Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fehler: Out of Memory (https://www.delphipraxis.net/37796-fehler-out-memory.html)

C64-Flo 10. Jan 2005 18:00


Fehler: Out of Memory
 
Eines Vorweg:

Ich habe praktisch keinen Plan von Delphi (was man an meinen fragen hier oft sieht :lol: ), code aber für meine Leben gerne -kA wie das nochmal war, dass ich mit Delphi anfing....

Irgendwie kriegt man schon alles hin, wenn man will..(auch wenn mans übers Knie brechen muss und notorisch BASIC-stile anwendet, obwohls vermutlich schon 1000 neuzeitlichere Wege gibt , wie man das eine oder andere Problem hinbekommt )

Zur Zeit mache ich ein Hack´n´Slay-Tamagotchi-Popp-Spiel(tm)...grob an AD&D angelehnt.
Im Grunde nichts bahnbrechendes, aber in Punkto Suchtfaktor immer noch top!

Unlogische Fehler im Ablauf bis hin zu Ausstiegen an Stellen, die vorher noch funktionierten -

sind das Hinweise auf eine Speicherüberlastung?

Jaja, ich gebs zu, ich hab eine Handvoll globaler Arrays drinne und auch sonst nicht wirklich darauf geachtet, sparsam mit dem Speicher umzugehen...


Bitte bitte kann mir jemand sagen wie ich vielleicht dem Programm mehr Speicher zuweisen kann dass es alle Arrays etc verkraftet?
Bzw wie ich sonst allgemein Speicher sparen könnte?

Wäre es vielleicht besser anstatt 5 2dimensionalen Arrays 1 dreidimensionales zu verwenden?
Oder records? :gruebel:
Darf man nicht über 30 Forms in einem Programm verwenden?
Muss ich jetzt eine Datenbank andocken?

aaaaaaaahhhhhhhhhhhhh

Erinnerungen an
"OUT OF MEMORY"-Meldungen werden wach



:gruebel:

[edit=sakura] Großschreibung ist WIE SCHREIEN ;) Mfg, sakura[/edit]

shmia 10. Jan 2005 18:07

Re: OUT OF MEMORY.
 
Zitat:

Zitat von C64-Flo
Irgendwie kriegt man schon alles hin, wenn man will..(auch wenn mans übers Knie brechen muss und notorisch BASIC-stile anwendet, obwohls vermutlich schon 1000 neuzeitlichere Wege gibt , wie man das eine oder andere Problem hinbekommt )

Genau das ist dein Problem; du bist nicht wirklich bereit vom Quick & Dirty Programmieren Abschied zu nehmen.
Unter Windows ist Speichernmangel sehr selten und falls doch, dann wird eben auf Festplatte ausgelagert.
Also meine Glaskugel sagt, dass du Spaghetti Code programmiert hast und nicht der fehlende Speicher schuld ist.

RedDust 10. Jan 2005 18:31

Wo ein Wille ist, ist auch ein weg
 
Also es gibt eine Methode die ich oft anwende sind übergreifende Units, 1. behält man die übersicht und 2. findet man schneller Fehler. Hier mal, wie ich das Prob. lösen würde.

1. Unit

Delphi-Quellcode:
unit variablen;

interface

uses controls;

type TKontakt = record
        Name        : string[255];
        Vorname     : string[255];
        Geburtstag  : TDate;
     end;

     TZeiger = ^TInhalt;

     TInhalt = record
       Inhalt : TKontakt;
       Next  : TZeiger;
       Prev  : TZeiger;
     end;

var z_akt, z_akt2, z_kopf, z_ende : TZeiger;
    v_dat                        : FILE OF TKontakt;
    VCard                        : TKontakt;

implementation

end.
2. Unit

Delphi-Quellcode:
unit prozeduren;

interface

uses variablen;

procedure p_laden;
procedure p_uebernehmen(kontakt : TKontakt);
procedure p_speichern;

implementation

uses haupt;

procedure p_laden;
begin
  AssignFile(v_dat, ExtractFilePath(Application.ExeName) + 'daten.lst');
  Reset(v_dat);
      WHILE NOT EOF(v_dat) DO
        BEGIN
          IF z_akt = NIL THEN
            BEGIN
              New(z_akt);
              Read(v_dat,z_akt^.Inhalt);
              z_kopf := z_akt;
              z_ende := z_akt;
              z_akt^.Prev := NIL;
              z_akt^.Next := NIL;
            END
          ELSE
            BEGIN
              new(z_akt2);
              z_akt^.Next := z_akt2;
              z_akt^.Next^.Prev := z_akt;
              z_akt := z_akt2;
              Read(v_dat,z_akt^.Inhalt);
              z_ende := z_akt;
              z_akt^.Next := NIL;
            END;
        END;
  z_akt := z_kopf;
