Extern: strings an C übergeben
Übersicht
BlitzMax, BlitzMax NG
Allgemein|
|
SensenwerkBetreff: Extern: strings an C übergeben |
Antworten mit Zitat |
|---|---|---|
|
N'abend,
ich mal wieder mit einem nervigen kleinen Problem. Zuersteinmal: Ist es vielleicht doch möglich, den print Befehl so zu benutzen, dass er nicht automatisch am Ende ein c <<endl bzw. "\n" ausgibt. Ich möchte nämlich folgenden Code ermöglichen können: Code: [AUSKLAPPEN] print "Status: " print "." print "." Allerdings so, dass nicht Status: . . dasteht sondern Status: .. Wenn das irgendwie ginge, bräuchte ich garnicht zu wissen, wie ich meine BM Strings nach c rüberbringe. Alternativ wäre es auch wunderbar, wenn einfach eine \b (letztes Zeichen löschen) Escapesequenz mit print funktionieren würde. Da ich bisher aber nichts dergleichen gefunden habe, hier meine Frage: wie schaff ich es, einen string so an c weiterzugeben, dass ich dort mit cout oder printf denselben ausgeben kann. Habe folgendes probiert: Code: [AUSKLAPPEN] #include <iostream> #include <string> using namespace std; int CPrint( string theStr ) { cout << theStr; return 0; } Und dann einfach mit folgendem in BM selber aufrufen Code: [AUSKLAPPEN] extern function CPrint( str:string ) endextern CPrint( "test" ) Jedoch gab das nur eine seltsame Fehlermeldung, die ich mir nur damit erklären kann, dass der String Datentyp von BM nix dem c String zu tun hat. Hab dann noch probiert jeden BM String Charakter in einem int array zu speichern, den an C zu übergeben, und dann C intern nach ascii wieder in chars zurückzuverwandeln, die dann ausgegeben werden, doch tat sich dabei ein sehr sonderbares Phänomen auf: Beim Versuch ein int Array mit den gespeicherten ascii Werten zu übergeben, ging sämtlicher Inhalt des Arrays 'verloren', so dass auch diese Methode fehlschlug. Wenn mir jemand helfen kann, könnte ich heut Nacht sicher besser schlafen. ; ) |
||
|
L'enfer, c'est les autres. (Jean Paul Sartre)
Havoc ~40% done Sensenwerk.eu |
||
Dreamora |
Antworten mit Zitat |
|
|---|---|---|
|
Extern Cstrings haben den type
$z also extern function CPrint (text$z) end extern Du kannst von BM her einfach einen String an die Funktion übergeben, BM wird ihn eigenständig umwandeln. Der newline müsste eigentlich ~n sein (funktioniert mit einigen der bekannten Escape Sequenzen von C aber bei weitem nicht allen) |
||
| Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. | ||
|
|
Sensenwerk |
Antworten mit Zitat |
|---|---|---|
|
Hmm seltsam, ich bekomme folgende Fehlermedlung:
D:/Proggn/BlitzMax1_16/Sensenwerke/tmp/.bmx/CppPrint.bmx.console.release.win32.o(code+0x9d): undefined reference to `CPrint' Build Error: Failed to link D:/Proggn/BlitzMax1_16/Sensenwerke/tmp/CppPrint.exe Hab das ganze mit einem einfachen Int als Übergabe probiert: Die gleiche Fehlermedlung erscheint. Sehr komisch. Meine eigenen c Dateien lassen sich momentan gar nicht mehr selber kompilieren, egal was ich mach! Das ist insofern ein Rätsel, da es heute schonmal ging. Irgendeine Idee? *argsl* |
||
|
L'enfer, c'est les autres. (Jean Paul Sartre)
Havoc ~40% done Sensenwerk.eu |
||
Dreamora |
Antworten mit Zitat |
|
|---|---|---|
|
Undefined reference deutet darauf hin, das es nicht sauber importiert wurde.
Hast du die C file importiert? (bei C++ files musst du mit extern "C" { ... } den code umschliessen, war zumindest bei mir bisher so) |
||
| Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. | ||
|
|
Sensenwerk |
Antworten mit Zitat |
|---|---|---|
|
Jo habich eignetlich alles gemacht... gna
Code: [AUSKLAPPEN] 'blitz max code
Import "CText.cpp" Extern "C" Function CPrint () End Extern CPrint( ); Code: [AUSKLAPPEN] //c++ code
#include <iostream> #include <string> using namespace std; int CPrint( ) { cout << "hallo"; return 0; } Kannst Du mal schaun, ob das bei Dir funktioniert? Vielen Dank für Deine Hilfe btw. |
||
|
L'enfer, c'est les autres. (Jean Paul Sartre)
Havoc ~40% done Sensenwerk.eu |
||
Dreamora |
Antworten mit Zitat |
|
|---|---|---|
|
Nein funktioniert so nicht.
Sagte ja, muss extern "C" { ... } rundherum stehen ... Code: [AUSKLAPPEN] //c++ code
#include <iostream> #include <string> using namespace std; extern "C" { int CPrint( ) { cout << "hallo"; return 0; } } Zusätzlich muss die letzte Zeile leer sein. |
||
| Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. | ||
|
|
Sensenwerk |
Antworten mit Zitat |
|---|---|---|
| Aah, hatte das nicht ganz verstanden, beim vorigen Post. Es funktioniert nun einwandfrei! Sei gesegnet und gute Nacht : D | ||
|
L'enfer, c'est les autres. (Jean Paul Sartre)
Havoc ~40% done Sensenwerk.eu |
||
|
|
BtbN |
Antworten mit Zitat |
|---|---|---|
|
Warum die Welt mit C/++ verrückt machen, wenn es auch so wunderbar geht?
Hier mal der Code der Print-Funktion: Code: [AUSKLAPPEN] Function Print( str$="" )
StandardIOStream.WriteLine str StandardIOStream.Flush End Function Ah, daran sieht man, der Zeilenumbruch kommt durch das WriteLine zustande. Man ersetze es mit WriteString und ist glücklich: Code: [AUSKLAPPEN] Function Printf( str$="" )
StandardIOStream.WriteString(str) StandardIOStream.Flush End Function Macht genau das, was du willst, ohne großen Aufwand. Es ist sinnwoll, mal in die Module zu schauen, bevor man anfängt mit irgendwelchen C/++ experimenten anzufangen. |
||
|
|
Sensenwerk |
Antworten mit Zitat |
|---|---|---|
|
Hmm, stimmt, ist 'ne Idee. In Modulen rumschnüffeln schadet sicher nie. ; )
Das ganze mit c zu versuchen hat sich dennoch gelohnt, da ich so die feine Escapesequenz \b nutzen kann. |
||
|
L'enfer, c'est les autres. (Jean Paul Sartre)
Havoc ~40% done Sensenwerk.eu |
||
Übersicht
BlitzMax, BlitzMax NG
Allgemein
Powered by phpBB © 2001 - 2006, phpBB Group
