Wie C++ einbinden
Übersicht

![]() |
MidimasterBetreff: Wie C++ einbinden |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also, jetzt brauch ich mal Eure Hilfe. Aus den alten Forenbeiträgen und Tutorials werd ich nicht so schlau...
Ich hab da ein OpenSource-Projekt GUIDO zum Thema "Notensatz" gefunden. Man übergibt dabei Anweisungs-Strings und erhält dafür ein mit Noten gefülltes Postscript EPS-Dokument. http://en.wikipedia.org/wiki/GUIDO_music_notation http://sourceforge.net/projects/guidolib/files/ Das wird als C++-Quellcode für PC und MAC zur Verfügung gestellt. Nun möchte ich ein wenig damit herumexperiemtieren, weiß aber nicht, wie ich es ...und vor allem was ich ...in mein BlitzMax Projekt einfügen muss. Es gibt dort eine DLL und eine LIB und auch viele *.H-Dateien. Wie kann ich das nun so einbauen, dass der Code auf MAC und PC laufen wird. Oder muss ich auf dem PC die DLL ansprechen und für den MAC gibt es einen anderen Weg? Ihr merkt schon, ich bin total unerfahren in C.... Es gibt auch Beispiele in C, wie man ein Minimal-Programm aussehen könnte: Code: [AUSKLAPPEN] #include <iostream> #include "GUIDOEngine.h" #include "GDevicePostScript.h" using namespace std; // --------------------------------------------------------------------------- // This example of code is intended to show the minimum steps to read a // GMN file and to display it. // Take care that for simplicity, this example doesn't check return codes // --------------------------------------------------------------------------- void DrawGMNFile (const char * filename) { ARHandler arh; // use a GDevicePostScript with a 72 dpi resolution GDevicePostScript dev ((int)(21*72/2.54), (int)(29.7*72/2.54), "outfile.eps", "", ""); // declare a data structure for engine initialisation // we'll make use of the default graphic device (embedded in the library) // Guido font is guido2 and text font is times GuidoInitDesc gd = { &dev, 0, "guido2", "Times" }; GuidoOnDrawDesc desc; // declare a data structure for drawing GuidoInit (&gd); // Initialise the Guido Engine first // and parse the GMN file to get a GGR handle directly stored in the drawing struct GuidoParseFile (filename, &arh); GuidoAR2GR (arh, 0, &desc.handle); desc.hdc = &dev; // we'll draw on the postscript device desc.page = 1; // draw the first page only desc.updateRegion.erase = true; // and draw everything desc.scrollx = desc.scrolly = 0; // from the upper left page corner desc.sizex = desc.sizey = 500; // size of the drawing region GuidoOnDraw (&desc); } int main(int argc, char **argv) { const char * file = argv[1]; DrawGMNFile (file); return 0; } könnt ihr da draus schon was erkennen, wie die Anbindung klappen könnte? |
||
OldSkool90 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
EDIT: EDIT: Ich nehm alles zurück xDD | ||
- Zuletzt bearbeitet von OldSkool90 am Sa, Feb 20, 2010 20:42, insgesamt einmal bearbeitet
OldSkool90 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
sorry für doppelpost.
hab da mal eine behauptung gefunden: https://www.blitzforum.de/foru...hp?t=22260 anscheinend weiss klepto wie es geht oder zumindest weiss er dass es geht. |
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Man kann C++-Code importieren und Funktionen daraus verwenden.
Ich zitiere mal aus pub.FreeAudio: BlitzMax: [AUSKLAPPEN] ?Win32 Um die Funktionen zu verwenden, muss man diese wie in diesem Beispiel mit "Extern" einbinden. Es scheint auch eine optionale Angabe für abweichende Namen im C/C++-Code zu geben. (Function Funktion()="Name") Man braucht meines Wissens nach allerdings MinGW unter Windows. @OldSkool90 Weißt du, warum das mit OpenGL 3.2 nicht funktioniert? Es wird kein Glew 1.5.2 sondern Glew 1.5.1 verwendet. Somit geht es 'nur' bis OpenGL 3.0. mfG mpmxyz Edit damit hier keiner stirbt ![]() |
||
- Zuletzt bearbeitet von mpmxyz am Sa, Feb 20, 2010 20:45, insgesamt 2-mal bearbeitet
OldSkool90 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
okay mpmxyz...sag mir nochmal das man was höheres als opengl 1.1 verwenden kann und ich krieg nen herzinfarkt O.O | ||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Erstmal Danke für die Antworten, aber,... ich versteh kein Wort ![]() wovon redet ihr? kann ich das jetzt irgendwie für mein Problem nutzen? Ich fürchte, ich brauch es etwas "verdauerlicher", weil ich keinen Schimmer habe... |
||
berndR |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich bin neu hier im Forum und deshalb erstmal ein freundliches Hallo in die Runde.
Das Thema Notensatz interessiert mich ebenfalls. Zur Zeit schreibe ich ein Midi Programm und brauche dafür demnächst auch etwas für die Notendarstellung. GUIDO kannte ich bisher nicht. Hab es mir jetzt mal heruntergeladen und angesehen. Das API ist ja nicht schlecht aber so gut wie garnicht dokumentiert. Hast du dir mal Lilypond angesehen. Lilypond kann den Notensatz als Grafikdatei im PNG Format ausgeben. Eine Ausgabe als Mididatei ist ebenfalls möglich. Außerdem kann man Mididateien direkt in Lilyponddateien umwandeln. Ein C++ Schnittstelle für Blitzmax ist ziemlich einfach. Was für ein System hast du und welchen C++ Compiler ? |
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe jetzt mal ein kleines C-Beispiel gemacht.
Das Herausfinden, wie man MinGW richtig installiert, war nicht so einfach... (MinGW braucht man, wenn man Windows hat.) Das Einbinden von C-Code an sich ist plattformunabhängig: CCode: [AUSKLAPPEN] int Add(int a,int b){
return a+b; } BlitzMax: [AUSKLAPPEN] SuperStrict Das Einbinden der GUIDOlib sollte ganze ähnlich funktionieren. Du musst nur schauen, was du alles für Funktionen, Konstanten etc. brauchst. mfG mpmxyz P.S.: Hallo, berndR! |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
@berndR
auf mich machte das GUIDO-Projekt den moderneren Eindruck. Außerdem war es mir schon von vielen Seiten empfohlen worden. Zudem sah ich nur bei GUIDO Möglichkeiten die Notenausgabe auch in eigene Programme zu integrieren. LilyPond scheint mir eher ein fertiger "Notenkompilier" zu sein, bei dem man eine Textdatei übergibt und dann eine komplette Notenseite (für den Druck) zurückerhält. Und alles immer über das File-System... Hast du bei Lilypond schon irgendwelche "Schnittstellen" entdeckt? Alles was ich bisher gesehen habe, sieht eher aus wie eine Blackbox: Oben TXT rein, unten PNG raus. @mpmxyz lieb von dir, danke. Das MinGW läuft, denn sowas läuft perfekt: BlitzMax: [AUSKLAPPEN] SuperStrictC++Code: [AUSKLAPPEN] #include <brl.mod/blitz.mod/blitz.h>
extern "C" { void *DruckWas(char *str); } using namespace std; void *DruckWas(char *str) { printf(str); } So kleine eigene C++ Funktionen kann ich einbinden. Wo es aber bei mir schon aufhört, ist so ein großes Projekt durchzublicken. Bei GUIDO gibt es LIBx und Hs und CPPs und DLLs und zwei Ordner für Windows. Einer heißt GuidoLib-1.38-DevKit-Win32 und einer GuidoLib-1.38-SRC und darin einen Ordner WIN32. Eine interessante Datei scheint die GuidoDisplay.cpp (siehe erster Post) zu sein, doch die krieg ich schon nicht mehr ohne Fehlermeldungen compiliert: BlitzMax: [AUSKLAPPEN] SuperStrictC++Code: [AUSKLAPPEN] #include <iostream> //#include "GUIDOEngine.h" //#include "GDevicePostScript.h" using namespace std; // --------------------------------------------------------------------------- // This example of code is intended To show the minimum steps To read a // GMN file And To display it. // Take care that For simplicity, this example doesn't check return codes // --------------------------------------------------------------------------- extern "C" { void DrawGMNFile(char *str); } void DrawGMNFile (char * filename) { ARHandler arh; // use a GDevicePos ...(siehe erster Post) daraus resultiert dann eine ganze Litanei von Fehlermeldungen: Zitat: Building guidodisplay
Compiling:guidodisplay.cpp C:/Basic/guidolib-1.38-devkit-win32/guidotest.cpp: In function `void DrawGMNFile(char*)': C:/Basic/guidolib-1.38-devkit-win32/guidotest.cpp:26: error: `ARHandler' was not declared in this scope C:/Basic/guidolib-1.38-devkit-win32/guidotest.cpp:26: error: expected `;' before "arh" C:/Basic/guidolib-1.38-devkit-win32/guidotest.cpp:28: error: `GDevicePostScript' was not declared in this scope ... und lass ich die Zeile //#include "GUIDOEngine.h" zu, dann diese Meldungen: Zitat: Building guidodisplay
Compiling:guidodisplay.cpp In file included from C:/Basic/guidolib-1.38-devkit-win32/guidotest.cpp:5: C:/Basic/guidolib-1.38-devkit-win32/GUIDOEngine.h:25:25: GUIDOExport.h: No such file or directory In file included from C:/Basic/guidolib-1.38-devkit-win32/guidotest.cpp:5: C:/Basic/guidolib-1.38-devkit-win32/GUIDOEngine.h:250: error: expected constructor, destructor, or type conversion before "GuidoInit" C:/Basic/guidolib-1.38-devkit-win32/GUIDOEngine.h:260: error: expected constructor, destructor, or type conversion before "GuidoParseFile" ... Eine im Code erwähnte Datei GDevicePostScript.h hab ich sogar noch nirgends entdecken können. Und da ist es jetzt eben schon vorbei mit meinem Halb- ( ![]() Was würdest du mir raten? Es ist (in erträglichem Zeitaufwand) zu schaffen dieses Kit in ein eigenes BMax-Projekt zu integrieren? Bei so einer Einschätzung fehlt mir nun total die Fachkenntnis. |
||
berndR |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Für Lilipond gibt es leider keine Programmierschnittstelle. Es geht nur der Umweg über eine kompilierte Datei.
Ich habe mal versucht GUIDO mit C++ zu kompilieren. Das einzige was funktioniert ist die Version mit QT. Die Windows Software passt nicht mit der DLL zusammen und ergibt Fehler beim Linken. Es ist m. M. nach zwecklos, eine Anbindung an BM zu schreiben, wenn schon das Kompilieren mit C++ nicht funktioniert. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group