簡體   English   中英

C ++為多維數組賦值

[英]C++ assigning value to multidimensional array

我正在嘗試為3x3維數組中的每個索引賦值。 我在開始時將所有值初始化為1,然后將index [0] [2]設置為2.但是,某種方式索引[1] [0]也附加到值2.然后我嘗試設置[1] [2]到2,[2] [0]也設置為值2.我不確定這里發生了什么?

1 | 2 | 1 | ----> 1 | 1 | 2 |

1 | 1 | 1 | ----> 1 | 1 | 1 |

2 | 1 | 1 | ----> 1 | 2 | 1 |

void magicSquare (int param){
//param = 3
int volume = param - 1;

int squareArray[volume][volume];

int c = 0;
int d = 0;

for (int i = 0; i < param*param; i++) {

    squareArray[c][d] = 1;
    c +=1;
     if (c == param) {
                d +=1;
                c = 0;

     }

}

squareArray[0][2]= 2;


c = 0;
d = 0;

printf (" %d | ",squareArray[c][d]);
for (int i = 1; i < param*param; i++) {

    c +=1;

    if (c == param) {
        d +=1;
        c = 0;
        printf ("\n %d | ",squareArray[c][d]);
    }
    else printf (" %d | ",squareArray[c][d]);

}

您將數組聲明為2x2而不是3x3。

param-1 (3-1)被分配給volume ,因此是2x2。 數組從0開始索引,以size-1結束。 聲明數組時, 聲明大小 ,然后訪問0size-1元素。

此外,您可以使用嵌套for循環代替使用cd

for(int i=0; i<param; ++i){      // will loop [0,param-1] or [0,param) 
    for(int j=0; j<param; ++j){  // same
        arr[i][j] = 1;
    }
}

編輯:我故意省略動態分配,因為OP顯然是初學者。

您正在訪問squareArray超出范圍。 代替

int squareArray[volume][volume];

使用

int squareArray[param][param];

聲明2D數組時

int array[M][N];

用於訪問數組的有效索引范圍是:

array[0][0] .... array[M-1][N-1]

在你的情況下, param是3.你聲明一個大小為2 x 2的數組。 訪問數組的有效范圍索引是:

squareArray[0][0]  .... squareArray[1][1]

在循環:

for (int i = 0; i < param*param; i++) {

    squareArray[c][d] = 1;
    c +=1;
     if (c == param) {
                d +=1;
                c = 0;

     }
}

你正在訪問數組到squareArray[2][2] 這本身就會導致不確定的行為。

更新

感謝@MattMcNabb,我意識到這個問題已被標記為C ++。

int squareArray[param][param];

不是有效的C ++語句。 必須將其更改為使用某種動態數組 - 例如std::vectorstd::array

您可以使用:

std::vector<std::vector<int>> squareArray(param, std::vector<int>(param, 0));

如果你總是在編譯時知道正方形的維度,那么你可以寫:

template<int param>
void magicSquare ()
{
    int squareArray[param][param];

並保留其余的代碼。

但是,如果直到運行時才知道param那么這在標准C ++中不起作用。 (有些編譯器允許擴展,但有充分的理由避免使用此類擴展)。

沒有太多細節,標准修復就是寫:

    vector< vector<int> > squareArray(param, vector<int>(param));

是的,這有點難看,但是你不必改變你的其余代碼。 要啟用此功能,您需要在文件的頂部, #include <vector> ,並using std::vector; 如果你還沒有使用namespace std。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM