C 语言 函数参数传递 值传错
问题具体如下:有个函数AB(float,float,int,int)第一:我使用的是一些局部变量在其生存周期内使用他们,调用AB(...)但是进入函数后参数a,b,c并不...
问题具体如下:
有个函数AB(float, float, int, int)
第一:
我使用的是一些局部变量在其生存周期内使用他们,调用AB(...)
但是进入函数后 参数a,b,c并不 全 是我使用的变量的值。
第二:
我使用常量测试函数如“AB(10.0,20.0, 1, 50)
传进函数后参数a,b,c ,d 并 不 全 是10.0 20.0.......
补充:
1.我已经检测过汇编后的情况,地址偏移没出错,而且参数使用正确(请不要怀疑我传了地址- -!)
2. 传错的值一般都是 2#-en10 之类的 展开
有个函数AB(float, float, int, int)
第一:
我使用的是一些局部变量在其生存周期内使用他们,调用AB(...)
但是进入函数后 参数a,b,c并不 全 是我使用的变量的值。
第二:
我使用常量测试函数如“AB(10.0,20.0, 1, 50)
传进函数后参数a,b,c ,d 并 不 全 是10.0 20.0.......
补充:
1.我已经检测过汇编后的情况,地址偏移没出错,而且参数使用正确(请不要怀疑我传了地址- -!)
2. 传错的值一般都是 2#-en10 之类的 展开
4个回答
展开全部
你说的太含糊了,我不能判断出问题。
类似的问题常见于缓冲区溢出,参数传递不正确,比如上下文中存在scanf或者printf的情况。
其他的情况也有见过,但是描述的实在看不懂。
还有些是变量重名。
汇编码如果没有错那除非CPU或者内存坏了。这个我也遇上过几次,不过挺少见的。
如果是硬件问题内存>总线>CPU。软件问题更多。
一般都是编程者自己的问题,也有少数编译器编译错误,不过一般混合时容易出错。
你要是想详细了解直接把出错的全部代码贴出来看看就可以了,这样问浪费大家时间。
大多数都是一些比较简单的问题。
类似的问题常见于缓冲区溢出,参数传递不正确,比如上下文中存在scanf或者printf的情况。
其他的情况也有见过,但是描述的实在看不懂。
还有些是变量重名。
汇编码如果没有错那除非CPU或者内存坏了。这个我也遇上过几次,不过挺少见的。
如果是硬件问题内存>总线>CPU。软件问题更多。
一般都是编程者自己的问题,也有少数编译器编译错误,不过一般混合时容易出错。
你要是想详细了解直接把出错的全部代码贴出来看看就可以了,这样问浪费大家时间。
大多数都是一些比较简单的问题。
追问
这个,,请参考楼上的例子,,反正用就是这么用他的,,他是个项目,没法粘代码,见谅、、、
这个变量重名是没有的哈,,,而且打了个 数度写断点,到进函数都没停过的,,
真心觉得奇葩。。因为AB()其他地方也用过,但是没出这总问题
追答
我觉得没什么新鲜的,很正常,我只能说因为没有上下文判断起来太困难。
而且关键是费了很大劲判断出来,可能也没什么价值。
因为有些情况,比如某事故损失几亿元人民币,由于事故很难重新来过。
只能靠猜,然后试验的方式去调查。这样弄上几天还是有价值的,可以避免未来发生同样的悲剧。
个人来说,最好是避免悲剧,而不是发生了悲剧再来调查。因为你没有更多技术细节,不想花功夫去弄了。
最关键的是你根本没说出你的疑问是什么,也没有错误的程序。就一个2#-en10想说明什么?
浮点数里1#XX,2#XX每个环境都不一样,一般是浮点数的转换问题,也可能是计算问题,还可能是数值转换……
如果你觉得程序没有写错,可以尝试关闭全部的优化试验一下。反正编译器的错误还是满常见的,就是对于写程序比较少的人见得不多,而且一般比较困惑。即使有很多年调试编译器的经验,有时也很难改正编译器的错误,毕竟那些程序太复杂了。
展开全部
这就是浮点数的精度问题。多了解下浮点数在计算机的存储方式就明白了。
显然要避免浮点数传值,因为在不同精度下值会稍微不同。
就你这个问题而言。
函数形参类型为float,而实参你传的是10.0,请问10.0的类型是什么?
由于你没指定类型,它会默认转换为double型。
不同精度的浮点数的传递不完全一样是正常的。
所以这样传值AB(10.0f,20.0f, 1, 50)
显然要避免浮点数传值,因为在不同精度下值会稍微不同。
就你这个问题而言。
函数形参类型为float,而实参你传的是10.0,请问10.0的类型是什么?
由于你没指定类型,它会默认转换为double型。
不同精度的浮点数的传递不完全一样是正常的。
所以这样传值AB(10.0f,20.0f, 1, 50)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
楼主问的问题太含糊了,至少也要列出操作系统版本,编译器版本,是否多线程等相关信息吧
另外,传进去的参数类型是float,那个“2#-en10”楼主是怎么得到的,就算传错也应该是一个数值啊
另外,传进去的参数类型是float,那个“2#-en10”楼主是怎么得到的,就算传错也应该是一个数值啊
追问
win 64 vs2010 单线程 多次调用过,其他地方都没错,,,,次函数没被指针函数过
“2#-en10” 打断点 在进入AB函数后, 里面的一个参数(出错不一定是某一个参数a,b,c...都可能错) 看到的
追答
在调用函数AB的语句那里下断点,截图看看准备传进去的参数是否已经被改变
在函数AB的第一个语句那里下断点,截图看看传进去的参数是啥样
yl62803112说的是有道理的,缺省的浮点数常量是double类型的,也请考虑
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
看来你的思维挺活跃的。那么就点播你一下。
你的函数AB(float,float,int,int),在调用的时候用AB(10.0,20.0, 1, 50)去调用,程序没错,确实可以调用,因为类型和参数个数是符合语法要求的。但是有一点,虽然调用成功了,那几个数压根就没有用,因为没形参。就是你的那几个数10.0,20.0, 1, 50,没有赋值给变量。也就是在函数体是使用不到这个值的。如果你这样定义:AB(float a,float b,int c ,int d),那结果就不一样了。
我是根据经验来跟你解释的,可能不是很权威。我写函数的时候,都会把形参定义好,而不是直接确定参数类型就OK了。
你的函数AB(float,float,int,int),在调用的时候用AB(10.0,20.0, 1, 50)去调用,程序没错,确实可以调用,因为类型和参数个数是符合语法要求的。但是有一点,虽然调用成功了,那几个数压根就没有用,因为没形参。就是你的那几个数10.0,20.0, 1, 50,没有赋值给变量。也就是在函数体是使用不到这个值的。如果你这样定义:AB(float a,float b,int c ,int d),那结果就不一样了。
我是根据经验来跟你解释的,可能不是很权威。我写函数的时候,都会把形参定义好,而不是直接确定参数类型就OK了。
更多追问追答
追问
亲,我偷了下懒,,,我定一的是AB(float a,float b,int c ,int d),,,
比如哈:
float x,y;
int r,g,b;
变量赋值。。。。
AB(x,y, r,g,b); 或者 AB(10.0,20.0, 1, 50);
这样传,进去后参数都会错
追答
我问下,是编译的时候出错还是运行的 时候出错啊?
你直接在AB里输出a,b,c,d,看看,看是不是结果是不是对的。可以结图过来吗?你
来自:求助得到的回答
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询