[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