5

として宣言された49スペースの1次元配列があり、ネストされたforループを使用して1次元配列を2次元配列にスローしようとしint boardArray [49];ているため、2次元7x7配列も宣言されています。これはテストに使用しているコードです。 int boardArrayTwo [7][7]'

for (int i = 0; i > 50; ++i)
{
    boardArray[i] = i; //fills the array with ints 0 - 48 to test
}
for (int x = 0; x >= 7; ++x)
{
    for (int k = 0; k >= 7; ++k)
    {
        for (int n = 0; n >= 49; ++n)
        {
            boardArrayTwo[x][k] = boardArray[n];
            cout << boardArrayTwo[x][k] << " " << endl;
        }

    }
}

これを実行してみましたが、何も起こりません。私はそれを間違っていますか?

4

8 に答える 8

7
for (int x = 0; x >= 7; ++x)
{
    for (int k = 0; k >= 7; ++k){
         for (int n = 0; n >= 49; ++n)
    {

これは間違っています。xとkは7未満である必要があります(3番目のサイクルは使用しないでください):

for (int x = 0; x < 7; ++x)
{
    for (int k = 0; k < 7; ++k){
        boardArrayTwo[x][k] = boardArray[7*x + k];

編集:

@Fabio Ceconelloのように、彼のコメントで私に気づかせてくれます。最初のループでさえ、条件チェックが逆になっているために間違っています。次のように変更する必要があります。

for (int i = 0; i < 49; ++i)
{
    boardArray[i] = i; //fills the array with ints 0 - 48 to test
}
于 2011-09-20T23:08:39.360 に答える
5

ループ内の反転ロジック(他の人が言及した)を除けば、3番目の内部ループは必要ありません。2番目の内側のループに帰属を配置するだけです。

boardArrayTwo[x][k] = boardArray[x * 7 + k];

編集:これらのリテラルはすべて良い習慣ではないことにも言及する必要があります。上記にもう1つ追加しました。次のようにコードを書き直します。

#define arrlen(x) (sizeof(x)/sizeof((x)[0]))

for (int i = 0; i < arrlen(boardArray); ++i)
{
    boardArray[i] = i; 
}
int stride = arrlen(boardArrayTwo[0]);
for (int x = 0; x < arrlen(boardArrayTwo); ++x)
{
    for (int k = 0; k < stride; ++k)
    {
        boardArrayTwo[x][k] = boardArray[stride * x + k];
        cout << boardArrayTwo[x][k] << " " << endl;
    }
}

警告:配列がここで宣言されていない場合(パラメーターとして渡された場合)、arrlen()は機能しません。しかし、それは別の長い話です...

于 2011-09-20T23:12:32.137 に答える
5

宛先配列が行優先の順序になっているようです。ソース配列を直接所定の位置にブラストすることができます。

memcpy(boardArrayTwo, boardArray, 49 * sizeof(int));

または、より慣用的なC ++で何かを好む場合:

std::copy(boardArray, boardArray + 49, reinterpret_cast<int*>(boardArrayTwo));
于 2011-09-20T23:20:04.247 に答える
4

i > 50forループで使用しました。i < 49他のすべてのループでも同じである必要があります。

また、これは機能しません。すべてのboardArrayTwo[][]値をに設定しています。boardArray[49]代わりに、次のようにする必要があります。

for (int x = 0; x < 7; ++x)
{
    for (int k = 0; k < 7; ++k)
    {
        boardArrayTwo[x][k] = boardArray[7*x + k];
        cout << boardArrayTwo[x][k] << " " << endl;
    }
}

また

int count = 0;

for (int x = 0; x < 7; ++x)
{
    for (int k = 0; k < 7; ++k)
    {
        boardArrayTwo[x][k] = boardArray[count];
        cout << boardArrayTwo[x][k] << " " << endl;
        count++;
    }
}
于 2011-09-20T23:07:53.870 に答える
1

まず、ループの2番目の項は、forその条件が真であるときにforループが実行されることを示しています。したがって、すべてのループ<の代わりにを使用する必要があります。>=

第二に、ループオーバーnは余分であり、そこにあるべきではありません。必要なのは、とを調べてxから、対応する要素をからにkコピーすることです。boardArrayboardArrayTwo

次のいずれかを実行できます。

int n = 0;
for (int x = 0; x < 7; ++x)
    for (int k = 0; k < 7; ++k)
    {
        boardArrayTwo[x][k] = boardArray[n];
        ++n;
    }

または、数式を使用して適切な計算を行いますn

for (int x = 0; x < 7; ++x)
    for (int k = 0; k < 7; ++k)
        boardArrayTwo[x][k] = boardArray[x*7+k];

x*7+k配列の行を反復処理しているように見えるのでx、各行に7つの要素x*7+kがあり、boardArrayのth要素が[x][k]boardArrayTwo/の位置を表すと書いています。

于 2011-09-20T23:15:18.503 に答える
0

ノート

for (int i = 0; i > 50; ++i)

が0に初期化されている場合i、それはそれより大きくなることはないため50、ループに入ることがありません。

于 2011-09-20T23:08:37.987 に答える
0

各ループで、以下(<)または等しいではなく、以上(>)を使用しました。また、Fabioが上記で指摘しているように、3番目のネストされたループがboardArrayTwo[x][k]何度も何度も0〜49に設定されていることにも注意してください。算術演算を使用してxとkを操作し、それらがboardArrayへのインデックスになるようにしてから、そのインデックスをに割り当てる必要がありますboardArrayTwo[x][k]

また、実際には8ポジションである0..7を使用していることも重要です。配列の長さは7しかないため、実際にはいくつかのガベージ値が含まれています。

#include <iostream>
using std::cout;
using std::endl;

int main () {

    int boardArray[49];
    int boardArrayTwo[7][7];

for (int i = 0; i < 50; ++i)
{
    boardArray[i] = i; //fills the array with ints 0 - 48 to test
}
for (int x = 0; x < 7; ++x)
{
    for (int k = 0; k < 7; ++k)
    {
            boardArrayTwo[x][k] = boardArray[x*7 + k];
            cout << boardArrayTwo[x][k] << " " << endl;
    }
}

}

運が良ければ(私が恥ずかしくない限り)、これでうまくいくはずです!

編集:Fabioに感謝します!

于 2011-09-20T23:11:16.833 に答える
0
for(int i=0; i<49; i++)
b[i]=(i+1);

int p=0;
for(int i=0;i<7;i++){
        for(int j=0;j<7;j++)
        {a[i][j]=b[p];
        p++;}
        }

他のエラーのほかに、3番目のループはあなたのコードを間違っています

于 2013-09-23T12:58:37.637 に答える