Chinaunix
标题:
用DEV C++试验下面的程序,得不出正确结果
[打印本页]
作者:
btf001
时间:
2017-07-01 09:12
标题:
用DEV C++试验下面的程序,得不出正确结果
#include <stdio.h>
#include "stdlib.h"
#define va_list void*
#define va_arg(arg, type) *(type*)arg; arg = ((char*)arg + sizeof(type));
#define va_start(arg, start) arg = (void*)((char*)&(start)) + sizeof(start)
int sum(
unsigned char
nr, ...)
{
int i = 0;
int result = 0;
va_list arg = NULL;
va_start(arg, nr);
for(i = 0; i < nr; i++)
{
result += (int)va_arg(arg,
unsigned char
); //有猫腻
}
return (int)result;
}
int main(int argc, char* argv[])
{
printf("%d\n", sum(4, 100,100,100,100));
printf("%d\n", sum(3, 200, 200, 200));
return 0;
}
输出的结果是错误的,但是把unsigned char换成int,又是正确的,上面加粗的字体换成int.
不知道是什么原因。
作者:
Windows19
时间:
2017-07-01 09:27
nonono,问题不是支付方式,而是金额。
你要的这个东西显然已经超出论坛技术讨论的范围,我拍脑袋的估一下差不多要一周左右的工作量,假设你找了一个月薪20000的人帮你做这件事,至少就得掏5000块,而且一般零活的价钱会在月结工资的基础上再向上浮动10~20%。
不知道lz有没有做好掏6000块的心理准备。
作者:
windoze
时间:
2017-07-01 10:41
你单写一个数字它的类型就是int(或者long等等)喽,你得写成'\x64'它的类型才是char。
int的尺寸和char是不一样的,但va_arg并不知道,得你告诉它,你告诉它的是错那当然就不对了。
@Windows19
你真逗,你拍脑袋得多使劲才能拍出一周的工作量?还是赶紧去医院看看吧,晚了怕留后遗症。
作者:
cokeboL
时间:
2017-07-01 17:34
回复
3#
windoze
猫哥你伤害了他
作者:
cokeboL
时间:
2017-07-01 17:34
回复
2#
Windows19
直接放到签名上,每回一帖都带上这段
作者:
bruceteen
时间:
2017-07-03 08:20
对于 void foo( char a, char b )
你认为 &a 和 &b 之间相差 sizeof(char) 吗?不是,而是“至少”相差sizeof(char)。
按照标准,a/b 是扩展到int而后入栈的,所以相差sizeof(int)。
另外,a、b等等还可以是通过寄存器,而非调用栈,来传递。所以你的代码没有可移植性呀,为什么不用 <stdarg.h> 中定义的 va_list 等宏?
作者:
爻易
时间:
2017-07-03 08:52
可变参数是通过栈传递的!根据编译器具体实现,小粒度参数的尺寸大小可能会扩展到32位,所以那些相关的宏也是编译器相关的。
鼓励楼主自主实现的实践尝试,实力是一步步逐渐提高的
作者:
btf001
时间:
2017-07-03 10:08
回复
7#
爻易
谢谢指点。
作者:
btf001
时间:
2017-07-03 10:09
回复
3#
windoze
谢谢高手。
作者:
btf001
时间:
2017-07-03 10:11
回复
6#
bruceteen
谢谢高手。
作者:
btf001
时间:
2017-07-03 10:12
回复
6#
bruceteen
谢谢高手。
作者:
btf001
时间:
2017-07-03 10:14
回复
6#
bruceteen
高手,谢谢。
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2