Op 10 april 2012 22:06 heeft Darius Blaszyk <dhkblas...@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
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to