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