Ein Array in einer Klasse als private-Deklaration
Hallo zusammen,
ich habe so eine Klasse erstellt :
Delphi-Quellcode:
Dieses Array wird im construktor mit Daten gefüllt und ja, ich habe mir mit SetLength eine ausreichende Länge festgelegt. Nun rufe ich in einer Funktion GetMem auf und dann die Windows API-Funktion GetAdaptersAddresses, dann wird das Array FName mit irgendwelchen Hyroglyphen überschrieben. Die große Frage ist warum ?
type
TKlasse = class(TObject) private FName : array of string; public ... ... ... end; |
Re: Ein Array in einer Klasse als private-Deklaration
Und wie sehen die Aufrufe auf?
|
Re: Ein Array in einer Klasse als private-Deklaration
Hier wird der Array befüllt :
Delphi-Quellcode:
Und so ist der Aufruf von GetAdaptersAddresses :
SetLength(FaaiAdapters,1);
FaaiAdapters[0] := pAdapterList; while FaaiAdapters[High(FaaiAdapters)].Next <> nil do begin SetLength(FaaiAdapters,Length(FaaiAdapters)+1); FaaiAdapters[High(FaaiAdapters)] := FaaiAdapters[High(FaaiAdapters)-1].Next; end;
Delphi-Quellcode:
Und in diesem Teil in Zeile 13 überschreibt er mir den Array FaaiAdapters.
PVOID = Pointer;
TGetAdapterAdresses = function (Family: ULONG; Flags: cardinal; Reserved: PVOID; pAdapterAddresses: PIP_ADAPTER_ADDRESSES; pOutBufLen: PULONG): dword; stdcall; error := AdaptersAddresses(AF_UNSPEC, 10, nil, nil, @buffer); if error <> ERROR_BUFFER_OVERFLOW then begin FreeLibrary(hdll); exit; end; GetMem(adapterextinfo, buffer); error := AdaptersAddresses(AF_UNSPEC, 10, nil, adapterextinfo, @buffer); if error = ERROR_SUCCESS then |
Re: Ein Array in einer Klasse als private-Deklaration
Wo ist Zeile 13? genau! (Mit oder ohne Leerzeichen)
|
Re: Ein Array in einer Klasse als private-Deklaration
Zudem würde ich die Größe einmal setzen und nicht bei jedem Schritt vergrößern
|
Re: Ein Array in einer Klasse als private-Deklaration
Zitat:
Zitat:
Edit: Erwähnt sei noch, auf meinem Windows VISTA 64Bit mit 4GB RAM funktioniert es wunderbar. Wenn ich das gleiche auf einem Windows XP SP2 oder SP3 mit 2GB RAM oder 4GB RAM ausführe, wird mir das Array durch den Aufruf von GetAdaptersAddresses überschrieben. Und auch nur dann, wenn das Array größer als Eins ist. Edit2: Ich habe noch ein paar Tests durchgeführt. Wenn das Array die Größe eins hat, dann funktioniert alles wunderbar. Ist das Array aber größer als eins, dann habe ich unter Windows XP SP2 und SP3 Probleme, dass mir das Array überschrieben wird. Dieses passiert aber nicht unter Windows VISTA 64Bit. |
Re: Ein Array in einer Klasse als private-Deklaration
Zitat:
Wenn es keine maximal erreichbare Größe geben sollte (oder diese bei MAXINT liegen sollte [solch ein Riesenarry anzulegen um im schlimmsten Fall nur einen Eintrag einzufügen ist definitiv sub-optimal]) dann machst Du es halt folgendermassen
Delphi-Quellcode:
Ist wesentlich schneller und ressourcenschonender als bei jedem Durchlauf das Array um 1 zu vergrößern.
const
Delta = 500; var myArray: array of string; myArraySize: integer; myItemConter: integer; i: integer; begin myItemCounter := 0; myArraySize := Delta; SetLength(myArray, myArraySize); for i:= 0 to WasWeißIch do begin Inc(myItemCounter); myArray[i]:= "Foo"+i; if myItemCounter = myArraySize then begin Inc(myArraySize, Delta); SetLength(myArray, myArraySize); end; end; SetLength(myArray, myItemCounter); |
Re: Ein Array in einer Klasse als private-Deklaration
Benutze doch TList.
|
Re: Ein Array in einer Klasse als private-Deklaration
und wo ist der zusammenhang zu deinem eingangspost? ich kann weger die klasse noch die eigennschaft in deinen anderen post erkennen ... :glaskugel:
|
Re: Ein Array in einer Klasse als private-Deklaration
Also, ich habe jetzt wahrscheinlich den Fehler gefunden. Es lag nicht an der Art wie ich das Array erstellt habe, sondern an dem Aufruf von GetAdaptersAddresses. Ich habe beim Aufruf das Flag von 10 auf 0 gesetzt. Jetzt wird beim Aufruf von GetAdaptersAddresses das Array nichtmehr überschrieben. Des weiteren habe ich noch den Aufruf von GetMem in AllocMem geändert.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:37 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