Re: [fpc-pascal] more questions on storage

2007-09-26 Thread Michael Van Canneyt


On Wed, 26 Sep 2007, Marc Santhoff wrote:

 Hi,
 
 having this definition:
 
 
 {$mode objfpc}
 {$longstrings on}
 type
   cmpstr = record
   ID: integer;
   Name: string;
   Value: single;
   end;
 
 var
   buf: array [0..MAX] of cmpstr;
 
 How does the memory layout of the buffer look like?
 
 I tried to get there with ddd but I couln't find out how the string
 inbetween is put into memory. For atomic types (integer, single) it's
 pretty clear, but longstrings do have a variable size. How is the buffer
 set up?

Longstrings are not working correctly. You should use ansistrings or
shortstrings.

Michael.
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


[fpc-pascal] fpc 2.2.0 win32_arm-linux cross-compiler issue

2007-09-26 Thread Paul Nicholls
Hi all,
I have downloaded the freepascal 2.2.0 fpc source code (
fpcbuild-2.2.0.zip) and attempted to create a arm-linux cross-compiler that
runs under win32.  I have done this previously with the fpcbuild-2.0.4 .zip
file ok using this batch file:

**START OF BATCH FILE
set path=G:\fpc\2.2.0\bin\i386-win32
make distclean

make all install CPU_TARGET=arm OS_TARGET=linux
CROSSBINDIR=G:\fpc-crossbinutils\arm-linux BINUTILSPREFIX=arm-linux-
INSTALL_PREFIX=G:\fpc_win32_arm-linux COMPILER_OPTIONS=cpufpemu

pause
END OF BATCH FILE**


After I build the cross-compiler and tried using 'ppcrossarm.exe' to build a
pascal program I was having errors in the output and noticed this:

Free Pascal Compiler version 2.2.0 [2007/09/24] for arm
Copyright (c) 1993-2007 by Florian Klaempfl
Target OS: WinCE for ARM

I am using the same batch file to compile my pascal program that I used
before so I am unsure why it is saying that the Target OS: WinCE for ARM is
coming up :(

cheers,
Paul
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] more questions on storage

2007-09-26 Thread Marc Santhoff
Am Mittwoch, den 26.09.2007, 09:30 +0200 schrieb Michael Van Canneyt:
 
 On Wed, 26 Sep 2007, Marc Santhoff wrote:
 
  Hi,
  
  having this definition:
  
  
  {$mode objfpc}
  {$longstrings on}
  type
  cmpstr = record
  ID: integer;
  Name: string;
  Value: single;
  end;
  
  var
  buf: array [0..MAX] of cmpstr;
  
  How does the memory layout of the buffer look like?
  
  I tried to get there with ddd but I couln't find out how the string
  inbetween is put into memory. For atomic types (integer, single) it's
  pretty clear, but longstrings do have a variable size. How is the buffer
  set up?
 
 Longstrings are not working correctly. You should use ansistrings or
 shortstrings.

Okay, good to know. Besides I'm using fpc 2.0.4, what is it that's not
working?

And back to the original question: how is the memory layout using
AnsiString then?

Thanks,
Marc


___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] more questions on storage

2007-09-26 Thread Marco van de Voort
   set up?
  
  Longstrings are not working correctly. You should use ansistrings or
  shortstrings.
 
 Okay, good to know. Besides I'm using fpc 2.0.4, what is it that's not
 working?
 
 And back to the original question: how is the memory layout using
 AnsiString then?

The field is a pointer to the ansistring. Which is basically a pchar with a
TAnsirec record on negative offset of the ptr value.
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] more questions on storage

2007-09-26 Thread Jonas Maebe


On 26 Sep 2007, at 11:18, Marc Santhoff wrote:


Longstrings are not working correctly. You should use ansistrings or
shortstrings.


Okay, good to know. Besides I'm using fpc 2.0.4, what is it that's not
working?


Longstrings were never completely implemented nor tested, so no one  
really knows what works and what doesn't. It would be better if the  
compiler simply gave an error for them at compile time.



Jonas
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] more questions on storage

2007-09-26 Thread Marc Santhoff
Am Mittwoch, den 26.09.2007, 11:38 +0200 schrieb Jonas Maebe:
 On 26 Sep 2007, at 11:18, Marc Santhoff wrote:
 
  Longstrings are not working correctly. You should use ansistrings or
  shortstrings.
 
  Okay, good to know. Besides I'm using fpc 2.0.4, what is it that's not
  working?
 
 Longstrings were never completely implemented nor tested, so no one  
 really knows what works and what doesn't. It would be better if the  
 compiler simply gave an error for them at compile time.

That's irritating, because rtl.pdf from the 2.0.4 release says on page
19:

