Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Объявление массива без указания размера
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
toweroff
Добрый день!
Что-то не соображу...
Есть массив, находится во флеш. Реально здоровый, количество элементов считать руками ну просто лень.
Объявлен (соответственно, в хидере и в с-файле) так
Код
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


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


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

ок, обойти никак?
SM
В том, что массив безразмерный, по сути указатель на объявленную пачку констант, размер не известен компилятору. Flexible array это называется, sizeof к ним нельзя применять (правда, в gnu вроде можно, но для этого он не должен быть extern, там и макрос есть для кол-ва элементов - #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
)
toweroff
Ясно, спасибо.

Тогда пойдем с другой стороны. Есть вот такой вот массив, как узнать его размер без ручного подсчета количества элементов? Keil 5
конструкция гнусей не помогает
SM
сделайте в том же файле, где он определен, еще и константу, 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
kolobok0
Цитата(toweroff @ Feb 21 2014, 17:39) *
...размер без ручного подсчета количества элементов?


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

мне сдаётся так...
toweroff
Уфф... в общем переформатировал я массив в красивые колоночки по 16 байт и тупо посчитал строки...
Просто от прошивки к прошивке эти массивы могут меняться, делать это каждый раз не хотелось бы, да, видно, придется. Доки по RVDS также никаких решений не предлагают sad.gif
SM
Так гну-тым скомпилируйтесь, он ничуть не хуже кейла или RV, а такими приятными штучками - лучше.
Сергей Борщ
Цитата(toweroff @ Feb 21 2014, 15:53) *
и тупо посчитал строки...
Чем не устроила предложенная SM дополнительная константа в том же файле, проинициализированная sizeof(array)/sizeof(array[0])? Места она занимает явно меньше чем ваши выравнивания, дурацких ограничений в 16 символов не накладывает, ошибиться при ее подсчете компилятор (в отличие от вас) не может - сплошные плюсы. И для большинства процев накладных расходов не будет - что заданный вами врукопашную, что посчитанный компилятором он будет лежать отдельной константой ибо далеко не любое число можно встроить в код команды.
SM
Цитата(Сергей Борщ @ Feb 21 2014, 18:11) *
предложенная SM дополнительная константа


Я подозреваю, что кейл так не может, что это гнутое расширение...
toweroff
Цитата(Сергей Борщ @ 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);
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.