2013-02-22 3 views
1

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

псевдокоде

void insert_vals(uint8_t num, uint8_t *match_num, uint8_t *value) 
{ 
    uint8_t i; 

    while(data_exists) // how do I determine if data exists in 'value'? 
    { 
     switch(num) 
     { 
      case 0: 
      { 
       switch(match_num[i]) 
       { 
        case 0: 
         hw0reg0 = value[i]; 
        case 1: 
         hw0reg1 = value[i]; 
        case 2: 
         hw0reg2 = value[i]; 
        case 3: 
         hw0reg3 = value[i]; 
       } 
      } 
      case 1: 
      { 
       switch(match_num[i]) 
       { 
        case 0: 
         hw1reg0 = value[i]; 
        case 1: 
         hw1reg1 = value[i]; 
        case 2: 
         hw1reg2 = value[i]; 
        case 3: 
         hw1reg3 = value[i];     
       } 
      } 
      // etc. 2 other cases 
     } 
     i++; 
    } 
} 

Вызов Пример (псевдокод)

/* 
* num: hardware device select from 1 - 4 
* match_num: 4 possible matches for each hardware device 
* value: 32-bit values to be assigned to 4 possible matches 
* NOTE: This function assumes hardware devices are selected 
* in a consecutive order; I will change this later. 
*/ 

// example calling code - we could have configured 4 hardware devices 
insert_vals(0, [0, 1], [0x00000001, 0x000000FF]); // arg2 and arg3 equal in length 

Как я могу это сделать?

В массиве символов C автоматически добавит '\0' в конец массива, но это не похоже на массив целых чисел. Если бы я как-то смог определить длину match_num и value (см. Инструкцию if) во время выполнения, то это позволило бы мне создать цикл for.

Редактировать

Так как я знаю, что там будет максимум 4-х элементов, я не мог сделать что-то похожее на следующее?

void insert_vals(uint8_t num, uint8_t *match_num, uint32_t *value) 
{ 
    int i; 

    for(i = 0; i < 4; i++) 
    { 
     if(value[i] == -1) 
      break; 
     else 
     { 
      // Assign data 
     } 
    } 
} 
+0

......... magic? –

+0

Пожалуйста, позвоните по номеру – dasblinkenlight

+0

Извините, ребята, вы здесь. – Biff

ответ

3

Вы не можете получить длину массива, на которую указывает только указатель. Либо вы должны передать длину, либо она должна быть постоянной (всегда 4) с некоторым значением дозорного значения в неиспользуемых элементах - значение, которое каким-то образом недействительно для ваших вычислений (например, NUL для строк).

+0

Предполагая, что я прошел в длину, это означало бы, что 'sizeof (my_array)/sizeof (int)' будет работать во время компиляции *, если вне функции, как вы говорите? – Biff

+0

@Biff: что бы работа над делением выполнялась в каком-то месте, где 'my_array' на самом деле является массивом (а не указателем). –

+0

Это означало бы изменение моих аргументов как 'match_num []' и 'value []' соответственно. Верный? – Biff

1

Есть ли ценность, которую вы можете гарантировать, что она не находится в «удобных» данных? (например, 0 не является допустимым символом для символьных строк, поэтому г-н Керниган и г-н Ричи решили выбрать его как маркер «конца массива». Вы можете сделать то же самое с любой ценностью.

Скажите, что вы знаете свое целое число значения находятся в диапазоне от 0 до 512, поэтому вы можете инициализировать весь массив, например, до 1024, затем заполнить его и прокрутить его до тех пор, пока не произойдет число> 512 (которое должно быть вашим маркером маркера).

Другая возможность чтобы передать количество элементов в массиве вместе с массивом.

+0

См. Мой пример вызова. – Biff

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