Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Brauchen in SUBs dimensionierte Variablen später Speicher?

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
cromfelge



Anmeldungsdatum: 28.02.2023
Beiträge: 5

BeitragVerfasst am: 28.02.2023, 10:50    Titel: Brauchen in SUBs dimensionierte Variablen später Speicher? Antworten mit Zitat

Hallo!

Ich dachte bisher immer, dass per DIM dimensionierte Variablen und Arrays nach dem Ende eines SUB automatisch geleert und gelöscht werden und keinen zusätzlichen Speicher benötigen.
Um das zu "beweisen", habe ich dieses kleine Programm geschrieben, das mir aber leider unerwartete Ergebnisse lieferte:

Code:
WIDTH 80, 25

SUB STRINGS
    DIM AS STRING coolString(1 TO 10000)
    FOR i AS DOUBLE = 1 TO 10000
        coolString(i) = "This array is big!"
    NEXT
    PRINT "Voll"
    SLEEP
END SUB

PRINT "Leer"
SLEEP
STRINGS
PRINT "Leer"
SLEEP


Jetzt belegt das Programm laut Task-Manager vor der Durchführung des SUB ca. 2,0 MB Arbeitsspeicher. Während das SUB läuft, steigt der Speicherbedarf erwartbar auf 2,7 MB. Nachdem das SUB aber beendet ist, sinkt der benötigte Arbeitsspeicher jedoch nur auf 2,2 MB ab.
Ist das einfach so und man muss anders programmieren? Gibt es irgendeinen Code/Befehl, der das verhindert und wirklich alles am Ende des SUB löscht? Oder liegt der Fehler beim Task-Manager?
Bei großen Programmen mit vielen SUBs kann sich das ja sonst schon zu einem gewissen Speicherbedarf aufaddieren...

Vielen Dank schon mal für eure Ideen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 28.02.2023, 14:19    Titel: Antworten mit Zitat

Das hängt mit der internen Speicherverwaltung von FB zusammen. Da Prozedurcn (also SUBs bzw. FUNCTIONs) üblicherweise mehrfach aufgerunfen werden, bleibt der beim ersten Aufruf reservierte Speicher (zumindest in gewissen Grenzen) während der Programmlaufzeit im Besitz der Prozedur, damit er nicht bei jedem Aufruf neu reserviert werden muß.

Du brauchst also (zumindest in diesem Fall) keine Angst vor einem Speicherleck zu haben.
Code:
Width 80, 25

Sub STRINGS
   Dim As String coolString(1 To 10000)
   For i As Integer = 1 To 10000
      coolString(i) = "This array is big!"
   Next
   ? @STRINGS, @coolstring(1) 'pointer auf die sub und auf das erste Element des arrays
End Sub

Print "Leer"
Sleep
STRINGS
Print "1"
Sleep
STRINGS
Print "2"
Sleep
STRINGS
Print "3"
Sleep
STRINGS
Print "4"
Sleep
Print "working..."
For x As Integer = 1 To 1000
   STRINGS
Next
 Print "OK"
Sleep


Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
cromfelge



Anmeldungsdatum: 28.02.2023
Beiträge: 5

BeitragVerfasst am: 28.02.2023, 16:17    Titel: Antworten mit Zitat

Vielen Dank für das Beispiel in der Antwort, das macht es gut deutlich. So ist das ja schon einmal beruhigend. Eigentlich arbeiten ja auch alle Programme so, von denen ich den Code gelesen habe, aber das Ergebnis meines Testprogramms hatte mich dann schon etwas verwundert. Im Vergleich zu dem, was Browser und moderne Spiele so ziehen, komme ich bei FB eh selten ans Limit lachen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz