str:=chr(ic);  //为什么是错的?
我怎么没看出错来
 
//我想完成下面一段错误的代码,要如何修改?
   for i:=1 to 90 do
      str:=chr(i);
把i改成ic就行了呀

解决方案 »

  1.   

    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.
      

  2.   

    不好意思,没看清str的类型,同意楼上的。
      

  3.   

    抛开上面的指针的用法错误不提,
    研究为什么会出现你的那种情况,我从编译生成的指令入手他们的区别就是 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) 这句用作不同的用法。
      

  4.   

    var
       i:byte;       //
       ic:byte;
       str:char;     //
    begin
       ic:=65;
       //我想完成下面一段错误的代码,要如何修改?
       for i:=1 to 90 do
          str:=chr(i);
    end.
      

  5.   

    因为pstr是指针类型的,而chr是char类型的,不匹配。
    记住用指针类型变量,要先分配内存,切记切记!!
    getmem(pointvar,128);
    freemem(pointvar);
      

  6.   

    一觉醒来,又琢磨出点东西,怀疑上面的问题可能根本根本原因在于 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)等效了。