![]() |
Dynamisches Array
Ich habe ein Problem mit meinem Array.
Ich habe ein dynamisches Array erstellt und setzte danach die Länge fest.
Delphi-Quellcode:
var data: Array of Byte;
Delphi-Quellcode:
setlength(data, length(Edit3.Text) + 14);
Zum Schluss muss ich den letzten beiden Array Werten = 0 zuweisen. Da ich aber nicht weiß, wie lang das Array ist, benutze ich also zum füllen der letzen beiden Arraystellen folgenden Code:
Delphi-Quellcode:
Doch wenn ich mein Programm starte bekomme ich die Meldung: "Zugriffsverletzung bei Adresse ... "
data[length(Edit3.Text) + 14 - 1] := 0;
data[length(Edit3.Text) + 14] := 0; Wenn ich jedoch die letze Stelle des Arrays nicht belege, funktioniert alles. Doch warum ist das so? Muss bei einem dynamischen Array die letzte Stelle immer frei bleiben? |
AW: Dynamisches Array
Hallo,
Zitat:
length(Edit3.Text) + 14 - 2 und length(Edit3.Text) + 14 - 1 da dynamische Felder stets mit dem Index 0 beginnen. Beste Grüße Mathematiker |
AW: Dynamisches Array
Nimm doch einfach High(data) um den letzen erlaubten Index zu erhalten:
Delphi-Quellcode:
data[High(data) - 1] := 0;
data[High(data)] := 0; |
AW: Dynamisches Array
Ok erstmal danke dafür.
Mit High funktioniert es super. Aber ich hab ein weiteres Problem. Ich möchte mein Array via TCP versenden. Dazu habe ich Testeshalber einmal ein statisches Array und einmal ein dynamisches Array benutzt. Wenn ich das statische benutze, funktioniert alles so, wie ich es möchte. Das bedeutet, der Inhalt meines TCP Paket stimmt mit dem überein, was ich eingegeben habe. Wenn ich jedoch das dynamische benutze, dann bekomme ich in meinem Paket was komplett anderes angezeigt. Wie kann das sein? |
AW: Dynamisches Array
Zitat:
Bitte deshalb mehr Code posten. |
AW: Dynamisches Array
Ok kein Problem.
Dieses Beispiel mit dem statischen Array funktioniert ohne Probleme. In Edit3.Text befindet sich ein 6 Stellen langes Wort
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var data: Array[0..19] of Byte; bytes: TIdBytes; i: integer; begin //setlength(data, length(Edit3.Text) + 14); // ReqSize data[0] := length(Edit3.Text) + 10; data[1] := 0; data[2] := 0; data[3] := 0; // ReqID data[4] := 0; data[5] := 0; data[6] := 0; data[7] := 0; // ReqType data[8] := 3; data[9] := 0; data[10] := 0; data[11] := 0; // ReqBody for i := 1 to length(Edit3.Text) do data[11 + i] := TEncoding.Default.GetBytes(Edit3.Text[i])[0]; // Null Terminator Body data[High(data) - 1] := 0; // Null Terminator Req data[High(data)] := 0; //showmessage(IntToStr(length(data))); SetLength(bytes, length(data)); move(data, bytes[0], length(data)); IdTCPClient1.IOHandler.Write(bytes); end; Hier das Beispiel mit einem dynamischen Array. Hier bekomme ich nur wirres Zeug angezeigt.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var data: Array of Byte; bytes: TIdBytes; i: integer; begin setlength(data, length(Edit3.Text) + 14); // ReqSize data[0] := length(Edit3.Text) + 10; data[1] := 0; data[2] := 0; data[3] := 0; // ReqID data[4] := 0; data[5] := 0; data[6] := 0; data[7] := 0; // ReqType data[8] := 3; data[9] := 0; data[10] := 0; data[11] := 0; // ReqBody for i := 1 to length(Edit3.Text) do data[11 + i] := TEncoding.Default.GetBytes(Edit3.Text[i])[0]; // Null Terminator Body data[High(data) - 1] := 0; // Null Terminator Req data[High(data)] := 0; //showmessage(IntToStr(length(data))); SetLength(bytes, length(data)); move(data, bytes[0], length(data)); IdTCPClient1.IOHandler.Write(bytes); end; |
AW: Dynamisches Array
Warum machst du es nicht gleich so und nimmst gleich das Array zum Übertragen?
Delphi-Quellcode:
procedure TForm7.Button1Click(Sender: TObject);
var data: TBytes; //Array of Byte; i: integer; begin setlength(data, length(Edit3.Text) + 14); // ReqSize data[0] := length(Edit3.Text) + 10; data[1] := 0; data[2] := 0; data[3] := 0; // ReqID data[4] := 0; data[5] := 0; data[6] := 0; data[7] := 0; // ReqType data[8] := 3; data[9] := 0; data[10] := 0; data[11] := 0; // ReqBody for i := 1 to length(Edit3.Text) do data[11 + i] := TEncoding.Default.GetBytes(Edit3.Text[i])[0]; // Null Terminator Body data[High(data) - 1] := 0; // Null Terminator Req data[High(data)] := 0; IdTCPClient1.IOHandler.Write(data); end; |
AW: Dynamisches Array
Also wenn ich "data: TBytes;" deklariere bekomme ich die Meldung, dass es keine überladene von IdTCPClient.IOHandler.Write() mit den Argumenten gibt.
Da aber diese TIdBytes verlangt, habe ich data eben als TIdBytes deklariert und siehe da, es funktioniert. Ihr seid einfach die Besten. |
AW: Dynamisches Array
In der IdGlobal
ist TIdBytes = TBytes; defniert. |
AW: Dynamisches Array
Variablen vom Typ eine dynamischen Array sind Zeiger (man kann z.B. auch nil zuweisen um die Array-Variable zu löschen).
Beim "move" möchte man nicht die Variable mit einer neuen Adresse überschreiben, sondern den Speicher auf den diese Variable verweist. Ebenso soll nicht die Adresse des Arrays übertragen werden. Der Inhalt des Arrays begint mit dem ersten Element.
Delphi-Quellcode:
move(data, bytes[0], length(data)); IdTCPClient1.IOHandler.Write(bytes[0]); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz