Extern: strings an C übergeben

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Sensenwerk

Betreff: Extern: strings an C übergeben

BeitragFr, Apr 14, 2006 22:29
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Confused
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

BeitragFr, Apr 14, 2006 22:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Apr 14, 2006 22:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Apr 14, 2006 22:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Apr 14, 2006 23:05
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Apr 14, 2006 23:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Apr 14, 2006 23:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Apr 15, 2006 9:17
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Apr 15, 2006 16:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group