2014-01-21 3 views
0

У меня есть массив структур, который содержит кучу информации, которая будет постоянной от времени компиляции. Я пытаюсь инициализировать массив, чтобы вся информация, относящаяся к конкретной переменной, находилась в одном месте. Проблема, с которой я сталкиваюсь, это тип данных, который может быть любым типом числа для var_ptr или var_max (другой член отслеживает тип обработки).Как инициализировать void * к известному типу данных

Я использую void * для указателя, но мне нужен способ выделения памяти и ее инициализации. См. Прокомментированный .var_max = & (23) ниже для примера того, что я пытаюсь выполнить.

typedef enum{ 
    INT, 
    CHAR, 
    LONG, 
    LONGLONG, 
    FLOAT 
} data_type_t; 


typedef struct param_t param_t; 


struct param_t{ 
    const char* name;      //Text name of variable 
    const void* var_ptr;      //Pointer to variable 
    const void* var_max;     //Pointer to max limit of var_ptr, same datatype 
    int (*p_func)(const param_t*, char *);//Function to process parameter variable 
    const data_type_t data_type;   //Data type of 
}; 


int MinMax_handler(const param_t *, char *); 

extern int Hours, Minutes, Seconds; 
/******************Variables go here******************/ 
const param_t param[] = 
{ 
    {.name = "DEV_RTC_HR", .var_ptr = &Hours, /*.var_max = &(23),*/ .p_func = &MinMax_handler, .data_type = INT}, 
    {.name = "DEV_RTC_MIN", .var_ptr = &Minutes, .p_func = &MinMax_handler, .data_type = INT}, 
    {.name = "DEV_RTC_SEC", .var_ptr = &Seconds, .p_func = &MinMax_handler, .data_type = INT} 
}; 
/*****************************************************/ 

Комментирование .var_max = & (23) позволяет обобщить и, кажется, работает хорошо.

Похоже, что профсоюз может работать, но он будет занимать гораздо больше памяти, поскольку большинство типов данных будут int (16 бит), но мне нужно разместить длинные (64-битные).

Мне нужно, чтобы это ограничение было ограничено C. Окончательной версией этого элемента будет 50-150 элементов массива и автоматически создается извне.

+1

«Нет» - это первое слово при просмотре названия. – herohuyongtao

+0

Для члена var_max, есть ли что-нибудь, препятствующее вам использовать простой тип, такой как int или short? Затем вы можете просто установить значение в param_t param []. – ryyker

+0

Одним из элементов массива struct может быть весь char, следующий может быть длинным. Нужно быть агностиком. И использование всего долгого времени съедало бы большую память на микроконтроллере. – user3219864

ответ

0

Поступая .var_max = &(23) вы пытаетесь создать указатель на буквальное значение, которое не имеет смысла

Вы можете сделать одну из двух вещей:

  1. предварительно выделить память, поместить значение 23 там, и используйте это как ваш указатель

  2. Предположим, что если размер данных соответствует void * (то есть, 64 бит или менее, если у вас 64-битная арка), вы можете разместить значение непосредственно в указателе

    .var_max = (недействительными *) 23

+0

Его 16-битная арка. – user3219864

+0

хорошо, но мой ответ по-прежнему применяется. Если ваши данные равны 16 бит или меньше, вы можете сохранить их непосредственно в указателе. В противном случае вам нужно будет выделить память для него – Naps62

0

Вы должны объект, адрес-оператора может работать на, например,

long twentythree = 23L; 

/* ... */, .var_max = &twentythree, /* ... */ 
+0

Да, это очевидный способ сделать это, но я пытаюсь найти способ поместить все параметры в одно место (чтобы его можно было прочитать/редактировать вручную). – user3219864

+0

И да, ключ здесь - мне нужно указать объект. Думаю, мой вопрос должен был заключаться в том, чтобы заставить компилятор автоматически генерировать объект. – user3219864