鱼C论坛

 找回密码
 立即注册
查看: 4155|回复: 9

[技术交流] 手动实现一个不定参数函数,(限C语言),有兴趣的进来

[复制链接]
发表于 2012-6-20 22:43:52 | 显示全部楼层 |阅读模式
5鱼币
例如有函数
#include <stdio.h>
int add(int a,...)
{
            int Sum;
            .......
           return Sum;
}
void main()
{
       int sum;
      sum = add(1,2,3,4,5,6,7,8,9,10);
        printf("%d\r\n",sum);
}

要求在实现add函数,参数不定,不允许用第一个参数提供信息,不允许用固定值作为结束符。在_cdecl调用约定下执行不会出现任何问题。l例如如上代码   执行完后返回所有参数的和,例如上面,打印出55.     鱼币只奖励给答案最完美的。

附注:参数可以任意输入,数量不限,当然所有参数之和越界问题不在其内,但是参数传入表达式,变量都要可以。。   

最佳答案

查看完整内容

很无耻地直接翻译3楼代码
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-6-20 22:43:53 | 显示全部楼层
很无耻地直接翻译3楼代码
  1. #include <stdio.h>
  2. int add(int a,...)
  3. {
  4.         int Sum=0;
  5.         int* p = &Sum;
  6.         int i;
  7.         unsigned char* ReturnAddr = (unsigned char*)p[2];
  8.         unsigned char ParaNum = ReturnAddr[2]/sizeof(int);
  9.         for( i=0,p=&a;i<ParaNum;++i ) Sum+=p[i];
  10.         return Sum;
  11. }
  12. void main()
  13. {
  14.         int sum;
  15.         sum = add(1,2,3,4,5,6,7,8,9,10);
  16.         printf("%d\n",sum);
  17. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-21 09:27:51 | 显示全部楼层
:'(  没人回帖。。。。。。。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-6-21 09:47:09 | 显示全部楼层
#include "stdafx.h"

int add(int a,...)
{
        int Sum;
        int tmp;
        _asm
        {
                xor eax,eax
                mov ecx,[ebp+4]
                add ecx,2
                mov al,[ecx]
                mov Sum,eax
        }
        printf("参数有:%d个\n",Sum/4);
    return Sum;
}
void main()
{
    int sum;
    sum = add(1,2,3,4);
        //printf("%d\r\n",sum);
}

算出来参数了,后面的加法自己写吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-21 10:08:35 | 显示全部楼层

犯规了,内嵌汇编了。。还有,如果参数个数超过0xFF/4 的话,就会溢出,导致结果就、异常,:lol。。不过已经对了一半了,若后面再没有完美的答案,就给分了 :lol
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-6-21 10:52:53 | 显示全部楼层
数据是死的,但指针是活的...把你的不定参数作数组,然后传个指针过去就OK了...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-21 12:18:46 | 显示全部楼层
小王子之歌 发表于 2012-6-21 10:52
数据是死的,但指针是活的...把你的不定参数作数组,然后传个指针过去就OK了...

:L,说起来貌似很轻松啊。。。试试呗,参数不限,跟printf函数差不多。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-21 21:27:18 | 显示全部楼层
唉!。。。。。。甲鱼论坛无人能解此题否?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-6-21 21:29:29 | 显示全部楼层
对32位汇编不熟悉,
对于类似add         esp, 8这样的指令,后面数据超过255的机器码不熟悉,故而无法改进,坐等高人。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-21 21:37:32 | 显示全部楼层
仰望天上的光 发表于 2012-6-21 21:25
很无耻地直接翻译3楼代码

不错,不错。。。版主不愧为版主。。。唯一欠缺的就是当参数个数大于0xff/4的时候,结果就不对了,只因为add esp,参数个数*4  这个办法解决可以根据通过判断add这个指令的机器码是0x80还是0x83  80的时候后面的立即数是一个字节,就是你做的这个情况,如果是0x83那么后面就是四个字节。    不过这样的答案已经算是完美了。。。  只是不晓得这个鱼币如何给?  指导下哦
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-21 02:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表