char* an char* ranhängen



  • Hab n kleines Programm geschrieben das auf einem videofenster das video meiner Webcam anzeigt. Das hat auch soweit geklappt. Dann solls ne Funktion geben die den frame speichert der angezeigt wird. Das ist die Funktion:
    capFileSaveDIB (hWnd,filename);
    hwnd is klar aber ich hab probleme mit dem filename. der will einen char*.
    Wenn ich da einfach sowas angebe: "c:\\cam.jpg" klappt das auch einwandfrei, ich will aber noch datum umd uhrzeit mir im filename haben, damit die datei nicht einfach überschrieben wird.

    time_t Zeitstempel;
         Zeitstempel = time(0);
    char *a = "d:\\webcam";
    char *b = ".jpg";
    char *file = a+ctime(&Zeitstempel)+b;
    capFileSaveDIB (hWndC,file);
    

    Die Antwort:
    45 D:\C++\cam\cam.h invalid operands of types `char*' and `char*' to binary `operator+'
    Welchen Operator braucht man denn da wenn nicht + ? habs auch schon mit << und . (ja ich programiere auch php) versucht.

    mfg



  • Nimm std::string, nicht char*. Die kannst du mit + aneinanderhängen.



  • die funktion
    capFileSaveDIB (hWndC,file);
    nimmt keinen string



  • Und wo ist da das Hindernis? std::string kann dir im Notfall einen const char* auf seine Daten liefern (mittels 'c_str()').



  • time_t Zeitstempel;
         Zeitstempel = time(0);
    string a = "d:\\webcam";
    string b = ".jpg";
    string file = a + ctime(&Zeitstempel) + b;
    char *fname = c_str(file);
    capFileSaveDIB (hWndC,fname);
    

    38 D:\C++\cam\cam.h `c_str' undeclared (first use this function)

    hab string included mfg



  • capFileSaveDIB (hWndC,file.c_str());
    


  • Ic3Hawk schrieb:

    char *fname = c_str(file);
    
    char *fname = (char*)file.c_str();
    

    🙂



  • Ic3Hawk schrieb:

    time_t Zeitstempel;
         Zeitstempel = time(0);
    string a = "d:\\webcam";
    string b = ".jpg";
    string file = a + ctime(&Zeitstempel) + b;
    char *fname = c_str(file);
    capFileSaveDIB (hWndC,fname);
    

    38 D:\C++\cam\cam.h `c_str' undeclared (first use this function)

    c_str ist keine globale Funktion, sondern eine Methode von string (wenn du den Unterschied nicht kennst, solltest du zurückkehren zu den Grundlagen).

    Edit @pale dog: Und dieser Cast gehört zu den Sachen, die man NICHT machen sollte.



  • Hallo

    Ic3Hawk schrieb:

    time_t Zeitstempel;
         Zeitstempel = time(0);
    string a = "d:\\webcam";
    string b = ".jpg";
    string file = a + ctime(&Zeitstempel) + b;
    char *fname = c_str(file);
    capFileSaveDIB (hWndC,fname);
    

    38 D:\C++\cam\cam.h `c_str' undeclared (first use this function)

    hab string included mfg

    #include<string>
    
    std::string
    

    chrische



  • oder einen dritten char* erstellen, der so roß ist wie die beiden anderen zusammen und rüberkopieren...



  • pale dog schrieb:

    Ic3Hawk schrieb:

    char *fname = c_str(file);
    
    char *fname = (char*)file.c_str();
    

    🙂

    Ui, ganz ganz böse... Bei c_str() ist nicht garantiert das ein Zeiger auf den tatsächlichen Inhalt des std::basic_string Objekts zurückgegeben wird. Sowas führt zwangsläufig zu undefinierten Verhalten.



  • David_pb schrieb:

    Bei c_str() ist nicht garantiert das ein Zeiger auf den tatsächlichen Inhalt des std::basic_string Objekts zurückgegeben wird.

    was sonst, wenn's nicht klappt? null?



  • Es könnte eine Kopie des char-Arrays erzeugen und einen Pointer darauf zurückgeben. Der Standard verlangt nur, dass c_str() eine const char* zurückgibt, dessen Elemente gleich denen des Strings sind.
    siehe Standard 21.3.6 1



  • Braunstein schrieb:

    Es könnte eine Kopie des char-Arrays erzeugen und einen Pointer darauf zurückgeben. Der Standard verlangt nur, dass c_str() eine const char* zurückgibt, dessen Elemente gleich denen des Strings sind.

    naja, geht doch auch...



  • Und was bringts dir da rein zu schreiben?



  • David_pb schrieb:

    Und was bringts dir da rein zu schreiben?

    da will doch keiner reinschreiben. der OP möchte doch nur einen dateinamen zusammensetzen und braucht das ergebnis als char* ...
    🙂



  • Na in dem Fall reicht auch ein const char*. 😛



  • David_pb schrieb:

    Na in dem Fall reicht auch ein const char*. 😛

    ne, nicht wenn die funktionen einen 'normalen' char* haben will. 😉



  • Na in dem Fall muss davon ausgegangen werden das die Funktion irgendwas ändern will... Und das ist halt irgendwo falsch.

    Dann lieber sowas:

    char* str = &foo[ 0 ];
    

    Wobei das irgendwie auch unschön ist.



  • pale dog schrieb:

    David_pb schrieb:

    Na in dem Fall reicht auch ein const char*. 😛

    ne, nicht wenn die funktionen einen 'normalen' char* haben will. 😉

    Scheißegal, C-Casts in C++ stinken trotzdem.



  • pale dog schrieb:

    ne, nicht wenn die funktionen einen 'normalen' char* haben will. 😉

    Woher willst du wissen, ob hier ein char* gefragt ist?
    capFileSaveDIB ist sowieso ein Makro welches eine capFileSaveDIB-Message absetzt. Hier sollte auch ein const char* funktionieren.


Anmelden zum Antworten