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