4
//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 の場合、最初の位置にある必要があります。

編集: コードを更新しました。i*30+j でインデックスを計算して、何かを計算して 1 次元配列に格納しようとしましたが、うまくいきません。

4

1 に答える 1

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

もう 1 つの情報として、2D 配列を動的に割り当てる必要がある場合は、次のようにします。

int **a = new int*[30];
for(int i = 0; i < 30; ++i)
{
    a[i] = new int[5];
}
于 2012-06-05T10:56:36.153 に答える