1

私はC++を初めて使用しますが、2次元配列に値を設定するだけで混乱しているため、いくつかの概念が欠けていると思います。指定した場所に一度だけ設定するのではなく、複数の場所に設定します。コードは他の言語では完全に理にかなっているので、私が知らないのはC ++のちょっとした癖に違いありませんか?

#include <iostream>
#include <string>

int main()
{
const int width=26;
const int height=10;
char arr[width][height];
//fill with dots
std::string empty=".";
for (int i=0;i<height;i++)
{
    for (int j=0;j<width;j++)
    {
        arr[i][j]=empty[0];
    }
}
std::string msg="test";
//set location row=5, col=3 to "t"
arr[5][3]=msg[0];

//print the array
for (int i=0;i<height;i++)
{
    for (int j=0;j<width;j++)
    {
        std::cout<<arr[i][j];
    }
    std::cout<<std::endl;
}
}

結果は次のとおりです。

..........................
..........................
..........................
.......................t..
............t.............
...t......................
..........................
..........................
..........................
..........................

真ん中には1トンしかありません。なぜ他の2トンを入れているのかわかりません。

4

2 に答える 2

4

出力の形状からすると、明らかに高さ10、幅26を使用しています。

配列を参照しているのは[i][j]iが垂直でj水平である場合ですが、その場合、配列は26行10列で定義されています。ですから、印刷するときにあふれています。配列はメモリの単なる連続ブロックであるため、これはそのブロックをオーバーフローしていません。そうしないと、クラッシュする可能性があります。しかし、それは正しくありません。

現在、行の長さは10文字ですが、26であるかのようにアクセスしています。これは、次の2行から値を取得することを意味します。出力の余分な「t」値は、それらの前の行でオーバーフローした結果です。

これが理にかなっていることを願っています。

アクセスをarr[j][i]に変更するか、定義をに変更しchar arr[10][26]ます。

于 2012-08-24T03:13:24.217 に答える
3

それはあなたが高さをどのように定義しているかと関係があります。

サンプルコードで使用している値を指定しなかったため、両方のオプションを試しました。

と:

int  height = 10;
int  width = 26;

上記で説明した動作が得られます。

ただし、次の場合:

int  height = 26;
int  width = 10;

正しい動作が得られます。「t」が複数回表示された理由は、高さと幅が誤った値で定義されているため、バッファをメモリに過剰に実行していたために、たまたまメモリ内の同じポイントにインデックスを付けていたためです。たまたま正しく初期化されました。

于 2012-08-24T03:12:55.833 に答える