Konsolenklasse in Visual C++ Projekt übernehmen



  • Du musst den String^ umwandeln nach "char*" =>
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-158664.html



  • Das ging ja fix. Habe das probiert und bekomme jetzt eine neue Fehlermeldung:

    error C2664: 'JedecFile::Readfile': Konvertierung des Parameters 1 von 'LPCSTR' in 'char *' nicht möglich Durch die Konvertierung gehen Qualifizierer verloren

    Zum Umwandeln habe ich die Struktur StringConvA benutzt und wie im Beispiel angegeben eingebunden. Hier der Code:

    jed->Readfile((LPCSTR) StringConvA(openFile_jed->FileName));
    

    Hat jemand Rat?



  • Du solltest deine Klasse *char const ** erwarten lassen. Denn es macht wenig sinn für deine Klasse den Dateinamen ändern zu können.

    BR
    Vinzenz



  • dercmdr schrieb:

    Das ging ja fix. Habe das probiert und bekomme jetzt eine neue Fehlermeldung:

    error C2664: 'JedecFile::Readfile': Konvertierung des Parameters 1 von 'LPCSTR' in 'char *' nicht möglich Durch die Konvertierung gehen Qualifizierer verloren

    Zum Umwandeln habe ich die Struktur StringConvA benutzt und wie im Beispiel angegeben eingebunden. Hier der Code:

    jed->Readfile((LPCSTR) StringConvA(openFile_jed->FileName));
    

    Wenn Du *wirklich* "char*" benötigst (also einen veränderbaren String), dann musst Du folgendes machen:

    char* pStr = strdup(StringConvA(managedString));
    // Verwende "pStr"
    free(pStr); // gebe den String wieder frei
    

    (oder kopierst den Code-Teil aus der StringConvA-Klasse raus...)



  • Ich habe den char* jetzt als const char* deklariert und es funktioniert, vielen Dank dafür!

    Jetzt habe ich leider schon neue Probleme. Ich bräuchte Konvertierungen von int in string^ und von char in string^. Ich habe gesehen, dass im FAQ eine Umwandlung von char* in string^ beschrieben ist. Ich könnte meine Umwandlungen über diesen Umweg machen, aber vielleicht hat ja jemand eine einfachere Lösung?



  • char c = 'a';
    String ^ str1 = c.ToString();
    
    int i = 100;
    String ^ str2 = i.ToString();
    

    BR
    Vinzenz



  • Vielen Dank für die super Hilfe! Jetzt tut alles wie es soll!



  • Leider schon wieder ein Problem.
    Der cast von string^ in const char* macht mir Probleme. Ich nutze den cast, um einen Dateinamen aus einem openfiledialog zu konvertieren. Beim ersten Öffnen einer Datei funktioniert das auch. Will ich aber später eine andere Datei öffnen, so geht es nicht mehr. Beim Debuggen ist mir aufgefallen, dass bei dem ersten Öffnen einer Datei in der Methode, in der ich die Datei öffne, der Name der Variablen in der der Dateiname steht (ein const char*), nicht angezeigt wird. Sie ist namenlos. "Klappt man sie auf", so wird auch nur der erste Buchstabe der übergebenen Zeichenkette angezeigt, wie es für einen Zeiger üblich ist. Öffne ist jetzt erneut eine Datei mit derselben Methode, so wird beim Debuggen der Name der Variablen in der Methode richtig angezeigt und wenn ich sie aufklappe steht der gesamte Text da, wie bei einem Array. Leider fehlt in diesem Text ein "\" vor jedem "\", so dass die Pfadangaben nicht stimmen und keine Datei geöffnet werden kann. Es gibt keine Fehlermeldung die mir irgendwie weiterhelfen könnte. Aber es scheint halt einen Unterschied zwischen dem ersten Nutzen des casts und den folgenden zu geben. Hoffe das war einigermaßen verständlich. Jemand eine Idee wo das Problem liegt?

    Edit:
    Hab nochmal nen bischen rumgespielt und festgestellt, dass das so nicht ganz richtig ist. Die Variable in der Methode, in der ich die Datei öffne, wird nie mit Namen angezeigt. Wenn ich für sie eine Überwachung hinzufügen will sagt er, sie liegt out of scope. Allerdings existiert eine lokale Namenlose Variable, die den Text beinhaltet.
    Ich habe auch einen Weg gefunden, wie es funktioniert. Es geht, wenn ich jedesmal , bevor ich eine Datei öffne, den Zeiger auf meine Klasse, in der die Datei geöffnet und eingelesen wird, mit delete lösche und mit new neu initialisiere. Mache ich das nicht, so funktioniert das Öffnen nicht. Auch nicht, wenn ich zwei mal hintereinander versuche, dieselbe Datei zu öffnen. Jetzt habe ich zwar eine Lösung die funktioniert, aber würde trotzdem gerne wissen, wo das Problem liegt.

    Edit - Lösung des Problems:
    Ich realisiere das Einlesen mit einem ifstream. Aus irgend einem Grund setzt die Close Methode die Fehlerbits nicht ordentlich zurück, in diesem Fall _mystate. Nach dem Aufruf von Close muss noch der Aufruf von Clear erfolgen, dann geht auch das nächste Dateiöffnen. Vielleicht hilfts ja mal jemandem weiter.



  • dercmdr schrieb:

    Der cast von string^ in const char* macht mir Probleme.

    WAS für einen CAST??? Das kann man nicht casten!!! Du musst umwandeln!!! (mit StringConvA).

    dercmdr schrieb:

    Ich realisiere das Einlesen mit einem ifstream.

    Bringe doch nicht bitte (normales) C++ und C++/CLI durcheinandern. Das ist nicht gut, vor allem nicht, wenn man sich noch nicht so gut auskennt. Das führt nur zu Verwirrung!

    Verwenden den System::IO::StreamReader um Dateien zu lesen!



  • Jochen Kalmbach schrieb:

    WAS für einen CAST??? Das kann man nicht casten!!! Du musst umwandeln!!! (mit StringConvA).

    Keine Panik, ich meine natürlich umwandeln ;).

    Jochen Kalmbach schrieb:

    Bringe doch nicht bitte (normales) C++ und C++/CLI durcheinandern. Das ist nicht gut, vor allem nicht, wenn man sich noch nicht so gut auskennt. Das führt nur zu Verwirrung!

    Das ist nur vorübergehend, da das möglichst fix fertig musste. Für mich ist nur C++/CLI ziemlich neu, normales C++ geht schon. Werde aber die Klasse auf streamreader umstellen sobald ich die Zeit dazu habe.


Anmelden zum Antworten