gpt4 book ai didi

c++ - C函数调用参数被扰乱

转载 作者:太空宇宙 更新时间:2023-11-04 12:04:26 25 4
gpt4 key购买 nike

我为此使用了带有 gcc 的 Netbeans,我发现函数参数的值在调用函数和被调用函数之间被破坏了。

在 myfuns.h 中:

float dotprod( float u1, float u2, float u3,  float v1, float v2, float v3 );

在 myfuns.c 中

 float dotprod( float u1, float u2, float u3, float v1, float v2, float v3 )
{
float res= u1*v1+u2*v2+u3*v3 ;
return res;
}

在主程序中

 ...
float dp=dotprod( rx, ry, rz, ddx, ddy, ddz );
...

如果我在 dotprod() 函数中打印 u1、u2 等的值,或者使用debugger,与main.c中rx,ry等的值不同

如果我将参数从 float 转换为 float*,问题似乎就消失了。我也尝试在 6 个浮点参数前后添加一个虚拟整数参数,第一个没问题,但最后一个也被损坏。我花了几个小时试图找出错误。

有什么建议吗?

最佳答案

  1. main() 中所有变量的类型是否指定为float
  2. 调用 dotprod() 的原型(prototype)是否可见?换句话说,您的主文件是否有 #include "myfuns.h"

特别是,对第二个问题回答“否”意味着编译器将对传递的参数做出某些假设,使值具有不同的宽度,或者以不同的方式解释它们。

例如,考虑:

#include <stdio.h>

int main(int argc, char *argv[]) {
float x = 1.5, y = 2.5;
fn (x, y); // <-- compiler makes assumptions.
return 0;
}

void fn (float a, float b) { // <-- compiler should complain
printf ("%f %f\n", a, b); // about bad assumptions.
}

哪些输出:

0.000000 1.937500

这真的不是您所期望的。这是用 gcc 编译的,发出的大量警告应该足以返回并检查代码 (a)

在这种特殊情况下,我的 intfloat 类型的宽度相同(32 位)但是,因为编译器认为该函数接受 int,它将首先将那些 float 转换为该类型。不幸的是,当函数查看堆栈上的那些 int 值时,它将它们解释为 float 类型,它们的编码方式完全不同。

如果您的预期类型和实际类型的宽度不同,情况可能会更糟,因为您可能会发现您尝试使用的数据多于堆栈中的数据。

这个特定的代码示例可以简单地通过插入来修复:

void fn (float, float);

main() 之前(或交换 main()fn() )以便不假定原型(prototype)。这导致 gcc 没有警告和正确的输出:

1.500000 2.500000

基本上,您必须确保调用者和被调用者就传递的参数达成一致。其中包括调用约定、数据类型和参数计数等内容。 其中任何一个不匹配都会给您带来麻烦。


(a): 比如下面的,在我的系统上:

testprog.c: In function ‘main’:
testprog.c:5: warning: implicit declaration of function ‘fn’
testprog.c: At top level:
testprog.c:9: warning: conflicting types for ‘fn’
testprog.c:5: note: previous implicit declaration of ‘fn’ was here

关于c++ - C函数调用参数被扰乱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12793904/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com