1

以下の printResults() メソッド (下部のメイン メソッドから呼び出される) は、4 つの値すべてに対して -858993460 を返します。どうしてこれなの?doCalc() メソッド内で数値と計算が正しいことを cout ステートメントで確認したので、ポインターを使用して printResults() メソッドを呼び出している方法にエラーがあると想定しています...

typedef int matrix[2][2] ;

struct matrices {
matrix a;
matrix b;
};

...getInput() method constructs 

matrix* doCalc (matrices m){
matrix toReturn;
char input;
cout << "Which calculation would you like to perform - (M)ultiply, (A)dd, (S)ubtract?";
cin >> input;
switch(input){
case 'M':
    toReturn[0][0] = ((m.a[0][0])*(m.b[0][0]));
    cout << "XX " << ((m.a[0][0])*(m.b[0][0]));
    toReturn[0][1] = (m.a[0][1]*m.b[0][1]);
    cout << "YY " <<  (m.a[0][1]*m.b[0][1]);
    toReturn[1][0] = (m.a[1][0]*m.b[1][0]);
    toReturn[1][1] = (m.a[1][1]*m.b[1][1]);
    break;
case 'A':
    toReturn[0][0] = (m.a[0][0]+m.b[0][0]);
    toReturn[0][1] = (m.a[0][1]+m.b[0][1]);
    toReturn[1][0] = (m.a[1][0]+m.b[1][0]);
    toReturn[1][1] = (m.a[1][1]+m.b[1][1]);
    break;
case 'S':
    toReturn[0][0] = (m.a[0][0]-m.b[0][0]);
    toReturn[0][1] = (m.a[0][1]-m.b[0][1]);
    toReturn[1][0] = (m.a[1][0]-m.b[1][0]);
    toReturn[1][1] = (m.a[1][1]-m.b[1][1]);
    break;
}
return &toReturn;

}

void printResult(matrix m){
cout<<"---RESULT---\n";
cout << m[0][0] << "  " << m[0][1] << "\n";
cout << m[1][0] << "  " << m[1][1] << "\n";

}

void main() {
matrices m = getInput();
cout << m.a[0][0] << "  " << m.a[0][1] << "\n";
cout << m.a[1][0] << "  " << m.a[1][1] << "\n\n";
cout << m.b[0][0] << "  " << m.b[0][1] << "\n";
cout << m.b[1][0] << "  " << m.b[1][1] << "\n";

matrix* calc = doCalc(m);
matrix c = &calc;

printResult(*calc);

}
4

5 に答える 5

2

関数が終了すると行列toReturnは破棄されるため、何らかの形式の永続的なメモリ割り当てを使用する必要があります (検索newおよび削除)。そのため、すべての値はナンセンスです。

于 2013-05-07T01:21:16.530 に答える
0

matrix toReturn;スタックに割り当てられるローカル変数です。返却後doCalcの内容は不定です。この場合、古いアドレスのメモリはランダムなガベージで上書きされます。

于 2013-05-07T01:23:38.387 に答える
0

動的に割り当てられたメモリを管理したり、値で返す場合に呼び出し元に左辺値を提供するよう要求したりすることを避けることができます。

matrix doCalc (const matrices& m)
{
    matrix toReturn;

    // Code here

    return toReturn;
}

結果をオブジェクトに割り当てるmatrixか、以下のような式で使用できます。

if(doCalc(m).a[0][0] == 1)
{
     // do something
}

また

matrix mat(doCalc(m));
if(mat.a[0][0] == 1)
{
     // do something
}
于 2013-05-07T01:33:14.893 に答える
0

toReturn終了時にスタック フレームと共に破棄されますdoCalc

ポインターを返す代わりに、呼び出している関数に渡します。

void doCalc (matrices m, matrix* pReturnMatrix)

matrix* calc = new matrix();
doCalc(m, calc);
于 2013-05-07T01:27:51.503 に答える