Precompiler

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

judos

Betreff: Precompiler

BeitragMi, Apr 07, 2010 2:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen!

Ich habe mal ne Frage was Precompiler angeht.
Also ich habe mir gedacht, ich könnte einen Precompiler bauen, der einige Sachen für Blitz3d oder auch Blitz+ vereinfacht.

Der erste Versuch war folgender: Ich tausche die blitzcc.exe mit einer eigenen exe aus, die einfach mal die Anfrage weiterleitet. Drückt man also F5 im Blitzbasic, sollte der Precompiler nichts anderes tun, als den ursprünglichen Compiler zu benützen.
Das hat allerdings bereits nicht funktioniert. Jetzt frage ich mich was ich daran falsch gemacht habe.

Code für den "Pseudo" Precompiler war folgender:
BlitzBasic: [AUSKLAPPEN]
;Graphics 800,200,16,2
c$=CommandLine$()

start$=Chr(34)+"blitzcc-1.exe"+Chr(34)+" "+c$
ExecFile start$
;Print start$
;Print "commandline: "+c$
;Print "done."
;WaitKey
End


Habe die Anführungzeichen überall hingetan, also um das Ganze, ganz weggelassen, nur um die Parameter. Hat aber nie funktioniert.

Hat jemand vielleicht einige Anregungen oder Vorschläge die mir helfen könnten?
Vielen Dank für die Antworten!

mfg judos
 

n-Halbleiter

BeitragMi, Apr 07, 2010 9:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei ExecFile muss das gesamte Konstrukt, also "blitzcc-1.exe" und die Parameter in einen String, wobei du das "blitzcc-1.exe" nicht nochmal in Anführungszeichen setzen darfst. Beispiel:
BlitzBasic: [AUSKLAPPEN]
Local file=WriteFile("hi.bat")
WriteLine(file,"@echo off")
WriteLine(file,":lbl")
WriteLine(file,"echo %1")
WriteLine(file,"goto lbl")
CloseFile file
;ExecFile Dateiname+" "+Parameter
ExecFile "hi.bat abc"
End

(Natürlich das CMD-Fenster mit Strg+C schließen, um die Endlosschleife zu verlassen.)

Bei dir müsste das dann Folgendes sein: BlitzBasic: [AUSKLAPPEN]
start$="blitzcc-1.exe "+c$
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit
Ploing!
Blog

"Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935)
 

judos

BeitragMi, Apr 07, 2010 14:42
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, ohne Anführungszeichen gehts aber leider auch nicht.

BlitzBasic: [AUSKLAPPEN]
c$=CommandLine$()

start$="blitzcc-1.exe "+c$
ExecFile start$


Könnte das ein Problem mit dem Pfad sein, oder woran sonst liegt das wohl? Welche Datei führt das Programm am Schluss überhaupt aus? Das ist schon blitzcc.exe oder?

mfg judos

Xeres

Moderator

BeitragMi, Apr 07, 2010 14:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Gibst du auch den gesamten, absoluten Pfad an?
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Chester

BeitragMi, Apr 07, 2010 14:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Und ganz wichtig ist auch die Environment-Variable "blitzpath" auf den Blitz3D Ordner setzten.

Ich hab auch mal sowas geschrieben, allerdings in C++. Wenn du interessiert bist, kann ich dirs gerne zukommen lassen Smile

In C++ hat man nämlich den Vorteil, dass man die Fehlermeldungen und Debuglogs, die der Compiler an das Programm, von welchem er aufgerufen wurde(also den Precompiler), zurückschickt, auch in die Debugkonsole der IDE zurückgeben kann, was mit Blitz3D nicht möglich ist.

Starwar

BeitragMi, Apr 07, 2010 15:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Execfile(Chr(34)+"C:\Was Auch Immer\blitzcc.exe -parameter"+Chr(34))

Wegen den Leerzeichen.
MFG

EDIT: Geht nicht? Versteh ich nicht...
 

judos

BeitragMi, Apr 07, 2010 15:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Also der Pfad bezieht sich auf die blitzcc-1.exe Datei?

Habs mal so probiert:
BlitzBasic: [AUSKLAPPEN]

