DLL中对应的调用函数GetItem定义如下:
function GetItem(pvSelect:pointer;nItem:integer):DWORD;cdecl;
//pvSelect参数是一个结构体数组,nItem为结构体的个数。结构体定义如下
type
PP1=^TT1;
TT1= record
wID:WORD;
pValue:pointer;
end;程序如下:
var
S1:array of PP1; //S1为结构体数组
begin
SetLength(S1,2); //结构体个数设置为2个
GetMem(S1[0],Sizeof(TT1));
GetMem(S1[1],Sizeof(TT1)); S1[0].wID=1;
S1[0].pValue:=GetMemory(30);
S1[1].wID=2;
S1[0].pValue:=GetMemory(30); GetItem(@S1[0],2); //目标是传入整个结构体数组,这样一次返回每个结构体的pValue showmessage(strpas(S1[0].pValue));
showmessage(strpas(S1[1].pValue)); FreeMem(S1[0].pValue);
FreeMem(S1[1].pValue);
FreeMem(S1[0]);
FreeMem(S1[1]);
S1:=nil;
end;问题出现在GetItem函数调用时结构体数组传参这里,无论写成@S1,还是@S1[0],都无法返回正确的pValue,
只有写成单个的S1[0]或者S1[1]时,可以正确得到对应的单个pValue,而我的目标是要传入整个结构体数组。
我对数组、指针这些概念比较糊涂,上面程序基本是照葫芦画瓢写出来的,所以不知道什么地方存在问题,
还请大家帮忙看看程序该如何调整,谢谢!
function GetItem(pvSelect:pointer;nItem:integer):DWORD;cdecl;
//pvSelect参数是一个结构体数组,nItem为结构体的个数。结构体定义如下
type
PP1=^TT1;
TT1= record
wID:WORD;
pValue:pointer;
end;程序如下:
var
S1:array of PP1; //S1为结构体数组
begin
SetLength(S1,2); //结构体个数设置为2个
GetMem(S1[0],Sizeof(TT1));
GetMem(S1[1],Sizeof(TT1)); S1[0].wID=1;
S1[0].pValue:=GetMemory(30);
S1[1].wID=2;
S1[0].pValue:=GetMemory(30); GetItem(@S1[0],2); //目标是传入整个结构体数组,这样一次返回每个结构体的pValue showmessage(strpas(S1[0].pValue));
showmessage(strpas(S1[1].pValue)); FreeMem(S1[0].pValue);
FreeMem(S1[1].pValue);
FreeMem(S1[0]);
FreeMem(S1[1]);
S1:=nil;
end;问题出现在GetItem函数调用时结构体数组传参这里,无论写成@S1,还是@S1[0],都无法返回正确的pValue,
只有写成单个的S1[0]或者S1[1]时,可以正确得到对应的单个pValue,而我的目标是要传入整个结构体数组。
我对数组、指针这些概念比较糊涂,上面程序基本是照葫芦画瓢写出来的,所以不知道什么地方存在问题,
还请大家帮忙看看程序该如何调整,谢谢!
1.定义一个结构体:struct info
{
char name[10];
int sex;
char address[50];
int age;
}
2.动态分配空间info * myinfo = new info[5];
3.函数处理//处理结构体数组的函数
int Manage(info * pInfo)
{
// 读写第一个数组元素
pInfo->age = 25; strcpy( pInfo->name , "Tom" ); // 读写第二个数组元素
(pInfo+1)->age = 23; strcpy( (pInfo+1)->name , "Jerry" ); // 后边指针加1即可处理下一个数组元素,但不要超出
...
return 0;
}// 因为此函数传递的是个指针参数,所以直接修改了数据,不要再 return 那个参数了// return 0 ; 只表示函数操作是否满意
4.函数出来后,如果使用完了,记得要释放申请的缓冲区delete [] myinfo;
TT1= record
wID:WORD;
pValue:pointer;
end;我觉得 C的程序里应该是要求 Pvalue也要分配好空间吧,GetItem 方法应该只是给你的空间中返回数据。
看你后面的代码,pValue返回的应该是一个字符串吧。
GetMem(S1[0],Sizeof(TT1));GetMem(S1[1],Sizeof(TT1)); 这两行代码就是错误的,你本意是想做什么??
S1[0].pValue:=GetMemory(30); 你这样分配,pValue指向空间应该和wID:WORD;不是连续的。PP1=^TT1;
TT1= packed record
wID:WORD;
pValue:Array[0..29] of Char;
end;
var
Arr:Array of TT1;
begin
setLength(Arr,2);
Arr[0]:=1;
Arr[1]:=2;
GetItem(@Arr[0],2);
showmessage(Arr[0].pValue);
showmessage(Arr[1].pValue);
setLength(Arr,0); //这样就可以释放了。end;