type
posrecord=record
name:array[1..8] of char;
end bufferarry=array of posrecordvar
fbufferarry:bufferarry;
p:^Posrecord;
i:integer;
recrecord:Posrecord;
begin
setlength(fbufferarry,10); //数组长度为10
//这里省掉把数据加入记录数据的语句
///////////////
getmem(p,sizeof(Posrecord)*10); //为指针分配内存
p:=@fbufferarry; for i:=0 to 9 do
begin
recrecord:=p^;
//这里省掉操作记录的语句
inc(p);
end; freemem(p);
end;
posrecord=record
name:array[1..8] of char;
end bufferarry=array of posrecordvar
fbufferarry:bufferarry;
p:^Posrecord;
i:integer;
recrecord:Posrecord;
begin
setlength(fbufferarry,10); //数组长度为10
//这里省掉把数据加入记录数据的语句
///////////////
getmem(p,sizeof(Posrecord)*10); //为指针分配内存
p:=@fbufferarry; for i:=0 to 9 do
begin
recrecord:=p^;
//这里省掉操作记录的语句
inc(p);
end; freemem(p);
end;
// p:=@fbufferarry;
// 上句改为
p:=@fbufferarry[0]; //取得头一个记录的地址
for i:=0 to 9 do
begin
recrecord:=p^;
//这里省掉操作记录的语句
inc(p);
end; freemem(p); ///释放内存的时候就 显示 无效的指针操作,不懂怎么回事, 上面的取数据操作已经成功了end;
p:=@fbufferarry;yun...你看看你的p指向哪裡取了。fbufferarry中存放的又不是指針是record對象而已 不同釋放。。
如果要
分配多大的内存给 P指针?是sizeof(posrecord)还是 sizeof(posrecord)*10;
那最后使用 finalize(fbufferarry)吗?
inc(p);
变量p在这两个地方改变了FreeMem(p, SizeOf(PosRecord) * 10); //如果p的地址已经改变了,释放当然就会有异常
//分配多少就释放多少
p := @fbufferarry[0]; //这样用不需要在开辟空间
那我应该如何用?我是调用一个BC++做的动态库,如下 typedef BOOL __stdcall (GETDATA)(void* pCommand, void* pDataBuffer, int nSize);
其中 pDatabuffer取得返回的数据,返回的数据都是结构类型,
我转成DELPHI
function getdata(P:pointer;Pbuffer:pointer;nSize:integer):boolean;但老是取不到第二条记录 还有一个问题struct POSRECORD
{
int nInfoID;
int nMoneyCent;
int nBalance;
int nTotalTimes;
int nOperatorNum;
int nYear,nMonth,nDay;
int nHour,nMinute,nSecond;
BOOL bNormal, bCancel;
BOOL bReload;
int nDMAdr;
};这个记录是占用 60个字节的空间的,转成DELPHI只占用52个字节,怎么办?你有Q吗?我加你详细请教一下,谢谢
id:integer;
money:integer;
end;ncount=10
POSRECORD *pRecordBuffer = new POSRECORD[nCount];
POSRECORD *pBuffer = pRecordBuffer;
POSRECORD CardRecord;
gettData(P, pBuffer, nLength);
for(int iLoop = 0; iLoop < nCount; iLoop ++)
{
CardRecord = *(pBuffer ++);上述的代码如何转成DELPHI?
var
pRecordBuffer:array of char; setlength(pRecordBuffer, nLength); //动态分配内存 fgetdata(fdllcall.m_pActReturn, pRecordBuffer, nLength);
for iLoop := 0 to nCount - 1 do
begin
CardRecord := PPOSRECORD(integer(pRecordBuffer)+iLoop*sizeof(POSRECORD))^;
000012,00700,008940,00034,000,2005-03-16,12:55:47,0,0,0,0,001
上面是正确的
001031,00060,005100,00043,000,2005-03-16,12:55:41,0,0,0,0,000
000000,00001,000012,00700,8940,0034-00-2005,03:16:12,1,0,0,1,047
相当于是第一条数据少了01,第二条数据把 第一条数据的01加了进来