Beiträge von BIF im Thema „Freier Speicher“
-
-
Wäre vielleicht einfacher mit peek.
Hinter fre(0) steckt ja nicht nur das Auslesen der Speicherstellen, sondern auch noch der Aufruf der Stringaufräumung, um den freien Variablenspeicher zu ermitteln.Schönen Gruß.
-
Hexworx:
Eben, zwei verschiedene Rechnungen führen auch zu zwei unterschiedlichen Ergebnissen.
Bei der Einschaltmeldung wird eben der gesamte Basic-RAM-Speicher berechnet.
Während bei fre(0) der freie Variablenspeicher angegeben wird.Schönen Gruß.
-
Also, ich meinte animierte Variablen, die sich im Variablenbereich von vorn und hinten aufbauen.
Dann die Garbage-Collection, die den oberen Stringbereich wieder schrumpfen läßt.Das wäre dann ein Drei- oder Vierfarbbalken.
So was müßte man eigentlich auch als Basic-Demo programmieren können.
SchönenGruß.
-
Das wäre dann die Erweiterung.
Die Anfangsfrage war meiner Meinung nach warum fre(.) und die Einschaltmeldung zu verschiedenen Ergebnissen kommnen.
Bei fre(0) gibt es ja dann wieder zwei Fälle: Entweder, es sind Variablen angelegt oder nicht.Schönen Gruß.
-
@Colt:
Sehr schöner Film.
Nur der Variablenbereich mit Variablen, Strings und fre(0)+Garbage Collection fehlt noch.Schönen Gruß.
-
Es geht hier wohl nicht um die zweigeteilte Speicherzelle, sondern um den zweigeteilten Basic-Bereich.
a) Programmcode mit Ende zwei Nullbytes
b) Variablenbereich
c) freier Variablenbereich fre(0)Im Falle das keine Variablen angelegt wurden oder ein clr ausgefürht wurde, ist der Variablenbereich mit dem freien Variablenbereich identisch.
Schönen Gruß.
-
In Basic gibt es nun mal den Unterschied zwischen Programm und Variablenspeicher.
Diese Unterschiede werden durch die Speicherstellen in der Zeropage ab 43 festgelegt.Die drei Nullbytes am Anfang, oder am Programmende bilden die End-Markierung des Basic-Programms.
Danach beginnt für das Basic der Variablenspeicherbereich.
Und der freie Variablenspeicher der mit fre(0) berechnet wird, wird durch den Felder-End-Zeiger und den Stringrenzen-Zeiger begrenzt.Schönen Gruß.
-
Das ist eben gerade der Unterschied mit den zwei Bytes.
Der Variablenspeicher, der beim Start mit fre(0) ermittelt wird ist um 2 Byte kleiner, als der Basicspeicher für ein Basic-Programm, ohne Variablen selbstverständlich.
Also rein rechnerisch ist das zwar fast gleich, wenn noch keine Variablen angelegt worden sind, aber nicht ganz gleich.
Wenn bereits Variablen angelegt worden sind, dann hat fre(0) aber keine Aussagekraft mehr darüber, wie groß das Basic-Programm noch werden kann.
Also, man kann aus dem freien Variablenspeicher mit Einschränkung natürlich auch Rückschlüße über den freien Basic-Programmspeicher ziehen, wenn z.B. alle Variablen gelöscht sind.
Aber im Prinzip, berechnet fre(0) in Zusammenarbeit mit der Garbage-Collection den freien Variablenspeicher.Schönen Gruß.
-
Ich denke mal man kann unterscheiden zwischen
freien Basic Speicher
und
freiem Variablen-Speicher.
fre(0) ermittelt den freien Variablen-Speicher und nicht den freien Basic-Speicher.
Der Basic-Speicher setzt sich wohl aus dem Basic-Programm+Varialblen-Speicher-Bereich zusammen.
Schönen Gruß.
-
Offensichtlich ist das Thema ein Dauerbrenner.
Interessant wäre wohl die Frage, mit welcher Methode, bzw. welchem Programm die 2 Phantombytes berechnet wurden.Schönen Gruß.
-
@Markusk:
Ich hab das auch mal am EMU ausprobiert und mußte feststellen, daß Mike eigentlich recht hat.
Also, fre() scheint richtig zu arbeiten.
Möglicherweise bist du einem anderen Phänomen aufgesessen.
Wenn man eine Variable neu einführt, dann verschiebt sich auch der Feld-Ende-Zeiger weiter nach oben.
Gegebenenfalls ist es besser alle benutzten Variablen vorher mit dima,b,c anzulegen, um Verschiebungen beim Zeigerauslesen während des Programmablaufs zu verhindern.
Also mit jeder neu angelegten Variable verringert sich auch der freie Speicher um ein paar Byte.Schönen Gruß.
-
Das mit den zwei Nullen am Programmende stimmt zwar, ich glaub aber daß es an den zwei Zeigern liegt, aus den fre() berechnet wird.
1. Der String-Anfangs-Zeiger.
2. Der Variablenfelder-Ende-ZeigerDer String-Anfang beginnt beim Ende des freien Speichers +1
Und das Variblenfelder-Ende ist am Anfang des freien Speichers -1Daraus ergeben sich meiner Vermutung nach die zwei zusätzlichen Bytes.
Man müßte aber wohl mal in ROM-Listing gucken, wie das genau gemacht wird.Schönen Gruß.
-
Vielleicht muß man nur 65534 dazuzählen, wenn man auf das richtige Ergebnis kommen will.
Also grundsätzlich wird fre() glaub ich aus dem Zeiger für "Ende der Datenfelder" und "String-Grenze" ermittelt.
Der Stringgrenzen-Zeiger steht beim Start auf 40960, das Basic-RAM geht aber nur bis 40959. Das ergibt dann schon mal minus 1.
Wenn das Ende der Datenfelder +1 ist ergibt das dann die Differenz von den zwei fehlenden Bytes.Auf die hundertprozentige Exaktheit wurde hier vermutlich keinen Wert gelegt, die muß man dann als Programmierer erst herstellen.
Schönen Gruß.