0

2D 配列を関数に渡す方法 1 つ作成し、この配列を初期化する関数を定義したいと考えました。

#include <iostream>

using namespace std;
int n = 5;**strong text**
void wypelnijTabliceBooli(bool** b){
      for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++)
            b[i][j] = 0;
    }
}
int main(){
    bool b[n][n];
    wypelnijTabliceBooli(b);
    return 0;
}

そして私は得る

error: cannot convert 'bool (*)[(((unsigned int)(((int)n) + -0x000000001)) + 1)][(((unsigned int)(((int)n) + -0x000000001)) + 1)]' to 'bool**' for argument '1' to 'void wypelnijTabliceBooli(bool**)'|
4

4 に答える 4

1

配列はポインターではありません。関数に渡されると、配列の "最初の" (支配的な) 次元のみがポインターに変化します。それ以外の場合、多次元配列がある場合は、それに応じて関数の引数リストで宣言する必要があります。

void funcTaking2DArray(int (*arr)[5])
{
    // do stuff
}

int array[10][5];
funcTaking2DArray(array);
于 2013-04-06T08:11:57.417 に答える
1

使用次元:

void wypelnijTabliceBooli(bool b[n][n])

配列へのポインターとして渡すこともできますが、「最も外側」の次元以外はすべて知っている必要があります。

void wypelnijTabliceBooli(bool (* b)[n])

編集:これには、他のすべてが変更されていない状態で、C++標準を超える拡張機能を持つGNUまたはその他のコンパイラが必要であることを受け入れます。n別の方法は、const 値を作成することです。

于 2013-04-06T08:12:18.933 に答える
0

配列のサイズを柔軟にしたいようです。b を次のように宣言できます。

bool** b = new bool*[n]
for (i=0; i<n; i++)
    b[i] = new bool[n]
于 2013-04-06T08:18:37.007 に答える
0

あなたがいつ使用するかを知っている限り:

void wypelnijTabliceBooli(bool** b){
  for(int i = 0; i < n; i++){
    for(int j = 0; j < n; j++)
        b[i][j] = 0;
}
}

インデックスを使用して bool 2 次元配列をアドレス指定することはできません。これは、2 次元配列が連続したメモリの場所に格納されているために発生し、配列次元の少なく​​とも 1 つを指定しないと、特定の「行がいつ終了するか」を知る方法がありません。例: bool 配列があるとします。

bool myArray[2][3]={{true,true,false},{false,false,true}};

メモリ内では次のようになります ([] はメモリ ブロックを表します)。

[真][真][偽][偽][偽][真]

そして、ポインタだけを渡すだけでは、これが配列[3][2]か配列[2][3]かを知る方法がありません。

これは、次のように、配列の 1 次元を除くすべての次元を関数に渡すことで解決されます。

void wypelnijTabliceBool(bool b[][3] ){
  for(int i = 0; i < n; i++){
    for(int j = 0; j < n; j++)
        b[i][j] = 0;
}
}

(2 番目の次元が 3 の場合)。

于 2013-04-06T08:19:09.140 に答える