您的位置:程序门 -> delphi -> windows sdk/api



vc的结构如何用delphi来表示?


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


vc的结构如何用delphi来表示?[已结贴,结贴人:railgunman]
发表于:2007-11-22 18:22:07 楼主
各位高手,在vc中定义了如下结构:
struct   avcstruct
{
char*   char1;
char*   char2;
int   int1;
char*   char3;
};
请问,此结构在delphi中该如何定义?并如何使用?
发表于:2007-11-22 18:45:111楼 得分:30
type
    avcstruct   =   record
        char1   :   pchar;
        char2   :   pchar;
        int1   :   integer;
        char3   :   pchar;
    end;
发表于:2007-11-23 07:34:032楼 得分:8
还要注意对齐.如果vc中使用了对齐的编译控制指令,那么delphi   中要对应成packed   record.
(不过好像这个结构体中的变量都是四个字节的,定义成record   和packed   record没什么关系了。)
type  
        avcstruct       =       packed   record  
                char1       :       pchar;  
                char2       :       pchar;  
                int1       :       integer;  
                char3       :       pchar;  
        end;
发表于:2007-11-23 09:27:173楼 得分:0
我也是那样定义的,但是,我不知道如何给那个record分配内存?
我想问一下,如何给结构的变量分配内存呢?
发表于:2007-11-23 09:42:344楼 得分:5
new
发表于:2007-11-23 10:05:055楼 得分:0
new的话只能创建结构呀,结构里的字符指针怎么给他们分配内存呢?
发表于:2007-11-23 13:05:066楼 得分:0
delphi(pascal) code
type avcstruct = record char1 : pchar; char2 : pchar; int1 : integer; char3 : pchar; end; var strc,strc1 : avcstruct; a1,a2,a3 : array[0..1023] of char; begin //写法1 strc.char1 := @a1; strc.char2 := @a2; strc.char3 := @a3; strc.int1 := 1; dllfunc(avcstruct); //写法2 getmem(strc1.char1,1024); getmem(strc1.char2,1024); getmem(strc1.char3,1024); strc1.int1 := 1; dllfunc(avcstruct1); freemem(strc1.char1); freemem(strc1.char2); freemem(strc1.char3); end;
发表于:2007-11-24 21:26:307楼 得分:0
大哥,不晓得你测试过没有,方式2要报错,测试代码如下:
procedure   testpcharrecord;
var   strc,   strc1:   avcstruct;
    a1,a2,a3   :   array[0..1023]   of   char;
begin
    strc.char1   :=   @a1;
    strc.char2   :=   @a2;
    strc.char3   :=   @a3;
    strc.int1   :=   1;    

    strc.int1   :=   1;
    getmem(strc1.char1,   1024);
    getmem(strc1.char2,   1024);
    getmem(strc1.char3,   1024);

    strc1.char2   :=   '127.0.0.1';
    strc1.char3   :=   'scp';

    freemem(strc1.char1);   //   没有付值,所以在释放内存时没有报错
    freemem(strc1.char2);   //   在此处就报错,错误为:   invalid   pointer   operation
    freemem(strc1.char3);
end;

错误为:   invalid   pointer   operation.
发表于:2007-11-25 11:48:228楼 得分:0
?????
发表于:2007-11-25 20:21:169楼 得分:0
你应该检查一下自己用的对不对
发表于:2007-11-27 11:52:5210楼 得分:0
我就是那样用了的呀。就是调用的过程testpcharrecord。
发表于:2007-11-27 12:47:3511楼 得分:5
定义一下记录
var
    exp   :   tvcstruct;
发表于:2007-11-27 12:49:2012楼 得分:0
在你调用那从新做这些操作试试!
发表于:2007-11-27 14:48:4213楼 得分:0
strc1.char2       :=       '127.0.0.1';  
strc1.char3       :=       'scp';  

手动分配内存以后,不能这样赋值,否则会重新分配内存
发表于:2007-11-30 16:43:2314楼 得分:0
那该怎么赋值呀?用strcpy?
发表于:2007-12-02 13:28:1115楼 得分:0
up
发表于:2007-12-02 14:34:0016楼 得分:12
getmem后,是不能这样赋值的
strc1.char2               :=               '127.0.0.1';      
strc1.char3               :=               'scp';    

因为在内存中已经为变量分配了内存,并且strc1.char2的指针已经指向这块内存区了
所以要用copy的方式往这块内存区拷贝字符了

strcopy,strpcopy等

strpcopy(strc1.char2,'127.0.0.1');


快速检索

最新资讯
热门点击