Назначенная динамическая инициализация массива - PullRequest
0 голосов
/ 06 апреля 2011

Мне нужно найти решение для создания массива и выполнить назначенную инициализацию массива во время объявления.

Следующий код работает под C-компилятором ARM11, но, как всегда, он не работаетпод компилятором MSVC.Я пытаюсь создать модульный тест под Win32 для тестирования встроенного программного обеспечения перед его доставкой клиентам.

Код выглядит следующим образом:

/* In some header file: */
...
/* Module1 */
#define P_proc1     0

/* Module2 */
#define P_proc2     ( P_proc1 + 1 )
#define P_proc3     ( P_proc2 + 1 )
#define P_proc4     ( P_proc3 + 1 )

/* Module3 */
#define P_proc5     ( P_proc4 + 1 )
#define P_proc6     ( P_proc5 + 1 )
#define P_proc7     ( P_proc6 + 1 )
#define Q_proc2_2nd_inst ( P_proc7 + 1 )
#define Q_proc3_2nd_inst ( Q_proc2_2nd_inst + 1 )
#define Q_proc5_2nd_inst ( Q_proc3_2nd_inst + 1 )
#define P_Last      ( Q_proc5_2nd_inst + 1 )
...
/* End of some header file */

И

/* The source file */
#include "some header file"
...
/* MACRO declarations */
/* For the following macro: PROC = base process name,
                            INSTANCE = base number of instance
                            GROUP = extended num of instances for this instance*/
#define PQ_ENTRY(PROC, INSTANCE, GROUP ) \
    [P_##PROC + INST - 1] = { queue_table + P_##PROC + INSTANCE - 1, \
                              queue_table + ( GROUP == 1 ? \
                              P_##PROC : \
                              Q_##PROC##_2nd_inst ) \
                              + INST - 1 }

/* GLOBAL VARIABLE declarations */
/* queue definitions for tasks */
t_queue queue_table[P_last + 1];

t_queue *const p_queue_table[][2] =  
{  
    PQ_ENTRY( proc3,    1, 2 ),  
    PQ_ENTRY( proc2,    1, 2 ),  
    PQ_ENTRY( proc7,    1, 1 ),  
    PQ_ENTRY( proc5,    1, 2 ),  
    PQ_ENTRY( proc6,    1, 1 ),  
    PQ_ENTRY( proc1,    1, 1 ),  
    PQ_ENTRY( proc4,    1, 1 )  
};  
...  
/* End of source file */  

Определения для P_proc * также являются индексом таблицы (массива) queue_table.В этом примере имена процессов (базовых) были упрощены всего несколькими процессами, но для реального кода процессов намного больше, и (базовые) имена могут быть любыми.

Идея p_queue_table состоит в том, чтоиметь таблицу, которая будет содержать указатели на queue_table для разных экземпляров процесса и которая имеет индекс, да, имя процесса def., P_procX.

Невозможно полагаться на порядокзаписей в p_queue_table в том же порядке, что и имена процессов P_XXX.Если бы это было так, то мне не понадобилась бы назначенная инициализация таблицы.Одним из решений было бы просто объявить массив p_queue_table, а затем инициализировать его позже в функции, но это не то, что нужно.

Должна быть возможность расширять / создавать макросы для инициализации таблицыпри создании таблицы, даже если нужно создать другую таблицу, которую можно затем отсортировать и использовать для инициализации p_queue_table, за исключением procs [] [3], который инициализируется с помощью {{proc3, 1, 2}, {proc2,1, 2}, ...}.

У кого-нибудь есть ответ на эту проблему?

1 Ответ

1 голос
/ 08 апреля 2011

вы используете назначенную функцию инициализатора

double A[10] = { [1] = 32.0, [5] = 43.0 };

для элементов массива. Эта функция была представлена ​​C99, действующим стандартом для C с 12 лет. AFAIK MSVC не поддерживает C99, но только C89.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...