для цикла в target-c - массив примитивов - PullRequest
1 голос
/ 09 марта 2009
int matrix[3][3] = {
      {1,2,3},
      {1,2,3},
      {1,2,3},
}

Как мне зациклить его?

В основном, операция по длине - моя забота.

for (int i=0; XXXXX; i++) {
  for (int j=0; XXXX; j++) {
      int value = matrix[i][j];
 }
}

РЕДАКТИРОВАТЬ: Есть ли динамический способ получения размера массива? Что-то вроде sizeof()?

Ответы [ 4 ]

6 голосов
/ 09 марта 2009

Для статически созданных типов массивов вы можете использовать оператор sizeof, например,

sizeof(myArray) / sizeof(myArray[0])

Для динамически создаваемых массивов (то есть, на которые ссылается указатель) это не будет работать (sizeof просто даст вам размер указателя в вашей системе). В этом случае вам нужны либо константы, либо значение в вашем массиве. С помощью часового, просто просканируйте каждую ось, пока не найдете ее для длины (так работают строки C, используя \ 0).

5 голосов
/ 09 марта 2009

В C я бы сделал следующее, попробуйте:

sizeof( matrix ) /sizeof( matrix[0] )         <- outer array
sizeof( matrix[0] )/ sizeof( matrix[0][0] )   <- inner array



linux ~ $ cat sizeof_test.c
#include <stdio.h>

int main( void )
{
        int matrix[][3] = { {1,2,3}, {1,2,3}, {1,2,3}, };
        int matrix2[][3] = { {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3}, };
        int matrix3[][4] = { {1,2,3,4}, {1,2,3,4}, {1,2,3,4}, {1,2,3,4}, };

        printf( "array (%d) - elements( %d )\n", sizeof( matrix ) /sizeof( matrix[0] ), sizeof( matrix[0] )/ sizeof( matrix[0][0] ));
        printf( "array (%d) - elements( %d )\n", sizeof( matrix2 ) /sizeof( matrix2[0] ), sizeof( matrix2[0] )/ sizeof( matrix2[0][0] ));
        printf( "array (%d) - elements( %d )\n", sizeof( matrix3 ) /sizeof( matrix3[0] ), sizeof( matrix3[0] )/ sizeof( matrix3[0][0] ));

        return 0;
}
linux ~ $ gcc sizeof_test.c -o sizeof_test
linux ~ $ ./sizeof_test
array (3) - elements( 3 )
array (4) - elements( 3 )
array (4) - elements( 4 )
linux ~ $
1 голос
/ 09 марта 2009

Вы можете сделать это так же, как в C:

int matrix[3][3] = { {1,2,3}, {1,2,3}, {1,2,3}, };

for(int i = 0; i < 3; i++)
{
    for(int j = 0; j < 3; j++)
    {
        int value = matrix[i][j];
    }
}

Хотя я рекомендую использовать константу вместо магических 3. Сделает все более читабельным, особенно цикл for.

0 голосов
/ 09 марта 2009

Длина массива верхнего уровня равна 3, длина каждого подмассива равна 3, поэтому это должно работать:

for( int i = 0; i < 3; ++i ) {
      for( int j = 0; j < 3; ++j ) {
           // do something here for each element
      }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...