Variablenübergabe von VB an C++ mit Shell Befehl



  • das wäre der VB Code zur Übergabe an das C++ Programm:

    Ergebnis = Shell("D:\Projektarbeit\projektarbeit.EXE D:\Projektarbeit\ctest.WRL" & " " & LaengeX_str & " " & LaengeY_str & " " & LaengeZ_str & " " & CenterX_str & " " & CenterY_str & " " & CenterZ_str, 1)

    Wenn ich statt der Variablen zwischen die " " einfach nur die errechneten Werte schreibe, funktioniert alles wunderbar.

    Die Variablen sind Strings, welche auch die richtigen Werte enthalten: z.b. die Zeichenfolge: 0,06

    das wäre der C++ Code zur Übernahme der Werte:

    int main ( int argc, char *argv[] )
    {

    string ausdehnung_s_X, ausdehnung_s_Y, ausdehnung_s_Z, X_Koordinate_s, Y_Koordinate_s, Z_Koordinate_s;
    float skalierungsfaktor, ausdehnung_X, ausdehnung_Y, ausdehnung_Z, X_Koordinate, Y_Koordinate, Z_Koordinate,X_transformiert, Y_transformiert,Z_transformiert;

    // Der Übergabeparameter (Dateiname) wird in ein String umgewandelt.
    string Filename_L = static_cast<string>(argv[1]);

    // Der Übergabeparameter (X-Ausdehnung) wird in ein String umgewandelt.
    ausdehnung_s_X = static_cast<string>(argv[2]);

    // Der Übergabeparameter (Y-Ausdehung) wird in ein String umgewandelt.
    ausdehnung_s_Y = static_cast<string>(argv[3]);

    // Der Übergabeparameter (Z-Ausdehung) wird in ein String umgewandelt.
    ausdehnung_s_Z = static_cast<string>(argv[4]);

    // Der Übergabeparameter (X-Koordinate des Baugruppenmittelpunktes) wird in ein String umgewandelt.
    X_Koordinate_s = static_cast<string>(argv[5]);

    // Der Übergabeparameter (X-Koordinate des Baugruppenmittelpunktes) wird in ein String umgewandelt.
    Y_Koordinate_s = static_cast<string>(argv[6]);

    // Der Übergabeparameter (X-Koordinate des Baugruppenmittelpunktes) wird in ein String umgewandelt.
    Z_Koordinate_s = static_cast<string>(argv[7]);



  • Soweit sieht das schon gut aus - nun kannst du mal in der C++ FAQ nach "einmal Zahl nach String und zurück" fahnden, dort gibt es genug Möglichkeiten, die eingelesenen Strings in float umzuwandeln.

    PS: Die "static_cast<string>" dürften übrigens überflüssig sein - std::string ist auch ohne in der Lage, char*/char[] aufzunehmen.

    PPS: Denk dran, in C++ dient der Punkt '.' als Dezimalzeichen 😉



  • CStoll schrieb:

    Denk dran, in C++ dient der Punkt '.' als Dezimalzeichen 😉

    Zumindest wenn niemand mit "setlocale" was geändert hat 😉



  • ok... das wär interessant, wenn ich in c++ die werte wieder zurück konvertiere in einen float...

    aber ich hab ja das problem, dass der vb string nicht korrekt übergeben wird...

    wenn ich beim shell befehl die werte von hand eintrage klappts ja...

    und wenn ich anstatt der werte variablen einsetze...
    auch bei den normalen werten ists wurscht ob "." oder ","
    das problem besteht nur mit dem kram der übergeben wird und sachen wie:
    1.#QNAN

    zurückliefert...

    ne dll schreiben kannich leider ned...
    es ist nur für ne studienarbeit ...
    ich bin alles andere, als jemand der durch c++ oder vb komplett durchblickt.
    daher mein problem...

    gruß



  • Ich fürchte, solche Fehlerwerte mußt du manuell suchen und verarbeiten, damit kann C++ nämlich nichts anfangen.



  • mmm wo so ich da was suchen?
    der fehler tritt doch NUR auf, wenn ich von visual basic über den shell befehl die werte an das c++ programm übergebe...
    sowohl die variablen mit den werten sind korrekt, als auch das c++ programm..

    einzeln funktionieren beide...
    wenn ich die wert im shell befehl ohne variable (von hand) eintrage, funktioniert es auch..
    nur automatisiert in ner variable nicht...
    da kann ich schlecht was suchen... zumindest weiß ich nicht wie und wo ?!



  • Nochmal langsam:
    * Wenn du die Übergabewerte per Hand einträgst, arbeitet dein Programm
    * Wenn du reguläre Variablen (=echte Zahlenwerte) aus VB übergibst, arbeitet dein Programm
    * Wenn du Fehlerwerte aus einer Variable (1.#NAN o.ä.) übergibst, hast du ein Problem

    Soweit richtig?

    Das heißt, du mußt deine Eingabeparameter in C darauf überprüfen, ob sie die Text-Repräsentation eines Fehlerwertes enthalten (strcmp oder string::op==) und daraufhin entsprechend reagieren (z.B. indem du deine internen Variablen auf numeric_limits<double>::quiet_NaN() (=1.#NAN) bzw. numeric_limits<double>::infinity() (=1.#INF) setzt und damit weiterrechnest).



  • ne ne.. falsch verstanden

    meine vb datei berechnet werte..
    sagen wir:
    0,006

    so...
    dann übergebe ich diese via shell
    shell("dateiname.exe 0,006",1)

    das an c++
    funktioniert...

    NICHT funktionieren tut
    wenn zum beispiel der string a=0,006 ist...
    und dann via shell übergeben wird:
    shell("dateiname.exe " + a,1)

    die variable ist korrekt und enthält die richtigen werte...

    wenn ich nun wie im letzten beispiel mit a arbeite...
    dann kriege ich unter c++ den fehlercode, statt 0,006

    hoffe es ist nun besser beschrieben



  • Hast du auch daran gedacht, daß zwischen Programmname und Argumenten ein Leerzeichen stehen muß? Bei der expliziten Angabe ist dieses Leerzeichen vorhanden, bei deinem Variablenbeispiel versuchst du, das Programm "dateiname.exe0,0006" ohne Parameter aufzurufen.



  • hehe ja... den fehler hatte ich vorher...
    aber, nein das ist nicht mehr der fehler...
    die übergabe funktioniert korrekt, aber es wird halt aus irgendeinem grund ein fehler interpretiert oder übergeben...

    sowohl 1.#QNAN für werte im bereich 0,0x
    und 1.#INF für werte im bereich 0,0003342 z.b.



  • Kannst du mal den Code zeigen, wie du die Argumente in Zahlen umwandelst - möglicherweise ist dort ein Denkfehler drin.



  • mm wo meinst...
    in vn oder c++

    denn es wird ja in vb in einen string umgewandelt und dann an c++ auch als string übergeben...



  • Warum übergibst Du denn einen String? Das muss ja schiefgehen...



  • C++ (um mit den Werten zu "rechnen", solltest du sie irgendwo in eine Zahl zurückwandeln)



  • ach so ok ...
    kann ich machen...

    ich hab mir ne funktion dafür geschrieben:

    float stringtofloat (string doublestring)
    {
    char umwandler[40];
    float neuerfloat;
    //kopieren des Strings in ein Char-Feld
    strcpy(umwandler,doublestring.c_str());
    //Umwandeln eines Char Feldes in ein Double
    neuerfloat=atof (umwandler);
    return neuerfloat;
    }



  • Edit: *hust* sollte mal die posts bis zu ende lesen bevor ich was schreib *hust*



  • Ich rate Dir trotzdem dringend davon ab einen String zu übergeben, da dies vielleicht auf englischen OSen funktioniert, bei anderen aber nicht mehr...



  • Erstens kannst du man: atof auch direkt auf doublestring.c_str() rechnen lassen 😉 Und zweitens ist es eine gute Idee, kritische Funktionen mit Kontrollausgaben zu versehen (TRACE oder clog) - dann kannst du mitverfolgen, was da drin passiert.



  • mmm ... ja problem ist halt, dass ich mich ned wirklich gut damit auskenne...
    bin maschinenbauer, kein informatiker...
    hatte 2 semester c ... nedmal c++

    nun versuch ich irgendwie da durchzukommen... und es funzt alles, nur diese übergabe ned...
    😞

    mein dozent meinte, zur not sollte ich die werte in eine datei schreiben und mit c++ von da wieder auslesen, aber das kanns doch ned sein ...
    nur weiß ich nun erstmal ned weiter



  • zu jochen:

    ich würds ja gar ned als string übergeben...
    ich brauche nur floats...

    aber mein dozent meinte... es müsste so als string übergeben werden... ^^
    ich hab leider keine ahnung ob das auch anders geht... also direkt als float...
    dann kann ich mir nämlich den ganzen transformationskram ersparen...
    nur obs dann mit shell funktioniert ist die frage...


Anmelden zum Antworten