为什么会出错,MOVE....

hansion3406 2004-08-24 08:53:13
首先我说说,我没用过指针..呵呵,我下面要做的是..
type
PFuck = ^TFuck;
TFuck = Record
Name : String;
Age : Integer;
Phone : String;
NickName : String;
end; 搞出个结构..
var
Form1: TForm1;
FArr : array of Byte;
Fuck : TFuck; 申明这两个全局变量(因为我只是要传,所以干脆用全局)
然后
Move(Fuck,FArr,SizeOf(Fuck)); 想把TFUCK这个结构放到我的动态数组
var MyFuck :TFuck;
Move(FArr,MyFuck,SizeOf(TFuck)); 再把这个数组放到一个TFUCK结构中.

程序在没有关闭的时候都不会有错..但程序只要一关..SHIT,就立马寻址出错..
但是我同事..她改成
TFuck = Record
Name : String[10];
Age : Integer;
Phone : String[15];
NickName : String[20];
end; 这个改成定长的..
FArr : array[1..49] of Byte; 也不用动态数组..
这样一下就不会出错了...唉..可是这个不是我想要的..
各位老大们谁知道为什么的..我实在想不通..特别是程序在运行的时候不会错..关闭才错.
...全文
345 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
hansion3406 2004-08-26
  • 打赏
  • 举报
回复
呵..根本就不是这个问题...
算了..我还是结帐吧..谢谢大家了.
BigAngell 2004-08-25
  • 打赏
  • 举报
回复
学习
jinjazz 2004-08-25
  • 打赏
  • 举报
回复
关闭程序的时候没有异常
jinjazz 2004-08-25
  • 打赏
  • 举报
回复
不明白你是怎么看的,我没把握的问题一般都是经过测试的

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
PFuck = ^TFuck;
TFuck = Record
Name : String;
Age : Integer;
Phone : String;
NickName : String;
end;
var
Form1: TForm1;
FArr : array of Byte;
Fuck : TFuck;
implementation

{$R *.dfm}



procedure TForm1.Button1Click(Sender: TObject);
var MyFuck:Tfuck;
begin
setLength(Farr,sizeof(Tfuck));
Move(Fuck,FArr[0],SizeOf(Fuck));

Move(FArr[0],MyFuck,SizeOf(TFuck));

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
fuck.Name:='cheng x 扁';
fuck.Age:=high(integer);
fuck.Phone:='110';
fuck.NickName:='阿扁';
end;

end.
hansion3406 2004-08-25
  • 打赏
  • 举报
回复
你看一下有没有问题.

兄弟..你要试过MOVE完再说..我是不怎么会用指针啦..呵呵.
wizardqi 2004-08-25
  • 打赏
  • 举报
回复
动态数组有其独特的存贮结构,一般不要使用物理内存拷贝,你使用指针可能好点儿.
再者,结构应尽量确定大小,尤其是包含诸如String类型的变量,它的位置和长度是动态的。
hansion3406 2004-08-25
  • 打赏
  • 举报
回复
嗯..好办法.FARR[0]
这样做一下就有分配到内存了..

我下午再仔细看看..
kaguo 2004-08-24
  • 打赏
  • 举报
回复
move一個引用地址后,等到释放时候,因为大小的错误判断,可能就出错了
你要move 先算出正确的长度,再Move
Move回来的时候也是一样,先知道正确的长度才行。
BTW:怎么全是星星,都不敢说话拉,(>_<!)
beyondtkl 2004-08-24
  • 打赏
  • 举报
回复
MK.
还是 char数组好. char指针更好
aiirii 2004-08-24
  • 打赏
  • 举报
回复
問題在你聲明的 String; 上, 這個是一個引用而已, 你move還是move一個引用地址而已,在同個進程中, 字符還是在的, 但可能會出現一些錯誤


但是我同事..她改成
TFuck = Record
Name : String[10];

我也是建議改成這樣, 比較簡單
hkbarton 2004-08-24
  • 打赏
  • 举报
回复
取决于string类型的内存管理方式,widestring应该是在堆上分配的,这个时候string的变量是一个指针,所以sizeof后不是实际的size,而定长的shortstring就可以取得size,记得在一本书上也专门说过这个问题,不过不是记得很清楚了,也不知道说的对不对。如果一定要实现不定长的话看一看用array of char,然后动态分配长度可以不?
hansion3406 2004-08-24
  • 打赏
  • 举报
回复
为什么定长就不会出错..而不定长就会出错..为什么..
hansion3406 2004-08-24
  • 打赏
  • 举报
回复
谁能给我解释一下为什么
hansion3406 2004-08-24
  • 打赏
  • 举报
回复
呼,那不是有跟没有一样嘛..我就是要实现不定长的..呵呵..难道我得用数组在里面?
抱朴守拙 2004-08-24
  • 打赏
  • 举报
回复
type
PFuck = ^TFuck;
TFuck = Record
Name : String;
Age : Integer;
Phone : String;
NickName : String; //////////因为你的成员都没有固定大小
end; 搞出个结构..

Move(Fuck,FArr,SizeOf(Fuck)); /////////所以在SizeOf时取出的并不是此结构的真实大小,所以出错,当然改成固定大小就没问题了
Move(FArr,MyFuck,SizeOf(TFuck)); 再把这个数组放到一个TFUCK结构中.
luke5678 2004-08-24
  • 打赏
  • 举报
回复
哈哈!
jinjazz 2004-08-24
  • 打赏
  • 举报
回复
rpwt,delphi可能集成了反黄系统,哈哈
jinjazz 2004-08-24
  • 打赏
  • 举报
回复
不指定长度当然不能用farr[0]了,而且指定为SizeOf()也没有什么问题啊
hansion3406 2004-08-24
  • 打赏
  • 举报
回复
再回一句,不管是不是压缩的结构..都是会错..不指定数组长度的话..

算了..我还是用指定数组长度吧..呵呵.
这个贴还贴吧..看谁有没有什么好的办法的..呵呵..这样做实在不太是我想要的
hansion3406 2004-08-24
  • 打赏
  • 举报
回复
如果数组长度指定的话..呵呵..早就可以了..只要在接收方指定长度的数组就可以了..只要不小于那个数组的长度..不管结构内是不是指针..

但是,还是很谢谢大家..
加载更多回复(2)

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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