【问题标题】:A bug of using for loop to print out matrix in my program在我的程序中使用 for 循环打印出矩阵的错误
【发布时间】:2013-07-27 23:15:08
【问题描述】:

我写了以下代码在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.但是,当我使用普通循环打印时,它不起作用。但是,但是,但是,如果我将 for 循环中的 p1[0],p2[1] 更改为像 3 这样的具体数字(当我的矩阵维度为 3 时),它会再次起作用。

3.可以编译,但是for循环打印部分没有写入txt。当我将其更改为标准打印 cout(不仅是单行,我指的是整个方法)时,我也无法在终端中看到它们。但是正如我上面提到的,当我将 p[0] p[1] 更改为 3 时,它可以工作,这意味着我可以在 txt 或终端中看到它们

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

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

感谢您的帮助!

【问题讨论】:

  • 究竟是什么不起作用?
  • 可以编译,但是for循环打印部分没有写入txt。当我将其更改为标准打印 cout 时(不仅是单行,我的意思是整个方法),我也无法在终端中看到它们。但是正如我上面提到的,当我将 p[0] p[1] 更改为 3 时,它可以工作,这意味着我可以在 txt 或终端中看到它们

标签: c++ visual-studio-2010 for-loop printing fileoutputstream


【解决方案1】:

我们不知道findmatrixsizenormalmultiplication 做了什么。

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

检查是否p1 == p2

【讨论】:

  • 供您参考,您可以在此处查看整个代码:dropbox.com/s/faf20aoxecjylty/matrix_multiplication.cpp
  • 它很长,所以我没有把它们都放在这里。这是输入文件:dropbox.com/s/witjs2m766n7got/inputmatrix.txt
  • 是的,完全符合我的预期。 Asize 是一个本地数组,return Asize 返回指向其第零个元素的指针。但是函数返回后,Asize 的存储空间就会被释放。指针仍然指向堆栈的某个部分,该部分很快就会被覆盖。返回指向本地数据的指针总是一个坏主意。
【解决方案2】:

问题在于您从 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    相关资源
    最近更新 更多