取记录Record的问题(100)

  • 主题发起人 主题发起人 own_delphi
  • 开始时间 开始时间
O

own_delphi

Unregistered / Unconfirmed
GUEST, unregistred user!
记录类型为 delphi SegmentContentInfoTag = record nSegmentIndex : integer; nConentId : integer; nNoteIndex : integer; nDataLen : integer; pdata : array[0..1024-1] of char; end; pSegmentContentInfoTag = ^SegmentContentInfoTag;C++原型结构typedef struct SegmentContentInfoTag{ unsigned int nSegmentIndex; int nConentId; int nNoteIndex; int nDataLen; char *pdata; } SegmentContentInfo;我写的循环取数据如下:第一个取出没有问题,但是下一个就无法获取function GetSegment(aContentID : integer): Boolean;var SegInfo : pSegmentContentInfoTag; nSegmentNumber : pinteger; iNumber,i,j,iSeg : integer; bSeg : Boolean; s,sall : String; seg : pchar; iDataLen : integer;begin new(nSegmentNumber); SegInfo := AllocMem (1024*2); iDataLen := 0; bSeg := GetContentInfo(aContentID,nSegmentNumber,SegInfo);//Dll中C的方法, if (bSeg) then begin iNumber := nSegmentNumber^; for i:= 1 to iNumber do begin iSeg := SegInfo^.nDataLen; for j :=0 to iSeg-1 do begin s := SegInfo^.pdata[j]; sall := sall+s; end; sall := Copy(sall,1,iSeg); inc(SegInfo,4);//这里有问题 end; end; Dec(SegInfo, iNumber*4); FreeMem(SegInfo, 1024*2); dispose(nSegmentNumber);end;
 
SegInfo是你在当前过程中开辟的内存首地址,物理位置不定,你执行 inc(SegInfo,4);后,谁能知道这个变量指到哪里去了?当然由于GetContentInfo函数的功能对别人来说不清楚,也会导致很难理解你函数的功能。
 
你的DELPHI表示和C++表示并不完全一致char *pdata; 不能翻译成 pdata : array[0..1024-1] of char;
 
不错,但是如果翻译成pdata:PChar,也报错
 
procedure TForm1.btn1Click(Sender: TObject);var ArrChar: PChar; PInt: PInteger; iNum: Integer; I: Integer;begin ArrChar := AllocMem(20); try PInt := @ArrChar[0]; iNum := 0; repeat PInt^ := iNum; // 赋值; Inc(PInt); Inc(iNum); until iNum * SizeOf(PInt^) >= 20; PInt := @ArrChar[0]; for i := 0 to iNum -1 do begin memo1.lines.add(IntToStr(PInt^)); Inc(PInt); end; finally FreeMem(ArrChar); end;end;Inc 操作类型指针时, 关键在于 指针对应的类型结构大小....
 
SegInfo 是指针Inc(SegInfo,4); // 这里确定有问题!!!不好怎么表达, 举个例子来说.
 
这样试试type PSegmentContentInfoTag = ^SegmentContentInfoTag; SegmentContentInfoTag = packed record nSegmentIndex: integer; nConentId: integer; nNoteIndex: integer; nDataLen: integer; pdata: PChar; end;function GetContentInfo(ID: Integer; SegNum: PInteger; Buf: Pointer): Boolean; stdcall; external 'aaa.dll';function GetSegment(aContentID: integer): string;var s: string; i, nSegmentNumber: Integer; SegInfo: pSegmentContentInfoTag;begin Result := ''; SegInfo := AllocMem(1024 * 2); if GetContentInfo(aContentID, @nSegmentNumber, SegInfo) then begin for i := 0 to nSegmentNumber - 1 do begin SetString(S, SegInfo^.pdata, SegInfo^.nDataLen); Result := Result + S; Inc(SegInfo); end; end; FreeMem(SegInfo);end;
 
function GetSegment(aContentID : integer): Boolean;var SegInfo : pSegmentContentInfoTag; nSegmentNumber : pinteger; iNumber,i,iSeg : integer; bSeg : Boolean; s,sall : String;begin New(nSegmentNumber); try SegInfo := AllocMem(1024*2); try bSeg := GetContentInfo(aContentID,nSegmentNumber,SegInfo);//Dll中C的方法, if (bSeg) then begin iNumber := nSegmentNumber^; for i:= 1 to iNumber do begin s := ''; iSeg := SegInfo^.nDataLen; if iSeg > 0 then begin SetString(s, SegInfo^.pdata, SegInfo^.nDataLen); sall := sall + s; end; Inc(SegInfo); // 这样既可 end; end; Dec(SegInfo, iNumber); finally FreeMem(SegInfo, 1024*2); end; finally Dispose(nSegmentNumber); end;end;
 
可能导致出错的几个原因:1、SegmentContentInfoTag的定义因为不知道你在C中结构体的对齐方式是怎样的,如果是字节对齐就应该是如同 QQ在线 所描述的type PSegmentContentInfoTag = ^SegmentContentInfoTag; SegmentContentInfoTag = packed record nSegmentIndex: integer; nConentId: integer; nNoteIndex: integer; nDataLen: integer; pdata: PChar; end;2、没有见到GetContentInfo的C描述,不知道Delphi中定义是否准确3、关于SegmentContentInfoTag的pdata,因为不知GetContentInfo的实现, 不能确定是否需要预先分配内存
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
418
import
I
后退
顶部