Seite 2 von 3

Re: Speicherverwaltung in Purebasic

Verfasst: 09.06.2018 01:00
von Kurzer
Naja, man kann Strukturen (ich denke, darauf läuft es hinaus) ja auch als Variable oder als strukturiertes Array oder Liste benutzen. Da braucht man dann kein AllocateMamory() für.

Siehe auch Beispielcodes in der Hilfe unter "Strukturen".

Re: Speicherverwaltung in Purebasic

Verfasst: 09.06.2018 01:32
von diceman
Was Strukturen angeht, arbeite ich ausschließlich mit LinkedLists.
ts-soft hat geschrieben:Wenn Du auf AllocateMemory verzichtest, gibt es über kurz oder lang einen IMA. Kompilierst Du etwa ohne Debugger? :freak:
Der purefier in den CompilerOptionen sollte Dir helfen, Speicherfehler zu erkennen, aber der springt dann sofort an.
Nee, kompiliere immer mit Debugger; Purifer müßte auch aktiv sein (obwohl ich mit dem noch nie wirklich gearbeitet habe). :? Noch nie einen Fehler bekommen.
Worauf ich penibel achte, daß ich temporäre Arrays, Listen und Sprites freigebe, sobald ich diese nicht mehr brauche.
Hier und da benutze ich auch den CopySprite-Befehl - habe gemerkt, daß man damit eigentlich immer ein FreeSprite() benötigt, ansonsten kann bei wiederholtem Benutzen schnell der Speicher zulaufen.
Was ist ein IMA?

Re: Speicherverwaltung in Purebasic

Verfasst: 09.06.2018 02:02
von ts-soft
Ein IMA ist ein Invalid Memory Access, also ein ungültiger Speicherzugriff.

Re: Speicherverwaltung in Purebasic

Verfasst: 09.06.2018 08:46
von gekkonier
Gerade bei meinem Projekt das ich vorhabe ist AllocateMemory und Freunde gar nicht so schlecht. Die Möglichkeit mit peek und poke große Bereich ressourcenschonend abzuackern ist denke ich für Soundsynthese essentiell. Ich denke gerade für diesen Zweck ist manuelle Speicherverwaltung (das ist es mehr oder weniger ja!) essentiell. Mir ging es um das rundherum (kann es sein das ein GC das abackern vom Speicher stottern lässt?....) - und da scheint PB genau so zu machen wie es für mich nun für den Zweck Sinn macht.
Jetzt wird aber erstmal über Carrier und Modulatoren gelernt ;)

Re: Speicherverwaltung in Purebasic

Verfasst: 09.06.2018 10:09
von NicTheQuick
Statt mit Peek und Poke solltest du lieber mit Pointern arbeiten. Die sind dafür einiges schneller und wenn man sie mal kapiert, meistens sogar einfacher zu handhaben

Re: Speicherverwaltung in Purebasic

Verfasst: 09.06.2018 11:11
von mk-soft
@diceman

ein IMA tritt nur auf den man mit einen Pointer auf ein nicht definieren Speicher zugreift.
Du arbeitetest ja mit Pointer auf Listen oder Arrays. Wenn du also immer darauf achtest, das der Pointer auf ein gültigen Eintrag verweist, ist dieses kein Problem.

Arbeite auf sehr viel mit Pointern und vereinfacht viele Funktionen zur Übergabe von Daten...

Re: Speicherverwaltung in Purebasic

Verfasst: 09.06.2018 11:52
von diceman
Ja, dann weiß ich was du meinst, danke für die Erläuterung. :)
Einen solchen IMA hatte ich in der Tat ein paar Mal, aber ich konnte das jedesmal auf einen fehlerhaft adressierten *pointer zurückführen.
Pointer = <3 <3 <3

Re: Speicherverwaltung in Purebasic

Verfasst: 09.06.2018 12:08
von gekkonier
Na, ich denke solch ein Thread ist nicht schlecht - man liest mehr heraus als man vorerst ahnt!

Und jetzt: ab an den See und weg vom Computa!

Re: Speicherverwaltung in Purebasic

Verfasst: 09.06.2018 13:26
von Sicro
Anstatt

Code: Alles auswählen

*Memory = AllocateMemory(100)
kann man auch

Code: Alles auswählen

Global Dim ByteArray.b(99)
*Memory = @ByteArray()
nehmen.
Der Vorteil bei der AllocateMemory()-Variante ist, dass man darauf reagieren kann, wenn der angeforderte Speicher nicht reserviert werden konnte (AllocateMemory() liefert dann eine Null-Adresse zurück).
Bei der ByteArray()-Variante würde das Programm vermutlich einfach abstürzen, wenn die Speicheranforderung zu hoch ist.

Wenn also mit sehr großen Daten hantiert wird, ist es besser mit AllocateMemory() oder AllocateStructure() zu arbeiten, anstatt mit normalen Variablen.

Edit:
"Dim" durch "Global Dim" ersetzt

Re: Speicherverwaltung in Purebasic

Verfasst: 09.06.2018 14:05
von ts-soft
Ein Memory (nicht der Zeiger) ist aber immer gültig, eine Variable (ByteArray) hat aber einen festgelegten Gültigkeitsraum!