强制类型转换(136分)

  • 主题发起人 主题发起人 kite20020304
  • 开始时间 开始时间
K

kite20020304

Unregistered / Unconfirmed
GUEST, unregistred user!
在delphi中如何实现如下的强制类型转换?
TPINIT *tpinfo;
if ((tpinfo = (TPINIT *)tpalloc("TPINIT", NULL, TPINITNEED(0))) == NULL)

【注:
1、struct tpinfo_t {
char usrname[MAXTIDENT+2]; /* client user name */
char cltname[MAXTIDENT+2]; /* application client name */
char passwd[MAXTIDENT+2]; /* application password */
char grpname[MAXTIDENT+2]; /* client group name */
long flags; /* initialization flags */
long datalen; /* length of app specific data */
long data; /* placeholder for app data */
};
typedef struct tpinfo_t TPINIT;

2、tpalloc在Delphi中的声明为
function tpalloc(types : pChar
subtype : pchar
size : longint): pChar;stdcall;external WTUXWS32_DLL;

 
type TPINIT = record
usrname: array[0..MAXTIDENT+1] of char;
……
flags: cardinal;
……
end;
type PPINIT = ^TPINIT;

var tpinfo: PPINIT ;
tpinfo := PPINIT(tpalloc('TPINIT', nil, 0));
if (tpinfo = nil) then
 
这不是强制类型转换,只是一个指针计算吧。
type
Ptpinfo=^tpinfo_t;//指向这个结构的指针
tpinfo_t= record
usrname:array [0..MAXTIDENT+1] of char;
cltname:array [0..MAXTIDENT+1] of char;
cltname:array [0..MAXTIDENT+1] of char;
grpname:array [0..MAXTIDENT+1] of char;
flags:word;
datalen:word;
data:word;
end;

//假定tpalloc返回的就是这个结构体指针
tpalloc
tpinfo:Ptpinfo;
if ((tpinfo:=tpalloc("TPINIT", NULL, TPINITNEED(0)))= Nil)//其实分2部更好
========
tpinfo:Ptpinfo;
tpinfo:=tpalloc(...);
if (tpinfo=nil) then
...
如果在其他位置用不到这个结构体的话就更简单了。
好像是一个网络程序吧
 
tpalloc返回的是PChar,详见上面的【注:2】
 
没注意:
要是那样的话,用水世界的答案就可以了。
也就是这样:
tpinfo:Ptpinfo;
tpinfo:=ptpinfo(tpalloc(...))就可以了。
if (tpinfo=nil) then
 
定义一个相同的Record即可
 
楼上正解
 
关键是结构定义
Type
Ptpinfo=^tpinfo_t
TpInfo_t=Record
Usrname:array[0..MAXTIDENT+1] of char;
cltname:array[0..MAXTIDENT+1] of char

passwd:array[0..MAXTIDENT+1] of char

grpname:array[0..MAXTIDENT+1] of char;
flags:word;
datalen:word;
data:word;
end
 
就是指针类型的转换吧?
tpalloc函数中把指向分配的空间的指针类型转为PChar指针类型,
调用后,把返回的PChar指针类型再转为真实的指针类型。
 
多人接受答案了。
 
后退
顶部