Nicht dokumentierte, wissenswerte BlitzMax Fakten

Übersicht BlitzMax, BlitzMax NG FAQs und Tutorials

Neue Antwort erstellen

 

Dreamora

Betreff: Nicht dokumentierte, wissenswerte BlitzMax Fakten

BeitragSa, Apr 22, 2006 15:39
Antworten mit Zitat
Benutzer-Profile anzeigen
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.


  • Wie deklariert und initialisiert man einen Array of Array
    Code: [AUSKLAPPEN]

    strict
    ' Der folgende Array wird Daten für eine Pyramide beinhalten. Er wird also oben 1 Feld benötigen und zu unterst 10
    Local IntArray:Int[][]
    IntArray   = IntArray[..10]         ' Wir benötigen 10 "Zeilen" im Array
    For Local i:Int = 0 To 9
       IntArray[i]      = New Int[i+1]   ' oberste Stufe 1 Feld, unterstes 10
       For Local j:Int = 0 To i
          IntArray[i][j]   = i*10+j
       Next
    Next


  • Wie gebe ich nun diese Daten wieder aus?
    Code: [AUSKLAPPEN]

    Local ausgabe:String
    For Local i:Int = 0 To 9
       ausgabe=""
       For Local j:Int = 0 To i
          ausgabe :+ IntArray[i][j] + "~t"
       Next
       Print ausgabe
    Next




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

BeitragDi, Apr 25, 2006 22:05
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jun 30, 2006 21:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Compiler-Flag für MacOS ist
Code: [AUSKLAPPEN]
?MacOS
MaxIDE Community Edition: Summary | Bugs | Feature Requests | CVS Repository | Thread

simi

BeitragSo, Jan 21, 2007 15:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

rema

Betreff: Pixmap

BeitragMo, Jan 29, 2007 6:21
Antworten mit Zitat
Benutzer-Profile anzeigen

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

BeitragSa, Mai 26, 2007 17:46
Antworten mit Zitat
Benutzer-Profile anzeigen
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
 

#Reaper

Newsposter

BeitragSa, Mai 26, 2007 22:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Kleine Ergänzung:
Das gibts dann auch noch in Zusammenhang mit dem Betriebssystem:

Code: [AUSKLAPPEN]
?Win32X86
?LinuxX86
?MacosX86
?MacosPPC


Smile
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

BeitragDi, Jun 12, 2007 19:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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
 

#Reaper

Newsposter

BeitragDi, Jun 12, 2007 20:10
Antworten mit Zitat
Benutzer-Profile anzeigen
:O
Sowas brauche ich schon lange Very Happy
(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

BeitragFr, Jun 15, 2007 22:15
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen...

FOODy

BeitragDo, Jun 21, 2007 8:34
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jul 29, 2007 13:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jul 29, 2007 20:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jul 29, 2007 23:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BtbN

Betreff: Zugriff auf BMax-Funktionen aus C-Code herraus

BeitragDo, Jan 15, 2009 11:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Apr 05, 2010 14:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Interesse an einer Liste aller installierten Module?

BlitzMax: [AUSKLAPPEN]
Local list:TList = EnumModules()

For Local s:String = EachIn list
Print s
Next

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  ()
'gibt einem den Pfad zur BlitzMax Installation zurück

ModulePath:String (modID:String)
'konvertiert einen mit EnumModules erhaltenen scope in einen Pfad

ModuleIdent:String (modID:String)
'gibt einem den Namen des Moduls aus

ModuleSource:String (modID:String)
'gibt einem den Pfad zur Haupt BMX-Datei eines Moduls zurück

ModuleArchive:String (modID:String)
'gibt einem den Pfad zur *.a Datei eines Moduls zurück

ModuleInterface:String (modID:String)
'gibt einem den Pfad zur *.i Datei eines Moduls zurück

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

BeitragMo, Apr 05, 2010 16:27
Antworten mit Zitat
Benutzer-Profile anzeigen
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
Framework BRL.StandardIO


Local A:Int[]=[1,2,3,4,5]


For Local i:Int=0 To A.length-1
Print A[i]
Next


For Local i:Int=0 Until A.length ' selbes Ergebnis
Print A[i]
Next


Input ""
End



[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

BeitragDi, Jun 22, 2010 12:59
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG FAQs und Tutorials

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group