[fpc-devel] Now sure why this raises Runtime Error 216
Michael Van Canneyt
michael at freepascal.org
Fri Jan 7 06:51:22 CET 2022
On Thu, 6 Jan 2022, Ozz Nixon via fpc-devel wrote:
> Procedure Make_Language_File(
> Description,MenuPath,TextPath,QuestPath:String;
> Enabled:Boolean;SecurityLevel:Byte;Flags:Longint);
> Var
> FileSize:Longint;
>
> Begin
> Writeln('Language_File empty size is ',SizeOf(L));
> FileSize:=0;
> Description:=Description+#0;
> Inc(FileSize,Length(Description));
> MenuPath:=MenuPath+#0;
> Inc(FileSize,Length(MenuPath));
> TextPath:=TextPath+#0;
> Inc(FileSize,Length(TextPath));
> QuestPath:=QuestPath+#0;
> Inc(FileSize,Length(QuestPath));
> SetLength(L.Description,Length(Description));
> SetLength(L.MenuPath,Length(MenuPath));
> SetLength(L.TextPath,Length(TextPath));
> SetLength(L.QuestPath,Length(QuestPath));
> Move(Description[1],L.Description,Length(Description));
This code is wrong. That must be
Move(Description[1],L.Description[0],Length(Description));
> Move(MenuPath[1],L.MenuPath,Length(MenuPath));
Same here.
Move(MenuPath[1],L.MenuPath[0],Length(MenuPath));
> Move(TextPath[1],L.TextPath,Length(TextPath));
Same here
Move(TextPath[1],L.TextPath[0],Length(TextPath));
> Move(QuestPath[1],L.QuestPath,Length(QuestPath));
Same here.
Move(QuestPath[1],L.QuestPath[0],Length(QuestPath));
These fields are dynamic arrays, in essence pointers to a memory block.
Your code writes to the memory area for pointer, not to the memory area the pointer points to.
Michael.
More information about the fpc-devel
mailing list