0

他の言語でプログラミングしたことがありますが、C++ を学習しているときに問題が見つかりました。配列を引数として取るメソッドを使用して、再帰の問題を解決しようとしています。おそらく、パブリック配列を使用することを考えましたが、どちらの方法でも配列を使用できません。

私が読んだことから、それは記憶と関係があるように私には思えます。(メモリ消費量は多いですが、呼び出しごとに作り直せばうまくいくと思いました。)

ここにいくつかのコードがあります:

static void FindSolution(int row, int column, bool answer[][8][8]) {
    for(int i = 0; i < 8; i++) 
        //Some processing…
        bool temp = true;
        FindSolution(0, column + 1, answer[row][column] = temp);
    }
}

配列を実際に使用するにはどうすればよいですか? どういうわけか

エラー:

error: array type 'bool [8]' is not assignable
         FindSolution(0, column + 1, answer[row][column] = temp);
4

3 に答える 3

0

「列」をインクリメントし続けますが、8 に達していないことを確認するためにそれをチェックすることはありません。8 に達した場合、配列の最後から外れているため、エラーが発生します。

于 2013-10-01T01:22:18.240 に答える
0

これには、差し迫った問題がいくつかあります。

最初の問題: 関数のシグネチャが正しくない 3 番目のパラメーターを 3 次元配列として宣言しましたが、2 次元だけを処理したいようです。この関数を再宣言して 2D 配列を受け入れる方法はいくつかあります。すべてのオプションについては、ここで受け入れられた回答を参照してください。個人的には、特に理由がない限り、この状況ではテンプレート オプションを使用します。次のようなもの:

template<size_t _rows, size_t _columns>
static void FindSolution(int row, int column, bool (&answer)[_rows][_columns]) {
    // todo: Some processing...
}

これにより、コンパイル時に配列のサイズを正確に知ることができます。もちろん、これは動的に割り当てられた配列ではうまく機能しませんが、コンパイル時に配列の次元をすでに知っているように見えるので、これはそうではないと考えました。問題です。そうである場合は、添付したリンクで 2D 配列を関数に渡す他の方法を確認してください。

2 番目の問題: 再帰呼び出し 2 番目の問題は、再帰呼び出しをどのように行っているかです。

FindSolution(0, column + 1, answer[row][column] = temp);

を配列temp内の特定の位置に代入した結果は、配列ではなく、 の値になります。事実上、次のステートメント:answeranswertemp

answer[row][column] = temp

bool単一の値を 2 次元配列として渡そうとしていますが、うまくいきません。メソッドを再度正しく呼び出すには、応答配列に temp を割り当ててから、関数を再度呼び出す必要があります。

answer[row][column] = temp;
FindSolution<_rows,_columns>(0, column + 1, answer);

うまくいくはずです。(ここで明示的なテンプレート引数に注意してください<_rows,_columns>。これは、テンプレートを利用した上記で投稿した関数シグネチャを使用している場合にのみ必要です)

于 2013-10-01T01:39:50.717 に答える