Wie wandel ich den ein Array of Char als typecast zu einem string um, ohne auf mode Delphi umzustellen?
Im Delphimodus ist das alles möglich, aber ich will ja schließlich objfpc benutzen

Code: Alles auswählen
uses strutils;
var a_str1:array[0..64000] of char;
v_str1:string;
// einmal hin
strpcopy(a_str1,v_str1);
// und zurück
v_str1:=strpas(a_str1);
Was produziert er denn? Bei mir geht das.monta hat geschrieben:Ich hab beide probiert.
Pchar(@a_str1); produziert eine andere Ausgabe als strpas. Wobei strpas die brauchbare liefert. Woran das jetzt liegt, hab ich allerdings nicht tiefer nachvollzogen.
Code: Alles auswählen
//richtig:
writeln(StrPas(PChar(Data)));
//falsch:
writeln(Pchar(@Data));
//richtig:
writeln(Pchar(@Data[0]));
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
var Carr:Array[0..5] of Char=('m','o','n','t','a',#0);
begin
Memo1.Lines.Add(Pchar(@Carr));
Memo1.Lines.Add(Pchar(@Carr[0]));
end;
Code: Alles auswählen
procedure TFLACfile.ReadTag( Source: TTntFileStream; bSetTagFields: boolean );
var
i, iCount, iSize, iSepPos: Integer;
Data: array of Char;
sFieldID, sFieldData: string;
begin
Source.Read( iSize, SizeOf( iSize ) ); // vendor
SetLength( Data, iSize );
Source.Read( Data[ 0 ], iSize );
FVendor := String( Data );
Source.Read( iCount, SizeOf( iCount ) ); //fieldcount
FExists := ( iCount > 0 );
for i := 0 to iCount - 1 do begin
Source.Read( iSize, SizeOf( iSize ) );
SetLength( Data , iSize );
Source.Read( Data[ 0], iSize );
iSepPos := Pos( '=', String( Data ) );
//...
Code: Alles auswählen
procedure TFLACfile.ReadTag( Source: TFileStream; bSetTagFields: boolean );
var
i, iCount, iSize, iSepPos: Integer;
Data: array of Char;
sFieldID, sFieldData, sField: string;
begin
Source.Read( iSize, SizeOf( iSize ) ); // vendor
SetLength( Data, iSize );
Source.Read( Data[ 0 ], iSize );
FVendor := StrPas(PChar(Data)); //oder Pchar(@Data);
Source.Read( iCount, SizeOf( iCount ) ); //fieldcount
FExists := ( iCount > 0 );
for i := 0 to iCount - 1 do begin
Source.Read(iSize, SizeOf(iSize));
SetLength(Data , iSize );
Source.Read(Data[0], iSize );
sField := Copy(StrPas(PChar(Data)), 0, iSize);
iSepPos := Pos('=', sField);
//...
Code: Alles auswählen
Source.Read(Data[0], iSize );
sField := Copy(StrPas(PChar(Data)), 0, iSize);
Da ist ein fundamentaler Unterschied zu monta's Version: du nutzt ein statisches Array.theo hat geschrieben:Hmm, von mir aus gesehen ist das dasselbe.
Probier mal
Geht das bei dir nicht? Beachte das abschliessende #0 im Array.Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject); var Carr:Array[0..5] of Char=('m','o','n','t','a',#0); begin Memo1.Lines.Add(Pchar(@Carr)); Memo1.Lines.Add(Pchar(@Carr[0])); end;
Warum nimmst du eig. nicht gleich String statt Array of Char?
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
var Carr:Array of Char;
begin
Setlength(Carr,6);
Carr[0]:='m';
Carr[1]:='o';
Carr[2]:='n';
Carr[3]:='t';
Carr[4]:='a';
Carr[5]:= #0;
Memo1.Lines.Add(Pchar(Carr));
Memo1.Lines.Add(Pchar(@Carr[0]));
end;