Wie C++ einbinden

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Midimaster

Betreff: Wie C++ einbinden

BeitragSa, Feb 20, 2010 19:29
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Feb 20, 2010 20:05
Antworten mit Zitat
Benutzer-Profile anzeigen
EDIT: EDIT: Ich nehm alles zurück xDD
  • Zuletzt bearbeitet von OldSkool90 am Sa, Feb 20, 2010 20:42, insgesamt einmal bearbeitet
 

OldSkool90

BeitragSa, Feb 20, 2010 20:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Feb 20, 2010 20:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Man kann C++-Code importieren und Funktionen daraus verwenden.
Ich zitiere mal aus pub.FreeAudio:
BlitzMax: [AUSKLAPPEN]
?Win32
Import "dsounddevice.cpp"
Import "mmdevice.cpp"
Extern "C"
Function OpenMultiMediaDevice()
Function OpenDirectSoundDevice()
End Extern

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 Wink: Schaue dir das Modul pub.Glew an!
  • Zuletzt bearbeitet von mpmxyz am Sa, Feb 20, 2010 20:45, insgesamt 2-mal bearbeitet
 

OldSkool90

BeitragSa, Feb 20, 2010 20:40
Antworten mit Zitat
Benutzer-Profile anzeigen
okay mpmxyz...sag mir nochmal das man was höheres als opengl 1.1 verwenden kann und ich krieg nen herzinfarkt O.O

Midimaster

BeitragDi, Feb 23, 2010 9:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstmal Danke für die Antworten, aber,... ich versteh kein Wort Confused

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

BeitragDi, Feb 23, 2010 18:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Feb 23, 2010 20:22
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Import "C-Test.c" 'C-Code importieren, bei der GUIDOlib werden eventuell auch Header-Dateien gebraucht. (*.h)

Extern 'externe Deklaration beginnen
Function Add:Int(a:Int,b:Int) 'Funktionsdeklaration
EndExtern

Print Add(1,2) 'externe Funktion nutzen
End

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

BeitragDi, Feb 23, 2010 22:56
Antworten mit Zitat
Benutzer-Profile anzeigen
@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]
SuperStrict
Framework BRL.StandardIO
Import "cplus.cpp"
Extern "C"
Function DruckWas(str$z)
End Extern
DruckWas "Hello World!"
C++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]
SuperStrict
Framework brl.basic
Import pub.win32
Import "GUIDOEngine.lib"

Global lib% = LoadLibraryA("GUIDOEngine.dll")
If lib = 0
Print "Dll konnte nicht geladen werden"
End
EndIf

Import "guidodisplay.cpp"

Extern "C"
Function DrawGMNFile(str$z)
End Extern

DrawGMNFile("test.gmn")
C++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- ( Confused wohl eher Achtel-) Wissen.

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

BeitragMi, Feb 24, 2010 20:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group