<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0">
	<channel>
		<title>BlitzBasic Portal Worklogs - BlueBasic Compiler</title>
		<link>https://www.blitzforum.de/worklogs/327/</link>
		<description>Worklog von Thunder</description>
		<language>de</language>
		<managingEditor>mail@blitzforum.de</managingEditor>
		<webMaster>mail@blitzforum.de</webMaster>
		<pubDate>Sat, 28 Jul 2012 21:16:16 +0200</pubDate>
		<lastBuildDate>Sat, 28 Jul 2012 21:16:16 +0200</lastBuildDate>

		<item>
			<title>Erste ausführbare Dateien</title>
			<link>https://www.blitzforum.de/worklogs/327/#3572</link>
			<guid>https://www.blitzforum.de/worklogs/327/#3572</guid>
			<author>Thunder</author>
			<description>Mit Freude kann ich endlich ausf&amp;uuml;hrbare Ergebnisse vorweisen. Arrays sind aber leider noch nicht mit von der Partie &lt;img src=&quot;/forum/images/smiles/icon_sad.gif&quot; alt=&quot;Sad&quot; /&gt;  Aber ich habe das Gef&amp;uuml;hl, das hier liest sowieso keiner &lt;img src=&quot;/forum/images/smiles/icon_biggrin.gif&quot; alt=&quot;Very Happy&quot; /&gt;&lt;br /&gt;Folgendes: Das Modulsystem funktioniert wie in BlitzMax - zweistufig (brl.blitz, pub.stdc - bzw. in BlueBasic gerade aktuell: blub.core). Imports funktionieren aber anders... Imports sollen im Endeffekt so funktionieren, dass sie nur die Symboltabelle importieren und nicht die Datei nochmal dem Linker &amp;uuml;bergeben. Wie Imports in BlitzMax implementiert sind, hat einige St&amp;ouml;rfaktoren provoziert. Aber dar&amp;uuml;ber rede ich, wenn Imports komplett so funktionieren, wie sie es sollen.&lt;br /&gt;&lt;br /&gt;Heute m&amp;ouml;chte ich &amp;uuml;ber Finalize und das Select-Statement reden.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Finalize&lt;/b&gt;&lt;br /&gt;Zu aller erst: Ich habe Bl&amp;ouml;dsinn erz&amp;auml;hlt... Finalize wird nicht nur f&amp;uuml;r Sprachen unterst&amp;uuml;tzt werden, die Goto unterst&amp;uuml;tzen. Goto ist nur notwendig, wenn man versucht, den erzeugten Objektcode klein zu halten. In Wirklichkeit kann man aber einfach das, was im Finalize-Block steht, an jeden If-Block anh&amp;auml;ngen.&lt;br /&gt;Zur Verdeutlichung ein Beispiel in BlueBasic und zwei Wege, es zu kompilieren (beide in C):&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]If x = 2 Then&lt;br /&gt;    x = 0&lt;br /&gt;ElseIf x = 3 Then&lt;br /&gt;    x = 500&lt;br /&gt;ElseIf x = 4 Then&lt;br /&gt;    x = 1337&lt;br /&gt;Else&lt;br /&gt;    x = 42&lt;br /&gt;Finalize&lt;br /&gt;	y = 80&lt;br /&gt;EndIf[/syntax]&lt;br /&gt;Wenn die Zielsprache Goto erlaubt:&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;if&amp;#40;_x == 2&amp;#41;&amp;#123;&lt;br /&gt;&amp;nbsp; &amp;nbsp; _x = 0;&lt;br /&gt;&amp;#125;else if&amp;#40;_x == 3&amp;#41;&amp;#123;&lt;br /&gt;&amp;nbsp; &amp;nbsp; _x = 500;&lt;br /&gt;&amp;#125;else if&amp;#40;_x == 4&amp;#41;&amp;#123;&lt;br /&gt;&amp;nbsp; &amp;nbsp;_x = 1337;&lt;br /&gt;&amp;#125;else&amp;#123;&lt;br /&gt;&amp;nbsp; &amp;nbsp;_x = 42;&lt;br /&gt;&amp;nbsp; &amp;nbsp;goto _1;&lt;br /&gt;&amp;#125;&lt;br /&gt;_y = 80;&lt;br /&gt;_1&amp;#58;;&lt;/div&gt;&lt;br /&gt;Wenn sie es nicht tut:&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;if&amp;#40;_x == 2&amp;#41;&amp;#123;&lt;br /&gt;&amp;nbsp; &amp;nbsp; _x = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; _y = 80;&lt;br /&gt;&amp;#125;else if&amp;#40;_x == 3&amp;#41;&amp;#123;&lt;br /&gt;&amp;nbsp; &amp;nbsp; _x = 500;&lt;br /&gt;&amp;nbsp; &amp;nbsp; _y = 80;&lt;br /&gt;&amp;#125;else if&amp;#40;_x == 4&amp;#41;&amp;#123;&lt;br /&gt;&amp;nbsp; &amp;nbsp;_x = 1337;&lt;br /&gt;&amp;nbsp; &amp;nbsp;_y = 80;&lt;br /&gt;&amp;#125;else&amp;#123;&lt;br /&gt;&amp;nbsp; &amp;nbsp;_x = 42;&lt;br /&gt;&amp;#125;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, habe den letzteren Weg jetzt auch implementiert... kann nicht erkl&amp;auml;ren, wieso ich darauf nicht schon fr&amp;uuml;her gekommen bin.&lt;br /&gt;&lt;br /&gt;Ob Finalize auch f&amp;uuml;r Schleifen kommen soll, das hat auch keinen interessiert - anscheinend. Also hab ich mir Mal die Arbeit gespart und ich &amp;uuml;berlege mir das sp&amp;auml;ter noch. Wichtig w&amp;auml;re, Mal mit den komplizierteren Sachen anzufangen: Arrays, Strings und Objekte. &lt;br /&gt;&lt;br /&gt;Es gibt jetzt &amp;uuml;brigens ein besseres Interface zwischen Frontend und Backend (Funktionspointer sind meine neuen besten Freunde). Das einerseits dem Frontend erm&amp;ouml;glicht, Informationen &amp;uuml;ber das Backend abzufragen (bool-Variablen: knows_goto, knows_continue, knows_exit - ob die Sprachen diese Funktionen unterst&amp;uuml;tzt) und andererseits erm&amp;ouml;glicht, Backendfunktionen &amp;uuml;ber die Funktionspointer aufzurufen.&lt;br /&gt;Wenn knows_goto true ist, wird die Goto-Methode verwendet, Finalize zu kompilieren, ansonsten die andere.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Select-Statement&lt;/b&gt;&lt;br /&gt;Das Select-Statement in BlitzBasic und BlitzMax unterscheidet sich generell Mal vom Switch-Statement in C (und ein paar anderen Sprachen).&lt;br /&gt;1. In den Blitz-Dialekten ist z.B. das Durchfallen von einem Case ins n&amp;auml;chste (wenn kein break; vorhanden ist) nicht m&amp;ouml;glich (break bzw. exit ist nicht Mal notwendig, um aus dem Select auszusteigen). Das wurde in BlitzMax (wei&amp;szlig; nicht, ob in BlitzBasic auch) mit dem Komma kompensiert.&lt;br /&gt;2. Au&amp;szlig;erdem k&amp;ouml;nnen in C die Case-Label nur konstante Ausdr&amp;uuml;cke abfragen (also keine Variablen). Da ist Basic also weiter, was Features angeht, kann aber nicht so gut optimieren, wie C das in dem Fall kann (&amp;lt;- meine Annahme).&lt;br /&gt;&lt;br /&gt;Ich habe mich entschieden, Select noch durch das To-Schl&amp;uuml;sselwort zu erweitern, damit man Bereiche angeben kann. Ein Beispiel:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Select x&lt;br /&gt;Case 65 To 90, 97 To 122 ' ASCII Zeichen 'A' bis 'Z' oder 'a' bis 'z'&lt;br /&gt;	' ...&lt;br /&gt;Case 13, 10 ' CR oder LF&lt;br /&gt;	' ...&lt;br /&gt;Case 0&lt;br /&gt;	' ...&lt;br /&gt;Case 48 To 57 ' '0' bis '9'&lt;br /&gt;	' ...&lt;br /&gt;EndSelect[/syntax]&lt;br /&gt;&lt;br /&gt;Das To hat nat&amp;uuml;rlich eine h&amp;ouml;here Priorit&amp;auml;t als das Komma. Ich finde es n&amp;uuml;tzlich, denn wenn es um viele Bereichsabfragen geht, ist dieses Statement k&amp;uuml;rzer als If und trotzdem genauso pr&amp;auml;gnant.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Primitive&lt;/b&gt;&lt;br /&gt;Die primitiven Datentypen Byte, Short, Int, Long, Float und Double sind bereits implementiert. Dazu kommen UByte, UShort, UInt und ULong.&lt;br /&gt;So, jetzt kommt der BlitzMax-Kompatiblit&amp;auml;tsmodus ins Spiel. Liest der Compiler eine &amp;quot;*.bmx&amp;quot; Datei, dann wird sie in diesem Modus kompiliert. Er wird auf einige BlitzMax-spezifische Sachen R&amp;uuml;cksicht nehmen. Zum Beispiel, dass f&amp;uuml;r BlitzMax Byte = UByte und Short = UShort ist. D.h. man kann in einer &amp;quot;*.bmx&amp;quot;-Datei Byte und Short nur &lt;i&gt;ohne Vorzeichen&lt;/i&gt; verwenden. Das kann man jetzt als Nachteil sehen, aber ich sehe das so: Solange man nur seine BlitzMax-Projekte mit BlueBasic kompilieren will, ist das eh ok und wenn man BlueBasic als solches programmieren will, wird man sich nicht an die alte Dateiendung klammern (die neue ist &amp;uuml;brigens &amp;quot;*.blub&amp;quot;, falls ich das noch nicht irgendwie beil&amp;auml;ufig erw&amp;auml;hnt habe). &lt;br /&gt;&lt;br /&gt;&lt;b&gt;blub.core&lt;/b&gt;&lt;br /&gt;Blub.Core wird das Standardmodul von BlueBasic in dem die wichtigsten Funktionen eingebaut sind. Im Moment enth&amp;auml;lt es _main (also den Punkt, wo das C-Programm die Kontrolle bekommt - _main ruft dann bb_main auf), _PutInteger (da ich noch keine Strings habe, konnte ich noch kein Print verwenden, also habe ich eine Funktion geschrieben, die Integer ausgibt) und _End (das einfach exit(0) ausf&amp;uuml;hrt).&lt;br /&gt;&lt;br /&gt;Einfache Programme (Sachen, die man normalerweise mit esoterischen Programmiersprachen l&amp;ouml;sen w&amp;uuml;rde &lt;img src=&quot;/forum/images/smiles/icon_biggrin.gif&quot; alt=&quot;Very Happy&quot; /&gt;) wie die Ausgabe der Fibonacci-Zahlen, sind daher schon m&amp;ouml;glich und in den meisten F&amp;auml;llen schreibt man sogar g&amp;uuml;ltige BlitzMax-Programme:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Import blub.core&lt;br /&gt;&lt;br /&gt;fibo 0, 1&lt;br /&gt;&lt;br /&gt;Function fibo(a:Int, b:Int)&lt;br /&gt;	Local tmp = a&lt;br /&gt;	a :+ b&lt;br /&gt;	PutInteger a&lt;br /&gt;	If a &amp;lt; 500 Then fibo a, tmp&lt;br /&gt;EndFunction[/syntax]&lt;br /&gt;&lt;br /&gt;Ich hoffe, dass mir die n&amp;auml;chsten Ziele keine argen Probleme machen.&lt;br /&gt;Dann liest man sich wieder n&amp;auml;chstes Mal,&lt;br /&gt;&lt;br /&gt;Christian&lt;br /&gt;</description>
			<pubDate>Sat, 28 Jul 2012 21:16:16 +0200</pubDate>
		</item>

		<item>
			<title>Kommando retour</title>
			<link>https://www.blitzforum.de/worklogs/327/#3556</link>
			<guid>https://www.blitzforum.de/worklogs/327/#3556</guid>
			<author>Thunder</author>
			<description>Hallo miteinander,&lt;br /&gt;&lt;br /&gt;nach zwei Monaten und drei Tagen melde ich mich nun wieder und ich habe gute Neuigkeiten parat. Daf&amp;uuml;r, dass ich nur gelegentlich an BlueBasic arbeiten konnte, ist es in dieser Zeit gut gewachsen. Es ist immer noch unbenutzbar, aber es hat einige Konstrukte dazugelernt.&lt;br /&gt;&lt;br /&gt;Bevor ich mit Blub (die offizielle Abk&amp;uuml;rzung &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;) beginne: Freundlicherweise habe ich die Erlaubnis bekommen, obwohl ich mein Projekt nicht in BlitzMax programmiere (sondern es nur was mit BMax zu tun hat), hier hin und wieder ein paar Updates zu machen. Danke daf&amp;uuml;r! Zus&amp;auml;tzlich werde ich ein, zwei Sachen erkl&amp;auml;ren (Syntax-Unterschiede ...), im Gro&amp;szlig;en und Ganzen ist die Syntax aber sehr gleich der von BlitzMax.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Quelltextsicherung&lt;/b&gt; passiert jetzt auf Google Code: &lt;a href=&quot;http://code.google.com/p/bluebasic&quot; target=&quot;_blank&quot;&gt;http://code.google.com/p/bluebasic&lt;/a&gt; Als Versionsverwaltungssystem verwende ich Mercurial und der Code ist jetzt unter GPL v3 lizenziert - da muss ich noch schauen, ob die nicht in Konflikt mit meinen Zielen steht (n&amp;auml;mlich, ob man die mit BlueBasic programmierten Programme dann unter einer anderen Lizenz ver&amp;ouml;ffentlichen k&amp;ouml;nnte).&lt;br /&gt;&lt;br /&gt;Zum alten Stand dazugekommen sind: If-ElseIf-Else-Finalize, If-Else (einzeilig), Select-Case-Default-Finalize, For-To-Step, For-Until-Step, Repeat-Until, Repeat-Forever, While-Wend, Goto und Labels, zuweisungs&amp;auml;hnliche Operationen (so etwas wie a:+2, a:Mod 4)&lt;br /&gt;Notwendigerweise habe ich dazu einen Formelparser gebraucht, der auch zu funktionieren scheint, und au&amp;szlig;erdem habe ich das Basissystem und die Caseinsensitivity ver&amp;auml;ndert.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Finalize&lt;/b&gt;&lt;br /&gt;So, jetzt wird dem BMax-Programmierer schon dieses merkw&amp;uuml;rdige &amp;quot;Finalize&amp;quot; aufgefallen sein. Was ist das?&lt;br /&gt;Es ist ein weiterer optionaler Teil der If-Abfrage oder des Select-Ausdrucks und eigentlich ganz einfach zu verstehen:&lt;br /&gt;&lt;b&gt;F&amp;uuml;r If-Bedingungen:&lt;/b&gt; Der Finalize-Block wird aufgerufen, nachdem ein If- oder ElseIf-Block erfolgreich abgeschlossen wurde und &lt;b&gt;nicht&lt;/b&gt; wenn kein einziger If- oder ElseIf-Zweig betreten wurde (dann kommt, wenn es da ist, Else ins Spiel). Else bleibt &amp;uuml;brigens weiter optional, d.h. es kann auch If-Abfragen ohne Else, aber mit Finalize geben.&lt;br /&gt;&lt;b&gt;F&amp;uuml;r Case-Bedingungen:&lt;/b&gt; Selbes Prinzip. Der Finalize-Block wird aufgerufen, nachdem ein Case-Block erfolgreich durchlaufen wurde und &lt;b&gt;nicht&lt;/b&gt; wenn kein einziger Case-Zweig betreten wurde (dann kommt, wenn es da ist, Default ins Spiel). Default bleibt auch weiterhin optional.&lt;br /&gt;&lt;br /&gt;Internes Compilerdetail: Finalize wird mithilfe von unbedingten Spr&amp;uuml;ngen (besser bekannt als goto) umgesetzt. Ergo k&amp;ouml;nnen Finalize-Ausdr&amp;uuml;cke nur in eine Sprache &amp;uuml;bersetzt werden, die auch goto oder eine Art unbedingter Spr&amp;uuml;nge unterst&amp;uuml;tzt. Das betrifft aber BlueBasic f&amp;uuml;r's Erste gar nicht, denn das Backend, welches ich schreibe, kompiliert nach C und da gibt's goto.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;For-Schleife&lt;/b&gt;&lt;br /&gt;Wie ich finde eine sehr interessante Schleife, weil sie sich wesentlich von For-Schleifen in anderen Sprachen unterscheidet. Ich bin dabei zu versuchen, sie in BlueBasic genau so umzusetzen, wie sie in BlitzMax funktioniert. Im Prinzip ist sie ganz einfach. Man hat eine Variable, gibt an von wo und bis wohin sie z&amp;auml;hlen soll und wenn man besonders gut gelaunt ist, auch noch, in welchen Abst&amp;auml;nden.&lt;br /&gt;Interessanterweise lassen sich aber die Variablen, die man bei von-wo und bei bis-wohin angegeben hat, innerhalb der Schleife &amp;auml;ndern, ohne dass sich BlitzMax davon gest&amp;ouml;rt f&amp;uuml;hlt. Beispiel:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Local a:Int, i:Int&lt;br /&gt;a := 5&lt;br /&gt;For i := 1 To a	' Endlosschleife?&lt;br /&gt;	a:+1&lt;br /&gt;Next			' Denkste![/syntax]&lt;br /&gt;&lt;br /&gt;Also speichert BlitzMax die Ergebnisse &lt;i&gt;bevor&lt;/i&gt; die Schleife betreten wird? Nach einem kurzen Blick in den Asm-Code kann ich das nur best&amp;auml;tigen; oft sogar sehr effizient in einem Prozessorregister. Was BlitzMax kann, kann BlueBasic zwar noch lange nicht, aber das funktioniert bereits genau so in BlueBasic - dazu legt der Compiler lokale Variablen in der Funktion an, die diese Werte speichern, und zwar nur, wenn die angegebenen Werte nicht konstant sind.&lt;br /&gt;Kompiliere ich das obige Beispiel mit BlueBasic, bekomme ich folgenden Code (auf das Wesentliche reduziert):&lt;br /&gt;&lt;b&gt;Code: &lt;/b&gt;&lt;span style=&quot;font-size:0.8em; display:inline;&quot; id=&quot;showcodebox2&quot;&gt; &lt;a href=&quot;javascript&amp;#058;show_code('2')&quot;&gt;[AUSKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;span style=&quot;font-size:0.8em; display:none;&quot; id=&quot;hidecodebox2&quot;&gt; &lt;a href=&quot;javascript&amp;#058;hide_code('2')&quot;&gt;[EINKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;div id=&quot;codebox2&quot; class=&quot;codebox&quot; style=&quot;max-height: 200px;&quot; onload=&quot;check_code('2');&quot;&gt;int _a;&lt;br /&gt;int _i;&lt;br /&gt;int temp0;&lt;br /&gt;_a = 5;&lt;br /&gt;temp0 = _a;&lt;br /&gt;for&amp;#40;_i = 1 ; _i &amp;lt;= temp0 ; _i += 1&amp;#41;&amp;#123;&lt;br /&gt;&amp;nbsp; &amp;nbsp;_a = _a + 1;&lt;br /&gt;&amp;#125;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Wie man sieht l&amp;ouml;st der Compiler das Problem mit der temp0-Variablen, die den Wert von a &amp;uuml;bernimmt. Man k&amp;ouml;nnte anstelle von a auch eine Formel hinschreiben, der Compiler w&amp;uuml;rde genauso handeln. Das ganze funktioniert &amp;uuml;brigens auch mit dem von-wo-Wert der For-Schleife.&lt;br /&gt;Ich verweise au&amp;szlig;erdem stolz darauf, dass a:+1 zu _a = _a + 1 kompiliert wird. D.h. das Frontend formt die Formel so um, damit das Backend, falls die Zielsprache kein :+ oder += unterst&amp;uuml;tzt, keine Probleme kriegt.&lt;br /&gt;&lt;br /&gt;Es ist zwar nicht an diesem Beispiel erkennbar, aber die For-Schleife ist noch nicht ganz fertig, ich muss noch an der Ausstiegsbedingung arbeiten.&lt;br /&gt;&lt;br /&gt;Wer sich die Syntaxdefinitionen genauer anschauen will, kann Mal einen Blick in die mcommand.d werfen. Dort ist in Kommentaren sehr sch&amp;ouml;n erkl&amp;auml;rt, wie man welches Konstrukt gebrauchen kann und worauf man bei der Entwicklung eines Backends achten sollte.&lt;br /&gt;&lt;br /&gt;Wer BlueBasic ausprobieren will, muss (weil es noch immer in einem sehr fr&amp;uuml;hen Stadium ist) es sich selber bauen. Dazu braucht man MSYS (Teil von MinGW) und Mercurial und DMD (Digital Mars D Compiler). Ihr m&amp;uuml;sst euch mit Mercurial das Repository klonen und dann make dr&amp;uuml;berlaufen lassen. Blub funktioniert bisher sowohl auf Linux als auch auf Windows - ich lege Wert darauf, dass es von Anfang an auf beiden Systemen funktioniert.&lt;br /&gt;W&amp;uuml;rde mich btw immer noch &amp;uuml;ber Helfer freuen.&lt;br /&gt;&lt;br /&gt;Au&amp;szlig;erdem &lt;b&gt;eine Frage&lt;/b&gt; an die BlitzMax-er und vielleicht zuk&amp;uuml;nftig BlueBasicler (&lt;img src=&quot;/forum/images/smiles/icon_biggrin.gif&quot; alt=&quot;Very Happy&quot; /&gt;): Ich habe &amp;uuml;berlegt Finalize auch auf Schleifen zu &amp;uuml;bertragen. F&amp;uuml;r den Fall, dass die Schleife korrekt (mit der Bedingung) beendet wurde, springt sie noch in Finalize, wenn es da ist:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Repeat&lt;br /&gt;	...&lt;br /&gt;	If x=5 Then Exit ' steigt direkt aus - ohne Finalize&lt;br /&gt;Finalize&lt;br /&gt;	x = 5&lt;br /&gt;Until a&amp;gt;=50 ' wenn diese Bedingung erf&amp;uuml;llt wurde, geht der Programmfluss zuerst noch in den Finalize-Block[/syntax]&lt;br /&gt;&lt;br /&gt;Unsch&amp;ouml;n oder verwendbar?&lt;br /&gt;&lt;br /&gt;So, beim n&amp;auml;chsten Mal folgen weitere Beschreibungen und hoffentlich mehr Features. Was mich in n&amp;auml;chster Zeit &lt;i&gt;wahrscheinlich&lt;/i&gt; besch&amp;auml;ftigen wird sind zus&amp;auml;tzliche primitive Datentypen (z.B. Float), Continue/Exit das Modulsystem und vielleicht schon Arrays.&lt;br /&gt;&lt;br /&gt;Man liest sich,&lt;br /&gt;&lt;br /&gt;Christian</description>
			<pubDate>Sun, 17 Jun 2012 21:19:24 +0200</pubDate>
		</item>

		<item>
			<title>Eine Nachricht</title>
			<link>https://www.blitzforum.de/worklogs/327/#3520</link>
			<guid>https://www.blitzforum.de/worklogs/327/#3520</guid>
			<author>Thunder</author>
			<description>Hallo,&lt;br /&gt;&lt;br /&gt;ich schreibe euch heute, weil gestern, an Freitag dem Dreizehnten, die vermutlich letzte Kopie vom damaligen BlueBasic-Code wahrscheinlich zerst&amp;ouml;rt wurde, als meine externe HDD den Geist aufgab. Ich glaube nicht, dass es Chance auf Rettung gibt.&lt;br /&gt;&lt;br /&gt;Schweigeminute.&lt;br /&gt;&lt;br /&gt;Aber viel wichtiger: Ich habe gar nicht geplant an dem Code weiterzuarbeiten, der ist schon seit fast zwei Jahren (so lang ist es schon her, dass ich das letzte Mal geschrieben habe) einfach &amp;uuml;ber diverse Ger&amp;auml;te verstreut gelegen. Ich hatte eigentlich vor f&amp;uuml;r eine n&amp;auml;chste Version flex und GNU Bison zu verwenden, was sich dann irgendwie auch erledigt hat, als ich gemerkt habe, dass die wahrscheinlich suboptimal sind.&lt;br /&gt;&lt;br /&gt;Vor einem Monat in etwa, habe ich begonnen, die Arbeiten in m&amp;auml;&amp;szlig;igem Schwung wieder aufzunehmen, aber auf einer neuen Codebasis und mit neuen Hintergedanken. Es soll eine Teilkompatiblit&amp;auml;t mit BlitzMax erreicht werden, damit BlitzMax-Programme mit wenig Aufwand nach BlueBasic portiert werden k&amp;ouml;nnen und dort eventuell sogar von Zusatzfunktionen profitieren.&lt;br /&gt;&lt;br /&gt;Die Codebasis ist nicht mehr in BlitzMax geschrieben (auch nicht BB), sondern in D. Was mich zweifeln l&amp;auml;sst, ob ich den Worklog hier weiterf&amp;uuml;hren darf. Einerseits ist das Projekt nicht mehr in einem Blitz-Dialekt geschrieben, aber es h&amp;auml;ngt direkt mit BlitzMax zusammen. W&amp;uuml;rde mich freuen, wenn mir das ein Zust&amp;auml;ndiger sagen k&amp;ouml;nnte &lt;img src=&quot;/forum/images/smiles/icon_smile.gif&quot; alt=&quot;Smile&quot; /&gt;&lt;br /&gt;Ich werde nichtsdestoweniger diesen (Schluss-)Eintrag zumindest noch zu einem Erkl&amp;auml;rungseintrag verwenden, was ich machen m&amp;ouml;chte:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Ziele&lt;/b&gt;&lt;br /&gt;- BlueBasic-Code soll sich fast immer so &lt;i&gt;verhalten&lt;/i&gt; wie BlitzMax-Code. Das hei&amp;szlig;t nicht, dass derselbe Code produziert werden soll oder, dass die Module einfach von BlitzMax &amp;uuml;bernommen werden (dann k&amp;ouml;nnte ich BlueBasic eventuell nicht OpenSource machen, weil die Module nicht mir geh&amp;ouml;ren).&lt;br /&gt;- Das Projekt auch online speichern, damit es 1. nicht verloren gehen kann und 2. dass andere daran mitarbeiten k&amp;ouml;nnen. Geplant ist Google Code.&lt;br /&gt;- Ein einfaches Backendsystem, sodass man relativ unkompliziert Backends f&amp;uuml;r verschiedene Programmiersprachen (und damit auch Plattformen) schaffen kann. Im Moment programmiere ich nur ein kleines C-Backend nebenher, damit ich sehe, ob der Code richtig aus dem Abstract Syntax Tree (AST) generiert wird - ich halte das, was ich programmiere zumindest f&amp;uuml;r einen AST &lt;img src=&quot;/forum/images/smiles/icon_biggrin.gif&quot; alt=&quot;Very Happy&quot; /&gt; . Das C-Backend wird wahrscheinlich auch das erste richtige Backend f&amp;uuml;r BlueBasic sein, weil ich C als portablen Assembler missbrauchen werde.&lt;br /&gt;- BlueBasic soll Konstrukte bieten, die BlitzMax nicht oder nur eingeschr&amp;auml;nkt bietet. Ich hoffe, dass ich zumindest Funktions&amp;uuml;berladung und New() mit Parametern umsetzen kann. Aber auch kleinere Sachen, wie Conditional Compiling.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Was ist noch davor n&amp;ouml;tig&lt;/b&gt;&lt;br /&gt;- Ich wei&amp;szlig; nicht, wieviele Interesse h&amp;auml;tten, sich zu beteiligen. Wenn es keinen interessiert, dann brauche ich das Projekt nicht Mal auf Google Code stellen (dann backupe ich es einfach nur mit Docs oder so), aber wenn doch sollte ich schon eine Art Dokumentation der geplanten Syntax ausarbeiten. Dann f&amp;auml;llt die Zusammenarbeit wahrscheinlich wesentlich leichter. &lt;br /&gt;- Die Probleme l&amp;ouml;sen, die ich gerade jetzt habe. N&amp;auml;mlich, wie man eine Formel in eine geeignete abstrakte Form umwandelt, sodass sie - ohne komplizierte Parsingvorg&amp;auml;nge - vom Backend in eine Formel der Zielsprache umgewandelt werden kann. Dazu werde ich mir in der n&amp;auml;chsten Zeit einige Gedanken machen m&amp;uuml;ssen.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Wieviel vom Altbekannten steht wieder?&lt;/b&gt;&lt;br /&gt;Da muss ich euch entt&amp;auml;uschen. Nicht viel. Das Problem mit den Formeln h&amp;auml;mmt zu sehr, als dass ich z.B. Zuweisungen implementieren k&amp;ouml;nnte, die ich l&amp;auml;ngst einbauen wollte. &lt;br /&gt;Der Funktionsumfang ist etwa der, den die n&amp;auml;chsten zwei Programme abdecken:&lt;br /&gt;&lt;b&gt;BlueBasic&lt;/b&gt;&lt;b&gt;Code: &lt;/b&gt;&lt;span style=&quot;font-size:0.8em; display:inline;&quot; id=&quot;showcodebox3&quot;&gt; &lt;a href=&quot;javascript&amp;#058;show_code('3')&quot;&gt;[AUSKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;span style=&quot;font-size:0.8em; display:none;&quot; id=&quot;hidecodebox3&quot;&gt; &lt;a href=&quot;javascript&amp;#058;hide_code('3')&quot;&gt;[EINKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;div id=&quot;codebox3&quot; class=&quot;codebox&quot; style=&quot;max-height: 200px;&quot; onload=&quot;check_code('3');&quot;&gt;Rem&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;A test file.&lt;br /&gt;&amp;nbsp; &amp;nbsp;Test comment.&lt;br /&gt;&amp;nbsp; &amp;nbsp;' Test comment in test comment.&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;br /&gt;EndRem&lt;br /&gt;&lt;br /&gt;Const zee = 43 ' Test constant&lt;br /&gt;Global a,b,c ' Test variables ...&lt;br /&gt;Local d,e&lt;br /&gt;&lt;br /&gt;Function f&amp;#40;&amp;#41; ' test function&lt;br /&gt;&amp;nbsp; &amp;nbsp;Const ij = 42&lt;br /&gt;&amp;nbsp; &amp;nbsp;Local i&lt;br /&gt;&amp;nbsp; &amp;nbsp;Global j ' test global in test function&lt;br /&gt;EndFunction&lt;br /&gt;&lt;br /&gt;Function zee&amp;#58;Int&amp;#40;PARAMETER1&amp;#58;Int, parameter2, parameter3 = 5&amp;#41;&lt;br /&gt;&amp;nbsp; &amp;nbsp;Const style ' test void constant in test int function&lt;br /&gt;&amp;nbsp; &amp;nbsp;Local x,y&lt;br /&gt;&amp;nbsp; &amp;nbsp;Global z&lt;br /&gt;EndFunction&lt;/div&gt;&lt;br /&gt;Wird kompiliert zu:&lt;br /&gt;&lt;b&gt;Code: &lt;/b&gt;&lt;span style=&quot;font-size:0.8em; display:inline;&quot; id=&quot;showcodebox4&quot;&gt; &lt;a href=&quot;javascript&amp;#058;show_code('4')&quot;&gt;[AUSKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;span style=&quot;font-size:0.8em; display:none;&quot; id=&quot;hidecodebox4&quot;&gt; &lt;a href=&quot;javascript&amp;#058;hide_code('4')&quot;&gt;[EINKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;div id=&quot;codebox4&quot; class=&quot;codebox&quot; style=&quot;max-height: 200px;&quot; onload=&quot;check_code('4');&quot;&gt;/* GLOBAL CONSTANT DEFINITIONS */&lt;br /&gt;const int __zee = 43&lt;br /&gt;&lt;br /&gt;/* GLOBAL VARIABLES */&lt;br /&gt;int __a;&lt;br /&gt;int __b;&lt;br /&gt;int __c;&lt;br /&gt;&lt;br /&gt;/* FUNCTION FORWARD DECLERATIONS */&lt;br /&gt;void bb_main&amp;#40;void&amp;#41;;&lt;br /&gt;void __f&amp;#40;void&amp;#41;;&lt;br /&gt;int __zee&amp;#40;int __parameter1,int __parameter2,int __parameter3&amp;#41;;&lt;br /&gt;&lt;br /&gt;/* FUNCTION DEFINITIONS */&lt;br /&gt;void bb_main&amp;#40;void&amp;#41;&amp;#123;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int __d;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int __e;&lt;br /&gt;&amp;#125;&lt;br /&gt;void __f&amp;#40;void&amp;#41;&amp;#123;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; const int __ij = 42&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; static&amp;nbsp; int __j;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int __i;&lt;br /&gt;&amp;#125;&lt;br /&gt;int __zee&amp;#40;int __parameter1,int __parameter2,int __parameter3&amp;#41;&amp;#123;&lt;br /&gt;#define __style&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; static&amp;nbsp; int __z;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int __x;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int __y;&lt;br /&gt;#undef __style&lt;br /&gt;&amp;#125;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Und dieser Code (der 3 Fehler enth&amp;auml;lt):&lt;br /&gt;&lt;b&gt;BlueBasic&lt;/b&gt;&lt;b&gt;Code: &lt;/b&gt;&lt;span style=&quot;font-size:0.8em; display:inline;&quot; id=&quot;showcodebox5&quot;&gt; &lt;a href=&quot;javascript&amp;#058;show_code('5')&quot;&gt;[AUSKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;span style=&quot;font-size:0.8em; display:none;&quot; id=&quot;hidecodebox5&quot;&gt; &lt;a href=&quot;javascript&amp;#058;hide_code('5')&quot;&gt;[EINKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;div id=&quot;codebox5&quot; class=&quot;codebox&quot; style=&quot;max-height: 200px;&quot; onload=&quot;check_code('5');&quot;&gt;Rem&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;A test file.&lt;br /&gt;&amp;nbsp; &amp;nbsp;Test comment.&lt;br /&gt;&amp;nbsp; &amp;nbsp;' Test comment in test comment.&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;br /&gt;EndRem&lt;br /&gt;&lt;br /&gt;Const zee = 43 ' Test constant&lt;br /&gt;Global a,b,c ' Test variables ...&lt;br /&gt;Local d,e,c&lt;br /&gt;&lt;br /&gt;Function f&amp;#40;x&amp;#58;Object&amp;#41; ' test function&lt;br /&gt;&amp;nbsp; &amp;nbsp;Const ij = 42&lt;br /&gt;&amp;nbsp; &amp;nbsp;Local i&lt;br /&gt;&amp;nbsp; &amp;nbsp;Global j ' test global in test function&lt;br /&gt;EndFunction&lt;br /&gt;&lt;br /&gt;Function zee&amp;#58;Int&amp;#40;PARAMETER1&amp;#58;Int, parameter2, parameter3 = 5,&amp;#41;&lt;br /&gt;&amp;nbsp; &amp;nbsp;Const style ' test void constant in test int function&lt;br /&gt;&amp;nbsp; &amp;nbsp;Local x,y&lt;br /&gt;&amp;nbsp; &amp;nbsp;Global z&lt;br /&gt;EndFunction&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;gibt diese Fehlermeldungen:&lt;br /&gt;&lt;br /&gt;Zitat:&lt;div class=&quot;quotebox&quot;&gt;[11] error: Variable &amp;quot;c&amp;quot; is defined (at least) twice&lt;br /&gt;&lt;br /&gt;[13] error: type &amp;quot;object&amp;quot; (of var &amp;quot;x&amp;quot;) does not exist&lt;br /&gt;&lt;br /&gt;[19] error: name of parameter (in function definition of &amp;quot;zee&amp;quot;) expected, instead got ')' [41]&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Vielleicht ist es schon jemandem aufgefallen, dass bei keiner der Variablen ein Typ-Bezeichner steht. Den gibt es, so wie in BlitzMax, aber wenn kein Typ neben einer Variablen steht, wird sie ein Integer (wie auch in BlitzMax bis in Strict, aber nicht mehr in SuperStrict) und ich habe mir einfach das :Int erspart.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Hier noch ein paar Pl&amp;auml;nchen kurz erl&amp;auml;utert:&lt;/b&gt;&lt;br /&gt;(vielleicht sind ein, zwei Sachen gleich geblieben und vielleicht habe ich sie schon Mal erkl&amp;auml;rt)&lt;br /&gt;&lt;br /&gt;(Super)Strict wird es btw nicht geben, weil von Haus aus mit den strikten Regeln programmiert werden sollte. Dass Variablen ohne Typbezeichner aber direkt Integer werden, finde ich praktisch und sollte behalten werden. Auch das Ausschalten einzelner Funktion (z.B. Goto) im SuperStrict ist eine Qual.&lt;br /&gt;&lt;br /&gt;Und wem die Void-Konstante aufgefallen ist, die sollen zum Conditional Compiling benutzt werden k&amp;ouml;nnen.&lt;br /&gt;&lt;br /&gt;Au&amp;szlig;erdem m&amp;ouml;chte ich zwei Istgleich-Zeichen. Dass in verschiedenen BASIC-Formen = sowohl f&amp;uuml;r Zuweisungen als auch f&amp;uuml;r Abfragen verwendet wird, halte ich f&amp;uuml;r etwas inkonsistent. Um dem abzuhelfen, ohne aber zu forcieren, dass man diese Variante nicht mehr verwenden darf (man soll weiterhin beides mit = machen k&amp;ouml;nnen), soll ein zus&amp;auml;tzlicher Zuweisungsoperator erstellt werden ( &amp;quot;:=&amp;quot; schien mir sinnvoll, weil BlitzMax auch die Schreibweisen &amp;quot;:+&amp;quot; &amp;quot;:*&amp;quot; etc. kennt ), der explizit auf eine Zuweisung hinweisen soll. Die weitere Unterst&amp;uuml;tzung des einfachen Istgleich f&amp;uuml;r Zuweisungen ist eigentlich haupts&amp;auml;chlich der Kompatiblit&amp;auml;t geschuldet.&lt;br /&gt;&lt;br /&gt;In-Operator. Er soll etwas Arbeit abnehmen und &amp;uuml;berpr&amp;uuml;fen, ob ein Element in einem Array enthalten ist:&lt;br /&gt;&lt;b&gt;Code: &lt;/b&gt;&lt;span style=&quot;font-size:0.8em; display:inline;&quot; id=&quot;showcodebox6&quot;&gt; &lt;a href=&quot;javascript&amp;#058;show_code('6')&quot;&gt;[AUSKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;span style=&quot;font-size:0.8em; display:none;&quot; id=&quot;hidecodebox6&quot;&gt; &lt;a href=&quot;javascript&amp;#058;hide_code('6')&quot;&gt;[EINKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;div id=&quot;codebox6&quot; class=&quot;codebox&quot; style=&quot;max-height: 200px;&quot; onload=&quot;check_code('6');&quot;&gt;Local c&amp;#58;Int, array&amp;#58;Int&amp;#91;20&amp;#93;&lt;br /&gt;If c In array Then ...&lt;/div&gt;&lt;br /&gt;Das erspart eine Schleife (intern wird sie nat&amp;uuml;rlich schon gebraucht). Demnach soll dann auch die Syntax von For-Schleifen angepasst werden:&lt;br /&gt;&lt;b&gt;Code: &lt;/b&gt;&lt;span style=&quot;font-size:0.8em; display:inline;&quot; id=&quot;showcodebox7&quot;&gt; &lt;a href=&quot;javascript&amp;#058;show_code('7')&quot;&gt;[AUSKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;span style=&quot;font-size:0.8em; display:none;&quot; id=&quot;hidecodebox7&quot;&gt; &lt;a href=&quot;javascript&amp;#058;hide_code('7')&quot;&gt;[EINKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;div id=&quot;codebox7&quot; class=&quot;codebox&quot; style=&quot;max-height: 200px;&quot; onload=&quot;check_code('7');&quot;&gt;For c = EachIn array ' soll Bluebasic als deprecated kennzeichnen, aber kennen&lt;br /&gt;ForEach c In array ' soll die pr&amp;auml;ferierte Schreibweise sein&lt;/div&gt;&lt;br /&gt;Das killt dann eine &amp;Uuml;berlappung der zwei For-Schleifen.&lt;br /&gt;&lt;br /&gt;Ich wei&amp;szlig;, ich hab mir wieder viel vorgenommen... Kann nicht anders.&lt;br /&gt;&lt;br /&gt;Wie gesagt will ich, dass das Projekt OpenSource ist (zlib-Lizenz wahrscheinlich). Vorerst aber nicht, zuerst w&amp;uuml;rde ich gerne schauen, ob sich der Aufwand lohnt es auf eine Plattform wie Google Code zu stellen - w&amp;auml;re nicht so begeistert, wenn ich mir die M&amp;uuml;he gemacht h&amp;auml;tte und es dann niemand' interessiert. &lt;br /&gt;&lt;br /&gt;Wie gesagt Programmiersprache ist D. Es ist ein Ableger von C/C++ aber macht doch einige Sachen entscheidend anders, d.h. eine geringe Einarbeitungszeit w&amp;uuml;rde niemandem erspart bleiben, aber die hatte ich auch zu leisten. D ist kostenlos, objektorientiert, modulbasiert, konsistent...&lt;br /&gt;Die Compiler dmd (Original von Digital Mars) bzw. gdc (Frontend f&amp;uuml;r gcc) sind f&amp;uuml;r Windows, Linux und afaik auch MacOS erh&amp;auml;ltlich. Durch Phobos (eine Lib, die auch auf zumindest diesen drei Systemen l&amp;auml;uft) sind dann die D-Programme auch kompatibel und verhalten sich auf allen Systemen gleich. &lt;br /&gt;&lt;br /&gt;Ich will nur darauf hinaus, dass ich gerne R&amp;uuml;ckmeldungen von denjenigen h&amp;auml;tte, die Interesse h&amp;auml;tten mehr oder weniger daran mitzuarbeiten (&amp;quot;mehr oder weniger&amp;quot; hier im wahrsten Sinne der Worte). Vielleicht manchmal den Code zu &amp;uuml;berfliegen, zu schauen, ob man ein Teilproblem l&amp;ouml;sen kann etc.&lt;br /&gt;Wenn nicht probier ich's wieder alleine.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ja, f&amp;uuml;r's erste war's das jetzt. Ich hoffe es qu&amp;auml;len sich einige durch den Eintrag, tut mir aber Leid, dass er so lang ausgefallen ist. Solange ich nicht wei&amp;szlig;, ob ich hier den Worklog weiterf&amp;uuml;hren darf, werde ich auch nichts neues mehr posten, aber hoffentlich umso mehr an BlueBasic arbeiten. &lt;br /&gt;&lt;br /&gt;Man liest sich hier oder wo anders&lt;br /&gt;- aber irgendwo sicher,&lt;br /&gt;&lt;br /&gt;Christian</description>
			<pubDate>Sat, 14 Apr 2012 00:11:52 +0200</pubDate>
		</item>

		<item>
			<title>Erweiterte Konstrukte</title>
			<link>https://www.blitzforum.de/worklogs/327/#2705</link>
			<guid>https://www.blitzforum.de/worklogs/327/#2705</guid>
			<author>Thunder</author>
			<description>Hallo,&lt;br /&gt;&lt;br /&gt;l&amp;auml;nger ist es her, dass hier ein Eintrag gemacht wurde - das liegt an meinem Parallelprojekt MaxNet. Vergessen habe&lt;br /&gt;ich BlueBasic allerdings nicht.&lt;br /&gt;Ich habe jetzt Select-Case-Default sowie Repeat-Until implementiert. Ersteres muss noch genauer auf Lauff&amp;auml;higkeit&lt;br /&gt;gepr&amp;uuml;ft werden. &lt;br /&gt;&lt;br /&gt;Wie ich schon oft gesagt habe, wird man mit BlueBasic einige Einschr&amp;auml;nkungen vorfinden (zB: kein On-The-Fly Deklarieren&lt;br /&gt;von Variablen, Select-Case-Default eingeschr&amp;auml;nkt ...). Daher will ich dem Nutzer dennoch einiges an n&amp;uuml;tzlichen Funktionen&lt;br /&gt;bieten, die man bei BlitzBasic doch vermisst.&lt;br /&gt;Eine, neuimplementierte, dieser Art ist das aussteigen aus verschachtelten Schleifen. Ich gehe in meinen Beispielen in&lt;br /&gt;dem Eintrag von folgendem Code aus:&lt;br /&gt;[syntax=&amp;quot;bb&amp;quot;]Global x%,y%=1&lt;br /&gt;Repeat&lt;br /&gt;	x=1&lt;br /&gt;	Repeat&lt;br /&gt;		Print x+&amp;quot; x &amp;quot;+y+&amp;quot; = &amp;quot;+(x*y)&lt;br /&gt;		x=x+1&lt;br /&gt;	Until x&amp;gt;10&lt;br /&gt;	y=y+1&lt;br /&gt;Until y&amp;gt;10&lt;br /&gt;Print &amp;quot;Fertig!&amp;quot;&lt;br /&gt;End[/syntax]&lt;br /&gt;&lt;br /&gt;Dieser Code gibt mit Hilfe von zwei Variablen und zwei verschachtelten Repeat-Until-Schleifen das 1x1 aus.&lt;br /&gt;Wenn ich das 1x1 allerdings nach der Rechnung 5x5 abbrechen will, muss ich einen unsch&amp;ouml;nen Umweg gehen:&lt;br /&gt;[syntax=&amp;quot;bb&amp;quot;]Global x%,y%=1&lt;br /&gt;Repeat&lt;br /&gt;	x=1&lt;br /&gt;	Repeat&lt;br /&gt;		Print x+&amp;quot; x &amp;quot;+y+&amp;quot; = &amp;quot;+(x*y)&lt;br /&gt;		If x=5 And y=5 Then x=100&lt;br /&gt;		x=x+1&lt;br /&gt;	Until x&amp;gt;10&lt;br /&gt;	If x=101 Then Exit&lt;br /&gt;	y=y+1&lt;br /&gt;Until y&amp;gt;10&lt;br /&gt;Print &amp;quot;Fertig!&amp;quot;&lt;br /&gt;End[/syntax]&lt;br /&gt;&lt;i&gt;(Dies ist nur eine M&amp;ouml;glichkeit von vielen)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Nicht besonders sch&amp;ouml;n - besonders eklig wird es, wenn man die Schleifen erweitern will. Deshalb habe ich mir ein Feature&lt;br /&gt;von der Programmiersprache Ada abgeschaut: Man kann Schleifen Namen geben.&lt;br /&gt;An den Befehl Exit stellt man einfach den Schleifennamen hinten ran und man kann aus einer beliebigen Schleife (in der man&lt;br /&gt;auch drinnen ist &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;) aussteigen:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;BlueBasic&lt;/b&gt; und nicht [syntax=&amp;quot;bmax&amp;quot;]Global x:Int,y%=1&lt;br /&gt;Repeat schleifenname&lt;br /&gt;	x=1&lt;br /&gt;	Repeat&lt;br /&gt;		Print x+&amp;quot; x &amp;quot;+y+&amp;quot; = &amp;quot;+(x*y)&lt;br /&gt;		'nach 5x5 abbrechen:&lt;br /&gt;		If x=5 And y=5 Then Exit schleifenname&lt;br /&gt;		x=x+1&lt;br /&gt;	Until x&amp;gt;10&lt;br /&gt;	y=y+1&lt;br /&gt;Until y&amp;gt;10&lt;br /&gt;Print &amp;quot;Fertig!&amp;quot;&lt;br /&gt;End[/syntax]&lt;br /&gt;&lt;br /&gt;Wer genau hinschaut bemerkt, dass ich f&amp;uuml;r Variablen auch die BlitzMax-Specifier zulasse (allerdings nur Int, String und Float).&lt;br /&gt;Obiger BlueBasic-Code l&amp;auml;sst sich bereits problemlos kompilieren und ausf&amp;uuml;hren &lt;img src=&quot;/forum/images/smiles/icon_smile.gif&quot; alt=&quot;Smile&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mfg Thunder</description>
			<pubDate>Fri, 16 Jul 2010 12:35:21 +0200</pubDate>
		</item>

		<item>
			<title>Riesenfortschritte II</title>
			<link>https://www.blitzforum.de/worklogs/327/#2655</link>
			<guid>https://www.blitzforum.de/worklogs/327/#2655</guid>
			<author>Thunder</author>
			<description>&amp;Uuml;berraschung!&lt;br /&gt;&lt;br /&gt;Auch BlueBasic habe ich erweitert. Ich habe einen Import-Befehl implementiert, der eine C-Datei mit einer IMP-Datei importiert.&lt;br /&gt;Die IMP-Datei listet auf, welche Funktionen dem BlueBasic-Compiler bekannt sein sollen, also welche der Programmierer verwenden&lt;br /&gt;kann. &lt;br /&gt;Au&amp;szlig;erdem habe ich Strings implementiert, doch leider gibt es Probleme mit Stringvergleichen. Wie bei BlueBasic-1 sind folgende&lt;br /&gt;Stringvergleiche m&amp;ouml;glich:&lt;br /&gt;[syntax=&amp;quot;bb&amp;quot;]Local s1$,s2$&lt;br /&gt;If &amp;quot;jalsldf&amp;quot;=&amp;quot;kdlsfjsld&amp;quot; Then ...&lt;br /&gt;If &amp;quot;jklsdjf&amp;quot;=s1 Then ...&lt;br /&gt;If s2=&amp;quot;jkdlsf&amp;quot; Then ...&lt;br /&gt;If s1=s2 Then ...[/syntax] &lt;br /&gt;Die Strings d&amp;uuml;rfen nicht in der If manipuliert werden, weil es dann zu folgendem Problem kommen w&amp;uuml;rde:&lt;br /&gt;&lt;b&gt;Code: &lt;/b&gt;&lt;span style=&quot;font-size:0.8em; display:inline;&quot; id=&quot;showcodebox8&quot;&gt; &lt;a href=&quot;javascript&amp;#058;show_code('8')&quot;&gt;[AUSKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;span style=&quot;font-size:0.8em; display:none;&quot; id=&quot;hidecodebox8&quot;&gt; &lt;a href=&quot;javascript&amp;#058;hide_code('8')&quot;&gt;[EINKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;div id=&quot;codebox8&quot; class=&quot;codebox&quot; style=&quot;max-height: 200px;&quot; onload=&quot;check_code('8');&quot;&gt;;Basic-Code&amp;#58;&lt;br /&gt;If Lower&amp;#40;s1&amp;#41;=Lower&amp;#40;s2&amp;#41; Then ...&lt;br /&gt;;C-Code&amp;#58;&lt;br /&gt;if&amp;#40;strcmp&amp;#40;lower&amp;#40;s1&amp;#41;,lower&amp;#40;s2&amp;#41;&amp;#41;==0&amp;#41;&amp;#123; ...&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Lower muss, um nicht den echten String zu manipulieren, eine Kopie anlegen und einen Zeiger auf diese Kopie (die danach auch ver&amp;auml;ndert&lt;br /&gt;wurde) zur&amp;uuml;ckgeben. Dieser Zeiger zeigt (logischerweise) auf einen allokierten Speicherbereich. Der Vergleich w&amp;uuml;rde funktionieren, doch&lt;br /&gt;w&amp;uuml;rde ich die Adressen der Speicherbereiche, und damit 8 KB Speicher, verlieren. Wenn diese Vergleiche in einer Schleife (die z.B. 10000&lt;br /&gt;Mal ausgef&amp;uuml;hrt wird) vorgenommen werden, hat man in den Speicher ein Loch von 78 MiB gebohrt. Schlimmer wird es, wenn diese Funktionen&lt;br /&gt;verschachtelt aufgerufen werden: Trim(Mid(Upper(s$),5,-1))&lt;br /&gt;Daher habe ich das rausgelassen. Man darf Strings manipulieren, aber nicht in Vergleichen.&lt;br /&gt;&lt;br /&gt;Au&amp;szlig;erdem gibt es einen von BlitzBasic abweichenden Befehl Clr, der einen String &amp;quot;freigibt&amp;quot;. Man k&amp;ouml;nnte es mit str=&amp;quot;&amp;quot; vergleichen, es ist&lt;br /&gt;aber besser, weil auch der Speicher freigegeben wird. Ich werde trotzdem versuchen, das auf eine Zuweisung von &amp;quot;&amp;quot; zu &amp;uuml;bertragen.&lt;br /&gt;&lt;br /&gt;Weiters sind jetzt Print und Write einigerma&amp;szlig;en implementiert. Folgende Syntax:&lt;br /&gt;&lt;b&gt;Code: &lt;/b&gt;&lt;span style=&quot;font-size:0.8em; display:inline;&quot; id=&quot;showcodebox9&quot;&gt; &lt;a href=&quot;javascript&amp;#058;show_code('9')&quot;&gt;[AUSKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;span style=&quot;font-size:0.8em; display:none;&quot; id=&quot;hidecodebox9&quot;&gt; &lt;a href=&quot;javascript&amp;#058;hide_code('9')&quot;&gt;[EINKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;div id=&quot;codebox9&quot; class=&quot;codebox&quot; style=&quot;max-height: 200px;&quot; onload=&quot;check_code('9');&quot;&gt;BNF&amp;#58;&lt;br /&gt;&amp;lt;print-syntax&amp;gt; = Print String | Variable | &amp;#40; Rechenausdruck &amp;#41;&lt;/div&gt;&lt;br /&gt;Wenn man innerhalb von Print rechnen will, muss man den Rechenausdruck in Klammern schreiben:&lt;br /&gt;[syntax=&amp;quot;bb&amp;quot;]Global daumen=5&lt;br /&gt;;Nicht zul&amp;auml;ssig:&lt;br /&gt;Print &amp;quot;Hier ist Pi mal Daumen: &amp;quot;+3.14*daumen&lt;br /&gt;;Zul&amp;auml;ssig:&lt;br /&gt;Print &amp;quot;Hier ist Pi mal Daumen: &amp;quot;+(3.14*daumen)&lt;br /&gt;;Au&amp;szlig;erdem unzul&amp;auml;ssig:&lt;br /&gt;Print &amp;quot;In Klammern d&amp;uuml;rfen nur Rechenausdr&amp;uuml;cke stehen&amp;quot;+(&amp;quot; es ist leichter zu parsen und au&amp;szlig;erdem schreibt kein Mensch einen String in Klammern^^&amp;quot;)[/syntax]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mfg Thunder&lt;br /&gt;&lt;br /&gt;PS: Ja, &amp;quot;Riesenfortschritte I&amp;quot; war nicht in dem Worklog, sondern hier: &lt;a href=&quot;https://www.blitzforum.de/worklogs/369/&quot; target=&quot;_blank&quot;&gt;https://www.blitzforum.de/worklogs/369/&lt;/a&gt;</description>
			<pubDate>Tue, 06 Jul 2010 10:31:26 +0200</pubDate>
		</item>

		<item>
			<title>Ifs</title>
			<link>https://www.blitzforum.de/worklogs/327/#2522</link>
			<guid>https://www.blitzforum.de/worklogs/327/#2522</guid>
			<author>Thunder</author>
			<description>Hallo,&lt;br /&gt;&lt;br /&gt;ich habe den Vorschlag von Noobody umgesetzt und die Entfernung der Kommentare in den Compiler selbst verlegt damit&lt;br /&gt;keine Probleme entstehen. Bis jetzt funktioniert es so, ich k&amp;ouml;nnte mir allerdings vorstellen, dass ich irgendwas&lt;br /&gt;vergessen habe...&lt;br /&gt;&lt;br /&gt;Das n&amp;auml;chste w&amp;auml;ren If-Bedingungen. Auch diese wurden f&amp;uuml;rs erste nur f&amp;uuml;r Ints und Floats eingebaut. Ich habe einige&lt;br /&gt;Tests gemacht; dieser Quelltext:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Local x%=2,y%=1 'Kommentar&lt;br /&gt;If x=y Then 'Kommentar&lt;br /&gt;	inlinec printf(&amp;quot;x=y\n&amp;quot;); 'Kommentar&lt;br /&gt;ElseIf x=y+1'Kommentar&lt;br /&gt;	If y=x-1 Then inlinec printf(&amp;quot;x=y+1 und y=x-1\n&amp;quot;); 'Kommentar&lt;br /&gt;Else 'Kommentar&lt;br /&gt;	inlinec printf(&amp;quot;else\n&amp;quot;);'Kommentar&lt;br /&gt;EndIf  'Kommentar&lt;br /&gt;[/syntax]&lt;br /&gt;... wird zu ...&lt;br /&gt;&lt;b&gt;Code: &lt;/b&gt;&lt;span style=&quot;font-size:0.8em; display:inline;&quot; id=&quot;showcodebox10&quot;&gt; &lt;a href=&quot;javascript&amp;#058;show_code('10')&quot;&gt;[AUSKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;span style=&quot;font-size:0.8em; display:none;&quot; id=&quot;hidecodebox10&quot;&gt; &lt;a href=&quot;javascript&amp;#058;hide_code('10')&quot;&gt;[EINKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;div id=&quot;codebox10&quot; class=&quot;codebox&quot; style=&quot;max-height: 200px;&quot; onload=&quot;check_code('10');&quot;&gt;#include &amp;quot;C&amp;#58;/BlitzMax/BlueBasic2/inc/standard.c&amp;quot;&lt;br /&gt;#include &amp;quot;test.h&amp;quot;&lt;br /&gt;int main&amp;#40;int argc, char** argv&amp;#41;&amp;#123;&lt;br /&gt;BB_INT x = 2;&lt;br /&gt;BB_INT y = 1;&lt;br /&gt;if&amp;#40;x==y&amp;#41;&amp;#123;&lt;br /&gt;printf&amp;#40;&amp;quot;x=y\n&amp;quot;&amp;#41;;&lt;br /&gt;&amp;#125;else if&amp;#40;x==y+1&amp;#41;&amp;#123;&lt;br /&gt;if&amp;#40;y==x-1&amp;#41;&amp;#123;&lt;br /&gt;printf&amp;#40;&amp;quot;x=y+1 und y=x-1\n&amp;quot;&amp;#41;;&lt;br /&gt;&amp;#125;&lt;br /&gt;&lt;br /&gt;&amp;#125;else&amp;#123;&lt;br /&gt;printf&amp;#40;&amp;quot;else\n&amp;quot;&amp;#41;;&lt;br /&gt;&amp;#125;&lt;br /&gt;return 0;&lt;br /&gt;&amp;#125;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Es scheint also zu funktionieren und es kostete mich nur 30 Zeilen Code (am Anfang mehr, ein bisschen Optimierung und&lt;br /&gt;alles wird besser; apropos &lt;i&gt;First make it run, then make it run fast&lt;/i&gt; (Brian Kernighan) passt gut dazu).&lt;br /&gt;&lt;br /&gt;Im Moment sind einzeilige If-Verschachtelungen oder If-Elseif oder If-Else oder If-Elseif-Else Kombinationen nicht m&amp;ouml;glich:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]'Wir sind nicht m&amp;ouml;glich:&lt;br /&gt;If x=0 Then If y=0 Then ...&lt;br /&gt;If x=0 Then x=1 Else x=0&lt;br /&gt;'...[/syntax]&lt;br /&gt;&lt;br /&gt;Au&amp;szlig;erdem wird wahrscheinlich eine weitere Regel bleiben: Mehrzeilige If -&amp;gt; 'Then' ist optional ; Einzeilige If -&amp;gt; 'Then' &lt;br /&gt;ist verpflichtend. Das ist geplant (oder auch nicht) um soetwas zu vermeiden:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]If x=0 If y=2 y=3 'nicht cool[/syntax]&lt;br /&gt;&lt;br /&gt;Ich wei&amp;szlig;, ich habe euch wahrscheinlich nicht mit gro&amp;szlig;artigen Neuigkeiten &amp;uuml;berschwemmt, aber jetzt ist einmal der Schulstre&amp;szlig;&lt;br /&gt;vorbei (heute war der letzte Test gewesen) und ich werde versuchen mehr zu machen.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bis zum n&amp;auml;chsten Eintrag,&lt;br /&gt;&lt;br /&gt;Thunder</description>
			<pubDate>Wed, 09 Jun 2010 21:18:08 +0200</pubDate>
		</item>

		<item>
			<title>rekursive Includes</title>
			<link>https://www.blitzforum.de/worklogs/327/#2504</link>
			<guid>https://www.blitzforum.de/worklogs/327/#2504</guid>
			<author>Thunder</author>
			<description>Hallo,&lt;br /&gt;&lt;br /&gt;ich melde mich wieder mit einer neuen Version BlueBasic, die jetzt Includes unterst&amp;uuml;tzt. Diese werden durch&lt;br /&gt;rekursive Funktionsaufrufe meiner Pr&amp;auml;prozessorfunktion (die auch Kommentare entfernt etc.) interpretiert. Es ist&lt;br /&gt;erstaunlich wie gut sich das mit Hilfe von Rekursion in 37 effektiven Zeilen (=Zeilen in denen was steht) l&amp;ouml;sen l&amp;auml;sst.&lt;br /&gt;(sauber - nicht gepfuscht! ok, ich gebs zu; zuerst gepfuscht und dann sauber neugeschrieben &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt; )&lt;br /&gt;&lt;br /&gt;Die Rekursivit&amp;auml;t der Includes im Titel betrifft nat&amp;uuml;rlich nicht die Funktion, mit der diese interpretiert werden,&lt;br /&gt;sondern, dass sie auch rekursiv inkludiert werden k&amp;ouml;nnen, zB test.bb inkludiert test2.bb, das test3.bb inkludiert.&lt;br /&gt;&amp;Uuml;brigens gibt es eine Warnung, wenn versucht wird eine Datei doppelt zu inkludieren.&lt;br /&gt;&lt;br /&gt;Info:&lt;ul&gt;&lt;br /&gt;		&lt;li&gt;Note hei&amp;szlig;t, es wird ein Text ausgegeben, der dem Benutzer etwas sagt, was aber nicht unbedingt&lt;br /&gt;		wichtig ist. Wird nur in einem der Verbose-Modes des Compilers angezeigt:&lt;br /&gt;			-v ... be verbose&lt;br /&gt;			-V ... be very verbose&lt;br /&gt;			&lt;br /&gt;		&lt;li&gt;Warnung hei&amp;szlig;t, es wird ein Text ausgegeben, aber der Kompiliervorgang wird fortgesetzt.&lt;br /&gt;		&lt;li&gt;Error hei&amp;szlig;t, es wird ein Text ausgegeben und die Kompilation beendet. &lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Au&amp;szlig;erdem habe ich das Kommentarzeichen von ; auf ' ge&amp;auml;ndert, jedoch sehr modular, zwei Schl&amp;auml;ge auf die Tastatur und&lt;br /&gt;es ist wieder beim Alten.&lt;br /&gt;Der Grund f&amp;uuml;r die &amp;Auml;nderung war die Einf&amp;uuml;hrung der Funktion InlineC. Diese kann man auf 2 M&amp;ouml;glichkeiten aufrufen:&lt;br /&gt;[syntax=&amp;quot;bb&amp;quot;]InlineC printf(&amp;quot;Hallo Welt!\n&amp;quot;); 'Einzeilig&lt;br /&gt;InlineC ' wenn nach dem Befehl eine neue Zeile anf&amp;auml;ngt...&lt;br /&gt;printf(&amp;quot;Hallo Welt!\n&amp;quot;);&lt;br /&gt;'... wird er als mehrzeilig interpretiert.&lt;br /&gt;EndInlineC[/syntax]&lt;br /&gt;Der Strichpunkt am Ende der C-Befehle hat es ausgemacht. Dieser w&amp;uuml;rde n&amp;auml;mlich schon vom Pr&amp;auml;prozessor entfernt und der&lt;br /&gt;Compiler bek&amp;auml;me ihn gar nicht zu Gesicht. Der Strichpunkt h&amp;auml;tte automatisch eingef&amp;uuml;gt werden k&amp;ouml;nnen, doch das ist 1. unpraktisch&lt;br /&gt;und 2. h&amp;ouml;herer Aufwand (nicht unbedingt viel h&amp;ouml;her, aber schon um einiges und ich mag keine vollgestopften Funktionen, die ich&lt;br /&gt;sp&amp;auml;ter nicht mehr lesen kann).&lt;br /&gt;Nicht dass ihr jetzt denkt ich sei faul^^, aber InlineC ist f&amp;uuml;r mich eine ganz wichtige Funktion, weil ich theoretisch Teile&lt;br /&gt;der BlueBasic-Funktionsbibliothek in BlueBasic selbst schreiben k&amp;ouml;nnte (mit einigen InlineC-Aufrufen).&lt;br /&gt;&lt;br /&gt;Wie ich schon letztes Mal sagte erstellt der Compiler die Datei irgendwas.prep.bb die dann kompiliert wird. Diese beinhaltet schon&lt;br /&gt;alle Includes und keine Kommentare mehr.&lt;br /&gt;Mal sehen, was ich bis zum n&amp;auml;chsten Mal mache...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bis dahin,&lt;br /&gt;&lt;br /&gt;Thunder</description>
			<pubDate>Mon, 07 Jun 2010 15:23:06 +0200</pubDate>
		</item>

		<item>
			<title>Funktionsaufrufe und optionale Parameter</title>
			<link>https://www.blitzforum.de/worklogs/327/#2495</link>
			<guid>https://www.blitzforum.de/worklogs/327/#2495</guid>
			<author>Thunder</author>
			<description>Hallo,&lt;br /&gt;&lt;br /&gt;ich habe jetzt einen einfachen Funktionsaufruf aus dem Programm implementiert (noch nicht in mathematischen Ausdr&amp;uuml;cken).&lt;br /&gt;Auch optionale Parameter durften nicht fehlen, doch da sie von ANSI-C nicht unterst&amp;uuml;tzt werden, musste ich da nachhelfen.&lt;br /&gt;Mein System mit optionalen Parametern ist nicht so komfortabel wie das von BlitzBasic, aber es ist definitiv einfacher zu&lt;br /&gt;programmieren und braucht in meinem Quelltext etwa 30 Zeilen. Ich wei&amp;szlig; noch nicht ob ich es umstellen werde. Mein System&lt;br /&gt;sieht so aus:&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bb&amp;quot;]Function EineFunktion(a%,b%=20,c%=30)&lt;br /&gt;End Function ; in BlueBasic ist auch EndFunction erlaubt: BlitzMax-Style &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt; &lt;br /&gt;;Aufrufe:&lt;br /&gt;EineFunktion(30,40,50)&lt;br /&gt;EineFunktion(40,,20)&lt;br /&gt;EineFunktion(10,1,) ;Das ganze geht nat&amp;uuml;rlich auch ohne Klammern&lt;br /&gt;EineFunktion(10,,)[/syntax]&lt;br /&gt;&lt;br /&gt;Wie wird das verwirklicht? Der Compiler geht die Datei zweimal von oben bis unten durch. Beim ersten Mal wird alles m&amp;ouml;gliche&lt;br /&gt;zusammengetragen, woran mich C hindern w&amp;uuml;rde (Funktionen, die weiter oben verwendet werden, m&amp;uuml;ssen vordeklariert sein ...).&lt;br /&gt;&lt;br /&gt;In diesem Durchlauf werden auch die Funktionen im Speicher des Compilers vordeklariert, damit er wei&amp;szlig;, dass es sie gibt. Der&lt;br /&gt;Compiler erstellt dann einen String mit den Parametern der Funktion. Ein Beispiel:&lt;br /&gt;[syntax=&amp;quot;bb&amp;quot;]Function IrgendeineFunktion(s$,i%=1337,k%,f#=3.14,s1$=&amp;quot;Hallo&amp;quot;)[/syntax]&lt;br /&gt;Bei solch einer Funktion generiert der Compiler diesen Parameterstring: $%=1337%#=3.14$=&amp;quot;Hallo&amp;quot;&lt;br /&gt;Aus dem kann er bei Funktionsaufrufen lesen, welcher Parameter welchen Typs ist und ob er optional ist und was eingesetzt werden&lt;br /&gt;soll, falls er optional ist und nicht angegeben wird.&lt;br /&gt;&lt;br /&gt;Ein kompiliertes Beispiel:&lt;br /&gt;[syntax=&amp;quot;bb&amp;quot;]Local POSx=22,POSy%=11&lt;br /&gt;Local x%,y#=55.5,w=100.2,h%=23&lt;br /&gt;Global isinside=(posx&amp;gt;=x And posx&amp;lt;=x+w) And (posy&amp;gt;=y And posy&amp;lt;=y+h)&lt;br /&gt;add50(,,)&lt;br /&gt;add50(50,40,30)&lt;br /&gt;add50(,20,)&lt;br /&gt;add50(,20,30)&lt;br /&gt;add50(60,,)&lt;br /&gt;add50(70,50,)&lt;br /&gt;add50(70,,54)&lt;br /&gt;&lt;br /&gt;Function Add50(X=20,Y=30,Z=40)&lt;br /&gt;	Local z%=(x+y+z) Mod 50&lt;br /&gt;End Function[/syntax]&lt;br /&gt;&lt;br /&gt;Sieht in C so aus:&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;showcodebox11&quot;&gt; &lt;a href=&quot;javascript&amp;#058;show_code('11')&quot;&gt;[AUSKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;span style=&quot;font-size:0.8em; display:none;&quot; id=&quot;hidecodebox11&quot;&gt; &lt;a href=&quot;javascript&amp;#058;hide_code('11')&quot;&gt;[EINKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;div id=&quot;codebox11&quot; class=&quot;codebox&quot; style=&quot;max-height: 200px;&quot; onload=&quot;check_code('11');&quot;&gt;#include &amp;quot;C&amp;#58;/BlitzMax/BlueBasic2/inc/standard.c&amp;quot;&lt;br /&gt;#include &amp;quot;test.h&amp;quot;&lt;br /&gt;BB_INT add50&amp;#40;BB_INT x, BB_INT y, BB_INT z&amp;#41;&amp;#123;&lt;br /&gt;// BlueBasic macht alle Variablen- und Funktionsnamen klein.&lt;br /&gt;BB_INT z = &amp;#40;x+y+z&amp;#41; % 50;&lt;br /&gt;&amp;#125;&lt;br /&gt;int main&amp;#40;int argc, char** argv&amp;#41;&amp;#123;&lt;br /&gt;BB_INT posx = 22;&lt;br /&gt;BB_INT posy = 11;&lt;br /&gt;BB_INT x = 0;&lt;br /&gt;BB_FLOAT y = 55.5;&lt;br /&gt;BB_INT w = 100.2;&lt;br /&gt;BB_INT h = 23;&lt;br /&gt;isinside = &amp;#40;posx&amp;gt;=x &amp;amp;&amp;amp; posx&amp;lt;=x+w&amp;#41; &amp;amp;&amp;amp; &amp;#40;posy&amp;gt;=y &amp;amp;&amp;amp; posy&amp;lt;=y+h&amp;#41;;&lt;br /&gt;add50&amp;#40;20,30,40&amp;#41;;&lt;br /&gt;add50&amp;#40;50,40,30&amp;#41;;&lt;br /&gt;add50&amp;#40;20,20,40&amp;#41;;&lt;br /&gt;add50&amp;#40;20,20,30&amp;#41;;&lt;br /&gt;add50&amp;#40;60,30,40&amp;#41;;&lt;br /&gt;add50&amp;#40;70,50,40&amp;#41;;&lt;br /&gt;add50&amp;#40;70,30,54&amp;#41;;&lt;br /&gt;&lt;br /&gt;return 0;&lt;br /&gt;&amp;#125;&lt;br /&gt;&amp;#40;test.h&amp;#41;&amp;#58;&lt;br /&gt;&lt;br /&gt;BB_INT isinside;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bis zum n&amp;auml;chsten Mal,&lt;br /&gt;&lt;br /&gt;Thunder</description>
			<pubDate>Sun, 06 Jun 2010 13:06:11 +0200</pubDate>
		</item>

		<item>
			<title>Matheconverter &amp; Modularität</title>
			<link>https://www.blitzforum.de/worklogs/327/#2489</link>
			<guid>https://www.blitzforum.de/worklogs/327/#2489</guid>
			<author>Thunder</author>
			<description>Hallo,&lt;br /&gt;&lt;br /&gt;glaubt nicht, was ich sage! Es ist kein Mathe-Parser - ich w&amp;uuml;rde es eher als Mathematik-Syntax-Converter&lt;br /&gt;bezeichnen; jedenfalls ist es so ziemlich fertig, was auch immer es jetzt ist. Schwer war es nicht, weil ich&lt;br /&gt;nur einiges zu konvertieren hatte ( =&amp;gt; zu &amp;gt;=, Shr zu &amp;gt;&amp;gt; ...); zwar fehlen noch ein paar Elemente, diese sind&lt;br /&gt;aber nicht grundlegend und k&amp;ouml;nnen sp&amp;auml;ter ohne weiteres eingef&amp;uuml;gt werden.&lt;br /&gt;&lt;br /&gt;Au&amp;szlig;erdem habe ich eine Theorie aufgestellt und zwar dar&amp;uuml;ber, wieso BB Variablen, die zum ersten Mal benutzt werden,&lt;br /&gt;deklariert. Zumindest, wenn man nach C kompiliert (ich habe keine Ahnung was blitzcc macht - ich bleibe bei meiner&lt;br /&gt;Theorie, die besagt, dass BlitzBasic NICHT kompiliert wird) ist es viel einfacher wenn man einfach alles deklariert,&lt;br /&gt;was einem in den Weg kommt. Ich h&amp;auml;tte es viel leichter gehabt, aber ich wollte eine strikte Deklaration von Variablen.&lt;br /&gt;&lt;br /&gt;&amp;Uuml;brigens versuche ich alles so modular wie m&amp;ouml;glich zu halten, um &amp;Auml;nderungen schnell an vielen Elementen vornehmen zu&lt;br /&gt;k&amp;ouml;nnen. Ein Beispiel: Fr&amp;uuml;her hatte ich 3 Funktionen f&amp;uuml;r Deklaration von Variablen/Konstanten: GlobalDec, LocalDec, ConstDec.&lt;br /&gt;Jetzt ist es eine (Declaration), die einen Parameter &amp;uuml;bergeben bekommt, um welche Deklaration es sich handelt. Das ist&lt;br /&gt;um einiges praktischer, wenn man nach C kompiliert. Diese 3 Funktionen waren ein &amp;Uuml;berbleibsel aus der Kompilierung nach&lt;br /&gt;Assembler.&lt;br /&gt;&lt;br /&gt;Es ist immernoch nicht mehr m&amp;ouml;glich, als Variablen zu deklarieren und Funktionen. Jetzt eine Beispieldatei:&lt;br /&gt;[syntax=&amp;quot;bb&amp;quot;]Local posx=22,posy%=11&lt;br /&gt;Local x%,y#=55.5,w=100.2,h%=23&lt;br /&gt;Global isinside=(posx&amp;gt;=x And posx&amp;lt;=x+w) And (posy&amp;gt;=y And posy&amp;lt;=y+h)&lt;br /&gt;&lt;br /&gt;Function Add(x%,y)&lt;br /&gt;	Local z%=x+y&lt;br /&gt;End Function&lt;br /&gt;[/syntax]&lt;br /&gt;...wird zu...&lt;br /&gt;&lt;b&gt;Code: &lt;/b&gt;&lt;span style=&quot;font-size:0.8em; display:inline;&quot; id=&quot;showcodebox12&quot;&gt; &lt;a href=&quot;javascript&amp;#058;show_code('12')&quot;&gt;[AUSKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;span style=&quot;font-size:0.8em; display:none;&quot; id=&quot;hidecodebox12&quot;&gt; &lt;a href=&quot;javascript&amp;#058;hide_code('12')&quot;&gt;[EINKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;div id=&quot;codebox12&quot; class=&quot;codebox&quot; style=&quot;max-height: 200px;&quot; onload=&quot;check_code('12');&quot;&gt;#include &amp;quot;C&amp;#58;/BlitzMax/BlueBasic2/inc/standard.c&amp;quot;&lt;br /&gt;#include &amp;quot;test.h&amp;quot;&lt;br /&gt;BB_FLOAT Add&amp;#40;BB_INT x, BB_INT y&amp;#41;&amp;#123;&lt;br /&gt;BB_INT z = x+y;&lt;br /&gt;&amp;#125;&lt;br /&gt;int main&amp;#40;int argc, char** argv&amp;#41;&amp;#123;&lt;br /&gt;BB_INT posx = 22;&lt;br /&gt;BB_INT posy = 11;&lt;br /&gt;BB_INT x = 0;&lt;br /&gt;BB_FLOAT y = 55.5;&lt;br /&gt;BB_INT w = 100.2;&lt;br /&gt;BB_INT h = 23;&lt;br /&gt;isinside = &amp;#40;posx&amp;gt;=x &amp;amp;&amp;amp; posx&amp;lt;=x+w&amp;#41; &amp;amp;&amp;amp; &amp;#40;posy&amp;gt;=y &amp;amp;&amp;amp; posy&amp;lt;=y+h&amp;#41;;&lt;br /&gt;return 0;&lt;br /&gt;&amp;#125;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Sollte also alles klappen. Diese Datei hie&amp;szlig; beim kompilieren test.bb&lt;br /&gt;Zu den Includedateien: Es werden 2 Dateien inkludiert n&amp;auml;mlich test.h und standard.c&lt;br /&gt;&lt;br /&gt;&lt;b&gt;test.h&lt;/b&gt;: Der Compiler erstellt 3 Dateien (Beispiel: test.bb): test.prep.bb (wird nachher gel&amp;ouml;scht), test.c, test.h&lt;br /&gt;test.h enth&amp;auml;lt die Deklarationen der globalen Variablen - so war es einfacher diese in den Griff zu bekommen.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;standard.c&lt;/b&gt;: Das ist die Library die bei jeder BlueBasic-generierten C-Datei hinzugef&amp;uuml;gt wird. Sie enth&amp;auml;lt alle&lt;br /&gt;Deklarationen etc. unter Anderem die von BB_INT, BB_FLOAT und BB_STRING (auch ein Teil des Modularit&amp;auml;tsprinzips)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bis zum n&amp;auml;chsten Eintrag,&lt;br /&gt;&lt;br /&gt;Thunder&lt;br /&gt;&lt;br /&gt;Edit: ich habe gerade bemerkt, dass die Beispieldatei (R&amp;uuml;ckgabetyp der Funktion) falsch kompiliert wird. Ich werde das beheben. - funktioniert jetzt! </description>
			<pubDate>Sat, 05 Jun 2010 15:30:47 +0200</pubDate>
		</item>

		<item>
			<title>Es geht weiter und der Code ist recht schön</title>
			<link>https://www.blitzforum.de/worklogs/327/#2480</link>
			<guid>https://www.blitzforum.de/worklogs/327/#2480</guid>
			<author>Thunder</author>
			<description>Hallo,&lt;br /&gt;&lt;br /&gt;wie gesagt: es geht weiter! Ich habe nun Funktionsdeklarationen so gut wie fertig (eigentlich fertig, aber ich&lt;br /&gt;wei&amp;szlig; noch nicht, ob sie fehlerlos funktionieren). Globale Deklarationen m&amp;uuml;ssen noch ein wenig abge&amp;auml;ndert werden,&lt;br /&gt;weil in BB folgendes m&amp;ouml;glich ist:&lt;br /&gt;[syntax=&amp;quot;bb&amp;quot;]Local x=55,y=22&lt;br /&gt;Global z=x*2-y[/syntax]&lt;br /&gt;Das s&amp;auml;he in C bei &amp;Uuml;bernahme des Codes so aus:&lt;br /&gt;&lt;b&gt;Code: &lt;/b&gt;&lt;span style=&quot;font-size:0.8em; display:inline;&quot; id=&quot;showcodebox13&quot;&gt; &lt;a href=&quot;javascript&amp;#058;show_code('13')&quot;&gt;[AUSKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;span style=&quot;font-size:0.8em; display:none;&quot; id=&quot;hidecodebox13&quot;&gt; &lt;a href=&quot;javascript&amp;#058;hide_code('13')&quot;&gt;[EINKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;div id=&quot;codebox13&quot; class=&quot;codebox&quot; style=&quot;max-height: 200px;&quot; onload=&quot;check_code('13');&quot;&gt;int z=x*2-y; // Fehler! da x und y noch nicht aufgetaucht sind...&lt;br /&gt;int main&amp;#40;int argc, char **argv&amp;#41;&amp;#123;&lt;br /&gt;&amp;nbsp; &amp;nbsp;int x=55,y=22;&lt;br /&gt;&amp;nbsp; &amp;nbsp;return 0;&lt;br /&gt;&amp;#125;&lt;/div&gt;&lt;br /&gt;Dieser Schritt der Initialisierung bei globalen Variablen wird in die main-Funktion verlegt:&lt;br /&gt;&lt;b&gt;Code: &lt;/b&gt;&lt;span style=&quot;font-size:0.8em; display:inline;&quot; id=&quot;showcodebox14&quot;&gt; &lt;a href=&quot;javascript&amp;#058;show_code('14')&quot;&gt;[AUSKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;span style=&quot;font-size:0.8em; display:none;&quot; id=&quot;hidecodebox14&quot;&gt; &lt;a href=&quot;javascript&amp;#058;hide_code('14')&quot;&gt;[EINKLAPPEN]&lt;/a&gt; &lt;/span&gt;&lt;div id=&quot;codebox14&quot; class=&quot;codebox&quot; style=&quot;max-height: 200px;&quot; onload=&quot;check_code('14');&quot;&gt;int z;&lt;br /&gt;int main&amp;#40;int argc, char **argv&amp;#41;&amp;#123;&lt;br /&gt;&amp;nbsp; &amp;nbsp;int x=55,y=22;&lt;br /&gt;&amp;nbsp; &amp;nbsp;z=x*2-y;&lt;br /&gt;&amp;nbsp; &amp;nbsp;return 0;&lt;br /&gt;&amp;#125;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Eigentlich ist es recht einfach das umzusetzen, doch ich m&amp;ouml;chte zuerst den Matheparser schreiben, damit ich den auch&lt;br /&gt;gleich einf&amp;uuml;gen kann. Das hei&amp;szlig;t, wenn ich Gl&amp;uuml;ck habe, seht ihr n&amp;auml;chstes Mal eine funktionierende Global Deklaration,&lt;br /&gt;Local Deklaration, Const Deklaration (alles vorerst nur f&amp;uuml;r Int und Float) und eine funktionierende Funktions Deklaration.&lt;br /&gt;&lt;br /&gt;&amp;Uuml;brigens habe ich (von mir so genannte) Befehlsattribute eingef&amp;uuml;hrt; auf ein Global(zum Beispiel) darf ein Doppelpunkt folgen, &lt;br /&gt;dem ein bestimmtes Attribut folgt (zB Static):&lt;br /&gt;[syntax=&amp;quot;bb&amp;quot;]Global:Static x,y ;auf diese Variablen kann nur in dieser Datei zugegriffen werden[/syntax]&lt;br /&gt;&lt;br /&gt;Ich hoffe ihr verliert trotz des Neuschreibens nicht die Hoffnung/das Interesse, ich gebe mein Bestes!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bis zum n&amp;auml;chsten Mal,&lt;br /&gt;&lt;br /&gt;Thunder</description>
			<pubDate>Fri, 04 Jun 2010 18:28:44 +0200</pubDate>
		</item>


	</channel>
</rss>
