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。当我将其更改为标准打印 cout(不仅是单行,我的意思是整个方法)时,我也无法在终端中看到它们。但正如我上面提到的,当我将 p[0] p[1] 更改为 3 时,它可以工作,这意味着我可以在 txt 或终端中看到它们

我以前从未在 C++ 中遇到过这种奇怪的情况,所以我希望有人能帮助我!

仅供参考,我使用 Visual Studio 2010 作为编译器。

谢谢你的帮助!

4

2 回答 2

1

我们不知道做什么findmatrixsizenormalmultiplication做什么。

但是,如果他们按照我的想法去做(并且我认为他们返回指向其本地数据的指针),则 引用的对象p1p2共享C存储。

检查是否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 回答