[fpc-devel]Re: [fpc-pascal]Strings vs. Ansistrings
Jonas Maebe
jonas at zeus.rug.ac.be
Thu Sep 21 10:29:48 CEST 2000
>> Could you send me the program? (if it's not > 100kb zipped) Then I'll
>> check it out.
>
>I'm replying off line since there's an attachment...
>
>This program is a little bit of code to try and demonstrate what I mean.
>The syntax is test3 <filename>, where filename is any ASCII text file.
>FYI... I just threw this program together quickly, so don't expect much :
>-)
>
>Here's what I get:
>{$H-} {$H+}
>go32 - works properly go32 - garbage (or nothing)
>win32 - works properly win32 - garbage (or nothing)
The problem is that you are using code which is really shortstring
specific:
***
Size := length (TestData) + 1;
getmem (DataFromFile [CurrentLine - 1],Size);
if DataFromFile [CurrentLine - 1] = NIL then
begin
writeln ('Memory error');
halt (1);
end;
move (TestData,DataFromFile [CurrentLine - 1]^,Size);
***
This can never work with ansistrings. The reason is that with
ansistrings, the compiler does all sorts of things behind the scenes.
Read the part about ansistrings in the reference guide to see how
ansistrings work.
The main reason the above doesn't work with ansistrings, is that
ansistrings are actually pointers themselves, so the move command
overwrites a lot of data. Also, they are automatically reference counted
(the program keeeps track how many ansistring variables point to the same
string and if no ansistring points anymore to a particular string, the
memory the string occupied is freed or reused for another string).
However, by using a "move()" call, you circumvent this reference counting
(the reference counts are updated only when using normal string
assignments etc), which means that everytime you do a readln(testdata),
the previous value you read in is lost.
Ansistrings provide some very nice features (like the reference couting,
automatic (de)allocation of memory etc, but for them to work you have to
play by the rules.
>BTW; are there problems with clreol and win32 targets? I seem to be having
>a situation where the entire line is not beginning cleared. I use window ()
>to create windows, so it may be related to that. The exact same code works
>with go32 targets, so I doubt it's how I wrote it. But you never know... :
>-)
There's probably a bug in the windows crt unit. I don't have windows
though, so I can't check it.
Jonas
More information about the fpc-devel
mailing list