Thema: Delphi SetLength mein problem

Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#11

Re: SetLength mein problem

  Alt 1. Nov 2006, 13:25
Hi
Zitat:
Ich hoffe das hilft und löst nicht wieder Beleidigungen aus...
Hilft sehr! Lößt auch keinerlei beleidigungen aus
Im Magnetic thread war ich etwas sauer das du mich hast auflaufen lassen.
Hättest du direkt gesag das es nicht geht, hätten wir uns anschließende Diskussionen
sparen können.. Aber denke das ist erledigt. (zumindest für mich).
Ich entschuldige mich aber nocheinmal dafür.

Dieser Thread ist auch keine Übersetzung sondern ein kompletter neuanfang.
Da ich bemerkt habe das es nichts bringt irgendeinen VB Code übersetzen zu wollen.

Zitat:
Warum ein Array von Zeigern auf den Record anstatt eines Arrays of Records?
Delphi-Quellcode:
AWindowDescr = array of PWindowDescr;
//Array von Zeigern auf den Record

AWindowDescr = array of TWindowDescr;
//Array auf den Record
Was ist genau der unterschied ?

Zitat:
also werden hier 101 Elemente angelegt, Zugreifbar mit Index 0 bis 100
Ja stimmt.
Es gab da ein problem wenn ich mit dem Array(0) begonnen habe die Daten zu füllen
werde ihn auf 99 setzen muss dann allerdings schauen ob nach allen änderungen
wieder ein AV auftritt.

Zitat:
warum holst du dir den Speicher für nur einen Record (den an Index 100)? Was ist der Sinn?
Ich habe gelesen das New eine ähnliche funktion wie Redim in VB ist.
Bin aber mittlerweile darauf gekommen das dadurch zuerst der Index(100) mit Daten gefüllt wird.
Ist also verkehrt meine vermutung.

Zitat:
Ich glaube der erste Parameter müsste noch ein ^ bekommen, weil sonst
schreibt ZeroMemory die Array-Pointer-Liste mit 0'en voll anstatt des Records
Könntest du mir bitte genau die function 'ZeroMemory' erklären ?
Welche parameter genau was machen.

Zitat:
warum? Willst du Index 0 nicht nutzen? Wenn vor dem Until ein Inc(IntI)
Weil wie oben beschrieben bei 0 ein AV auftrat ..
Habe inc(IntI); nun ans ende der until schleife gesetzt damit wird der Index 0 nun auch benutzt.

Zitat:
SetLength(wDescr, High(wDescr) + 10);
High() gibt dir den höchsten Index an, aber nicht die Anzahl der Elemente.
SetLength() will die Anzahl der neuen Elemente, also Anzahl der Elemente bisher + 10, sprich:
SetLength(wDescr, Length(wDescr) + 10);
Habe angenommen das der höchste wert high(wDescr) = 100 wenn Index= 99 geändert .. mit 10 addiert werden kann.
Wäre auch irgendwie logisch. ?

Zitat:
New(wDescr[IntI]);
beachte hier: es ist der Index 100 schon initialisiert!
Ja. aber nicht der 110 wenn mehr als 100 Fenster gefunden wurden. Oder ?

Zitat:
ZeroMemory(wDescr[IntI], SizeOf(wDescr[IntI]^));
siehe oben: 1. Parameter sollte noch ein ^ bekommen
wenn ich das Array AWindowDescr = array of TWindowDescr; setze kommt nun nach der änderung von
ZeroMemory(wDescr[IntI]^, SizeOf(wDescr[IntI]^)); folgende Fehlermeldung
[Pascal Error] Unit2.pas(235): E2017 Pointer type required
lasse ich den Zeiger^ weg diese
[Pascal Error] Unit2.pas(235): E2010 Incompatible types: 'Pointer' and 'TWindowDescr'
Vorher hatte ich bei AWindowDescr = array of PWindowDescr; keine Fehlermeldungen.
Wo ist nun der unterschied ?

Zitat:
SetLength(wDescr, IntI);
wenn du oben das mit dem Inc(IntI) änderst, dann hier Succ(IntI) als höchstes Element setzen
Verstehe ich auch nicht ganz ?
Nach dem durchlauf der Schleife hat doch IntI autmatisch den höchsten index
warum muss er dann mit Succ(IntI) explizit zugewiesen werden ?

gruß
  Mit Zitat antworten Zitat