SetEnv "blitzpath","D:\Blitzbasic3D\"
c$=CommandLine$()

start$=Chr(34)+"D:\Blitzbasic3D\bin\blitzcc-1.exe"+Chr(34)+" "+c$
ExecFile start$
Print start$
Print "commandline: "+c$
Print "done."
WaitKey
End


Also der Pfad zur blitzcc original Datei wird angegeben. Die Datei welche gestartet wird, ist automatisch von der Blitz ide, mit dem absoluten Pfad beschrieben.

Jetzt scheint es zu funktionieren.

Wären da noch 2 kleinere unschöne Sachen:

1. Beim starten eines Programmes sieht man die Ausgabe des Compilers, was ja sonst nicht der Fall ist.
Also es erscheint ein MS-Dos Fenster und drinnen steht:
"Parsing... Generating... Translating... Assembling... Executing..."
-> Das ist mir eigentlich egal. Aber:

2. Wenn ich Blitzbasic starten will und der Compiler bereits mit dem Präcompiler ersetzt ist, welcher die Anfragen einfach weiterleitet (Code siehe oben), dann geht das irgendwie nicht.
Also es wird ein Fehler ausgegeben.
"Microsoft Visual C++ Runtime Library" - Fenster mit folgendem Text:
"Runtime Error!
Program: D:\Blitzbasic3d\bin\ide.exe
abnormal program termination"

Was ziemlich nervig ist. So müsste ich jetzt den Compiler jedesmal umbenennen wenn ich Blitzbasic starten will, und das ist nicht sehr praktisch.

Gibts dazu irgendwelche Ideen wie man das noch vermeiden kann?

mfg judos

Starwar

BeitragMi, Apr 07, 2010 15:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich denke er fragt Keywords oder so was ab. Implementiere alle Compiler Parameter und guck dann mal.
MFG

EDIT
Meine Lösnung für das Pfad-Problem (BlitzPlus)
Code: [AUSKLAPPEN]
compiler$=Chr(34)+"C:\Program Files (x86)\BlitzPlus\bin\blitzcc.exe"+Chr(34)
param$="-c"
file$=Chr(34)+"D:\Dokumente\Test X.bb"+Chr(34)

stream=CreateProcess(compiler$+" "+param$+" "+file$)
If stream Then
   While Not Eof(stream)
      Print ReadLine$(stream)
   Wend
EndIf
Notify "Ende"

Chester

BeitragMi, Apr 07, 2010 15:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Wenn ich Blitzbasic starten will und der Compiler bereits mit dem Präcompiler ersetzt ist, welcher die Anfragen einfach weiterleitet (Code siehe oben), dann geht das irgendwie nicht.

Die Anfrage wird weitergeleitet, aber das Ergebnis nicht zurück.

Zu Beginn wird der Compiler von der Standard-IDE ( in IDEal ist dies nicht so ) mit den Parametern "+q +k" aufgerufen(kann auch sein, dass es "-q -k" ist, weiß ich nicht mehr genau). Und hier gibt dann der Compiler eine Liste aller Befehle, inklusive denen aus den Userlibs, zurück. Und hier ist, wie ich oben schon sagte, das Problem: In Blitz3D kann man nicht in die Konsole zurücksenden.
 

judos

BeitragMi, Apr 07, 2010 16:55
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, aber mit Blitzplus sollte das gehen?

Also kann man einfach mit print die Sachen ausgeben, die der Compiler ausgibt und dann sollte es funktionieren?

Ich werds später mal testen.
Thx für die Antworten!

mfg judos

Starwar

BeitragMi, Apr 07, 2010 18:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie willst du der IDE mit Blitz Daten senden? Du kennst ja den Stream nicht, in den die IDE schreibt.
MFG

Chester

BeitragMi, Apr 07, 2010 19:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Es ist eigentlich umgekehrt. Die IDE ruft per Kommandozeile den Compiler auf und liest die DOS-Rückgabe aus. Nur mit Blitz3D kann man nichts in die Konsole zurückgeben, wie es in BlitzPlus ist ,weiß ich nicht.

