Einstellung in Visual Studio



  • #include <Windows.h>
    #include <iostream>
    
    //Erstellen
    bool createFolder(const char *name) {
         return ( CreateDirectory((LPCTSTR)name,NULL) != 0);
    }
    bool createFolder(std::string name) { return createFolder( name.c_str()); }
    
    int main() {
    
    	std::cout << createFolder("D:\\test");
    	getchar();
    }
    

    Dieser Code klappt in Code::Blocks,DevC++ jedoch nicht in Visual Studio 2010 was muss ich einstellen damit es in VS auch klappt ?



  • Also es gibt keine Compilierfehler sondern der Ordner wird nicht in VS erstellt obwohl ein true zurückgeliefert wird. Bei den anderen Compilern wird der Ordner erstellt das gleiche Problem habe ich bei Registry Einträgen.



  • Nicht nachvollziehbar, Executable erstellt Ordner, Compiliert mit VS2012.



  • Der Cast nach LPCTSTR ist ganz schlecht. Er bringt zwar den Compiler zum schweigen, aber richtiger wird es nicht. Es kann zu den Problemen führen, die du beschreibst.

    Der wohl einfachste Weg ist im VS Projekt auf Multibyte-Characterset umzustellen (per Default ist Unicode eingestellt).

    Ein anderer Weg wäre die Signatur der Funktion createFolder(..) so anzupassen, dass die Argumente passen.

    Und natürlich wäre auch eine ordentliche Konvertierung eine Option.
    (Z.B. so: http://www.c-plusplus.net/forum/p1850229#1850229)

    Simon



  • ...



  • Danke @Theta
    ich wär darauf nie gekommen. Eine Frage noch :
    Ich programmier für mich paar Klassen und möchte das es sehr schnell geht, hab mir auch deinen Code angegugt du benutzt ja vector und string
    Meine Frage wieso ist dieses Cast nicht so gut ? Im Grunde sind es ja alles char Zeichensatzketten was würdest du machen wenn es in Echtzeit gehen soll lieber casten und auf multibyte Zeichensatz oder so wie du casten und bishen Zeit verlieren ?



  • Der Cast ist nicht "nicht so gut" sondern falsch. Du sagst dem Compiler "hier ist ein Unicode String", der Cast heißt "Halt die Schnauze das ist Unicode" und dann gibst du ihm einen ASCII-String. Die Windowsvariante von Unicode benutzt 2 Bytes um ein Zeichen darzustellen, also wird aus "D:" ein komisches Zeichen (vielleicht auch das hier, ist aber nicht so wichtig). Für "\\t" gibt es aber kein Unicode-Zeichen, sodass Windows verwirrt ist.

    Eine bessere Möglichkeit wäre einfach CreateDirectoryA statt CreateDirectory zu benutzen. Kein Cast, kein Konvertieren. Einfach Windows sagen dass es gefälligst ASCII benutzen soll anstatt so zu tun als wäre ASCII Unicode.

    Noch besser wäre es Windows zu sagen, dass es Unicode benutzen kann, damit das Programm auch Umlaute und sonstige komische Zeichen versteht. Dafür benutzt man dann L"D:\\test" und const wchar_t * und CreateDiretoryW. Kein Cast und keine Konvertierung nötig.

    Wenn du es umstellen können willst kannst du _T("D:\\test") mit const TCHAR * und CreateDiretory benutzen. Wenn du im Projekt Unicode einstellst benutzt er Unicode, bei ASCII halt ASCII. Ebenfalls kein Cast und keine Konvertierung nötig, nur halt neu kompilieren.



  • O`Boyle schrieb:

    ...was würdest du machen wenn es in Echtzeit gehen soll lieber casten und auf multibyte Zeichensatz oder so wie du casten und bishen Zeit verlieren ?

    Warum der Cast falsch ist, wurde ja schon geklärt.

    Also nun zur Performance-Frage: Ein Program muss zuerst korrekt sein, dann schnell. Ein schnelles Programm, das schnell nicht funktioniert, ist einfach nichts Wert oder kann sogar Schaden anrichten (von der Ampelsteuerung über Medizinalgeräte bis zur Raumfahrt oder dem Militär).

    Unter Windows würde ich den Zeichensatz auf Unicode umstellen, und den Code so anpassen, dass keine Konvertierung nötig ist. Windows benutzt intern sowiso Unicode, d.h. Funktionen, die Multibyte Character als Argumente haben, konvertieren diese intern.

    Um die Performance würde ich mir zuerst keine Gedanken machen, sondern die richtigen Abstraktionen finden und mit dem Code ausdrücken, was das Programm machen soll. Erst wenn du Engpässe hast, dann sollst du messen und ggf. optimieren. Optimierungen, die im Vergleich zu anderen Dingen im Programm nicht ins Gewicht fallen, nennt man Mikrooptimierungen und sie bringen meist gar nichts oder spielen sich in einem nicht messbaren Bereich ab. Beispielsweise dauert das Erstellen des Verzeichnises ziemlich sicher sehr, sehr viel länger als die Multibyte zu Unicode-Konvertierung. Hier noch ein Wikipedia Artikel zu dem Thema (Stichwort: Premature optimization): http://en.wikipedia.org/wiki/Program_optimization

    So, in diesem Sinne, viel Spass beim Programmieren.

    Gruss Simon


Anmelden zum Antworten