我不懂 但 我想知道!! str:=chr(ic); //为什么是错的?我怎么没看出错来 //我想完成下面一段错误的代码,要如何修改? for i:=1 to 90 do str:=chr(i);把i改成ic就行了呀 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 str:pchar; 是个指针声明,str没有分配有效的空间,str的内容是随机的。按照你的意思写法应该如下var i:integer; ic:byte; str:pchar;const ix=65;begin ic:=65; new(str); //给str申请空间 str^:=chr(ic); str^:=chr(ix); for i:=1 to 90 do str^:=chr(i); dispose(str); // 释放空间end. 不好意思,没看清str的类型,同意楼上的。 抛开上面的指针的用法错误不提,研究为什么会出现你的那种情况,我从编译生成的指令入手他们的区别就是 ix是常量,ic是变量,我多写了几句c: char;....ic:=65;c:= chr(ic);c:= chr(ix);我看了他们的编译后的机器码ic:= 65; mov byte ptr [ebp-$0d], $41c:= chr(ic); mov al, [epb-$0d]; mov [ebp-$08], alc:= chr(ix); mov byte ptr [ebp-$0e], $41可以看得出来,他把 chr(ix)当作常量操作的,而把chr(ic)当作了变量,但两者的效果是一样的。我又写上了2句str:= chr(ix); // ix 是个conststr:= @c; // 我发现这两句的代码是类似的,就是说进行了相同的操作;str:= chr(ix); mov eax, $0043ef1bc // $0043ef1bc 地址存放的是 const ix=65的数据 mov [ebp-$08], eaxstr:= @c; // mov eax, [ebp-$0e] // ebp-$0e是 c的数据区 mov [ebp-$08], eax从上面的代码可以看出,delphi把 chr(ix)当作常量来看;而 str:= chr(ix) 就变成了 str:= @ix 了。 (我这句语法通不过)这说明delphi会根据情况的不同把 chr(ix) 这句用作不同的用法。 var i:byte; // ic:byte; str:char; //begin ic:=65; //我想完成下面一段错误的代码,要如何修改? for i:=1 to 90 do str:=chr(i);end. 因为pstr是指针类型的,而chr是char类型的,不匹配。记住用指针类型变量,要先分配内存,切记切记!!getmem(pointvar,128);freemem(pointvar); 一觉醒来,又琢磨出点东西,怀疑上面的问题可能根本根本原因在于 pacal的const可以是无类型的,编译器根据需要来定。为了验证我把程序改成这样了const ix:integer= 65; // 显示的定义了 ix 为整形了var str: pchar; ic: integer; c: char;begin new(str); str:= @c; str:= chr(ix); // 这一句编译就过不去了,告诉类型不匹配 dispose(str);看来这回 chr(ix)和char(ic)等效了。 面试的问题,高手指导一下. 超急+在线等:这样的SQL语句如何写? 控件开发中滚动条的问题,那位高手帮忙调试下,500分 vclskin控件怎么用? 如何解决MDI相同的子窗口被重复打开 ★★《资料收集器》又做了些更新了,这可能是最后一次了。。。★★ 各位看看,绑定的问题 怎样获得当前记录的指针?? 请教有关图形图像问题 Delphi的程序,所有的Form都在App中初始化是创建(Application.CreateForm),这样岂不是很耗资源,想在用到时Create,在关闭时释放资源,各位有什么方法??? 一个字符串转换的问题 请问Delphi控件和OCX控件的一些问题?
var
i:integer;
ic:byte;
str:pchar;
const
ix=65;
begin
ic:=65;
new(str); //给str申请空间
str^:=chr(ic);
str^:=chr(ix);
for i:=1 to 90 do
str^:=chr(i);
dispose(str); // 释放空间
end.
研究为什么会出现你的那种情况,我从编译生成的指令入手他们的区别就是 ix是常量,ic是变量,
我多写了几句c: char;
....
ic:=65;
c:= chr(ic);
c:= chr(ix);
我看了他们的编译后的机器码
ic:= 65;
mov byte ptr [ebp-$0d], $41
c:= chr(ic);
mov al, [epb-$0d];
mov [ebp-$08], al
c:= chr(ix);
mov byte ptr [ebp-$0e], $41
可以看得出来,他把 chr(ix)当作常量操作的,而把chr(ic)当作了变量,但两者的效果是一样的。我又写上了2句
str:= chr(ix); // ix 是个const
str:= @c; //
我发现这两句的代码是类似的,就是说进行了相同的操作;str:= chr(ix);
mov eax, $0043ef1bc // $0043ef1bc 地址存放的是 const ix=65的数据
mov [ebp-$08], eax
str:= @c; //
mov eax, [ebp-$0e] // ebp-$0e是 c的数据区
mov [ebp-$08], eax从上面的代码可以看出,delphi把 chr(ix)当作常量来看;
而 str:= chr(ix) 就变成了 str:= @ix 了。 (我这句语法通不过)
这说明delphi会根据情况的不同把 chr(ix) 这句用作不同的用法。
i:byte; //
ic:byte;
str:char; //
begin
ic:=65;
//我想完成下面一段错误的代码,要如何修改?
for i:=1 to 90 do
str:=chr(i);
end.
记住用指针类型变量,要先分配内存,切记切记!!
getmem(pointvar,128);
freemem(pointvar);
ix:integer= 65; // 显示的定义了 ix 为整形了
var
str: pchar;
ic: integer;
c: char;
begin
new(str);
str:= @c;
str:= chr(ix); // 这一句编译就过不去了,告诉类型不匹配
dispose(str);看来这回 chr(ix)和char(ic)等效了。