AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Ein Array in einer Klasse als private-Deklaration

Ein Array in einer Klasse als private-Deklaration

Ein Thema von RWarnecke · begonnen am 18. Aug 2008 · letzter Beitrag vom 19. Aug 2008
Antwort Antwort
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#1

Ein Array in einer Klasse als private-Deklaration

  Alt 18. Aug 2008, 13:19
Hallo zusammen,

ich habe so eine Klasse erstellt :
Delphi-Quellcode:
type
  TKlasse = class(TObject)
  private
    FName : array of string;
  public
  ...
  ...
  ...
  end;
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 ?
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Ein Array in einer Klasse als private-Deklaration

  Alt 18. Aug 2008, 14:11
Und wie sehen die Aufrufe auf?
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#3

Re: Ein Array in einer Klasse als private-Deklaration

  Alt 18. Aug 2008, 14:41
Hier wird der Array befüllt :
Delphi-Quellcode:
    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;
Und so ist der Aufruf von GetAdaptersAddresses :
Delphi-Quellcode:
  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
Und in diesem Teil in Zeile 13 überschreibt er mir den Array FaaiAdapters.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Ein Array in einer Klasse als private-Deklaration

  Alt 18. Aug 2008, 16:27
Wo ist Zeile 13? genau! (Mit oder ohne Leerzeichen)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Ein Array in einer Klasse als private-Deklaration

  Alt 18. Aug 2008, 16:31
Zudem würde ich die Größe einmal setzen und nicht bei jedem Schritt vergrößern
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#6

Re: Ein Array in einer Klasse als private-Deklaration

  Alt 18. Aug 2008, 17:19
Zitat von omata:
Wo ist Zeile 13? genau! (Mit oder ohne Leerzeichen)
Mit den Leerzeilen, ich habe die Zeilennummer genommen vom Kasten.

Zitat von mkinzler:
Zudem würde ich die Größe einmal setzen und nicht bei jedem Schritt vergrößern
Ich kann aber die Größe nicht vorher setzen, da ich die Größe vorher ja nicht weiß.

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.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von Dunkel
Dunkel

Registriert seit: 26. Mär 2007
Ort: Klingenstadt
541 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: Ein Array in einer Klasse als private-Deklaration

  Alt 18. Aug 2008, 20:23
Zitat von RWarnecke:
Zitat von mkinzler:
Zudem würde ich die Größe einmal setzen und nicht bei jedem Schritt vergrößern
Ich kann aber die Größe nicht vorher setzen, da ich die Größe vorher ja nicht weiß.
Gibt es denn eine maximal erreichbare Größe? Dann benutz diese und verkleiner dann das Array am Ende entsprechend der wirklich gebrauchten Größe.
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:
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);
Ist wesentlich schneller und ressourcenschonender als bei jedem Durchlauf das Array um 1 zu vergrößern.
Es ist zu wahr um schön zu sein...
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Ein Array in einer Klasse als private-Deklaration

  Alt 18. Aug 2008, 21:52
Benutze doch TList.
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#9

Re: Ein Array in einer Klasse als private-Deklaration

  Alt 18. Aug 2008, 22:03
und wo ist der zusammenhang zu deinem eingangspost? ich kann weger die klasse noch die eigennschaft in deinen anderen post erkennen ...
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#10

Re: Ein Array in einer Klasse als private-Deklaration

  Alt 19. Aug 2008, 09:55
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 MSDN-Library durchsuchenGetAdaptersAddresses. Ich habe beim Aufruf das Flag von 10 auf 0 gesetzt. Jetzt wird beim Aufruf von MSDN-Library durchsuchenGetAdaptersAddresses das Array nichtmehr überschrieben. Des weiteren habe ich noch den Aufruf von GetMem in AllocMem geändert.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 16:08 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