Extern: strings an C übergeben
Übersicht

![]() |
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


Powered by phpBB © 2001 - 2006, phpBB Group