1.1.20 $H or $LONGSTRINGS : Use AnsiStrings
If {$LONGSTRINGS ON} is specified, the keyword String (no length
specifier) will be treated
as AnsiString, and the compiler will treat the corresponding variable as
an ansistring, and will
generate corresponding code.

I read it as there is no difference between the two (in that release)
and the compiler switches can be exchanged.

FWIW, I have this sitch in a couple of source files for a while now and
never had any (noticable) problems.

Marc


___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] more questions on storage

2007-09-26 Thread Marc Santhoff
Am Mittwoch, den 26.09.2007, 11:34 +0200 schrieb Marco van de Voort:
set up?
   
   Longstrings are not working correctly. You should use ansistrings or
   shortstrings.
  
  Okay, good to know. Besides I'm using fpc 2.0.4, what is it that's not
  working?
  
  And back to the original question: how is the memory layout using
  AnsiString then?
 
 The field is a pointer to the ansistring. Which is basically a pchar with a
 TAnsirec record on negative offset of the ptr value.

Thanks, that's what I assumed and could not proof.

Is this the case for any occurences of AnsiString, the type name itself
is a pointer behind the scenes or only in this special case of an array
(would make less sense)?

Marc


___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] more questions on storage

2007-09-26 Thread Marco van de Voort
 Am Mittwoch, den 26.09.2007, 11:34 +0200 schrieb Marco van de Voort:
  The field is a pointer to the ansistring. Which is basically a pchar with a
  TAnsirec record on negative offset of the ptr value.
 
 Thanks, that's what I assumed and could not proof.
 
 Is this the case for any occurences of AnsiString, the type name itself
 is a pointer behind the scenes or only in this special case of an array
 (would make less sense)?

In general, and can be nil when empty.  

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] fpc 2.2.0 win32_arm-linux cross-compiler issue

2007-09-26 Thread Peter Vreman
 Hi all,
 I have downloaded the freepascal 2.2.0 fpc source code (
 fpcbuild-2.2.0.zip) and attempted to create a arm-linux cross-compiler that
 runs under win32.  I have done this previously with the fpcbuild-2.0.4 .zip
 file ok using this batch file:

 **START OF BATCH FILE
 set path=G:\fpc\2.2.0\bin\i386-win32
 make distclean

 make all install CPU_TARGET=arm OS_TARGET=linux
 CROSSBINDIR=G:\fpc-crossbinutils\arm-linux BINUTILSPREFIX=arm-linux-
 INSTALL_PREFIX=G:\fpc_win32_arm-linux COMPILER_OPTIONS=cpufpemu

 pause
 END OF BATCH FILE**


 After I build the cross-compiler and tried using 'ppcrossarm.exe' to build a
 pascal program I was having errors in the output and noticed this:

 Free Pascal Compiler version 2.2.0 [2007/09/24] for arm
 Copyright (c) 1993-2007 by Florian Klaempfl
 Target OS: WinCE for ARM

 I am using the same batch file to compile my pascal program that I used
 before so I am unsure why it is saying that the Target OS: WinCE for ARM is
 coming up :(

WinCE is the default ARM target if a cross compiler is build under Windows. You 
need to specify
-Tlinux on the commandline or add it to fpc.cfg to make it the default:

#ifdef cpuarm
-Tlinux
#endif



___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] more questions on storage

2007-09-26 Thread Jonas Maebe


On 26 Sep 2007, at 11:56, Marc Santhoff wrote:


Longstrings were never completely implemented nor tested, so no one
really knows what works and what doesn't. It would be better if the
compiler simply gave an error for them at compile time.


That's irritating, because rtl.pdf from the 2.0.4 release says on  
page

19:

1.1.20 $H or $LONGSTRINGS : Use AnsiStrings
If {$LONGSTRINGS ON} is specified, the keyword String (no length
specifier) will be treated
as AnsiString, and the compiler will treat the corresponding  
variable as

an ansistring, and will
generate corresponding code.

I read it as there is no difference between the two (in that release)
and the compiler switches can be exchanged.


It seems there's some confusion in terminology. {$longstrings on}  
maps to {$h+}, which indeed means that string becomes an alias for  
ansistring rather than for shortstring. Separately from that there is  
also a type called longstring which is basically a shortstring but  
with a 4 byte length field. It's this longstring which has not been  
implemented properly.


Ansistrings (and thus {$longstrings on}) work fine.


Jonas
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] more questions on storage

2007-09-26 Thread Jonas Maebe


On 26 Sep 2007, at 12:03, Marco van de Voort wrote:


Am Mittwoch, den 26.09.2007, 11:34 +0200 schrieb Marco van de Voort:
The field is a pointer to the ansistring. Which is basically a  
pchar with a

TAnsirec record on negative offset of the ptr value.


Thanks, that's what I assumed and could not proof.

