明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2897|回复: 10

[求助]在ADS內,當一個指令執行完後,會有一個nil的返回值,如何去除?

[复制链接]
发表于 2003-2-17 23:32:00 | 显示全部楼层 |阅读模式
发表于 2003-2-18 09:34:00 | 显示全部楼层

Re:

可能我没能理解你的意图。
ADS函数的返回值用于检查函数执行过程是否正确,你若认为不需要用它,完全可以不去理会它。不知道为什么要去除它?
void MyADSCommand(...)  //函数参数表略
{
  ads_command(...);
}
这样好象ads_command()函数返回的int值就不会起作用了。
更好例子你可以用ObjARXWiz向导生成一段ARX示例代码,其中的AddCommand()函数就是引用了acedRegCmds->addCommand()函数,并忽略返回值。
 楼主| 发表于 2003-2-18 11:14:00 | 显示全部楼层

在ADS中,自己的函數調用是通過一個表,其中的細項為{"c:mycmd", mycmd_main}...

當在指令行輸入mycmd後,會調用mycmd_main,當然要先聲明int mycmd_main(struct resbuf *rb);在mycmd_main內,如果沒有用ads_rtnil或其他的返回函數,程序執行到最後,會在指令行自動返回nil,結果為"Command:mycmdnil",
不知能否明白!
发表于 2003-2-18 11:19:00 | 显示全部楼层

能否将mycmd_main()函数声明为void?

发表于 2003-2-18 13:26:00 | 显示全部楼层

[建议]

本帖最后由 作者 于 2003-2-18 13:26:15 编辑

用以下语句:
int mycmd_main(struct resbuf *rb)
{
...
  return RTNORM;
}
 楼主| 发表于 2003-2-18 14:21:00 | 显示全部楼层

不行,在{"c:mycmd",mycmd_main}裡,第二個是函數指針,它的返回類型只能是int

 楼主| 发表于 2003-2-18 14:22:00 | 显示全部楼层

不行的,本來對於int mycmd_main(...)函數,最後的返回值就是你所寫的,但就是在指

不行的,本來對於int mycmd_main(...)函數,最後的返回值就是你所寫的,但就是在指令行會顯示nil[br]
发表于 2003-2-18 16:06:00 | 显示全部楼层

贴上你的程序,让大伙看看?我怎么未遇上这种事?

 楼主| 发表于 2003-2-19 16:35:00 | 显示全部楼层

請各位看看原程序......

//以下以SDS或sds開頭的函數、變量、常量是和ads相應的,如sds_resbuf=resbuf,sds_link=ads_link,執行後,在指令行會有“mycmdnil"

//-----------------------------------------------------------------------------
#define ARRAYELEMENTS(array) (sizeof(array)/sizeof((array)[0]))
struct func_def
{
        char *func_name;
        int (*func) (struct sds_resbuf *);
};

int mycmd_main(resbuf *rb);
static struct func_def func_table[] =        
{
        {"c:mycmd", mycmd_main}
};

int main(int, char **);
int invokefun(void);
int funcload(void);


int main(int argc, char** argv)
{
        short scode = RSRSLT;             // Normal result code (default)
        int stat;
        char errmsg[80];
       
        ads_init(argc, argv);             // Open communication with lisp
       
        for ( ;; )
        {                      // Request/Result loop
                if ((stat = sds_link(scode)) < 0)
                {
                        sprintf(errmsg, "Templt: bad status from sds_link() = %d\n", stat);
                        sds_printf(errmsg);
                        sds_exit(-1);
                }
                scode = RSRSLT;               // Reset result code
               
                switch (stat)
                {
                        case RQXLOAD:                 // Load & define functions
                                scode = funcload() == RTNORM ? RSRSLT : RSERR;
                                break;
                        case SDS_RQXUNLD:
                                break;
                        case RQSUBR:                  // Handle external function requests
                                scode = invokefun() == RTNORM ? RSRSLT : RSERR;
                                break;
                        case SDS_RQSAVE:
                                break;
                        case SDS_RQEND:
                                break;
                        case SDS_RQQUIT:
                                break;
                        case SDS_RQCFG:
                                break;
                        case SDS_RQHUP:
                                break;
                        case SDS_RQXHELP:
                                break;
                        default:
                                break;
                }
        }
        return(1);
}

static int funcload()
{
        short i;
       
        for (i = 0; i < ARRAYELEMENTS(func_table); i++)
        {
                if (!ads_defun(func_table.func_name, i))
                        return RTERROR;
        }
       
        return RTNORM;
}

static int invokefun()
{
        struct sds_resbuf *rb;
        int val;
       
        if ((val = sds_getfuncode()) < 0 || val >= ARRAYELEMENTS(func_table))
        {
                sds_fail("收到不存在的函數代碼.");
                return RTERROR;
        }
       
        rb = sds_getargs();
       
        val = (*func_table[val].func)(rb);
        sds_relrb(rb);
        return val;
}

//////////////////////////功能函數//////////////////////////////////

int mycmd_main(resbuf *rb)
{
        ads_alert("in");
        return RTNORM;       
}
发表于 2003-2-21 14:12:00 | 显示全部楼层

将回显变量cmdecho设为0试试。

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 12:29 , Processed in 0.290936 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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