Variable Chars Verknüpfen



  • veryxRV schrieb:

    Ah okay danke ich probiers mal! 🙂

    BITTE ZWEITERE VARIANTE NEHMEN !!!
    Die erste führt Dich direkt wieder hierher mit der Frage "Warum stürzt mein Programm ab ?" oder "Warum bekomme ich die Daten nicht raus ?" oder ...

    Wenn Du die Daten tatsächlich "zum Schreiben rausgeben musst" (sprich: Mit "const char*" nicht auskommst), solltest Du kopieren - gibt's da nicht auch schon eine FAQ zu ?

    std::string s = "Simon2";
    
    char* sCopy = new char[s.length()+1];
    std::copy(s.begin(), s.end(), sCopy);
    
    MeineFunktionDirCHARBraucht(sCopy);
    s = sCopy;
    delete[] sCopy;
    

    (nicht getestet, sondern einfach hingetippt)

    Gruß,

    Simon2.



  • Simon2 schrieb:

    BITTE ZWEITERE VARIANTE NEHMEN !!!
    Die erste führt Dich direkt wieder hierher mit der Frage "Warum stürzt mein Programm ab ?" oder "Warum bekomme ich die Daten nicht raus ?" oder ...

    wieso?
    solange man mit dem char* nur lesezugriffe macht, sollte es nicht zicken...
    🙂



  • pale dog schrieb:

    Simon2 schrieb:

    BITTE ZWEITERE VARIANTE NEHMEN !!!
    Die erste führt Dich direkt wieder hierher mit der Frage "Warum stürzt mein Programm ab ?" oder "Warum bekomme ich die Daten nicht raus ?" oder ...

    wieso?
    solange man mit dem char* nur lesezugriffe macht, sollte es nicht zicken...
    🙂

    Ja, sicher, aber wenn du nur lesend zugreifen willst, reicht der 'const char*' vollkommen aus - der Cast öffnet da nur das Tor zu potentiellen Fehlern.



  • CStoll schrieb:

    pale dog schrieb:

    Simon2 schrieb:

    BITTE ZWEITERE VARIANTE NEHMEN !!!
    Die erste führt Dich direkt wieder hierher mit der Frage "Warum stürzt mein Programm ab ?" oder "Warum bekomme ich die Daten nicht raus ?" oder ...

    wieso?
    solange man mit dem char* nur lesezugriffe macht, sollte es nicht zicken...
    🙂

    Ja, sicher, aber wenn du nur lesend zugreifen willst, reicht der 'const char*' vollkommen aus - der Cast öffnet da nur das Tor zu potentiellen Fehlern.

    stimmt schon was du sagst, aber wie ich das mitbekommen habe, will er den pointer an eine funktion übergeben, die einen 'char*' haben will. wenn er einen 'const char*' übergeben will, würde der compiler das ablehnen, deshalb eben ein cast.
    ...aber natürlich muss sichergestellt sein, dass die funktion keine schreibzugriffe mit dem pointer macht - sonst - PENG!



  • pale dog schrieb:

    CStoll schrieb:

    pale dog schrieb:

    Simon2 schrieb:

    BITTE ZWEITERE VARIANTE NEHMEN !!!
    Die erste führt Dich direkt wieder hierher mit der Frage "Warum stürzt mein Programm ab ?" oder "Warum bekomme ich die Daten nicht raus ?" oder ...

    wieso?
    solange man mit dem char* nur lesezugriffe macht, sollte es nicht zicken...
    🙂

    Ja, sicher, aber wenn du nur lesend zugreifen willst, reicht der 'const char*' vollkommen aus - der Cast öffnet da nur das Tor zu potentiellen Fehlern.

    stimmt schon was du sagst, aber wie ich das mitbekommen habe, will er den pointer an eine funktion übergeben, die einen 'char*' haben will. wenn er einen 'const char*' übergeben will, würde der compiler das ablehnen, deshalb eben ein cast.

    Wenn das der Fall sein sollte, ist die entsprechende Funktion ziemlich sicher schlecht designt (Stichwort: const correctness).

    Und wenn die Funktion beabsichtigt, den übergebenen char* zu ändern, hilft dir c_str() sowieso nicht weiter - da ist der Ansatz von Simon vermutlich besser (und noch besser ist es, anstelle von std::copy() die Methode std::string::copy() zu verwenden).



  • pale dog schrieb:

    ...aber natürlich muss sichergestellt sein, dass die funktion keine schreibzugriffe mit dem pointer macht - sonst - PENG!

    Deswegen würde ich mich da nicht drauf verlassen. Eigentlich gibt es nur zwei Alternativen:
    A) Der Funktionsdesigner war ein gründlich mit seinem Design und er will ändern.
    😎 Der Funktionsdesigner war ein schludrig mit seinem Design und hat das const "vergessen".

    In beiden Fällen würde ich kopieren (selbst, wenn er nur geschludert hat, macht mir das nicht viel Hoffnung, dass es nur das fehlende const war)... 😉

    Gruß,

    Simon2.



  • hi,
    anscheinend ist es eine winapi-funktion, die den string haben möchte. in einem der ersten postings steht LPCTSTR, das ist ein winapi-typedef.
    ...und winapi-funktionen zu ändern kann schwierig werden 😉
    aber vielleicht sollte er besser MFC-CString verwenden, da darf man wenigstens die zeichen über einen char* ändern. 👍
    ich würde nur kopieren, wenn's wirklich nötig ist.



  • Wenn die Winapi den String nicht verändert erwartet sie einen const char* und man kann ihr direkt c_str() mitgeben.
    Wenn sie den Inhalt ändert sollte, erwartet sie normalerweise einen char* und eine Länge, dann kann man &my_str[ 0 ] mit my_str.size() benutzen.



  • pale dog schrieb:

    hi,
    anscheinend ist es eine winapi-funktion, die den string haben möchte...

    Das bedeutet was genau in diesem Zusammenhang ?
    Alternative A oder B ? 😃

    Gruß,

    Simon2.



  • Simon2 schrieb:

    pale dog schrieb:

    hi,
    anscheinend ist es eine winapi-funktion, die den string haben möchte...

    Das bedeutet was genau in diesem Zusammenhang ?
    Alternative A oder B ? 😃

    B.
    aber keine angst, m$ wird die aufrufsemantik von winapis nicht ändern. da legen die grossen wert drauf.
    🙂



  • pale dog schrieb:

    ...
    aber keine angst, m$ wird die aufrufsemantik von winapis nicht ändern. da legen die grossen wert drauf.
    🙂

    Na, da bin ich ja beruhigt ... 😉

    Muss halt jeder wissen, ob ihm ein eingespartes memcpy() das wert ist; eigentlich geht es mir nur darum, dass ein anscheinend etwas Unerfahrener (wie der OP) diese Diskussion und die Möglichkeiten mitbekommt. Das Ziel habe ich erreicht, nun muss der OP selbst entscheiden, was er macht. 😃

    Gruß,

    Simon2.



  • Also ich habe jetzt einfach mal std::string mit c_str() zum Umwandeln verwendet und das läuft bis jetzt ohne Probleme.



  • veryxRV schrieb:

    Also ich habe jetzt einfach mal std::string mit c_str() zum Umwandeln verwendet und das läuft bis jetzt ohne Probleme.

    Hi,

    mal aus Interesse: Werden beim Kompilieren Warnungen angezeigt (und sind die Warnung angeschaltet) ? Wie ist die Schnittstelle definiert (mit const oder ohne) ?

    "Läuft bislang ohne Probleme" ist in C++ nur ein sehr schwaches Qualitätssiegel.... 😉

    Gruß,

    Simon2.


Anmelden zum Antworten