Speicherverwaltung in Purebasic

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Kurzer
Beiträge: 1614
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Speicherverwaltung in Purebasic

Beitrag 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".
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2023: 56 Jahre.
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Speicherverwaltung in Purebasic

Beitrag 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?
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Speicherverwaltung in Purebasic

Beitrag von ts-soft »

Ein IMA ist ein Invalid Memory Access, also ein ungültiger Speicherzugriff.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
gekkonier
Beiträge: 314
Registriert: 20.04.2007 09:06
Wohnort: Wien

Re: Speicherverwaltung in Purebasic

Beitrag 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 ;)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Speicherverwaltung in Purebasic

Beitrag 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
Bild
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Speicherverwaltung in Purebasic

Beitrag 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...
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Speicherverwaltung in Purebasic

Beitrag 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
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
gekkonier
Beiträge: 314
Registriert: 20.04.2007 09:06
Wohnort: Wien

Re: Speicherverwaltung in Purebasic

Beitrag 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!
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Speicherverwaltung in Purebasic

Beitrag 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
Zuletzt geändert von Sicro am 09.06.2018 20:35, insgesamt 1-mal geändert.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Speicherverwaltung in Purebasic

Beitrag von ts-soft »

Ein Memory (nicht der Zeiger) ist aber immer gültig, eine Variable (ByteArray) hat aber einen festgelegten Gültigkeitsraum!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten