0

テストする次のコードを書きましたint main()

int main() {
int *p1 = findmatrixsize("inputmatrix.txt","A");//A function gets matrix size
cout << p1[0] << endl << p1[1] << endl;
int *p2 = findmatrixsize("inputmatrix.txt","B");
cout << p2[0] << endl << p2[1] << endl;

double **C = normalmultiplication("inputmatrix.txt","A", "B"); 
cout << C[0][0] << endl;

ofstream fout;
const string s="outputmatrix.txt";
fout.open(s);
for(int i=0;i<p1[0];i++){
    for(int j =0;j<p2[1];j++){
        fout << C[i][j] << " ";
    }
    fout<< endl;
}
fout.close();

return 0;
}

マルチアレイ印刷を実行しているときを除いて、すべてが機能します。問題は次のとおりです。

1.印刷部分をコメントアウトすると、p1[0],p1[1],p2[0],p2[1],C[i][j]完璧で正しい結果が得られます。

2.ただし、通常のループを使用して印刷すると機能しません。しかし、しかし、しかし、p1[0],p2[1]for ループ内を 3 のような具体的な数値に変更すると (行列の次元が 3 の場合)、再び機能します。

3.コンパイルはするが、forループ印刷部分がtxtに書かれていない。標準のprint cout(1行だけでなく、メソッド全体を意味します)に変更したところ、端末にも表示されませんでした。しかし、上で述べたように、p[0] p[1] を 3 に変更すると機能します。つまり、txt またはターミナルでそれらを見ることができます。

これまで C++ でこのような奇妙な状況に遭遇したことがないので、誰かが私を助けてくれることを願っています!

参考までに、コンパイラとして Visual Studio 2010 を使用しています。

ご協力いただきありがとうございます!

4

2 に答える 2

1

私たちは何findmatrixsizeをしているのかわかりませnormalmultiplicationん。

しかし、私が思っていることを実行すると (そして、ローカル データへのポインタを返すと思います)、 によって参照されるオブジェクトとp1ストレージp2C共有されます。

かどうかを確認しますp1 == p2

于 2013-07-27T21:17:34.930 に答える
0

問題は、findmatrixsize 関数と normalmultiplication 関数から結果を取得する方法にあります。これらは計算結果をスタックに保持し、それへのポインターを返しますが、これらの関数が作業を終了するとすぐにスタックが破棄されます。メモリ内の場所がこれらの関数の外部で有効になるように、これらの関数を再実装します。例えば、

int p1[2];
findmatrixsize("inputmatrix.txt","A", p1)

結果をfindmatrixsize内の最後の引数に入れます。

void findmatrixsize(const char* fileName, const char* matrixName, int* result)
{
  // routine
  result[0] = someValue1;
  result[1] = someValue2;
}
于 2013-07-27T21:16:26.537 に答える