Thema: Delphi PChar ???

Einzelnen Beitrag anzeigen

edeWelzheim

Registriert seit: 14. Mär 2005
Ort: Welzheim
8 Beiträge
 
Delphi 2005 Professional
 
#1

PChar ???

  Alt 18. Okt 2007, 08:16
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;
pChChar;
ChArray2:array[0..100] of char;
pCh2Char;
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;
pXChar;
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 pHlpChar;
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.
  Mit Zitat antworten Zitat