[fpc-pascal] Re: Problems with assigning pointers

dhkblaszyk at zeelandnet.nl dhkblaszyk at zeelandnet.nl
Wed Apr 11 16:11:58 CEST 2012


  

Hi Sven en Vincent, 

Thanks for your hints. Indeed the dynamic
array was the problem. I have now replaced it by a linked list of
verts/edges/faces. It now works perfectly. 

Regards, Darius 

On 11 apr
'12, Sven Barth wrote: 

> Am 10.04.2012 22:16, schrieb Vincent
Snijders:
> 
>> Op 10 april 2012 22:06 heeft Darius Blaszyk 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.
> 
> This is indeed the problem.
>

>>> 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);
> 
> Your pointer to v1 is already invalid here, because the second

> "add_vert" already changed the location of the array and thus the new

> pointer locations are also different.
> add_edge(v1, v2); readln;
end. 
> 
>> "TVertex". You then need to do a "New(Result)" in your
"add_vertex" function and add that "Result" to the enlarged array.
Similiary you'll need to do a
> " in some "remove_vertex" procedure.
Regards, Sven _______________________________________________ fpc-pascal
maillist - fpc-pascal at lists.freepascal.org [2]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal [3]

 


Links:
------
[1] mailto:dhkblaszyk at zeelandnet.nl
[2]
mailto:fpc-pascal at lists.freepascal.org
[3]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20120411/e261f98f/attachment.html>


More information about the fpc-pascal mailing list