2016-07-21 2 views
2

У меня после двух структурыКак использовать переменную типа данных на основе условия?

typedef struct { 

int day; 

char action [10]; 

}DataType1; 

и

typedef struct { 

int day; 

char action [50]; 

}DataType2; 

Теперь я должен использовать только один тип структуры данных на основе некоторого условия. Я сделал что-то вроде этого

void *ptr; 
DataType1 var1; 
DataType2 var2; 

if (validCondition == true) 
{ 
    ptr = &var1; 
} 
else 
{ 
    ptr = &var2; 
} 
//Used ptr in remaining code 

Но с помощью этого кода я заполнения, что может быть есть некоторая конструкция полетела в моем коде, поэтому я нужен этот тип трюк, но в любом случае мне нужно это. Я думал, что какой-то другой способ тоже, но у меня есть сомнения, как это работает

if (validCondition == true) 
{ 
    #define GENERIC_TYPE DataType1; 
} 
else 
{ 
    #define GENERIC_TYPE DataType2; 
} 

GENERIC_TYPE myVar; 
//use myVar in remaining code 

Как я знаю линию, начиная с символа # рассматривать как команду процессора и он будет известен и заменен во время компиляции. Но здесь у меня есть условие if, в котором validCondition изменилось время выполнения и в соответствии с этим определено #define.

Итак, в этом случае, как процессор будет работать?

Также у кого-нибудь есть идея для определения типа переменной данных на основе условия?

+0

Линии, начинающиеся с '#', являются ** препроцессорными директивами **, а не командой процессора. Компилятор полностью не знает о них, потому что они были заменены на этапе предварительной обработки, и на этом этапе нет исполняемого кода, поэтому вы не можете использовать блок if. Если условие является константой времени компиляции, используйте '# if' –

+2

Почему бы просто не использовать' DataType2' исключительно? – a3f

+0

@ a3f Point отметил..thanks – user2520119

ответ

0

Как о сохранении только один struct:

typedef struct { 
    int day; 
    char *action; 
} DataType; 

а затем на основе некоторого условия, вызовите malloc() с соответствующим числом байтов, необходимо:

DataType dt; 
if (checkWhateverCondionYouWant) 
    dt.action = malloc(someSize); 

HTH.

+2

's/char action/char action [] /' – a3f

+0

Спасибо за предложение. Но, к сожалению, я не могу этого сделать. Эта структура доступна в стороннем исходном коде.Поэтому я не могу его изменить. – user2520119

+0

@ user2520119: Итак, вы хотите запустить некоторую предпроцессорную директиву на основе некоторого значения, которое будет определено во время выполнения? а? – babon

1

Вы можете определить тип оболочки для этих типов данных:

struct DayAction { 
    int day; 
    char *action; 
    size_t actionlen; 
}; 

Тогда есть переменная этого типа и, в зависимости от вашего состояния, заполните поля этой переменной:

struct DayAction day_action; 

if (condition()) { 
    day_action.day = dt1.day; 
    day_action.action = dt1.action; 
    day_acion.actionlen = sizeof dt1.action; 
} 

После этого вы можете работать на day_action, так как он указывает на исходные данные.

Если вам нужно изменить dt1.day, сделайте указатель DayAction.day. Если вам не нужно менять action, сделайте DayAction.action a const char *.

Смежные вопросы