视频
ARX博士说-尽管我在2008年没有看到这种行为,也不知道极限是什么。为了测试,我返回了一个119717(任意的,只是生成的)字节的unicode字符串,它在Autolisp中打印得很好。有人对此有什么见解吗,比如这是在哪个版本的AC中更改的?谢了。
步骤1定义一个ADS可调用函数,让它生成一个大字符串并返回它,就像这样(未测试)代码0]
在Autolisp中调用ads函数代码1]
**** Hidden Message ***** 我在06中得到这个
static int ads_ntest(void)
{
const int slen = 2048;
char *x = (char *)malloc(slen*sizeof(char));
memset(x,'z',(slen-1)*sizeof(char));
acedRetStr(x);
free(x);
return (RSRSLT) ;
}
好的,谢谢。至少比503好 2002年也是如此,我敢打赌改变的是-> ARX
看起来它在32位'08版本('07??)中增长到0x66666667(1,717,986,919)。 所以看起来你对Acad 2000-2011很好,我还没有测试Bricscad 2002
我对该值不是百分之百确定,只是在调试中查看了acedRetStr的反汇编,并且有一个“mov eax,666 7h”。看着它收盘,我仍然不确定它有多大,或者这是否是正确的点。
mov eax, 66666667h
imul ebx
sar edx, 2
mov eax, edx
shr eax, 1fh
cmp eax, 1fh
在 267,500,000 到 268,000,000 之间的某个位置是当前计算机的限制。可能与操作系统可以分配内存的一样多。
丹尼尔,仅供参考,您发布的代码对Unicode没有好处。当数组被复制到 ACHAR 时,autolisp 报告的内容是一个巨大的值,这与 unicode 的编码方式有关。 我理解并立即抓住了,但是我将数组填充更改为
_tcsnset(x, _ACRX_T('z'), slen -1);
x = _ACRX_T('\0')
l
,并在接下来的15分钟内试图找出错误。同样,这是Unicode编码规则在起作用,与以前完全相同的错误,只是更加微妙。无论如何,将其更改为此以消除错误。
std::fill(x, x + slen - 2, _T('z'));
x = _ACRX_T('\0'); // edit: ack, did it again. Don't do this. Use the proper accessors, you get the idea.
页:
[1]