AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dynamisches Array

Ein Thema von SyntaxXx · begonnen am 25. Aug 2013 · letzter Beitrag vom 26. Aug 2013
Antwort Antwort
SyntaxXx

Registriert seit: 14. Dez 2008
328 Beiträge
 
Delphi XE4 Architect
 
#1

Dynamisches Array

  Alt 25. Aug 2013, 18:04
Ich habe ein Problem mit meinem Array.
Ich habe ein dynamisches Array erstellt und setzte danach die Länge fest.

var data: Array of Byte; 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:
data[length(Edit3.Text) + 14 - 1] := 0;
data[length(Edit3.Text) + 14] := 0;
Doch wenn ich mein Programm starte bekomme ich die Meldung: "Zugriffsverletzung bei Adresse ... "

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?
  Mit Zitat antworten Zitat
Mathematiker
(Gast)

n/a Beiträge
 
#2

AW: Dynamisches Array

  Alt 25. Aug 2013, 18:13
Hallo,
setlength(data, length(Edit3.Text) + 14);
Bei dieser Deklaration sind die letzten beiden Elemente, die mit dem Index
length(Edit3.Text) + 14 - 2 und length(Edit3.Text) + 14 - 1
da dynamische Felder stets mit dem Index 0 beginnen.

Beste Grüße
Mathematiker
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.024 Beiträge
 
Delphi 12 Athens
 
#3

AW: Dynamisches Array

  Alt 25. Aug 2013, 18:16
Nimm doch einfach High(data) um den letzen erlaubten Index zu erhalten:

Delphi-Quellcode:
data[High(data) - 1] := 0;
data[High(data)] := 0;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
SyntaxXx

Registriert seit: 14. Dez 2008
328 Beiträge
 
Delphi XE4 Architect
 
#4

AW: Dynamisches Array

  Alt 25. Aug 2013, 18:50
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?
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.618 Beiträge
 
Delphi 12 Athens
 
#5

AW: Dynamisches Array

  Alt 25. Aug 2013, 19:12

Wenn ich jedoch das dynamische benutze, dann bekomme ich in meinem Paket was komplett anderes angezeigt.


Wie kann das sein?
Ohne Code wird das schwierig sein, wobei du vielleicht bei dem dynamischen nur den Pointer überträgst und beim statischen dann die Daten.

Bitte deshalb mehr Code posten.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
SyntaxXx

Registriert seit: 14. Dez 2008
328 Beiträge
 
Delphi XE4 Architect
 
#6

AW: Dynamisches Array

  Alt 25. Aug 2013, 19:16
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;
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.618 Beiträge
 
Delphi 12 Athens
 
#7

AW: Dynamisches Array

  Alt 25. Aug 2013, 19:47
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;
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
SyntaxXx

Registriert seit: 14. Dez 2008
328 Beiträge
 
Delphi XE4 Architect
 
#8

AW: Dynamisches Array

  Alt 25. Aug 2013, 20:01
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.
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.618 Beiträge
 
Delphi 12 Athens
 
#9

AW: Dynamisches Array

  Alt 25. Aug 2013, 20:28
In der IdGlobal

ist TIdBytes = TBytes;

defniert.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Dynamisches Array

  Alt 26. Aug 2013, 12:42
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]);
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz