[fpc-pascal] Re: Problems with assigning pointers

Vincent Snijders vincent.snijders at gmail.com
Tue Apr 10 22:16:18 CEST 2012


Op 10 april 2012 22:06 heeft Darius Blaszyk <dhkblaszyk at zeelandnet.nl>
het volgende geschreven:
> Here's a minimal example that has the bug. First of all the first output is wrong as it says 0,50 instead of 20,50 (so the x item is overwritten). The second printed output differs from the first, so again the x item is overwritten. I'm clueless.
>
> program test;
>
> {$mode objfpc}{$H+}
>
> type
>  TVertex = record
>    x: double;
>    y: double;
>  end;
>  PVertex = ^TVertex;
>
>  TEdge = record
>    v1: PVertex;
>    v2: PVertex;
>  end;
>
> var
>  vert_count: integer = 0;
>  vert_list: array of TVertex;
>  edge_count: integer = 0;
>  edge_list: array of TEdge;
>
> function add_vert(x, y: double): PVertex;
> begin
>  Inc(vert_count);
>  SetLength(vert_list, vert_count);
>
>  vert_list[vert_count - 1].x := x;
>  vert_list[vert_count - 1].y := y;
>
>  Result := @vert_list[vert_count - 1];

I think this is not correct. If you increase the size of vert_list,
then the array may be relocated and Result isn't a valid pointer
anymore.

> end;
>
> procedure add_edge(v1, v2: PVertex);
> begin
>  Inc(edge_count);
>  SetLength(edge_list, edge_count);
>
>  WriteLn(v1^.x,' ',v1^.y); // this
>  edge_list[edge_count - 1].v1 := v1;
>  WriteLn(v1^.x,' ',v1^.y); // outputs the same thing as this
>  edge_list[edge_count - 1].v2 := v2;
> end;
>
> var
>  v1: PVertex;
>  v2: PVertex;
>
> begin
>  v1 := add_vert(20, 50);
>  v2 := add_vert(220, 50);
>
>  add_edge(v1, v2);
>
>  readln;
> end.
>

Vincent



More information about the fpc-pascal mailing list