这段程序报错,谁能帮我看下,谢谢

虎滴小猪猪 2012-09-17 08:50:47
function XinKaiPuDll_GetPIDInfo(A_pInfo: PXinKaiPuDllPIDInfoArr;
var A_sRstMsg: String): Boolean;
var
iRst1,i,iCount: Integer;
pInfo: PXinKaiPuDllPIDInfo;
begin
Result := False;
iRst1 := -1;
New(pInfo);
FillChar(pInfo^,SizeOf(pInfo^),#0);
iRst1 := XinKaiPuDll_CapGetAllSFdetail(pInfo);
if iRst1 > 0 then
begin
iCount := iRst1;
SetLength(A_pInfo^,iCount);
for i := 0 to iRst1 - 1 do
begin
A_pInfo^[i].PID := pInfo^.PID;
StrCopy(A_pInfo^[i].PName,PChar(Trim(pInfo^.PName)));
Inc(pInfo);
end;
Result := True;
end
else
begin
A_sRstMsg := XinKaiPuDll_ErrorMsg(iRst1);
end;
Dispose(pInfo); //执行到这里,释放指针时报‘invalid pointer operation’end;



...全文
196 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
虎滴小猪猪 2012-09-29
  • 打赏
  • 举报
回复
没人帮我啊?5555555
虎滴小猪猪 2012-09-19
  • 打赏
  • 举报
回复
咋改都不行啊。
那我这样说吧。我把调用的函数说明贴出来。谁帮我分析下,写个代码,我看看行不。


typedef struct UserSF
{
long id; //编号
char dsc[32]; //文字描述
}SFINFO;

6.19. 获取客户身份信息
long CapGetAllSFdetail(SFINFO *pINFO)
6.19.1. 功能描述
获取全部身份信息(身份编号、描述)
6.19.2. 参数说明
入口参数
 SFINFO *pINFO 指向客户身份信息结构的指针,参见结构的详细描述。如果为空指针则直接返回系统当前身份信息的总数量。
出口参数
 >0 成功获取信息的数量,信息存放在pINFO中
 -1 调用WebService异常
 -2 调用WebService失败

kaikai_kk 2012-09-19
  • 打赏
  • 举报
回复
不要用Inc(pInfo); StrCopy可以用Move代替或者直接循环数组
5t4rk 2012-09-18
  • 打赏
  • 举报
回复
指针的值都变了,你还dispose啊。。

虎滴小猪猪 2012-09-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
由于你inc(pinfo);导致pinfo移位,所以报错
[/Quote]

我也是这么觉得的,那我应该怎么处理?
iamduo 2012-09-18
  • 打赏
  • 举报
回复
SetLength(A_pInfo^,iCount);
Inc(pSrcInfo);
都感觉很不靠谱。
指针操作?数组操作?
需要谨慎!
lz 试试先内部组织一个非指针的数据,然后再赋值出去。
分成两步以后,错误就好调试了。
虎滴小猪猪 2012-09-18
  • 打赏
  • 举报
回复
function XinKaiPuDll_GetPIDInfo(A_pInfo: PXinKaiPuDllPIDInfoArr;
var A_sRstMsg: String): Boolean;
var
iRst1,i,iCount: Integer;
pInfo,pSrcInfo: PXinKaiPuDllPIDInfo;
begin
Result := False;
iRst1 := -1;
New(pInfo);
FillChar(pInfo^,SizeOf(pInfo^),#0);
iRst1 := XinKaiPuDll_CapGetAllSFdetail(pInfo);
if iRst1 > 0 then
begin
pSrcInfo:= pInfo;
iCount := iRst1;
SetLength(A_pInfo^,iCount);
for i := 0 to iRst1 - 1 do
begin
A_pInfo^[i].PID := pSrcInfo^.PID;
StrCopy(A_pInfo^[i].PName,PChar(Trim(pSrcInfo^.PName)));
Inc(pSrcInfo);
end;
Result := True;
end
else
begin
A_sRstMsg := XinKaiPuDll_ErrorMsg(iRst1);
end;
Dispose(pInfo);
end;


这样写也不行。而且pSrcInfo不用释放吗?
ok1411 2012-09-18
  • 打赏
  • 举报
回复
最好还是:
New(pInfo);
pSrcInfo:= pInfo;
下面全用pSrcInfo代替pInfo进行操作
...
Dispose(pInfo);
ok1411 2012-09-18
  • 打赏
  • 举报
回复
pInfo, pSrcInfo: PXinKaiPuDllPIDInfo;
...
New(pInfo);
pSrcInfo:= pInfo;
...
Dispose(pSrcInfo);
hsfzxjy 2012-09-18
  • 打赏
  • 举报
回复
将pinfo赋值给另一个指针,然后用那个指针操作。永远记住:new()的指针不能直接操作!
hsfzxjy 2012-09-17
  • 打赏
  • 举报
回复
由于你inc(pinfo);导致pinfo移位,所以报错
广州佬 2012-09-17
  • 打赏
  • 举报
回复
....
iRst1 := XinKaiPuDll_CapGetAllSFdetail(pInfo);
....
检查iRst1的值,若<1 ,到函数XinKaiPuDll_CapGetAllSFdetail中去跟。

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