end;

procedure p_uebernehmen;
begin
  IF ueberschreiben THEN
    BEGIN
      z_akt^.Inhalt := kontakt;
    END
  ELSE
  IF z_akt = NIL THEN
    BEGIN
      New(z_akt);
      z_akt^.Inhalt := kontakt;
      z_kopf := z_akt;
      z_ende := z_akt;
      z_akt^.Prev := NIL;
      z_akt^.Next := NIL;
    END
  ELSE
    BEGIN
      new(z_akt2);
      z_akt^.Next := z_akt2;
      z_akt^.Next^.Prev := z_akt;
      z_akt := z_akt2;
      z_akt^.Inhalt := kontakt;
      z_ende := z_akt;
      z_akt^.Next := NIL;
    END;
end;

procedure p_speichern;
begin
  IF z_akt <> NIL THEN
    BEGIN
      z_akt := z_kopf;
      AssignFile(v_dat, ExtractFilePath(Application.ExeName) + 'dateiname.endung');
      Rewrite(v_dat);
      WHILE z_akt^.Next <> NIL DO
        BEGIN
          Write(v_dat,z_akt^.Inhalt);
          z_akt := z_akt^.Next;
        END;
      Write(v_dat,z_akt^.Inhalt);
      CloseFile(v_dat);
    END;
end;


end.
Is aber nur 'n Vorschlag. Sollten noch Fragen auftreten, immer stellen. :duck:

SirThornberry 10. Jan 2005 18:54

Re: OUT OF MEMORY.
 
von welchem Typ ist das Array? Kurz und Knapp. Es kann an dem Array liegen. Ein Array wird im speicher an einem stück gespeichert. Das heißt wenn du in deinem Speicher nicht mehr so großen zusammenhängenden speicher hast kommt es eben zu solchen Fehlern. Lösung wäre eine verkettete Liste oder in dem Array nicht direkt die Records zu speichern sondern nur Pointer auf Records und den speicher für die Records dann selbst anfordern und wieder freigeben. Ich würde in dem Zusammenhang auch von den Array weg kommen und TList verwendet (wobei das intern auch nen Array of Pointer ist, aber eben nur Pointer und nicht riesen records).

Chewie 10. Jan 2005 18:57

Re: OUT OF MEMORY.
 
Wenn die Arrays statisch & lokal sind, gibts da sowieso ein Problem, da diese auf dem Stack abgelegt werden, der sehr begrenzt ist. Globale & dynamische werden allerdings auf dem Heap abgelegt, der recht groß ist, eigentlich bei weitem groß genug für ein Jump & Run-Spiel...

Jens Schumann 10. Jan 2005 18:57

Re: OUT OF MEMORY.
 
Hallo RedDust,
ich will ja nicht schlaumeiern (mach ich aber bestimmt schon :stupid: ), aber Dein Code
hat rein gar nichts mit OOP zu tun. Es handelt sich um uralte strukturierte Programmierung.
Ich empfehle in Objekten anstatt mit Records zu denken. Dann kommt man,gerade wenn es
ums Speichern geht, schnell zu dem Gespann TCollection/TCollectionItem. Wenn dann es
irgendwann in Richtung .net geht kann man schnell auf das Serializable Attribut umstellen.


Records sind in ObjektPascal nur wg. der Abwärtskompatiniltät (und ein bißchen WinAPI) enthalten. :cyclops:

Oxmyx 10. Jan 2005 19:00

Re: OUT OF MEMORY.
 
Zu 99,99999% liegt das nicht daran, dass zu wenig Speicher verfügbar ist (das tritt unter Windows so gut wie niemals auf), sondern daran, dass du in deinem verwurstelten Spaghetticode einfach die Fehler nicht siehst. ;-)

C64-Flo 10. Jan 2005 20:30

Re: OUT OF MEMORY.
 
Zitat:

Also es gibt eine Methode die ich oft anwende sind übergreifende Units, 1. behält man die übersicht und 2. findet man schneller Fehler. Hier mal, wie ich das Prob. lösen würde.
@RedDust

