<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0">
	<channel>
		<title>BlitzBasic Portal Worklogs - BlitzMax Weiterentwicklung &amp; Blog</title>
		<link>https://www.blitzforum.de/worklogs/564/</link>
		<description>Worklog von Thunder</description>
		<language>de</language>
		<managingEditor>mail@blitzforum.de</managingEditor>
		<webMaster>mail@blitzforum.de</webMaster>
		<pubDate>Thu, 31 May 2018 17:18:25 +0200</pubDate>
		<lastBuildDate>Thu, 31 May 2018 17:18:25 +0200</lastBuildDate>

		<item>
			<title>Entwicklung: Neuer bmk &amp; Docker im Build-Prozess</title>
			<link>https://www.blitzforum.de/worklogs/564/#3841</link>
			<guid>https://www.blitzforum.de/worklogs/564/#3841</guid>
			<author>Thunder</author>
			<description>Ich schulde euch Mal einen Beitrag zur Entwicklung.  &lt;img src=&quot;/forum/images/smiles/icon_redface.gif&quot; alt=&quot;Embarassed&quot; /&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;bmk&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Leider ist seit April nicht viel geschehen. Aber der neue bmk war damals schon relativ fertig.&lt;br /&gt;Man kann das komplette Set an Standard-Modulen (brl, pub, maxgui) damit bauen.&lt;br /&gt;&lt;br /&gt;Ein paar Features unterst&amp;uuml;tzt er noch nicht, was unter anderem verhindert, dass bruceys bah-Module funktionieren &lt;img src=&quot;/forum/images/smiles/icon_sad.gif&quot; alt=&quot;Sad&quot; /&gt;&lt;br /&gt;Es ist mir aber gro&amp;szlig;teils bekannt, woran das liegt. Zum Beispiel kann man so etwas schreiben:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]ModuleInfo &amp;quot;CC_OPTS: -DHAVE_CONFIG_H&amp;quot;[/syntax]&lt;br /&gt;und damit bezwecken, dass beim Build des Moduls, in dem diese Zeile vorkommt, der String -DHAVE_CONFIG_H zu den C-Compiler Optionen hinzugef&amp;uuml;gt wird. Das ist eine Aufgabe, die der bmk auch erledigt.&lt;br /&gt;&lt;br /&gt;Irgendwie fehlt nach dem Linken von MaxIDE auf Windows das Icon. Das Kompilieren eines Moduls bricht nicht ab, wenn es einen Fehler gab. bmk makemods hat noch Probleme ohne das -a Flag. etc. &lt;br /&gt;&lt;br /&gt;Zum bmk werde ich noch einen Post nachreichen!&lt;br /&gt;Da gibt es interessante algorithmische Probleme und neue Features zu entdecken  &lt;img src=&quot;/forum/images/smiles/icon_smile.gif&quot; alt=&quot;Smile&quot; /&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;Automatisches builden&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Jetzt gibt es auch ein Makefile im src/ Ordner, das dazu da ist, den kompletten build-Prozess durchzuf&amp;uuml;hren, also bmk und bcc compilieren, dann damit die BlitzMax-Module kompilieren und schlie&amp;szlig;lich makedocs und MaxIDE.&lt;br /&gt;&lt;br /&gt;Nachdem ich das Projekt bei bitbucket hoste, wo man 50 Minuten Build-Zeit pro Monat gratis bekommt, hab ich mir deren Build-System Mal angesehen und es ist relativ einfach da Fu&amp;szlig; zu fassen.&lt;br /&gt;&lt;br /&gt;1. Als erstes muss man ein Docker-Image aussuchen, innerhalb dessen alle Tools installiert sind, die zum Kompilieren notwendig sind. Da es so eines speziell noch nicht gab, hab ich eines gebaut (Dockerfile findet ihr unter src/docker). &lt;br /&gt;&lt;br /&gt;2. Dann muss man ins Repo nur noch ein YAML-File hineinschmei&amp;szlig;en, das den Build-Prozess beschreibt (es ist im Prinzip nichts anderes als ein Shell skript).&lt;br /&gt;F&amp;uuml;r BlitzMax wird dieses verwendet:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Code: &lt;/b&gt;&lt;span style=&quot;font-size:0.8em; display:inline;&quot; id=&quot;showcodebox0&quot;&gt; &lt;a href=&quot;javascript&amp;#058;show_code('0')&quot;&gt;[AUSKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;span style=&quot;font-size:0.8em; display:none;&quot; id=&quot;hidecodebox0&quot;&gt; &lt;a href=&quot;javascript&amp;#058;hide_code('0')&quot;&gt;[EINKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;div id=&quot;codebox0&quot; class=&quot;codebox&quot; style=&quot;max-height: 200px;&quot; onload=&quot;check_code('0');&quot;&gt;image&amp;#58; chtis/blitzmax-buildenv-linux&amp;#58;latest&lt;br /&gt;&lt;br /&gt;pipelines&amp;#58;&lt;br /&gt;&amp;nbsp; custom&amp;#58;&lt;br /&gt;&amp;nbsp; &amp;nbsp; build-linux&amp;#58;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - step&amp;#58;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; script&amp;#58;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - git submodule init&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - git submodule update&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - cd src&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - make clean&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - make install&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - make clean&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - cd ..&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - tar czf blitzmax-linux.tgz *&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - curl -X POST &amp;quot;https&amp;#58;//$&amp;#123;BLITZMAX_AUTH&amp;#125;@api.bitbucket.org/2.0/repositories/$&amp;#123;BITBUCKET_REPO_OWNER&amp;#125;/$&amp;#123;BITBUCKET_REPO_SLUG&amp;#125;/downloads&amp;quot; --form files=@&amp;quot;blitzmax-linux.tgz&amp;quot;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Ganz oben steht der Name des Docker-Image. Die Build-Server holen sich dann dieses Image, erstellen einen Container, laden das Code-Repo hinein und f&amp;uuml;hren das skript aus. In den beiden letzten Schritten wird das Archiv gepackt und in die Downloads-Sektion hochgeladen.&lt;br /&gt;&lt;br /&gt;Nachdem das dort echt flott geht (ca 5 Minuten - ihr m&amp;uuml;sst bedenken, dass alle Module viermal gebaut werden wegen debug/release und single/multi-threaded) bin ich damit voll zufrieden. Es gehen sich also ca. 10 builds im Monat gratis aus. Und ich verwende fancy Technologie (Docker)  &lt;img src=&quot;/forum/images/smiles/icon_razz.gif&quot; alt=&quot;Razz&quot; /&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;Ausblick&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ich finde das Fundament ist schon ganz gut. Es ist wichtig, dass der neue bmk perfekt funktioniert, damit auch&lt;br /&gt;wirklich die alten Module gebaut werden k&amp;ouml;nnen. Ich m&amp;ouml;chte eigentlich relativ wenige breaking changes machen.&lt;br /&gt;&lt;br /&gt;Der n&amp;auml;chste Schritt nach der Stabilisierung von bmk wird vermutlich die Ausarbeitung einer neuen Standardbibliothek sein. Au&amp;szlig;er ich schaffe es vorher noch im Compiler Interfaces zu implementieren (die w&amp;auml;ren n&amp;auml;mlich in BlitzMax wirklich praktisch).&lt;br /&gt;&lt;br /&gt;Neu bedeutet nicht komplett anders, aber ich m&amp;ouml;chte core-Module, die sehr m&amp;auml;chtig, aber klein sind, und ich m&amp;ouml;chte basic-Module (als Abl&amp;ouml;se f&amp;uuml;r die brl-Module), die auf den core-Modulen basieren und gleiche/&amp;auml;hnliche Interfaces bereitstellen wie die brl-Module.</description>
			<pubDate>Thu, 31 May 2018 17:18:25 +0200</pubDate>
		</item>

		<item>
			<title>Blog: Ein Henne-Ei-Problem</title>
			<link>https://www.blitzforum.de/worklogs/564/#3840</link>
			<guid>https://www.blitzforum.de/worklogs/564/#3840</guid>
			<author>Thunder</author>
			<description>Heute geht es passend zu Ostern um ein &amp;quot;Problem&amp;quot; beim Kompilieren von BlitzMax &lt;img src=&quot;/forum/images/smiles/icon_biggrin.gif&quot; alt=&quot;Very Happy&quot; /&gt;&lt;br /&gt;&lt;br /&gt;In BlitzMax gibt es das Programm &lt;b&gt;bcc&lt;/b&gt;, das ist der BlitzMax Compiler, der aus dem BlitzMax-Quelltext Assembler erstellt, und das Programm &lt;b&gt;bmk&lt;/b&gt;, das daf&amp;uuml;r zust&amp;auml;ndig ist, &lt;b&gt;bcc&lt;/b&gt;, &lt;b&gt;fasm&lt;/b&gt;, &lt;b&gt;gcc&lt;/b&gt;, &lt;b&gt;g++&lt;/b&gt; usw. in der richtigen Reihenfolge aufzurufen, Module zu bauen [1] und m&amp;ouml;glichst nichts neu zu kompilieren, was schon kompiliert vorliegt.&lt;br /&gt;&lt;br /&gt;In BlitzMax dabei waren au&amp;szlig;erdem eine IDE (&lt;b&gt;maxide&lt;/b&gt;) und ein Programm (&lt;b&gt;makedocs&lt;/b&gt;) um die HTML Dokumentation aus dem bbdoc-Format zu erstellen. Au&amp;szlig;erdem sind ein Haufen Standard-Module dabei.&lt;br /&gt;Schauen wir uns mal an, in welcher Programmiersprache die alle geschrieben sind:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;bcc&lt;/b&gt;: C++&lt;br /&gt;&lt;b&gt;bmk&lt;/b&gt;: BlitzMax&lt;br /&gt;&lt;b&gt;MaxIDE&lt;/b&gt;: BlitzMax&lt;br /&gt;&lt;b&gt;makedocs&lt;/b&gt;: BlitzMax&lt;br /&gt;&lt;b&gt;Module&lt;/b&gt; (brl, pub, maxgui): BlitzMax, C, C++, assembler&lt;br /&gt;&lt;br /&gt;Das bedeutet, wenn ich BlitzMax von Quelltext kompilieren m&amp;ouml;chte, baue ich als erstes &lt;b&gt;bcc&lt;/b&gt; mithilfe eines C++ Compilers. Dann komme ich aber nicht mehr weiter, weil ich nicht mit der Hand mit bcc, g++, ld etc. so hantieren kann, dass am Ende gebaute Module und ein funktionierender &lt;b&gt;bmk&lt;/b&gt; herauskommen.&lt;br /&gt;Wer BlitzMax mit den Scripten/Batch-Files von BRL kompilieren m&amp;ouml;chte, braucht also erst Mal einen funktionierenden bmk, den man sich als exe file herunterladen muss [2].&lt;br /&gt;&lt;br /&gt;Das ist relativ unn&amp;ouml;tig - vor allem weil der BlitzMax Compiler selbst in C++ geschrieben ist. Wenn wir eine &lt;b&gt;bmk&lt;/b&gt; Version in C++ h&amp;auml;tten, k&amp;ouml;nnten wir als erstes &lt;b&gt;bmk&lt;/b&gt; und &lt;b&gt;bcc&lt;/b&gt; kompilieren und dann den Rest.&lt;br /&gt;Daran arbeite ich gerade. An einem gut-konfigurierbaren und verl&amp;auml;sslichen Ersatz f&amp;uuml;r &lt;b&gt;bmk&lt;/b&gt;, der in C++ programmiert wird - und der eventuell etwas &amp;uuml;bersichtlicher programmiert ist als der alte bmk  &lt;img src=&quot;/forum/images/smiles/icon_sad.gif&quot; alt=&quot;Sad&quot; /&gt;  .&lt;br /&gt;&lt;br /&gt;PS:&lt;br /&gt;Es gibt &amp;uuml;brigens noch etwas, das wir nicht von Quelltext kompilieren k&amp;ouml;nnen: &lt;b&gt;fasm&lt;/b&gt; [3] ist &lt;i&gt;self-hosting&lt;/i&gt;, d.h. er ist in seiner eigenen (Assembler-)Sprache geschrieben und man braucht immer eine alte version des assemblers um eine neue zu assemblieren.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Endnoten&lt;/b&gt;&lt;br /&gt;[1] Mit &amp;quot;Bauen&amp;quot; meine ich den n&amp;ouml;tigen Vorgang um aus Quelltext ein ausf&amp;uuml;hrbares Programm oder eine Library zu erstellen. Das kann oft mehrere Prozesse involvieren (nicht nur das Kompilieren, z.B. auch assemblieren oder linken).&lt;br /&gt;[2] hier sind die exe files im git repo von blitzmax: &lt;a href=&quot;https://github.com/blitz-research/blitzmax/tree/master/_src/win32_x86/bin&quot; target=&quot;_blank&quot;&gt;https://github.com/blitz-resea...32_x86/bin&lt;/a&gt;&lt;br /&gt;[3] fasm = flat assembler, der assembler, der in Blitzmax verwendet wird, link: &lt;a href=&quot;http://flatassembler.net/&quot; target=&quot;_blank&quot;&gt;http://flatassembler.net/&lt;/a&gt;</description>
			<pubDate>Mon, 02 Apr 2018 02:00:59 +0200</pubDate>
		</item>

		<item>
			<title>Blog: #13 Try/Catch Fehler in BlitzMax</title>
			<link>https://www.blitzforum.de/worklogs/564/#3839</link>
			<guid>https://www.blitzforum.de/worklogs/564/#3839</guid>
			<author>Thunder</author>
			<description>Hallo,&lt;br /&gt;&lt;br /&gt;diesen Worklog m&amp;ouml;chte ich meiner Arbeit mit/an BlitzMax widmen. Das ist nicht unbedingt nur Programmieren sondern, wie ihr in meinen Tutorials vielleicht schon gelesen habt [1][2][3], auch Fehler Aufsp&amp;uuml;ren und Erforschen, was m&amp;ouml;glich ist. Andererseits werde ich hier auch zu meinem BlitzMax Fork posten.&lt;br /&gt;&lt;br /&gt;Dieses Mal m&amp;ouml;chte ich in K&amp;uuml;rze eure Aufmerksamkeit auf einen Fehler im BlitzMax Compiler lenken, den jemand letztes Jahr aufgesp&amp;uuml;rt und ihn auf Github gemeldet hat [4] (das hat die Nummer #13).&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;BlitzMax Issue #13&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ich zeige euch ein leicht modifiziertes Beispiel und erkl&amp;auml;re worum es dabei geht:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]SuperStrict&lt;br /&gt;Framework BRL.StandardIO&lt;br /&gt;&lt;br /&gt;Function TryFail()&lt;br /&gt;	Local x:Int = 10&lt;br /&gt;	Try&lt;br /&gt;		x :* 2&lt;br /&gt;		Print &amp;quot;Try: x == &amp;quot;+x&lt;br /&gt;		Throw &amp;quot;BAIL&amp;quot;&lt;br /&gt;	Catch e:Object&lt;br /&gt;	EndTry&lt;br /&gt;	Print &amp;quot;After Try: x == &amp;quot; + x + &amp;quot;  should be 20&amp;quot;&lt;br /&gt;EndFunction&lt;br /&gt;&lt;br /&gt;Function TryOk()&lt;br /&gt;	Local x:Int = 10&lt;br /&gt;	Local p:Byte Ptr = Varptr x ' taking the address solidifies the variable&lt;br /&gt;	Try&lt;br /&gt;		x :* 2&lt;br /&gt;		Print &amp;quot;Try: x == &amp;quot;+x&lt;br /&gt;		Throw &amp;quot;BAIL&amp;quot;&lt;br /&gt;	Catch e:Object&lt;br /&gt;	EndTry&lt;br /&gt;	Print &amp;quot;After Try: x == &amp;quot; + x + &amp;quot;  should be 20&amp;quot;&lt;br /&gt;EndFunction&lt;br /&gt;&lt;br /&gt;TryFail()&lt;br /&gt;TryOk()&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;Der Code zeigt zwei Funktionen mit Try/Catch-Bl&amp;ouml;cken. In beiden wird zuerst eine Variable x, die vorher mit dem Wert 10 initialisiert wurde, verdoppelt. Danach wird der Wert von x ausgegeben und eine Exception geworfen.&lt;br /&gt;Es sollte unmittelbar klar sein, dass der Wert von x nicht dadurch beeinflusst werden kann, ob eine Exception geworfen wird oder nicht, weil die Exception erst nach der Verdopplung geworfen wird. Man erwartet also viermal die Zahl 20 als Ausgabe.&lt;br /&gt;&lt;br /&gt;Ausgabe:&lt;br /&gt;&lt;b&gt;Code: &lt;/b&gt;&lt;span style=&quot;font-size:0.8em; display:inline;&quot; id=&quot;showcodebox1&quot;&gt; &lt;a href=&quot;javascript&amp;#058;show_code('1')&quot;&gt;[AUSKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;span style=&quot;font-size:0.8em; display:none;&quot; id=&quot;hidecodebox1&quot;&gt; &lt;a href=&quot;javascript&amp;#058;hide_code('1')&quot;&gt;[EINKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;div id=&quot;codebox1&quot; class=&quot;codebox&quot; style=&quot;max-height: 200px;&quot; onload=&quot;check_code('1');&quot;&gt;Try&amp;#58; x == 20&lt;br /&gt;After Try&amp;#58; x == 10&amp;nbsp; should be 20&lt;br /&gt;Try&amp;#58; x == 20&lt;br /&gt;After Try&amp;#58; x == 20&amp;nbsp; should be 20&lt;/div&gt;&lt;br /&gt;&lt;br /&gt; &lt;img src=&quot;/forum/images/smiles/icon_eek.gif&quot; alt=&quot;Shocked&quot; /&gt;  &lt;img src=&quot;/forum/images/smiles/icon_eek.gif&quot; alt=&quot;Shocked&quot; /&gt;  &lt;img src=&quot;/forum/images/smiles/icon_eek.gif&quot; alt=&quot;Shocked&quot; /&gt;&lt;br /&gt;&lt;br /&gt;In TryFail bekommen wir lustigerweise erstmal 20 im Try Block und dann 10 wenn wir wieder drau&amp;szlig;en sind (das &amp;uuml;brigens nur, wenn im Try Block eine Exception geworfen wird).&lt;br /&gt;&lt;br /&gt;Ich m&amp;ouml;chte kurz auf die Ursachen eingehen und eine Zusammenfassung geben, wie man sich vor dem Fehler sch&amp;uuml;tzt, da Mark ihn noch nicht gefixt hat und ich es noch nicht sinnvoll hinbekommen habe.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;Ursachen&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ich glaube dieser Bereich ist recht technisch geworden...  &lt;img src=&quot;/forum/images/smiles/icon_confused.gif&quot; alt=&quot;Confused&quot; /&gt; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Wie funktionieren Exceptions eigentlich?&lt;/b&gt;&lt;br /&gt;Ich m&amp;ouml;chte nicht zu sehr ins Detail gehen, aber es ist wichtig zu verstehen, was passiert wenn eine Exception geworfen wird:&lt;br /&gt;&lt;br /&gt;Eine Exception beeinflusst den Control-Flow in einem Programm erheblich. &amp;Uuml;blicherweise wird Code von oben nach unten ausgef&amp;uuml;hrt, mit Abfragen und Schleifen k&amp;ouml;nnen wir ihn lenken. Bei einer Exception wird der n&amp;auml;chste einh&amp;uuml;llende Try Block gesucht und zu dessen entsprechenden Catch Block gesprungen, aber nur falls die Exception von einem Typ ist, der von dem Catch-Block gefangen werden kann. Falls nicht, muss weiter au&amp;szlig;en gesucht werden. Dazu kann auch die aktuelle Funktion verlassen und der Call Stack abgearbeitet werden um schlie&amp;szlig;lich den Stack der Funktion wiederherzustellen, in die man zur&amp;uuml;ck springt (das nennt man dann &lt;i&gt;Stack Unwinding&lt;/i&gt;)... Und dann hei&amp;szlig;t es immer Gotos w&amp;auml;ren so un&amp;uuml;bersichtlich  &lt;img src=&quot;/forum/images/smiles/icon_lol.gif&quot; alt=&quot;Laughing&quot; /&gt; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Lokale Variablen&lt;/b&gt;&lt;br /&gt;Lokale Variablen wie dieses x aus dem Beispiel werden &amp;uuml;blicherweise auch auf dem Stack aufbewahrt. Der Compiler kann aber meistens lokale Variablen nur in CPU-Registern halten. Das spart Speicher und auch Zeit, weil Arbeitsspeicher viel langsamer ist als die CPU.&lt;br /&gt;Bei CPU-Registern gibt es aber Konventionen wof&amp;uuml;r sie verwendet werden k&amp;ouml;nnen, wichtig hier ist: wer sichert ein Register, wenn eine Funktion aufgerufen wird? Der Aufrufende oder der Aufgerufene?&lt;br /&gt;&lt;br /&gt;Von den sogenannten &lt;i&gt;General Purpose Registern&lt;/i&gt; der x86 Architektur (die keinen besonderen zweck erf&amp;uuml;llen) sind die Register ebx, esi und edi &lt;b&gt;callee-saved&lt;/b&gt; und die restlichen sind &lt;b&gt;caller-saved&lt;/b&gt;.&lt;br /&gt;callee-saved hei&amp;szlig;t, eine Funktion muss die Register abspeichern und vor dem return wiederherstellen.&lt;br /&gt;caller-saved hei&amp;szlig;t, eine Funktion darf die Register einfach verwenden wie sie will, d.h. jede Funktion muss bevor sie eine andere Funktion aufruft diese Register speichern, falls n&amp;ouml;tig.&lt;br /&gt;&lt;br /&gt;Mist, ich gehe schon mehr ins Detail als ich wollte...&lt;br /&gt;&lt;br /&gt;Jedenfalls ist es in der TryFail() Funktion so, dass BlitzMax den Wert von x nur in einem Register h&amp;auml;lt (bei mir ist es ebx). Das hei&amp;szlig;t der Compiler geht davon aus, dass der Wert in ebx steht und dass er nicht durch Funktionsaufrufe manipuliert wird.&lt;br /&gt;Nur leider h&amp;auml;lt sich die Funktion bbExThrow (das Throw Kommando in BlitzMax) nicht an die Konvention, weil es ja den Stack von der Funktion wiederherstellen muss, in die es zur&amp;uuml;ckspringt, und dazu geh&amp;ouml;ren auch die callee-saved Register (da die ja von Funktionsaufrufen unber&amp;uuml;hrt bleiben m&amp;uuml;ssten). Das ist ein bisschen ein Henne-Ei-Problem  &lt;img src=&quot;/forum/images/smiles/icon_surprised.gif&quot; alt=&quot;Surprised&quot; /&gt; &lt;br /&gt;Gespeichert werden diese callee-saved Register (sowie der Stack Frame) am Beginn eines Try-Blocks. Damit ist also das Ph&amp;auml;nomen erkl&amp;auml;rt.&lt;br /&gt;&lt;br /&gt;Dieses Problem wird in TryOk() dadurch vermieden, dass mit VarPtr die Speicheradresse von der Variable x genommen wird. Damit bleibt dem Compiler nichts anderes &amp;uuml;brig, als die Variable auf dem Stack abzuspeichern. Der Stackframe wird auch beim Throw korrekt wiederhergestellt (da hier nicht die einzelnen Werte der Variablen wiederhergestellt werden, sondern die Position des Stacks).&lt;br /&gt;&lt;br /&gt;Ich habe mich im Issue [4] auch schon zu dem Thema ge&amp;auml;u&amp;szlig;ert.&lt;br /&gt;&lt;br /&gt;Hier noch ein Ausschnitt des Assemblercodes der beiden Funktionen nebeneinander:&lt;br /&gt;&lt;a href=&quot;https://ibb.co/fReSC7&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;https://thumb.ibb.co/fReSC7/issue13.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;Fehlervermeidung&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Wenn ihr Code mit Try-Bl&amp;ouml;cken schreibt, die l&amp;auml;ngere Passagen enthalten, ist es wichtig, sich mit dem Problem auseinander zu setzen, vor allem da BlitzMax nicht aktiv entwickelt wird.&lt;br /&gt;&lt;br /&gt;Zusammenfassung:&lt;br /&gt;- &lt;b&gt;wichtig:&lt;/b&gt; der Fehler ist nicht-deterministisch, d.h. er kann auftauchen und verschwinden je nach dem wie der Compiler euren Code optimiert, weil nur Variablen betroffen sind, die in Registern gehalten werden.&lt;br /&gt;- der Fehler ist plattformunabh&amp;auml;ngig&lt;br /&gt;- der Fehler betrifft nur lokale Variablen&lt;br /&gt;- der Fehler betrifft nur &amp;Auml;nderungen am &lt;b&gt;Wert&lt;/b&gt; einer Variablen (bei Objekten geht es also um die Objektaddresse und nicht um den Inhalt des Objekts).&lt;br /&gt;- der Fehler &lt;i&gt;kann nicht auftreten&lt;/i&gt;, wenn euer Try-Block nur aus einer einzigen Zuweisung besteht. (die Try-Bl&amp;ouml;cke in den brl modulen sehen oft so aus).&lt;br /&gt;&lt;br /&gt;Die Standard Module brl, pub und maxgui sind von dem Fehler wahrscheinlich nicht betroffen. Ich habe die Try-Catch-Bl&amp;ouml;cke durchgesehen, die sowieso schon ziemlich rar sind in den Modulen.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;N&amp;auml;chstes Mal kommt dann wahrscheinlich Was zu meinem BlitzMax Fork.&lt;br /&gt;Ich werde auch sehen, ob ich was wegen dem Issue machen kann.&lt;br /&gt;&lt;br /&gt;Liebe Gr&amp;uuml;&amp;szlig;e!&lt;br /&gt;&lt;br /&gt;Quellen &amp;amp; Verweise:&lt;br /&gt;&lt;br /&gt;[1] BlitzMax mit Assembler/C &lt;a href=&quot;https://www.blitzforum.de/forum/viewtopic.php?t=35959&quot; target=&quot;_blank&quot;&gt;https://www.blitzforum.de/foru...hp?t=35959&lt;/a&gt;&lt;br /&gt;[2] BlitzMax vom Quelltext bauen &lt;a href=&quot;https://www.blitzforum.de/forum/viewtopic.php?t=40740&quot; target=&quot;_blank&quot;&gt;https://www.blitzforum.de/foru...hp?t=40740&lt;/a&gt;&lt;br /&gt;[3] BlitzMax Interna &lt;a href=&quot;https://www.blitzforum.de/forum/viewtopic.php?t=39579&quot; target=&quot;_blank&quot;&gt;https://www.blitzforum.de/foru...hp?t=39579&lt;/a&gt;&lt;br /&gt;[4] GitHub Issue #13 &lt;a href=&quot;https://github.com/blitz-research/blitzmax/issues/13&quot; target=&quot;_blank&quot;&gt;https://github.com/blitz-resea.../issues/13&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Edit: habe mich mit den Registern in einem Satz vertan (da stand mal esi statt ebx).</description>
			<pubDate>Tue, 27 Mar 2018 20:13:42 +0200</pubDate>
		</item>


	</channel>
</rss>
