1

我使用 f2c 转换器 (f2c) 将一些旧的 Fortran 代码转换为 C,并在 Windows 7(64 位)上创建了 Visual Studio 10 解决方案。我还必须将我的 C++ 程序(test.cpp,包含我的 main 函数)与 f2c 库(使用 nmake 在我的系统上构建)链接起来。

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

Stack around the variable 'qq' was corrupted
Stack around the variable 'pf' was corrupted
Stack around the variable 'ampls' was corrupted

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

/* Parameter adjustments */
--x1;
--xabs;
--ximag;
--xreal;
--work4;
--work3;
--work2;
--work1;
--ampls;
--pf;
--qq;
--tri;

这似乎有点奇怪,因为所有这些变量都是 C 数组,而且我认为 f2c 程序只是在做一些指针运算,以便数组中的索引 0 变为索引 1,与 Fortran 类似。

我不知道这是否也可能是由于转换后的代码访问尚未分配的数组元素时出现问题。

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

4

3 回答 3

1

潜在原因:

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

在我看来,调试错误的最佳方法是逐步调试程序并观察这些指针值。他们一定有什么问题。

于 2012-05-22T16:33:32.687 回答
1

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

int aa[10];
int *pa = aa;
--pa;
pa[1] = ...

即小规模测试可疑代码。您可以通过这种方式隔离问题的原因。(找到解决方法是另一回事)

于 2012-05-22T17:33:59.420 回答
1

您是否使用 crt 的调试版本进行编译?这可能会给你更多的信息。

此外,您的库是否有可能是用 C 构建的,而您的应用程序是用 C++ 编写的?

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

是否可以将所有 fortran 转换的代码添加到 Visual Studio 而不是单独制作?

于 2012-05-24T15:23:19.213 回答