首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调试运行时堆栈错误,一旦到达主函数的末尾

调试运行时堆栈错误,一旦到达主函数的末尾
EN

Stack Overflow用户
提问于 2012-05-22 22:58:52
回答 3查看 290关注 0票数 1

我已经使用f2c转换器(f2c)将一些遗留的Fortran代码转换为C语言,并在Windows7(64位)上创建了一个Visual Studio10解决方案。我还必须将我的C++程序(test.cpp,包含我的主函数)与f2c库(使用nmake在我的系统上构建)链接起来。

程序会运行,但一旦到达main函数的末尾,我就会收到以下Debug错误:

代码语言:javascript
复制
Stack around the variable 'qq' was corrupted
Stack around the variable 'pf' was corrupted
Stack around the variable 'ampls' was corrupted

我想知道这是否可能是由于f2c转换器在转换后的C(从Fortran)文件中所做的“更正”:

代码语言:javascript
复制
/* Parameter adjustments */
--x1;
--xabs;
--ximag;
--xreal;
--work4;
--work3;
--work2;
--work1;
--ampls;
--pf;
--qq;
--tri;

这看起来有点奇怪,因为所有这些变量都是C数组,我认为f2c程序只是做了一些指针运算,使得数组中的索引0变成了索引1,这与Fortran类似。

我不知道这是否也是由于转换后的代码访问未分配的数组元素时出错所致。

调试和修复此错误的最佳方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-23 00:33:33

潜在原因:

  • 此错误通常与在数组(动态或静态数组)的边界之外写入有关。如果您的指针未设置到正确的位置,则在-ve索引或索引中写入\Geting值可能会发生此错误。>= size_of_array.
  • This错误也会发生。(例如,ptr = 0ptr = 55、指向已删除(已释放;或已释放)内存或任何无效地址)

在我看来,调试你的错误的最好方法是一步一步地调试你的程序,并观察那些指针值。它们一定是出了什么问题。

票数 1
EN

Stack Overflow用户

发布于 2012-05-23 01:33:59

你说的可能是真的。我建议创建一个非常小的程序,它使用一个数组并完全像f2c一样递减指针。就像这样

代码语言:javascript
复制
int aa[10];
int *pa = aa;
--pa;
pa[1] = ...

也就是说,在小范围内测试可疑代码。您可以这样找出问题的原因。(找到解决方法是另一回事)

票数 1
EN

Stack Overflow用户

发布于 2012-05-24 23:23:19

您正在使用crt的调试版本进行编译吗?这可能会给你提供更多的信息。

另外,有没有可能你的库是用C构建的,而你的应用程序是用C++写的?

您提到的那些错误有时是由于不同的调用约定造成的。你确实声明它是一个64位的应用程序,所以它不应该是一个问题(所有的64位应用程序都使用相同的调用约定),但它值得一看。

是否可以将所有fortran转换后的代码添加到visual studio中,而不进行单独的make?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10704625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档