记录类型的指针问题,,有心者请进,,在线等待,,, ( 积分: 100 )

  • 主题发起人 主题发起人 meet
  • 开始时间 开始时间
M

meet

Unregistered / Unconfirmed
GUEST, unregistred user!
type
p_LICENSE = ^TLICENSE;
TLICENSE = record
Encrypt: string;
end;
type
p_EXCEL_NODE = ^TEXCEL_NODE;
TEXCEL_NODE = record
License: p_LICENSE;
end;
--------------------------------------
var
g_EXCEL_NODE: p_EXCEL_NODE;
List_License: TList;
begin
List_License := TList.Create;
New(g_EXCEL_NODE);
g_EXCEL_NODE^.License^.Encrypt := 'test'; //执行到这条语句会有问题,不知是为什么,是不是没分配内存,应该如何做才能正确,,,,谢谢大家了,,,急啊,,,
List_License.Add(g_EXCEL_NODE.License);
end;
 
type
p_LICENSE = ^TLICENSE;
TLICENSE = record
Encrypt: string;
end;
type
p_EXCEL_NODE = ^TEXCEL_NODE;
TEXCEL_NODE = record
License: p_LICENSE;
end;
--------------------------------------
var
g_EXCEL_NODE: p_EXCEL_NODE;
List_License: TList;
begin
List_License := TList.Create;
New(g_EXCEL_NODE);
g_EXCEL_NODE^.License^.Encrypt := 'test'; //执行到这条语句会有问题,不知是为什么,是不是没分配内存,应该如何做才能正确,,,,谢谢大家了,,,急啊,,,
List_License.Add(g_EXCEL_NODE.License);
end;
 
我按你的代码写了怎么没报错啊,不过最好在最后释放一下
 
type
p_LICENSE = ^TLICENSE;
TLICENSE = record
Encrypt: string;
end;
中把string 改为ShortString类型或者Char数组,string是动态长度的,你这样使用未分配内存,当然报错。
type
p_LICENSE = ^TLICENSE;
TLICENSE = record
Encrypt: ShortString;
end;
 
type
p_LICENSE = ^TLICENSE;
TLICENSE = record
Encrypt: string[255];
end;
 
to bjyplbx:
最后释放,和这个问题没关系,现在不是讨论这个。
编译时是没有错误,你执行了这些代码吗?我都有错啊,,,不可能没错的,,,
 
type
p_LICENSE = ^TLICENSE;
TLICENSE = record
Size: Integer;
Key_Type: Integer;
Encrypt: ShortString;
end;

那如果还有其它数据类型呢,怎么办,能不能把整个记录类型分配内存给它!
 
我真的运行了,没报错
 
to bjyplbx,
thank you,,,,but it is has problem,,,
 
我放在按钮点击事件里:
点第一次 没错
点第二次 没错

点第三次 错了
 
加了这么一句点了号几次都没错,你看是不是可以了呢,这个记录似乎不像类,是不是要分别分配空间呢
New(g_EXCEL_NODE^.License);
 
New(g_EXCEL_NODE^.License); 我试过, 也是不行。。。。

奇怪,把它改成Encrypt: ShortString;或Encrypt: String[255];都不行,,,,

有人回答吗????????急啊,,,,,现在我还在马来西亚,,,,解决不了,不能回国啊,,,,,惨,,,
 
我都能运行10000次不报错了,你到底是不是这里错啊

procedure TForm1.Button5Click(Sender: TObject);
type
p_LICENSE = ^TLICENSE;
TLICENSE = record
Encrypt: string;
end;
type
p_EXCEL_NODE = ^TEXCEL_NODE;
TEXCEL_NODE = record
License: p_LICENSE;
end;
var
g_EXCEL_NODE : p_EXCEL_NODE;
List_License : TList;
i : integer;
begin
for i := 1 to 10000 do
begin
List_License := TList.Create;
New(g_EXCEL_NODE);
New(g_EXCEL_NODE^.License);
try
g_EXCEL_NODE^.License^.Encrypt := 'test'; //执行到这条语句会有问题,不知是为什么,是不是没分配内存,应该如何做才能正确,,,,谢谢大家了,,,急啊,,,
List_License.Add(g_EXCEL_NODE.License);
finally
Dispose(g_EXCEL_NODE^.License);
Dispose(g_EXCEL_NODE);
List_License.Free;
end;
Button5.Caption := inttostr(i);
application.ProcessMessages;
end;
end;
 
这样试过没有:
begin
List_License := TList.Create;
New(g_EXCEL_NODE);
New(g_EXCEL_NODE^.License); //你的少了这句是不行的
g_EXCEL_NODE^.License^.Encrypt := 'test';
List_License.Add(g_EXCEL_NODE.License);
showmessage(g_EXCEL_NODE^.License^.Encrypt); //测试一下
end;
 
Encrypt: pchar;
然后使用时分配内存
 
to bjyplbx:
非常谢谢你,现在没有问题了,有幸认识你(QQ:30881567),我把以下二句写反了,所以有错,,,

New(g_EXCEL_NODE^.License);
New(g_EXCEL_NODE);
 
谢谢大家,,,,
 
用 Encrypt: string[255]; 应该可以,我试了n遍了。
或者这样改:
type
p_LICENSE = ^TLICENSE;
TLICENSE = record
Encrypt: [red]PChar[/red];
end;
type
p_EXCEL_NODE = ^TEXCEL_NODE;
TEXCEL_NODE = record
License: p_LICENSE;
end;
--------------------------------------
var
g_EXCEL_NODE: p_EXCEL_NODE;
List_License: TList;
begin
List_License := TList.Create;
New(g_EXCEL_NODE);
[red] GetMem(g_EXCEL_NODE^.License^.Encrypt, 5);[/red]
g_EXCEL_NODE^.License^.Encrypt := 'test'; //执行到这条语句会有问题,不知是为什么,是不是没分配内存,应该如何做才能正确,,,,谢谢大家了,,,急啊,,,
List_License.Add(g_EXCEL_NODE.License);
//注意释放内存。
end;
 
静态对象的分配与释放由编译器自动处理程序员需要理解这一点但不需要做任何
事情相反动态对象的分配与释放必须由程序员显式地管理相对来说比较容易出错,
所以同意给g_EXCEL_NODE^.License分配空间是必要的。
 
后退
顶部