2012-06-05 6 views
3
//The size of test doesn't matter for now just assume it's fitting 
int* test = new int[50000] 
    for(int i=stepSize;i<=maxValue;i+=stepSize){ 

       for(int j=0;j<=i;j+=stepSize){ 
        //Comput something and store it 
        test[i*30+j] = myfunc(); 
       } 

    } 

Если я сейчас хочу преобразовать его в массив 1D, как я могу вычислить правильные индексы для массива 1D? Например, для i = 5 и j = 0 оно должно быть в первом положении и т. Д.Вложенные петли - 1D индексирование

EDIT: Обновлен код. Я попытался вычислить что-то и сохранить его в массиве 1d, вычислив его индекс с помощью i * 30 + j, но это не работает.

+1

Что вы пытались? Кроме того, представленный образец кода не имеет для меня никакого смысла. Это не помогает. –

+0

Я обновил образец. В принципе, я хочу вычислить некоторые значения внутри цикла inested for и хранить результаты в массиве 1D от 0 до n. – user1356695

+0

Почему вы начинаете итерировать 'i' в 5? Как вы объявили массив? – jrok

ответ

3

Предполагая, что массив был определен следующим образом:

int a[30][5]; 

вы могли бы индексировать в него, как это:

a[i][j] 

Или определить его как массив с 1 размерности следующим образом:

int a[30*5]; 
a[j + 5*i]; 

Вот пример программы, отображающей итерации:

(Обратите внимание, что есть те, кто может сказать, что я переключил строки и столбцы, но это не имеет особого значения, поскольку он повторяется последовательно через массив. То есть, если вы думаете о строках и столбцах по-разному, просто включите все вхождения, и вы должны получить тот же результат.)

int main(int argc, char **argv) 
{ 
    int columns = 30; 
    int rows = 5; 
    int a[columns*rows]; // not really needed for this example 

    for(int i = 0; i < columns; ++i) 
    { 
     for(int j = 0; j < rows; ++j) 
     { 
      cout << "[" << i << "][" << j << "] offset: " << (i*rows + j) 
       << endl; 
     } 
    } 
} 

[0][0] offset: 0 
[0][1] offset: 1 
[0][2] offset: 2 
[0][3] offset: 3 
[0][4] offset: 4 
[1][0] offset: 5 
[1][1] offset: 6 
[1][2] offset: 7 
[1][3] offset: 8 
[1][4] offset: 9 
[2][0] offset: 10 
[2][1] offset: 11 
[2][2] offset: 12 
[2][3] offset: 13 
[2][4] offset: 14 
[3][0] offset: 15 
[3][1] offset: 16 
[3][2] offset: 17 
[3][3] offset: 18 

... 

[27][4] offset: 139 
[28][0] offset: 140 
[28][1] offset: 141 
[28][2] offset: 142 
[28][3] offset: 143 
[28][4] offset: 144 
[29][0] offset: 145 
[29][1] offset: 146 
[29][2] offset: 147 
[29][3] offset: 148 
[29][4] offset: 149 

И еще одна часть информации, если вам нужно выделить 2D массив динамически, вот how:

int **a = new int*[30]; 
for(int i = 0; i < 30; ++i) 
{ 
    a[i] = new int[5]; 
} 
+2

Неверное 'i' в умножении - вы хотите, чтобы количество элементов в одной строке (или столбце в зависимости от порядка). – Mario

+0

@Mario, да, вы правы, я обновил его, спасибо – Brady

+0

Это не работает, так как вычисленный индекс i + i * j будет 5, 12, 24 и т. Д., Но я хочу, чтобы он постоянно сохранял значения по позициям 0,1,2 и т. Д. – user1356695

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