Danke für den Einblick in Dein ´kleines schwarzes Medizinbuch´ , aber leider übersteigt der code etwas meine Kentnisse, ich werde das aber bei Zeiten mal in "Try and Error" Manier ausprobieren!
:thumb:

Zitat:

von welchem Typ ist das Array? Kurz und Knapp. Es kann an dem Array liegen. Ein Array wird im speicher an einem stück gespeichert. Das heißt wenn du in deinem Speicher nicht mehr so großen zusammenhängenden speicher hast kommt es eben zu solchen Fehlern.
@ SirThornberry

es handelt sich um 5 globale Arrays ungefähr in Dimensionen ´array[20,6] of integer´ und nochmal ca. 5 array[6] of string
sowie ca. 30 weiteren globalen variablen (Asche auf mein Haupt?)
Ich frage mich, ob eine zusammenfassung zu einem einzigen Integer- und Stringarray etwas bringt? (mathematisch kommts ja aufs selbe raus)
....die sache mit den TLists etc habe ich mir mal eben näher angesehen, und ich denke ich werde das mal testen.
:dp:

Zitat:

Zu 99,99999% liegt das nicht daran, dass zu wenig Speicher verfügbar ist (das tritt unter Windows so gut wie niemals auf), sondern daran, dass du in deinem verwurstelten Spaghetticode einfach die Fehler nicht siehst.
Zitat:

Unter Windows ist Speichernmangel sehr selten und falls doch, dann wird eben auf Festplatte ausgelagert.
Also meine Glaskugel sagt, dass du Spaghetti Code programmiert hast und nicht der fehlende Speicher schuld ist.
@ Oxmyx+shmia

:-D Na das macht mir doch irgendwie Hoffnung !
Meinen eigenen Spaghetticode habe ich noch immer entwurstelt bekommen - nur die Vermutung dass es nicht daran lag hatte mir den Wind aus den Segeln genommen (Kindheitsschock von C64?) :mrgreen:


Also sprich:
Ich könnte theoretisch (wills jetzt nicht testen) 100 globale Arrays einbauen, und das Programm würde das packen? (wenn sie nicht übertrieben lang sind :angel2: )

Danke nochmal an alle schnellen Antworter! :coder:

Oxmyx 10. Jan 2005 22:39

Re: OUT OF MEMORY.
 
Zitat:

Zitat von C64-Flo
Also sprich:
Ich könnte theoretisch (wills jetzt nicht testen) 100 globale Arrays einbauen, und das Programm würde das packen? (wenn sie nicht übertrieben lang sind :angel2: )

Danke nochmal an alle schnellen Antworter! :coder:

Du könntest auch 100 Arrays mit jeweils 1 Million Integers einbauen, wenn du Lust hast. Du bringst einen Computer nicht so schnell dazu, dass er keinen Speicherplatz mehr hat. Gegebenenfalls werden eben Daten ausgelagert auf die Festplatte, aber möglich ist es.

C64-Flo 10. Jan 2005 22:53

Re: OUT OF MEMORY.
 
Wow!

Das sind wahrlich gute Neuigkeiten!

Jetzt muss ich nur noch herausfinden, wo die Fehler liegen! :mrgreen:


.....wie kann es sein, das eine flag ihren Zustand von einer zeile zur nächsten ändert, OHNE dass sie darin auch nur ansatzweise angesprochen wird?

Irgendwo habe ich gehört, dass mehrere Forms parallel laufen können (oder immer?)....
könnte das die Ursache sein?

Ich meine...bei 30 Forms (die eigentlich als unabhängige ´Bildschirme´ im Spiel funktionieren sollen ...einer als ´Inventory´ einer als ´Kampfbildschirm´ etc) würde somit das Suchen nach zufälligen Effekten von Form12 auf Form24 usw ziemlich ausufern...
:pale:



Diese mutierte Flag war nämlich das erste ´unerklärliche Phänomen´, welches aber noch verkraftbar war.... Rüstungswerte die um 128 Punkte abweichen (anstatt -2 eben -130) sind da schon eher vernichtend für das gameplay... :firejump:


Ach wäre das schön, wenn ich tatsächlich die Arrays beliebig erweitern könnte.... schier endlose Monster und Ausrüstungsvarietäten.... <schmacht> :love:


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:59 Uhr.
Seite 1 von 2  1 2      

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