Problem bei Stringweitergabe



  • Belasse doch den Text in der Stringklasse, die "textBox1->Text" hat und übergib es in diesem String an deine Funktion "sysani".

    Und erst wenn du es mit fopen öffnen willst, konvertierst du es nach "const char *".



  • tegg schrieb:

    char *Speicher_aaa;
    	strcpy (Speicher_aaa,Speicher);
    	strcpy (Speicher_aaa,"\\Teil1.aaa");
    

    Ganz böser Fehler!

    mit *char Speicher_aaa reservierst du noch keinen Speicher für deine Variable. Du erzeugst lediglich einen Zeiger, der aber auf einen unbestimmten Platz im Speicher zeigt. Bei der Verwendung von strcpy dürfte es ordentlich rummsen 😉



  • tegg schrieb:

    char *Speicher_aaa;
    	strcpy (Speicher_aaa,Speicher);
    	strcpy (Speicher_aaa,"\\Teil1.aaa");
    

    Ich korrigiere das nur mal fix, damit du was draus lernst. Dennoch ist dieses Speichergepfriemel in deinem Anwendungsfall absolut nicht nötig.

    // Anzahl der Zeichen in [b]Speicher [/b]ermitteln
    int iLengthSpeicher = strlen( Speicher );
    // [b]Speicher_aaa[/b] anlegen und benoetigte Speichermenge allokieren
    char *Speicher_aaa = new char[ iLengthSpeicher  + 1 ];
    // Bestimmte Anzahl an Zeichen von [b]Speicher [/b]nach [b]Speicher_aaa[/b] kopieren
    strncpy( Speicher_aaa, Speicher, iLengthSpeicher );
    // Nullterminierung setzen ( Abschluss der Zeichenkette )
    Speicher_aaa[ iLengthSpeicher ] = 0;
    

    Edit: Löschen von Speicher_aaa mit delete [] Speicher_aaa; hinterher nicht vergessen 😃
    Aber wie gesagt: Das brauchst du hier nicht, das ist C-Urschleim 😉

    Verwende die ursprüngliche String-Klasse solange es eben geht.



  • It0101 schrieb:

    Belasse doch den Text in der Stringklasse, die "textBox1->Text" hat und übergib es in diesem String an deine Funktion "sysani".

    Und erst wenn du es mit fopen öffnen willst, konvertierst du es nach "const char *".

    und wie setze ich das um ?



  • Das StringConvertA am Anfang lässt du weg.
    Stattdessen uebergibst du direkt "textBox1->Text" an deine Funktion sysani
    und zwar als const-Referenz.

    Referenz, weil du dann nicht mit Pointern arbeiten musst und eben auch keine Kopie der Variable anlegst und const weil du nicht vorhast, deinen Text in der Funktion zu ändern sondern ihn einfach nur benutzen willst.

    void sysani( float a, float b, ... , const MEINE_STRING_KLASSE &text )
    {
        MEINE_STRING_KLASSE speicher_aaa = text + "\\Teil1.aaa";
        MEINE_STRING_KLASSE speicher_bbb = text + "\\Teil2.aaa";
    
        char *filename = StringConvA( speicher_aaa );
        FILE *fs = fopen( filename , "w" );
    
        ...
    }
    

    PS: wie MEINE_STRING_KLASSE in der MFC heißt musst du schon selber rausfinden. Ist eben die Stringklasse, auf der auch textBox1->Text basiert.



  • ein System::String ^

    error C2440: 'Initialisierung': 'StringConvA' kann nicht in 'char *' konvertiert werden
    1>        Kein benutzerdefinierter Konvertierungsoperator verfügbar, der diese Konvertierung durchführen kann, oder der Operator kann nicht aufgerufen werden
    

    oh man...was ist denn da jetzt was und warum sind Buchstaben keine Buchstaben...das ist so zum brechen... C ist vielleicht uralt aber funktioniert wenigstens, da ist ein Buchstabe ein Buchstabe 🙂



  • Vergiss die Funktion... StringConvA. Das "^" hätte mich gleich stutzig machen müssen.

    Das ist C# nicht C++... 😃
    Das braucht uns nicht wundern, dass der Compiler das nicht frisst 😃



  • Du hast kein Konsolen-Programm in C geschrieben, sondern in C++/CLI! Das macht immer noch keinen Sinn:
    http://blog.kalmbach-software.de/de/2010/03/05/ccli-und-winforms-macht-keinen-sinn/



  • Ich vermute, er hat sich bei C++/CLI einfach nur verklickt. Er will schon C/C++...
    Aber die Funktion, die er sich da rausgesucht hat, ist natürlich mitnichten für C++ geeignet 😉



  • wie denn das jetzt ?
    ich hab doch ein C++ Projekt gemacht...

    void sysani(....,const System::String ^Speicher)
    System::String ^Speicher_aaa= Speicher +"\\Teil.aaa";
    char* filename = (char*)(void*)Marshal::StringToHGlobalAnsi(Speicher_aaa);
    fs = fopen(filename, "w");
    

    so klappt das kompilieren, jedoch stimmen dann die \\ noch nicht und es kommt zum Fehler beim Ausführen



  • Jochen Kalmbach schrieb:

    Du hast kein Konsolen-Programm in C geschrieben, sondern in C++/CLI! Das macht immer noch keinen Sinn:
    http://blog.kalmbach-software.de/de/2010/03/05/ccli-und-winforms-macht-keinen-sinn/

    die sysani ist mal ein konsolenprogramm gewesen...



  • tegg schrieb:

    wie denn das jetzt ?
    [cpp]void sysani(....,const **System::String ^**Speicher)
    *System::String ^Speicher_aaa= Speicher +"\\Teil.aaa";
    char
    filename = (char
    )(void
    )Marshal::StringToHGlobalAnsi(Speicher_aaa);
    fs = fopen(filename, "w");
    [/cpp]

    Die fettmarkierten Dinger sind aber C#-Code 😉



  • muss ich jetzt die ganze klick-kacke neu zusammenbauen ? oder kann ich das irgendwie konvertieren ? Aber in meinen Eigenschaften ist es ein C/C++ Programm....

    ich schreib jetzt mal den string in eine datei und schau mal was da rauskommt



  • tegg schrieb:

    void sysani(....,const System::String ^Speicher)
    System::String ^Speicher_aaa= Speicher +"\\Teil.aaa";
    char* filename = (char*)(void*)Marshal::StringToHGlobalAnsi(Speicher_aaa);
    fs = fopen(filename, "w");
    

    so klappt das kompilieren

    Also wenn er sowas "System::String ^" übersetzen kann, dann hast du höchstwahrscheinlich ein "C++/CLI" Projekt angelegt. Ich kenne mich zwar in der MFC nicht aus, aber ich habe so meine Zweifel, dass es dort diese Konstruktion "System::String ^" gibt...

    Die Experten mögen mich korrigieren, wenn ich falsch liege.



  • hmm...also Problem ist die char *filname ist einfach nur ein "H"



  • Zeig mal deinen Code. Was hast du denn jetzt genau gemacht?

    Edit: Welche Art von Projekt hast du denn jetzt erzeugt?



  • Es ist ein C++/CLI Projekt. Das sieht man an den Einstellungen: "Common Language Runtime Support": steht auf jedefall nicht auf "None"...



  • bin schon wieder weiter... bin jetzt bei converttochar im form1.h am probieren und ein char zu übergeben

    es sollte ein CLR - Windows Form Anwendung sein



  • Jochen Kalmbach schrieb:

    Es ist ein C++/CLI Projekt. Das sieht man an den Einstellungen: "Common Language Runtime Support": steht auf jedefall nicht auf "None"...

    Reine MSIL CLR Unterstüzung /clr:pure



  • Wenn du CLR machst, dann bist du aber hier im MFC(C++)-Forum falsch 😉


Anmelden zum Antworten