реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Объявление массива без указания размера, и sizeof()
toweroff
сообщение Feb 21 2014, 13:20
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Добрый день!
Что-то не соображу...
Есть массив, находится во флеш. Реально здоровый, количество элементов считать руками ну просто лень.
Объявлен (соответственно, в хидере и в с-файле) так
Код
extern const unsigned char my_array[];

const unsigned char my_array[] = { /* здесь через запятую элементы массива */ };


при обращении к массиву никаких проблем, но вызов sizeof(my_array) вводит компилятор в ступор:
Код
test\test.c(41): error:  #70: incomplete type is not allowed


в чем проблема?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Feb 21 2014, 13:26
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(toweroff @ Feb 21 2014, 17:20) *
в чем проблема?


Проблема в том, что массив extern. Определяется sizeof на этапе компиляции, а поскольку сам массив находится в другой единице компиляции (другом файле), то его размер определить нет возмжности.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Feb 21 2014, 13:28
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(Палыч @ Feb 21 2014, 17:26) *
Проблема в том, что массив extern. Определяется sizeof на этапе компиляции, а поскольку сам массив находится в другой единице компиляции (другом файле), то его размер определить нет возмжности.

ок, обойти никак?
Go to the top of the page
 
+Quote Post
SM
сообщение Feb 21 2014, 13:31
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



В том, что массив безразмерный, по сути указатель на объявленную пачку констант, размер не известен компилятору. Flexible array это называется, sizeof к ним нельзя применять (правда, в gnu вроде можно, но для этого он не должен быть extern, там и макрос есть для кол-ва элементов - #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
)
Go to the top of the page
 
+Quote Post
toweroff
сообщение Feb 21 2014, 13:39
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Ясно, спасибо.

Тогда пойдем с другой стороны. Есть вот такой вот массив, как узнать его размер без ручного подсчета количества элементов? Keil 5
конструкция гнусей не помогает
Go to the top of the page
 
+Quote Post
SM
сообщение Feb 21 2014, 13:43
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



сделайте в том же файле, где он определен, еще и константу, int arr_size = ARRAY_SIZE(array); и ее тоже как extern потом берите. (про кейл не знаю, это методом тыка, сработает или нет, возможно, это расширение gnu, не уверен, что стандарт) По крайней мере в линуксе такое налево и направо практикуется:

Код
static struct v4l2_input tvp5146_inputs[] = {
    {
        .index    = 0,
        .name    = "Composite",
        .type    = V4L2_INPUT_TYPE_CAMERA,
        .std    = TVP514X_STD_ALL,
    },
    {
        .index    = 1,
        .name    = "S-Video",
        .type    = V4L2_INPUT_TYPE_CAMERA,
        .std    = TVP514X_STD_ALL,
    },
};

static struct vpfe_subdev_info vpfe_sub_devs[] = {
    {
        .name        = "tvp5146",
        .grp_id        = 0,
        .num_inputs    = ARRAY_SIZE(tvp5146_inputs),


главное, в одном файле чтобы это было - и инициализация, и ARRAY_SIZE
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Feb 21 2014, 13:44
Сообщение #7


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(toweroff @ Feb 21 2014, 17:39) *
...размер без ручного подсчета количества элементов?


точно так-же как и строки с символами, под форточками. размерности могут быть разные, но если есть терминал-символ
(который ноль как правило) - то сканируем до него.

мне сдаётся так...
Go to the top of the page
 
+Quote Post
toweroff
сообщение Feb 21 2014, 13:53
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Уфф... в общем переформатировал я массив в красивые колоночки по 16 байт и тупо посчитал строки...
Просто от прошивки к прошивке эти массивы могут меняться, делать это каждый раз не хотелось бы, да, видно, придется. Доки по RVDS также никаких решений не предлагают sad.gif
Go to the top of the page
 
+Quote Post
SM
сообщение Feb 21 2014, 13:56
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Так гну-тым скомпилируйтесь, он ничуть не хуже кейла или RV, а такими приятными штучками - лучше.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 21 2014, 14:11
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(toweroff @ Feb 21 2014, 15:53) *
и тупо посчитал строки...
Чем не устроила предложенная SM дополнительная константа в том же файле, проинициализированная sizeof(array)/sizeof(array[0])? Места она занимает явно меньше чем ваши выравнивания, дурацких ограничений в 16 символов не накладывает, ошибиться при ее подсчете компилятор (в отличие от вас) не может - сплошные плюсы. И для большинства процев накладных расходов не будет - что заданный вами врукопашную, что посчитанный компилятором он будет лежать отдельной константой ибо далеко не любое число можно встроить в код команды.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
SM
сообщение Feb 21 2014, 14:16
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(Сергей Борщ @ Feb 21 2014, 18:11) *
предложенная SM дополнительная константа


Я подозреваю, что кейл так не может, что это гнутое расширение...
Go to the top of the page
 
+Quote Post
toweroff
сообщение Feb 21 2014, 14:31
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(Сергей Борщ @ Feb 21 2014, 18:11) *
Чем не устроила ...

тем, что в Keil не работает.
когда объявил константу, причем после объявления массива, то все в порядке. До объявления массива - не работает

Но теперь все нормально, SM, спасибо

итого, хидер:
Код
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
extern const unsigned char my_array[];
extern const unsigned int MY_ARRAY_SIZE;


с-файл
Код
const unsigned char my_array[] = { ... };

// Объявление после массива
const unsigned int MY_ARRAY_SIZE = ARRAY_SIZE(my_array);
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 17:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01465 секунд с 7
ELECTRONIX ©2004-2016