Is this the case for any occurences of AnsiString, the type name  
itself
is a pointer behind the scenes or only in this special case of an  
array

(would make less sense)?


In general, and can be nil when empty.


And it's reference counted, so any record containing an ansistring  
has initialization rtti (and when declaring a record of this type, or  
allocating memory for it using new(), the compiler initialises the  
ansistring fields with nil).



Jonas
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] more questions on storage

2007-09-26 Thread Marc Santhoff
Am Mittwoch, den 26.09.2007, 12:55 +0200 schrieb Jonas Maebe:
 On 26 Sep 2007, at 11:56, Marc Santhoff wrote:
 
  Longstrings were never completely implemented nor tested, so no one
  really knows what works and what doesn't. It would be better if the
  compiler simply gave an error for them at compile time.
 
  That's irritating, because rtl.pdf from the 2.0.4 release says on  
  page
  19:
 
  1.1.20 $H or $LONGSTRINGS : Use AnsiStrings
  If {$LONGSTRINGS ON} is specified, the keyword String (no length
  specifier) will be treated
  as AnsiString, and the compiler will treat the corresponding  
  variable as
  an ansistring, and will
  generate corresponding code.
 
  I read it as there is no difference between the two (in that release)
  and the compiler switches can be exchanged.
 
 It seems there's some confusion in terminology. {$longstrings on}  
 maps to {$h+}, which indeed means that string becomes an alias for  
 ansistring rather than for shortstring. Separately from that there is  
 also a type called longstring which is basically a shortstring but  
 with a 4 byte length field. It's this longstring which has not been  
 implemented properly.
 
 Ansistrings (and thus {$longstrings on}) work fine.

Ah, okay. The Fog is lifting fastly. :)

And AnsiStrings are pretty much compatible to C's char*. Very handy.

Many thanks,
Marc


___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] more questions on storage

2007-09-26 Thread Marco van de Voort
  On 26 Sep 2007, at 11:56, Marc Santhoff wrote:
  ansistring rather than for shortstring. Separately from that there is  
  also a type called longstring which is basically a shortstring but  
  with a 4 byte length field. It's this longstring which has not been  
  implemented properly.
  
  Ansistrings (and thus {$longstrings on}) work fine.
 
 Ah, okay. The Fog is lifting fastly. :)
 
 And AnsiStrings are pretty much compatible to C's char*. Very handy.

Yes, though ansistrings may contain #0's.
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] more questions on storage

2007-09-26 Thread Marc Santhoff
Am Mittwoch, den 26.09.2007, 13:24 +0200 schrieb Marco van de Voort:
   On 26 Sep 2007, at 11:56, Marc Santhoff wrote:
   ansistring rather than for shortstring. Separately from that there is  
   also a type called longstring which is basically a shortstring but  
   with a 4 byte length field. It's this longstring which has not been  
   implemented properly.
   
   Ansistrings (and thus {$longstrings on}) work fine.
  
  Ah, okay. The Fog is lifting fastly. :)
  
  And AnsiStrings are pretty much compatible to C's char*. Very handy.
 
 Yes, though ansistrings may contain #0's.

Interesting, how will a cast handle this case?

Will it change the intermediate #0 to something else or will the
resulting pchars be cut at first occurrence?

I'd never use #0 in the middle of a string myself, but to be sure if a
user manages to do so ...

Marc


___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] more questions on storage

2007-09-26 Thread Jonas Maebe


On 26 Sep 2007, at 15:12, Marc Santhoff wrote:


And AnsiStrings are pretty much compatible to C's char*. Very handy.


Yes, though ansistrings may contain #0's.


Interesting, how will a cast handle this case?

Will it change the intermediate #0 to something else or will the
resulting pchars be cut at first occurrence?


You just get a pointer to the string data as-is, without any  
substitutions or pointer juggling. If whatever you pass the data to  
interprets #0 as the end of the string, it will see that embedded #0  
as the end of the string.



Jonas
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] more questions on storage

2007-09-26 Thread Marco van de Voort
 Am Mittwoch, den 26.09.2007, 13:24 +0200 schrieb Marco van de Voort:

Ansistrings (and thus {$longstrings on}) work fine.
   
   Ah, okay. The Fog is lifting fastly. :)
   
   And AnsiStrings are pretty much compatible to C's char*. Very handy.
  
  Yes, though ansistrings may contain #0's.
 
 Interesting, how will a cast handle this case?
 
 Will it change the intermediate #0 to something else or will the
 resulting pchars be cut at first occurrence?

A cast is really a cast. IOW the cast pchar(ansistring) is mostly a no-op.
Traditional C code then usually treats the #0 as end of string. 

It's mostly important when ansisstring is abused as general purpose buffer,
but generally it is better to use dyn arrays for that.
 

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal