1

ハードコードされた配列を渡して、実行時に割り当てられた多次元配列を受け取る関数をテストしたいと思います。

関数には のシグネチャがvoid generate_all_paths(int** maze, int size)あり、配列は として定義されていint arr[5][5] = {REMOVED}ます。

関数の配列を適切に強制する方法が正確にはわかりません(またはそれが不可能な場合)。

4

7 に答える 7

6

この多次元配列のトピックは、残念ながら多くのC++プログラマーを混乱させます。さて、ここに解決策があります:

void generate_all_paths(int (*maze)[5], int size);

それが関数宣言のように見える必要があります。代替ですが、完全に同等です

void generate_all_paths(int maze[][5], int size);

どちらも、5つの整数の配列へのポインターであるパラメーターを作成しています。次に、5つの整数の配列の配列をその関数に渡すことができます。

generate_all_paths(arr, 5);

配列の最初の要素は5つの整数の配列であるため、その関数に渡されると、自動的に(暗黙的に)その最初の要素へのポインターに変換されます。

コメントでは、int**内部ディメンションと外部ディメンションの両方に実行時の値が必要であるため、にバインドされていることを示しています。多次元配列は使用できなくなりました。次に、テスト目的で実行できることは、次のようなポインターの配列を作成することです。

int store[5 * 5] = { ..... };
int *arr[5] = { store, store + 5, store + 10, store + 15, store + 20 };

次に、実際には、関数にを受け入れるようにすることができますint**。配列の最初の要素はであるint*ため、自動的に変換されint**ます。これを行う別の方法は、データを2次元配列に保持することですが、その配列へのポインターで構造化された「ビュー」を作成するだけです。

int *arr[5] = { store[0], store[1], store[2], store[3], store[4] };

ストアはint[5][5]アレイです。そのstore[n]2次元配列のn番目のサブ配列にアクセスし、その要素タイプはであるintため、ポインター変換されたタイプはでありint*、これは再び互換性があります。

于 2009-02-11T06:48:19.617 に答える
3

あなたは書ける:

void display(char **a)

そして、そのa[i][j]中の要素を参照するために使用します。

宣言char **は「整数へのポインタへのポインタ」を意味します。それをステップに分解するには:

char *b = a[i];

iこれにより、array-of-arraysの'番目の配列の最初の要素へのポインタが得られます。

char c = b[j];

これjにより、配列の'番目の要素が取得されますb

次の問題は、そのような配列の配列を割り当てることです。

char **arrayOfArrays = new char *[10];

for (int n = 0; n < 10; n++)
    arrayOfArrays[n] = new char[20];

これにより、10個の配列の配列が割り当てられ、各「子」配列は20文字になります。

C / C ++では、配列アクセス構文は、ポインターから少し離れた値を取得する方法にすぎません。

char *p = "Hello";

char *pl = p + 2;   // get pointer to middle 'l'
char l = *pl;       // fetch

char o = p[4];      // use array syntax instead
于 2009-05-23T20:11:31.630 に答える
1

また、なぜ配列は予約語なのですか?

そうではありません。ネイティブマネージドタイプとしてC++/ CLIで使用されているため、キーワードとして表示されるVisualStudioを使用している可能性があります。ただし、これはC ++には関係がなく、VisualStudioはその点で誤解を招く可能性があります。

問題について:pointer-to-pointers-to-charを渡してから、ネストされた配列を直接渡すことができます(動的に割り当てられた配列を使用している場合)。

void display(char** array) …

とはいえ、関数は固定された既知の配列長とその他の詳細を想定しています。ネストされたstd::vector、またはstd::string(たとえば)を使用することをお勧めします。このような既存のデータ型を使用すると、作業がはるかに簡単になります。

void display(std::vector<std::string> const& array) {
    for (size_t i = 0; i < array.length(); ++i)
        cout << array[i] << endl;
}

これを利用するには、のプレーンC配列charの代わりにこれらのデータ構造を使用するように、呼び出し元のコードも変更する必要があります。

于 2009-05-23T20:10:05.767 に答える
1

void display(char ** array) 動作するはずです。また、標準のC /C++では予約語ではないと思います。

于 2009-05-23T20:12:45.527 に答える
0

arrは、使用している多次元配列へのポインタであり、実際には。へのポインタintです。これで、関数はポインターへのポインターを受け入れるため、 using:intのアドレスを取得し、それを関数に渡して、次のコードを取得する必要があります。arr&arr

配列を強制&arr変換するには:関数に渡します。func内の配列を参照するには:*maze[x][y]

于 2009-02-11T06:55:19.740 に答える
0

イヤーウィッカーの答えには重要な事実が欠けています。彼が提案しているのは配列の配列です。最初に、これはポインタの配列のためにメモリを浪費します( "char ** arrayOfArrays = new char * [10]"はこれの作成ポイントです)。2番目の場合、charの配列はメモリの連続ブロックではない可能性があり、これは多くの場合問題になります。C ++での唯一の回避策は、1次元配列を作成し、必要なときにインデックスを計算することです。

char *b = new char[width*height];

次に、このように要素x、y(xは幅に沿って、yは高さに沿って)を参照できます。

char c=b[width*y+x];

ただし、これは上記のソリューション(GCC 3.4.5で測定)よりも少し遅い場合があるため、連続メモリに関心がない場合(たとえば、ポインタに整数を追加することなく、常に[] []を使用して要素にアクセスします)そしてそれを逆参照します)、それからあなたは配列af配列を使うべきです。ただし、連続メモリを使用する場合、たとえば、初期化子としてstd :: stringオブジェクトに渡す場合や、ネットワーク全体を送信する場合は、2番目のメモリを使用する必要があります。

于 2009-05-24T01:19:33.973 に答える
0

最善の方法はポインターを使用することですが、Borland C++ では配列を関数のパラメーターとして渡すことができます。このコードを見てください (以下を含みます: iostream と conio):

////////////////////////////////////////////

void ReceivedArray(char x[5]){

for (int i=0; i<5; i++ )
cout << x[i];

}

void main(){

char *x = new char[5];

for (int i=0; i<5; i++ )
x[i]='o';

ReceivedArray(x);
getchar();
}


///////////////////////////////////////////////////////////////


For passing 2D arrays (oops! some lines in spanish, sorry!):

(includes: iostream, stdlb, stdio and math)


/////////////////////////////////////////////////

using namespace std;

void ver(int x[][20]){
for(int i=0; i<15; i++)  {
  for(int j=0; j<20; j++) {
   cout<< x[i][j] <<" ";       }
   cout << "\n";        }

}

void cambiar0(int x[][20]){ int n[255];
   for (int i=255; i>=0; i--)
    n[255-i]=i;


for(int i=0; i<15; i++)
  for(int j=0; j<20; j++)
      for(int k=0; k<255; k++)
       if(x[i][j]==n[k])  {
          x[i][j]=k; break;  }  
}

int main(int argc, char* argv[]){
int x[15][20]; char a; 

for(int i=0; i<15; i++)
  for(int j=0; j<20; j++)
   x[i][j]=rand()%255;

  cout << "¿desea ver la matriz? s/n ";
 cin >> a;
 if(a=='s') ver(x);

 cambiar0(x);

 cout << "\n\n";
 cout << "¿desea ver la matriz? s/n ";
 cin >> a;
 if(a=='s') ver(x);

system("PAUSE"); return 0;
}

///////////////////////////////////

これがあなたの意図したものであることを願っています。

于 2009-05-24T00:49:16.123 に答える