1

関数で配列の 2 つの行を一緒に追加しようとしていますが、それを行っていません。コードが正しく見え、エラーが発生しないため、なぜそうでないのかわかりません。* と & を使用して参照渡しを試みましたが、常にコード エラーが発生します。ありがとう

#include <iomanip>
#include <iostream>
#include <fstream>

using namespace std;

void addRow(int arr[100][100], int firstrow,int secondrow,int rows, int cols);

void addRow(int arr[100][100], int firstrow,int secondrow,int rows, int cols){
    int i =0;
    int j = cols;
    while(i<rows){
        arr[secondrow][j]+=arr[firstrow][j];
        i++;
        j++;
    }
    print(arr,rows,cols);
}
4

3 に答える 3

3
void addRow(int (&arr)[100][100], int firstrow,int secondrow,int rows, int cols);

参照で渡す場合は、正しい署名になります。

template <typename std::size_t rows, std::size_t cols>
void addRow(int (&arr)[rows][cols], int firstrow,int secondrow);

そうすれば、プログラムのコンテキスト内のパラメーターとして行と列さえ必要なくなります。

于 2012-10-02T14:41:17.087 に答える
3

配列は正しく渡されます。追加を正しく行っていないのはあなたのコードです。

最初に に設定jcols、 で大きい順に移動しj++ます。その結果、配列要素へのすべてのアクセスは、行の終わりを過ぎています。行列が常に正方形でない限り、ループ終了条件も正しくありません (その場合、行と列に別々のカウントを渡す必要はありません)。

これはうまくいくはずです:

void addRow(int arr[100][100], int firstrow,int secondrow,int rows, int cols){
    for(int j = 0 ; j != cols ; j++){
        arr[secondrow][j] += arr[firstrow][j];
    }
    print(arr, rows, cols);
}
于 2012-10-02T14:40:13.647 に答える
2

に変更arr[100][100]arr[][100]ます。(実際には、100 を記号定数にするなど、他のいくつかの変更がコードのスタイルを改善するのに役立ちますが、これは主に必要な変更です。)

その理由を理解するのは簡単ではありませんが、それでも C++ プログラミングにとっては重要です。関数に実際に渡されるのは、100 int の最初の行のアドレスです。addRow()以下を注意深くお読みください。 このアドレスは最初の int のアドレスですが、渡すセマンティクスは前述のとおりです。したがって、 内では、シンボルは 10,000 int の配列ではなく、100 int の配列への定数ポインタとして機能します。addRow()arr

于 2012-10-02T14:48:50.163 に答える