Jean SUZINEAU via fpc-pascal said on Mon, 5 Jun 2023 11:56:59 +0200

>Hello, I have a hard time trying to understand what you want to test.
>
>In your functions, you are using a record, not a class or a pointer to 
>record or an object.
>
>The personrecord just behave in your parameters and return value as an 
>Integer or a String, and your fillchar doesn't write outside of the 
>memory allocated for you junkvar, so I don't see what can go wrong.
>
>If you trace the address of person.name like this:
>
>//begin code
>begin
>       person := newperson();
>         writeln('1, person.name address: ',
> IntToHex(Int64(Pointer(@(person.name)))));
>       fillchar(junkvar, junkvar_size, 'a');
>       person2 := newperson();
>       fillchar(junkvar, junkvar_size, 'b');
>       person := modperson(person, 'Martin');
>       person := modperson(person2, 'Maria');
>         writeln('2, person.name address: ',
> IntToHex(Int64(Pointer(@(person.name)))));
>       {writeln(junkvar);}
>       writeperson(person);
>       writeperson(person2);
>end.
>//end code
>
>You'll see that the address doesn't change, for example:
>
>1, person.name address: 000000000050C7F0
>2, person.name address: 000000000050C7F0
>
>
>But if you declare your personrecord as a class, the things doesn't 
>behave the same way:
>
>//begin code
>const
>       junkvar_size = 20000000;
>
>type
>       personclass = class
>       name: string;
>       end;
>var
>       person: personclass;
>       person2: personclass;
>       junkvar: array[1..junkvar_size] of char;
>
>function newperson(): personclass;
>var newp: personclass;
>begin
>      newp:= personclass.Create;
>       newp.name := '';
>       newperson := newp;
>end;
>
>function modperson(person: personclass; name: string): personclass;
>begin
>       person.name := name;
>       modperson := person;
>end;
>
>procedure writeperson(person: personclass);
>begin
>       writeln(person.name);
>end;
>
>begin
>       person := newperson();
>         writeln('1, person.name address: ',
> IntToHex(Int64(Pointer(@(person.name)))));
>       fillchar(junkvar, junkvar_size, 'a');
>       person2 := newperson();
>       fillchar(junkvar, junkvar_size, 'b');
>       person := modperson(person, 'Martin');
>       person := modperson(person2, 'Maria');
>         writeln('2, person.name address: ',
> IntToHex(Int64(Pointer(@(person.name)))));
>       {writeln(junkvar);}
>       writeperson(person);
>       writeperson(person2);
>end.
>//end code
>
>
>You'll get a different address, something like:
>
>
>1, person.name address: 00007FFFF7F910E8
>2, person.name address: 00007FFFF7F91108

Thanks Jean,

The problem I was trying to fix was that I accidentally said:

person := modperson(person2, 'Maria');

instead of 

person2 := modperson(person2, 'Maria');
^^^^^^^  Note the 2

But wait, there's more...

As Travis Siegel pointed out, my method relied on the compiler not to
overwrite RAM of a variable that had gone out of scope, and that's the
highway to heartache. So I was first going to implement a non-OOP
solution using New and Dispose, and then implement an OOP solution. Now
that you provided the OOP solution, I'll make sure I can get your
solution to work, and then go back to the non-OOP solution.

So **THANK YOU** ! ! !

SteveT

Steve Litt 
Autumn 2022 featured book: Thriving in Tough Times
http://www.troubleshooters.com/bookstore/thrive.htm
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to