[fpc-pascal] Pchar from constant string

2023-06-29 Thread Hairy Pixels via fpc-pascal
What is really happening in this snippet? I think it must be implicitly taking 
the address of the constant string but is it also adding the null terminator 
automatically? The string prints with writeln so it must be null terminated 
right?

var
  p: Pchar;
begin
  p := '123';
  writeln(p);


Regards,
Ryan Joseph

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] Pchar from constant string

2023-06-29 Thread Mattias Gaertner via fpc-pascal
On Thu, 29 Jun 2023 21:18:44 +0700
Hairy Pixels via fpc-pascal  wrote:

> What is really happening in this snippet? I think it must be
> implicitly taking the address of the constant string but is it also
> adding the null terminator automatically? The string prints with
> writeln so it must be null terminated right?
> 
> var
>   p: Pchar;
> begin
>   p := '123';
>   writeln(p);

AFAIK the trailing #0 is already stored in the binary.

Mattias
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] Pchar from constant string

2023-06-29 Thread Michael Van Canneyt via fpc-pascal




On Thu, 29 Jun 2023, Mattias Gaertner via fpc-pascal wrote:


On Thu, 29 Jun 2023 21:18:44 +0700
Hairy Pixels via fpc-pascal  wrote:


What is really happening in this snippet? I think it must be
implicitly taking the address of the constant string but is it also
adding the null terminator automatically? The string prints with
writeln so it must be null terminated right?

var
  p: Pchar;
begin
  p := '123';
  writeln(p);


AFAIK the trailing #0 is already stored in the binary.


Yes, it is:

---
_$PROGRAM$_Ld1:
# [4] p := '123';
.ascii  "123\000"
.Le11:
---

Just as it is for a shortstring and ansistring:
---
# [6] s:='456';
.ascii  "\003456\000"
.Le12:
.size   _$PROGRAM$_Ld2, .Le12 - _$PROGRAM$_Ld2
---

Michael.
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] Pchar from constant string

2023-06-29 Thread Tomas Hajny via fpc-pascal

On 2023-06-29 16:22, Mattias Gaertner via fpc-pascal wrote:

On Thu, 29 Jun 2023 21:18:44 +0700
Hairy Pixels via fpc-pascal  wrote:


What is really happening in this snippet? I think it must be
implicitly taking the address of the constant string but is it also
adding the null terminator automatically? The string prints with
writeln so it must be null terminated right?

var
  p: Pchar;
begin
  p := '123';
  writeln(p);


AFAIK the trailing #0 is already stored in the binary.


Indeed - all constant strings are already terminated with #0. Note that 
this is not guaranteed for all string variables per se.


Tomas
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] Pchar from constant string

2023-06-29 Thread Hairy Pixels via fpc-pascal



> On Jun 29, 2023, at 9:31 PM, Michael Van Canneyt via fpc-pascal 
>  wrote:
> 
> Yes, it is:
> 
> ---
> _$PROGRAM$_Ld1:
> # [4] p := '123';
>.ascii  "123\000"
> .Le11:
> ---
> 
> Just as it is for a shortstring and ansistring:
> ---
> # [6] s:='456';
>.ascii  "\003456\000"
> .Le12:
>.size   _$PROGRAM$_Ld2, .Le12 - _$PROGRAM$_Ld2

That's why that worked. Hmm with short strings the null terminator could be 
truncated when copying right? Something to look out for.

Regards,
Ryan Joseph

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal