rushifell hat folgendes geschrieben : |
Zu meinem Beispiel hätte ich eine Frage: Ich habe irgendwo im Netz gelesen, dass man in Zeile 15 bei GetMem die Länge mit Sizeof(Char) multiplizieren muss/sollte. Kannst Du mir dazu was sagen?
|
AnsiChar und AnsiString sind Typen die für jedes Zeichen genau ein Byte benötigen.
In älteren Delphiversionen gilt:
Char = AnsiChar;
String = AnsiString;
WideChar und WideString benötigen für jedes Zeichen genau zwei Byte.
Ab Delphi 2009 gilt:
Char = WideChar;
String = WideString;
Du solltest dir überlegen welcher Datentyp notwendig ist.
Sollen tatsächlich Zeichenketten übergeben werden, dann definiere den Parameter z.B. als PAnsiChar oder PWideChar.
rushifell hat folgendes geschrieben : |
Bietet ByteArray Vorteile gegenüber Pchar? Muss ich keinen Speicher anfordern? Meine Buffergröße ist konstant 920 Bytes. Das ist wohl kein Problem?
|
Speicher muss immer in irgendeiner Form angefordert werden.
Wie die Anforderung erfolgt, hängt vom Datentyp ab.
In meinem Beispiel über SetLength.
Wenn dein Parameter immer eine feste Größe hat, ist es vieleicht sinnvoll dafür einen eigenen Datentyp zu deklarieren.
Dies kann ein Array fester Größe oder ein Record sein oder ein bischen von beidem.
z.B.:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43:
| type PMyParam = ^TMyParam; TMyParam = record Count: Longint; Item: array[0..915] of AnsiChar; end; procedure getDaten1(MyParam: PMyParam); begin MyParam^.Item[0] := 'T'; MyParam^.Item[1] := 'e'; MyParam^.Item[2] := 'x'; MyParam^.Item[3] := 't'; MyParam^.Count := 4; end; procedure getDaten2(var MyParam: TMyParam); begin MyParam.Item[0] := 'T'; MyParam.Item[1] := 'e'; MyParam.Item[2] := 'x'; MyParam.Item[3] := 't'; MyParam.Count := 4; end; procedure holeDaten; var myParam1: TMyParam; myParam2: PMyParam; begin getDaten1(@myParam1); getDaten2(myParam1); New(myParam2); try getDaten1(myParam2); getDaten2(myParam2^); finally Dispose(myParam2); end; |
rushifell hat folgendes geschrieben : |
Was ich nicht verstehe ist, dass das ganze doch gar nicht so extrem kompliziert aussieht, ich aber trotzdem keine Beispiele dafür gefunden habe. |
Ist nicht kompliziert, erfordert aber Grundlagenwissen über Datentypen, Speicherverwaltung und Paramterübergabe.