In C geht dies ganz simpel mit COut.
 

judos

BeitragMi, Apr 07, 2010 19:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Also habe mal mit Blitzplus versucht den Präcompiler zu schreiben.
Mit createprocess kann man ja die Ausgabe abfangen und weiterleiten.
Allerdings funktioniert das trotzdem nicht. Zudem sind die Parameter die beim Start von Blitzbasic mitgeliefert werden -q und -v. Also "Operiert leise" und "Versionsinfos". Von einer Liste mit Befehlen wird hier überhaupt nichts mitgeliefert. Erscheint mir ziemlich komisch. Kann es sein, dass der Compiler -q anders interpretiert?

Mit der Eingabeaufforderung bin ich allerdings auch nicht weiter gekommen. -q zeigt dort einfach eine leere Zeile an und mehr nicht.

-> ist print in b+ nicht das gleiche wie cout in c ?

mfg judos

tft

BeitragMi, Apr 07, 2010 19:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

du kannst aber die rückgabe auf ein File umleiten und dann mit B3D einlesen. So habe ich das gelöst.

Gruss TFT
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

Chester

BeitragMi, Apr 07, 2010 22:14
Antworten mit Zitat
Benutzer-Profile anzeigen
@tft: Ich glaube, du hast den Thread nicht ganz gelesen. Er möchte selbst eine Konsolerückgabe tätigen Wink

Zitat:
Mit createprocess kann man ja die Ausgabe abfangen und weiterleiten.

Nein, mit dem Befehl kann man nur die Ausgabe abfangen.

Erstell einfach mal eine .exe aus dem CodeBlitzBasic: [AUSKLAPPEN]
Print "Test"
. Dann STRG+R in die cmd rein, und von dort die .exe starten. Wenn sich ein neues Fenster öffnet, dann geht es nicht. Und falls sich kein Fenster öffnet, und "Test" in der CMD steht, liegt dein Fehler wo anders. Wink


Also wenn ich meinen Precompiler dazwischenschalte, ruft die Standard-IDE beim Start folgendes auf:
Zitat:
C:\Programme\Blitz3D\bin\blitzcc2.exe -q
C:\Programme\Blitz3D\bin\blitzcc2.exe -v
C:\Programme\Blitz3D\bin\blitzcc2.exe +k
 

judos

BeitragMi, Apr 07, 2010 23:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm stimmt, createprocess kann nur die Ausgabe des Compilers abfragen. Allerdings kann man mit bb keine Rückgabe an die IDE bzw. an blitzbasic.exe oder woher auch immer die Aufrufe beim Start kommen.

Gibt es dafür vielleicht eine Userlib?

@Chester: Du erwähnst auch einen selbst geschriebenen Precompiler. Wie hast du dieses Problem gelöst? Oder kann man das irgendwie umgehen?
Klar eine eigene IDE schreiben wäre ne Möglichkeit, aber wenn ich das nicht muss, würde ich es gerne umgehen Smile

mfg judos

Starwar

BeitragDo, Apr 08, 2010 0:04
Antworten mit Zitat
Benutzer-Profile anzeigen
judos, eine Userlib zu machen ist nicht wesentlich einfacher als C++ oder eine .Net-Sprache.
Und was neues lernen kann nie schaden. Was Daten und Anwendungen/Systemnahes angeht ist Blitz so wie so wie so unbrauchbar. Ist leider so.
MFG

Chester

BeitragDo, Apr 08, 2010 0:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
@Chester: Du erwähnst auch einen selbst geschriebenen Precompiler. Wie hast du dieses Problem gelöst? Oder kann man das irgendwie umgehen?
Siehe oben:
Chester hat Folgendes geschrieben:
Ich hab auch mal sowas geschrieben, allerdings in C++. Wenn du interessiert bist, kann ich dirs gerne zukommen lassen Smile


Zitat:
Gibt es dafür vielleicht eine Userlib?

Per Userlib in die Konsole zurückschreiben zu lassen, ist nicht ganz so einfach, wie man sich das vorstellt. Hab es bisher auch nur über einen Umweg hingekriegt, arbeite aber momentan noch dran.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group