2014-01-05 3 views
4

я 2 массива, один комментируется, я хотел бы сделать универсальный Printf, что будет строить значения:Как проверить, является ли элемент массива int или float?

int values [] = { 88, 56, 100, 2, 25 }; 
//float values[] = {88.5f, 56.5f, 100.0f, 2.234f, 88.12f}; 

if (value[0] is int) { 
    for(i; i < 5; ++i) 
    printf("%d ", *(values + i)); 
} else { 
    for(i; i < 5; ++i) 
    printf("%f ", *(values + i)); 
} 

Есть ли способ, чтобы проверить это? Например, когда я хотел увидеть, является ли элемент char или int, я использовал sizeof

+0

@haccks, союзы –

+0

Да, я знаю. Но мне нужно делать программу для занятий. Ill комментирует значения int и uncomment float values, а затем запускает программу, затем Ill comment float и uncomment int. Эти массивы используются для сортировки. – F1sher

+0

Мне не нужен способ хранить 2 типа значений в одном. Мне нужна информация, как узнать, является ли элемент массива int или float. – F1sher

ответ

3

С оговоркой, что это много сложностей для «функции», которую вы собираетесь использовать только при отладке своей программы, вы можете использовать C11 в _Generic конструкцию:

_Generic(values[0], int: 0, float:1, default:2) 

То, что вы, вероятно, следует сделать вместо этого будет больше соответствовать вашим намерениям является условной компиляции:

#define FLOAT_CASE 

#ifdef FLOAT_CASE 
float values[] = {88.5f, 56.5f, 100.0f, 2.234f, 88.12f}; 
#else 
int values [] = { 88, 56, 100, 2, 25 }; 
#endif 

... // all the code that is independent of the type of values here 

for(i; i < 5; ++i) 
#ifdef FLOAT_CASE 
    printf("%f ", *(values + i)); 
#else 
    printf("%d ", *(values + i)); 
#endif 
+1

Почему вы пишете '* (значение + i)', а не 'values ​​[i]'? И вы забыли инициализировать 'i'' '0'. –

+0

@ KeithThompson Вы должны направить все эти замечания в OP. Я взял строки программы дословно из вопроса, чтобы было ясно, что мой ответ состоял в том, чтобы использовать '# ifdef' или' _Generic', чтобы не исправлять стилистические проблемы (что не помогло бы с проблемой написания родового кода для 'int' и 'float') –

2

уродливое решение: если вам нужно только различны между междунар и floa t вы можете назначить нецелое значение, скажем 0,1 переменной, а затем проверить фактическое значение. Это дает что-то вроде:

#define IS_INT_TYPE(x) (x=0.1, x==0) 

Однако это уничтожит исходное значение параметра макроса. Если вы используете GCC, вы можете использовать TypeOf расширение(), чтобы привести значение:

#define IS_INT_TYPE(x) (((typeof(x)) 0.1) == 0) 

И отмечает Паскаль дал мне идею к решению:

#define IS_INT_TYPE(x) (((x*0+1)/2) == 0) 
+0

Если вы хотите пойти в этом направлении, решение, если известно, что' x' не является ни «0», ни в два раза из пределов его типа «x/(x + x) = = 0' –

+0

Удаление ограничения на 0: 'x == 0? ((x + 1)/2 == 0): ... ' –

+1

Требуется только' x', если 'float', быть конечным:' x == 0? ((x + 1)/2 == 0): (x/x)/(x/x + x/x) == 0'. [после просмотра edit] Ну, ладно, ваше решение явно лучше, но все еще требует, чтобы 'x' был конечным. Это легко проверить: '! (X INT_MAX) && ...' –

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