偶很久没写过程序了,以前做数据库倒文本的时候都用过的。
就是,
var 
  startadd:pointer;
  len:integer;
begin
  getmem(startadd^,100);
  socket.receivebuf(startadd^,len);
end;我现在要写个decode把内存里的这一堆东西转到一个
type
  receivepack = record
    cmdtype:int;
    sjhm:string;
    textlength:short;
    text:string;
  end;
里面去,我知道从这个记录怎么转到buffer,可是怎么变回来?
cmdtype:=startadd^;?这个我知道不对。真的想不起来了,还有就是pointer加一怎么加的啊?我近两年都没写过关于指针的了,都是做数据库开发,涉及到这个都是用inline assemble写的,以前觉得动态数据结构没用,现在知道错了。  

解决方案 »

  1.   

    我改了一下
    type  
       Treceivepack  =  record  
           cmdtype:int;  
           sjhm:string[11];  
       end;  
       preceivepack = ^Treceivepack;
    var    
       startadd:preceivepack;  
       len:integer;  
    begin  
       new(startadd);
       getmem(startadd^,socket.receivelength);  
       socket.receivebuf(startadd^,len);  
    end;  
     
    现在问题是这样,startadd^.cmdtype是对的,可是sjhm还是有错,另外如果不说明string长度的话?就是象我开始那样用一个变量表明字串长,那该怎么办啊?
      

  2.   

    我觉得startadd还是只能用pointer类型,可是该怎么写啊?
    :((
      

  3.   

    new(startadd);//已经给这个指针分配了空间;
    getmem(startadd^,socket.receivelength);//这样再分配没有必要
    我觉得socket中若数据大小正好为 sizeof(Treceivepack),且内容正确那读出应该没有问题。
      

  4.   

    可是,treceivepack是变长的啊,里面有string类型。
    ok,那我说简单一点,我只有一点不记得了
    var
      p:pointer;
    begin
       getmem(p^,socket.receivelength);  
       socket.receivebuf(p^,len);  
    现在怎么把这些数据读出来?
      

  5.   

    不用管那个,就是一个socket.receivebuf保证得到一个完整的数据就可以preceivepack(p)^.sjhm
      

  6.   

    我好像想起来一点了,试试先,如果我没有那个结构体的话,是不是可以这样读一下?
    str:=pchar(p)^;????
      

  7.   

    str:=char(p^)?
    是这样吧?
    可是
    a:byte;
    a:=byte(p^)怎么不对?