die Aufgabe:
in einer ISR sollen seriell eintreffende Daten zeichenweise verarbeitet werden.
der Empfangspuffer ist definiert als zB ch:array[0..1] of char.
natürlich möchte ich die Zeichen zusammenfügen, am einfachsten natürlich so:
s:= s + ch[0]
aus unerfindlichen (noch unbekannten) Gründen stürzt der PC *bei dieser* Anweisung ab, weshalb
ich auf die Idee kam, die Zeichen eben als PChar zu verwalten, was aber wieder andere
Schwierigkeiten aufwirft:
in den knappen Beschreibungen, die ich habe, sieht alles ganz klar + einfach aus, wenngleich es
auch Widersprüche gibt (zB 'PChar nur Zeiger, vor der Arbeit muss Speicher res werden' - eine andere Quelle weist einfach Inhalt zu; oder: 'StrPCopy nur im Zus'hang mit ShortStrings zu verwenden' - andere Quelle nutzt diese Routine mit normalen Strings + array of char).
Habe nun ein Mini-Test-Pogramm gemacht, das aber die unmöglichsten Ergebnisse bringt (eigentlich
immer etwas anderes als erwartet); besonders übel (ges-Zus'hang s.u.):
1)
//s:=Edit1.Text; pCh:=strPCopy(x,s); {->nicht ok; Müll hinten dran..?}
2)
{pCh:=strCat(pCh,pCh);} {ergibt 'ungültige Zeigeroperation' ?}
3)
//das folgende tut auch nicht.. ?}
s:=inttoStr(StrLen(pCh));{StrPas(pCh);} Label1.Caption:=s;
Kann da vielleicht jemand für Klarheit sorgen?? Danke!
PS:
a) wird strAlloc überhaupt benötigt?
b) wie gesagt: eigentlich möchte ich nur Char/PChar aneinanderreihen (analog s:=s+'x');
[code]
unit Test_PChar;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
BitBtn1: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private-Deklarationen }
ChArray:array[0..100] of char;
pCh
Char;
ChArray2:array[0..100] of char;
pCh2
Char;
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var i,j,k:integer; x:array[0..10] of char;
pX
Char;
begin
pX:=x; {nur ok, wenn x-Array ab '0'!!}
//sonst Compiler-Err 2010 (inkompatible Typen Array and PAnsiChar)
{pCh:=@ChArray;}
pCh:='123';
{pCh2:=@ChArray2;}
pCh2:='456';
Label1.Caption:=StrPas(pCh);
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var pHlp
Char;
x:array[0..100] of char;
s:string;
begin
{pHlp:=strAlloc(100);}
//s:=Edit1.Text; pCh:=PChar(s); {->ist ok}
//s:=Edit1.Text; pCh:=strPCopy(x,s); {->nicht ok; Müll hinten dran..?}
pCh :=strPCopy(ChArray,Edit1.Text);
pHlp:=strPCopy(ChArray2,Edit2.Text);
pCh:=strCat(pCh,pCh2);
s:=Edit2.Text; pCh2:=PChar(s); {->ist ok}
{pCh:=strCat(pCh,pCh);} {ergibt 'ungültige Zeigeroperation' ?}
//das folgende tut auch nicht.. ?}
s:=inttoStr(StrLen(pCh));{StrPas(pCh);} Label1.Caption:=s;
{StrDispose(pHlp);}
end;
end.