Nicht dokumentierte, wissenswerte BlitzMax Fakten
Übersicht

DreamoraBetreff: Nicht dokumentierte, wissenswerte BlitzMax Fakten |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
GCSetMode Konstante
Offiziell gibt es dafür 2 Konstanten und zwar 1 für die automatische Sammlung und 2 um die manuelle Steuerung zu aktivieren. Darüber hinaus gibt es jedoch noch 1 weitere Konstante: 4: Sagt dem GarbageCollector, dass er gewisse Debuginformationen in die Konsole ausgeben soll. Das kann durchaus von Nutzen sein, da man zb auch sieht, wieviele Objekte freigegeben wurden. Damit kann man zb Speicherleaks und zyklische Strukturen erkennen. Auch akzeptiert der GC Kombinationen dieser Flags (1+2!, 1+4, 2+4, jedoch nicht 1+2+4). Compilerflags So manch einer wird sich schon gefragt haben, wie man Code schreiben soll, der unter Windows etwas anderes macht als zb unter Linux. Ein erster Ansatz wäre da zb, dass man eine entsprechende Variable setzt. Nur ist dieser Ansatz nicht sehr schön. Viel einfacher geht es, wenn man die nicht dokumentierten Compilerflags benutzt. Diese sorgen dafür, dass alles was nach ihnen kommt, nur unter bestimmten Voraussetzunge überhaupt in das Programm einfliesst. Code: [AUSKLAPPEN] ?win32 ' Ich existiere nur, wenn ich auf einem Windowssystem kompiliert werde ?linux 'Ich existiere nur, wenn ich auf einem Linuxsystem kompiliert werde ?osx 'Ich existiere nur, wenn ich auf einem OSX System kompiliert werde ?debug 'Ich existiere nur, wenn ich im Debugmodus kompiliert werde ? 'Ich existere überall Hier ein Beispiel eines kleinen Codes, der nur unter Windows eine Konsequenz hat Code: [AUSKLAPPEN] ?win32 print "Ich bin auf Windows :)" ? Wie ihr seht müsst ihr danach jeweils wieder ein einzelnes ? platzieren um dem Compiler zu sagen, dass ab dem Punkt wieder alle den Code compilieren sollen. Der Type TMap (nur objektorientiert nutzbar) Es kommt immer Mal wieder vor, dass man eigentlich gerne Daten speichern würde, ihnen aber einen Namen oder sonst einen Erkennungsschlüssel mitgeben will, der nicht umbedingt eine Nummer ist. In so einem Fall ist man normalerweise eigentlich dazu gezwungen, entweder in einem Array oder einer Liste danach zu suchen. BlitzMax besitzt jedoch intern auch einen ObjektType TMap, der einem genau das erlaubt. Und zwar kann man über .Insert(Key:object, Value:object) ein Objekt reinpacken und über .ValueForKey(Key:object) das Objekt wieder rausholen. Auch kann man mit Eachin die Key und die Values durchgehen (mittels eachin map.Values() bzw. eachin map.Keys() ) , wie bei einer normalen Liste / Array. Um das zu veranschaulichen, habe ich hier ein kleines Beispiel: Code: [AUSKLAPPEN] Rem
TMap Beispiel für BlitzForum.de End Rem Strict Type Buch Field Autor:String Field Name:String Field Erscheinungsjahr:Int Method PrintBuch() Print Name + " erschienen " + Erscheinungsjahr Print "Autor: " + Autor + "~n" End Method End Type Global BuchRegister:TMap = New TMap Local harrypotter:Buch = New Buch harrypotter.Autor = "J. K. Rowling" harrypotter.Name = "Harry Potter und der Stein der Weisen" harrypotter.Erscheinungsjahr= 1998 Local ubaba:Buch = New Buch ubaba.Autor = "Urscha Gura" ubaba.Name = "Ubaba und der Gaga" ubaba.Erscheinungsjahr = 1956 ' Hinzufügen der Bücher zum Buch Register BuchRegister.Insert("Harry Potter",harrypotter) BuchRegister.Insert("Ubaba",ubaba) For Local buch:Buch = EachIn BuchRegister.values() buch.PrintBuch() Next End Array of Array anstatt mehrdimensionale Arrays Es kommt immer Mal wieder die Frage, wie / ob man mehrdimensionale Arrays ( [,] und so) mittels Slice dynamisch vergrössern kann und wie man es denn sonst lösen solle. Deswegen hier eine kleine Einführung zur Nutzen von Arrays of Arrays, die das Slicing als auch andere wichtige und interessante Dinge (wie Unterarrays mit verschiedenen Dimensionen!) erlauben.
Solltet ihr weitere wichtige oder interessante Fakten haben, die nicht wirklich dokumentiert sind, so fügt sie entweder dem Thread hinzu oder falls ihr euch nicht zutraut, entsprechende Beispiele beizulegen, so könnt ihr mich sonst auch gerne per PM anschreiben und ich füge es dann mit entsprechenden Beispielen hinzu. Ich möchte keine Postings ausser Fakten mit Beispielen wo nötig/nützlich in diesem Thread, für Diskussionen bitte sonstwo einen Thread öffnen. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
klepto2 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Compiler zum 'root' scope verweisen
Angenommen man hat 2 verschiedene Types wie hier: Code: [AUSKLAPPEN] 'main.bmx SuperStrict 'game.bmx Type game Global score:Int = 20 End Type 'editor.bmx Type editor 'Constants Const GAME:Int = 10 Function Check() game.score = 1 End Function End Type Print game.score editor.Check() Print game.score Wie man sieht hat man einmal einen Type game und einen type editor. Der Type Editor besitzt nun eine Konstante GAME und eine Funktion Check(), die aber auf die globale vom Type game zugreifen möchte. Versucht man diesen Code zu kompilieren, erhält man eine Fehlermeldung von BMax, die besagt, das score nicht gefunden werden konnte. Das ist logisch, da sich der compiler gerade im Scope vom Type Editor befindet. Doch was nun? Man ändert den Code nur an einer Stelle: Code: [AUSKLAPPEN] 'main.bmx SuperStrict 'game.bmx Type game Global score:Int = 20 End Type 'editor.bmx Type editor 'Constants Const GAME:Int = 10 Function Check() .game.score = 1 End Function End Type Print game.score editor.Check() Print game.score Wie man sieht haben wir nur einen Punkt (.) vor das game.score = 1 in der Funktion Check() hinzugefügt. Dieser Punkt veranlasst nun den Compiler nicht mehr im Type Editor scope zu suchen sondern im root. dadurch kennt er nun game.score und kann ihm 1 zuweisen. |
||
Matrix Screensaver
Console Modul für BlitzMax KLPacker Modul für BlitzMax HomePage : http://www.brsoftware.de.vu |
![]() |
Byteemoz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das Compiler-Flag für MacOS ist
Code: [AUSKLAPPEN] ?MacOS
|
||
MaxIDE Community Edition: Summary | Bugs | Feature Requests | CVS Repository | Thread |
![]() |
simi |
![]() Antworten mit Zitat ![]() |
---|---|---|
MaxGUI: Text in Statuszeile eines Fensters ausrichten
Die Stauszeile eines Fensters ist sozusagen in 3 Teile aufgeteilt. Links - Mitte - Rechts. Mit einem Tabulator "~t" kann zum nächsten Teil "gesprungen" werden. Code: [AUSKLAPPEN] SetStatusText window,"Rechts ~t Mitte ~t Links "
Die 5 Leerzeichen am Schluss sind notwendig, damit der linksbündige Text immer vollständig angezeigt wird - wenn das Fenster in der Grösse veränderbar ist, hat es dort so eine schräge "Abstufung", die diesen Text überdecken würde. |
||
![]() |
remaBetreff: Pixmap |
![]() Antworten mit Zitat ![]() |
---|---|---|
Pixmap Wenn man ein Pixmap erstellt, so wird der reservierte Speicher nicht gelöscht. Er können sich somit ungewollt Bildfehler ergeben. Jetzt ist ein neue Method zu dem Modul Pixmap's hinzu gekommen: ClearPixels( pixmap,$rrggbbaa ) Nun kann man dies mit folgender zusätzlicher Zeile beheben: Code: [AUSKLAPPEN] Local pixmap = CreatePixmap( wh, wh, PF_RGBA8888 )
ClearPixels( pixmap ) Beweisphoto vom Testprogramm (44kb): http://www.morszeck.com/images/fault_pixmap.png Hier das Testprogramm: Code: [AUSKLAPPEN] Strict
Global pixmap:TPixmap Global wh:Double = 100 Function CallImage:TImage() Local x:Double Local y:Double Local i:Double ' breake when wh (width+hight) < 10 pixel wh = wh - 1.0 If wh < 10.0 Then WaitKey() ; End ' create pixmap pixmap = CreatePixmap( wh, wh, PF_RGBA8888 ) ' ClearPixels( pixmap ) <--- Hier den Kommentar entfernen ' circle For i=0.0 To 360.0 Step 1.0 x = Sin( i ) * wh/2.2 + wh/2 y = Cos( i ) * wh/2.2 + wh/2 WritePixel( pixmap, x, y, $FF000080) Next ' get image Return LoadImage( pixmap ) End Function Graphics 1100,1100,0 SetBlend ALPHABLEND SetClsColor 255,255,255 Cls Local x:Int = 0 Local y:Int = -100 Repeat 'Cls If (wh Mod 10) = 0 Then y = y + 100 x = (wh Mod 10) * 100 DrawImage CallImage(), x, y Flip 'Delay 100 Until KeyHit(key_escape) |
||
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es gibt noch die Compilerfalgs X86 und PPC wo man jeweils zwischen x86- und PowerPC-Architektur unterscheiden kann. Wichtig, wenn es um Endians bei Dateien und Netzwerk geht.
Code: [AUSKLAPPEN] ?X86
DebugLog("Ich laufe unter X86-Architektur") ?PPC DebugLog("Ich laufe unter PowerPC-Architektur") ? Wenn man nur eine Programm für die Konsole programmieren will, kann man Framework BRL.Blitz nutzen. Das benutzt dann nur den Kern von BMax um überhaupt die Applikation ausführen zu können. Vorteil sind schnelle Kompilierzeiten und kleine .EXE-Dateien. Die Ein- und Ausgabe erfolgt dann so: Code: [AUSKLAPPEN] SuperStrict
Framework BRL.Blitz Global Eingabe : String WriteStdout("Testprogramm~n") WriteStdout("Erste Zeile~nZweite Zeile~nDritte Zeile~n") WriteStdout("Eingabe: ") Eingabe = ReadStdin() WriteStdout("Sie haben '" + Eingabe + "' eingegeben") End Im Gegensatz zu StandardIOStream.Write wird die Ausgabe auch sofort in der IDE internen Ausgabe angezeigt. Man braucht also auch kein BRL.StandardIO Modul mehr einzubinden. Das obige Programm ist nur 22,5 KByte bei mir groß. mfg olli |
||
vertex.dreamfall.at | GitHub |
#ReaperNewsposter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Kleine Ergänzung:
Das gibts dann auch noch in Zusammenhang mit dem Betriebssystem: Code: [AUSKLAPPEN] ?Win32X86
?LinuxX86 ?MacosX86 ?MacosPPC ![]() |
||
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7 |
![]() |
FOODy |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hab ebend herausgefunden wie einfach es ist eine Binäre und Hexadezimale Zeichenfolge in ein Byte, Short, Int und Long umwandeln kann.
Dokumentiert ist das nicht. (Konnt ich zumindest nicht finden) Code: [AUSKLAPPEN] SuperStrict
Framework BRL.StandardIO Print Int("$FF")+" - "+$FF Print Int("%10")+" - "+%10 Local in:String=Input("Hex: ") Print Int("$"+in) in=Input("Bin: ") Print Int("%"+in) Wichtig dabei ist das ein $ vor einem Hexwert und ein % vor einem Binärwert kommen muss. Gruß, FOODy PS: Bei Float und Double klappt das nicht! (Da wird ne 0 zurückgegeben) |
||
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB |
#ReaperNewsposter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
:O
Sowas brauche ich schon lange ![]() (Warum hab ich das bloß nicht gefunden.. :-/ ) |
||
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7 |
![]() |
Lunatix |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mh, ich weiss nich ob das bekannt ist, aber viele kennen sicher das Problem: man will mit der normalen maxide mal ein Modul kompilieren, will aber mangels eines anderen unfertigen modules (was einen fehler verursachen würd) nicht strg+D drücken. Bleibt nur der griff zur Konsole oder *.bat datei.
Allerdings kann man den code der bat mal eben schnell in ein neues dokument schreiben, als *.bat speichern und F5 drücken - schon funktionierts! beispiel: Code: [AUSKLAPPEN] echo "building fsgn.win32gui"
f:\programming\blitzmax\bin\bmk makemods -a fsgn.win32gui pause Funktioniert wunderbar ![]() |
||
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen... |
![]() |
FOODy |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es gibt jetzt 2 neue Methoden in der Stringklasse:
Join(arr:string[]) und Split(sep:String). Ein selbsterklärendes Beispiel: Code: [AUSKLAPPEN] SuperStrict
Framework BRL.StandardIO Local test:String="Dies ist ein String" Local splitted:String[]=test.Split(" ") Local joined:String="|".Join(splitted) For Local i:Int=0 Until splitted.length Print i+": "+splitted[i] Next Print joined |
||
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB |
![]() |
Moep |
![]() Antworten mit Zitat ![]() |
---|---|---|
Array Zugriff wie die Dim Arrays in Blitz3D :
Code: [AUSKLAPPEN] Local test[]=[10,20,30]
Print test(2) Local test[][]=[[10,11],[20,21],[30,31]] Print test(2)(1) Local test[10,10] test(5,8)=1337 Print test(5,8) mfg Moep |
||
Hardstyle Schleichwerbung:
http://www.youtube.com/user/Hackepeter42 Achtung: Suchtgefahr! moep123.ohost.de |
![]() |
Farbfinsternis |
![]() Antworten mit Zitat ![]() |
---|---|---|
Moep hat Folgendes geschrieben: Array Zugriff wie die Dim Arrays in Blitz3D :
Code: [AUSKLAPPEN] Local test[]=[10,20,30]
Print test(2) Local test[][]=[[10,11],[20,21],[30,31]] Print test(2)(1) Local test[10,10] test(5,8)=1337 Print test(5,8) mfg Moep so ein Schmarrn ... |
||
Farbfinsternis.tv |
![]() |
Moep |
![]() Antworten mit Zitat ![]() |
---|---|---|
könntest du vllcht etwas mehr dazu sagen als 'So ein Schmarrn' , funzt es nicht oder was? Oder ist es deiner meinung nach nicht wissenswert?
mfg Moep |
||
Hardstyle Schleichwerbung:
http://www.youtube.com/user/Hackepeter42 Achtung: Suchtgefahr! moep123.ohost.de |
![]() |
BtbNBetreff: Zugriff auf BMax-Funktionen aus C-Code herraus |
![]() Antworten mit Zitat ![]() |
---|---|---|
Will man in seinem C-Code eine BMax-Funktion aufrufen, um beispielsweise ein BMax-Event abzusetzen, kann man im C-Code einfach eine Funktion nach dem Schema "scope_module_FunctionName" deklarieren.
Funktionen aus dem Normalen anwendungs-Quellcode, die also nicht in einem Modul sind, werden wie folgt benannt: bb_FunctionName. Hier ein Beispiel, um aus C-Code herraus ein Event abzusetzen: Code: [AUSKLAPPEN] #include <brl.mod/blitz.mod/blitz.h>
#include <brl.mod/event.mod/event.h> void brl_event_EmitEvent(BBObject *event); BBObject *brl_event_CreateEvent(int id,BBObject *source,int data,int mods,int x,int y,BBObject *extra); void emitBBEvent() { brl_event_EmitEvent( brl_event_CreateEvent(BBEVENT_APPTERMINATE, &bbNullObject, 0, 0, 0, 0, &bbNullObject) ); } bbNullObject ist hierbei das BMax-Null, welches in wirklichkeit ein tatsächliches Object ist, was bbNullObject heisst. Dies käme dem BMax-Code gleich: Code: [AUSKLAPPEN] EmitEvent(CreateEvent(EVENT_APPTERMINATE, Null, 0, 0, 0, 0, Null))
|
||
![]() |
d-bug |
![]() Antworten mit Zitat ![]() |
---|---|---|
Interesse an einer Liste aller installierten Module?
BlitzMax: [AUSKLAPPEN] Local list:TList = EnumModules() Die Funktion EnumModules() ist weder dokumentiert noch sonst irgendwo vermerkt, funktioniert aber einwandfrei, auch außerhalb der MaxIDE. Habe ich gerade entdeckt, als ich den Code der MaxIDE nach dem Aufbau der Help-Tree durchforstet habe. ~edit~ Nun ja, nachdem ich es gerade mal eingehender studiert habe sind ein paar andere Funktionen im Bezug auf Module und BlitzMAx auch noch da: BlitzMax: [AUSKLAPPEN] BlitzMaxPath:String () modID ist jeweils der mit EnumModules zurückgegebene scope eines Moduls. Innerhalb eines Frameworks müsst ihr dafür noch das Modul brl.maxutil importieren! (okay, danke FireballFlame, hatte den Rest deines Posts überlesen *hüstel*) |
||
- Zuletzt bearbeitet von d-bug am Di, Apr 06, 2010 13:01, insgesamt 2-mal bearbeitet
![]() |
FireballFlame |
![]() Antworten mit Zitat ![]() |
---|---|---|
For ... Until
Außer der bekannten For ... To Zählschleife gibt es auch eine Variante mit Until, die den Endwert nicht mit in die Zählung einschließt, also einen Durchlauf früher aufhört. Nicht besonders atemberaubend, sieht aber z.B. beim Durchgehen von Arrays schöner aus: BlitzMax: [AUSKLAPPEN] SuperStrict [i]Ergänzung zum Beitrag von d-bug Was man als Framework-Nutzer noch wissen muss: EnumModules() befindet sich im Modul BRL.MaxUtil. |
||
![]() |
das wurgel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zwei Arrays lassen sich mit den Operator "+" zu einem neuen Array zusammenfügen.
Beispiel: Code: [AUSKLAPPEN] Local arr$[]=["bing", "bong", "bang"]
arr$:+["ding", "dong", "Apfelkompott"] For Local a$=EachIn arr Print a Next |
||
1 ist ungefähr 3 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group