2016-10-19 10 views
0
#define ID_A 5 
#define ID_B 7 
#define ID_C 9 
const int id_arr={ ID_A, ID_B, ID_C, }; 

Я знаю, что мне нужно знать смещение ID_C в id_arr, я могу использовать простую функцию, какВ C, как найти смещение элемента в массиве

int get_offset(id){ 
    for(i=0;i<id_arr_num;++i){ 
     if(id==id_arr[i]) return i; 
    } 
} 

Но обр это const, , так что я могу знать, что смещение ID_C будет 2 до времени выполнения, - это любой способ использовать макрос или другой способ узнать смещение до c runtime?

+2

'const int id_arr = {ID_A, ID_B, ID_C,}; ..... ????? – LPs

+0

Если я получаю вас: нет, вы не можете знать индекс элемента определенного значения в массиве с препроцессором – LPs

ответ

1

Избегайте использования макросов для этого.
И вы забыли указать id_arr_num.
Нет, нет способа узнать этот индекс до времени выполнения и избегать использования глобальных значений как можно больше.

Эта функция даст вам индекс переменной, которую вы ищете:

int get_offset(id, arr, size){ 
    for(i = 0;i < size;++i) 
     if(id == arr[i]) return i; 
} 
+0

Некоторые nitpicks: 1. Нет причин избегать использования * констант *, которые являются глобальными в C. 2. Ваш функция в основном такая же, как и в OP, с разными параметрами. 3. Не используйте отдельные текстовые строки. Если вам нужно что-то подчеркнуть, используйте * italics * или ** bold **. – user694733

2

Вместо того чтобы использовать непосредственно, использовать индексы идентификаторов, которые сами по себе являются зачеты:

enum { 
    IDX_A, 
    IDX_B, 
    IDX_C, 
    IDX_COUNT 
}; 
const int id_arr={ 5, 7, 9 }; 
/* Error checking to make sure enum and array have same number of elements (from assert.h) */ 
static_assert((sizeof id_arr/sizeof *id_arr) == IDX_COUNT, "Enum/array mismatch"); 

Использование проста :

id = id_arr[IDX_A]; 

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

  • Нет связанных вопросов^_^