Code in C++?



  • Michael E. schrieb:

    net schrieb:

    Michael E. schrieb:

    string removeDir(string f)
    {
        return f.substr(f.find_last_of("\\"));
    }
    

    leider falsch. das original liefert einen pointer in den eingabestring zurück. das hier kopiert einen teilstring raus.

    Dann halt so:

    void removeDir(string &f)
    {
        f.erase(f.find_last_of("\\"));    // Zweiter Parameter optional??
    }
    

    auch nicht richtig. das verändert das original. gar nicht so einfach, ne?



  • |even| schrieb:

    Falsch! beide richtungen gehen, sieht man ja auch an der

    die benutzen aber auch 2 verschiedene funktionen zum konvertieren, und das ist das problem!

    widen kann halt nur kleiner typen zu größeren konvertieren(char->wchar_t als beispiel), für den umgekehrten weg braucht man aber narrow(wchar_t->char).

    (aber der von mir gepostete code reicht für den hier geposteten fall vollauf, das umwandeln von wchar_t nach char war halt net verlangt^^)



  • net schrieb:

    Michael E. schrieb:

    net schrieb:

    Michael E. schrieb:

    string removeDir(string f)
    {
        return f.substr(f.find_last_of("\\"));
    }
    

    leider falsch. das original liefert einen pointer in den eingabestring zurück. das hier kopiert einen teilstring raus.

    Dann halt so:

    void removeDir(string &f)
    {
        f.erase(f.find_last_of("\\"));    // Zweiter Parameter optional??
    }
    

    auch nicht richtig. das verändert das original. gar nicht so einfach, ne?

    Mir ist schon klar, dass das das Original verändert. Aber gucks dir doch mal an:

    Man braucht einen Teil des Strings. Es ist eigentlich total unwichtig, wo der steht. Also hab ich ne Kopie zurückgeliefert. Weil du aber keine Kopie haben willst, hab das Original verändert. Was passt dirr denn dadran nicht? Dass es nicht 100% mit dem C-Code übereinstimmt? Wenn ja, dann lass es doch gleich stehen. Praktisch gesehen ist da kein Unterschied.

    Und komm bitte nicht mit sowas:

    string foo = "j\djlfj\u";
    string bar = removeDir(foo);
    foo += "z";    // bar hat jetzt immer noch denselben Wert
    

    Wer sowas schreibt, hat nen Fehler in der Denkweise.



  • Michael E. schrieb:

    Es ist eigentlich total unwichtig, wo der steht. Also hab ich ne Kopie zurückgeliefert. Weil du aber keine Kopie haben willst, hab das Original verändert. Was passt dirr denn dadran nicht? Dass es nicht 100% mit dem C-Code übereinstimmt? Wenn ja, dann lass es doch gleich stehen. Praktisch gesehen ist da kein Unterschied.

    der originalcode liefert einen pointer hinter das letzte \ zurück. und genau sowas erwartet der aufrufer, keine kopie, keine manipulation an den daten (was ist wenn die read-only sind?) das macht keiner deiner codes. du hast etwas völlig anderes programmiert :p



  • net schrieb:

    der originalcode liefert einen pointer hinter das letzte \ zurück. und genau sowas erwartet der aufrufer, keine kopie, keine manipulation an den daten (was ist wenn die read-only sind?)

    Falsch.

    Wenn du die Frage genau lesen würdest: es geht darum, wie man das in C++ macht.

    Beachte: C und C++ sind verschiedene Sprachen. Eine Lösung in C++ würde somit idR anders aussehen als in C. Folglich sind die Codes nicht falsch, sondern allesamt richtig, weil sie den Anforderungen entsprechen.

    Ich habe es woanders schonmal gesagt: bitte troll nicht dauernd rum.
    und @Michael E.: lass dich nicht aufziehen.



  • Shade Of Mine schrieb:

    Wenn du die Frage genau lesen würdest: es geht darum, wie man das in C++ macht.

    das steht da. irgendwelche missverständnisse? ich glaube nicht....

    Shade Of Mine schrieb:

    Beachte: C und C++ sind verschiedene Sprachen. Eine Lösung in C++ würde somit idR anders aussehen als in C.

    da bin ich genau deiner meinung.

    Shade Of Mine schrieb:

    Folglich sind die Codes nicht falsch, sondern allesamt richtig, weil sie den Anforderungen entsprechen.

    nein. die anforderung ist in etwa "schreibe eine funktion in c++, welche einen char* (c-string) bekommt und einen zeiger hinter das letzte vorkommen von \ liefert"

    edit: damit ihr nicht denkt ich motze nur rum...

    char* removeDir (char* pcFilename)
    {
      return 1 + pcFilename + string(pcFilename).find_last_of("\\");        
    }
    


  • net schrieb:

    nein. die anforderung ist in etwa "schreibe eine funktion in c++, welche einen char* (c-string) bekommt und einen zeiger hinter das letzte vorkommen von \ liefert"

    Nö, z.B. steht nirgendwo, dass man C-Strings benutzen sollte.
    Nach deiner Auffassung könnte man auch einen Iterator zurückliefern.

    Shade hat Recht. Ich klink mich aus.



  • Michael E. schrieb:

    Nö, z.B. steht nirgendwo, dass man C-Strings benutzen sollte.

    sollte man auch nicht, denn der op fragte nach einer c++ lösung. allerdings finde ich, dass man input und output der funktion schon dabei beachten sollte.

    Michael E. schrieb:

    Shade hat Recht.

    wenn ich schreiben würde 'heilig abend ist am 24. dezember' und du würdest schreiben 'es ist am 1. januar' würde er dir auch recht geben 😉



  • wie sähe dieser Code in C++ aus?

    Ganz einfach: in C++ sähe sie etwa so aus

    string removeDir(string const& f)
    {
        return f.substr(f.find_last_of("\\"));
    }
    

    ist doch vollkommen richtig.

    Wenn jemand fragt: wie sähe die Funktion in Java aus, würde wohl niemand sagen: Das geht nicht, weil Java keine Zeiger kennt. Sondern einfach eine Java Lösung posten die String verwendet.

    Man kann die Funktion _auch_ anders schreiben. Aber dieser Code ist eine legitime C++ Version der C Version. Sie sind nicht identisch, denn identisch das ist nicht möglich (mit der Ausnahme von kleinigkeiten wie zB laufende Zeiger zu verwenden, oder keine ungarische notation oder size_t statt int, etc. - was man in C aber sowieso auch machen könnte).

    Wenn du es also so siehst, dann ist die einzige Antwort die man gelten lassen kann:
    C++ kann das leider nicht.

    char* removeDir (char* pcFilename) 
    { 
      return 1 + pcFilename + string(pcFilename).find_last_of("\\");         
    }
    

    ist übrigens eine verdammt schlechte lösung. sowas würde man nie schreiben.



  • Shade Of Mine schrieb:

    wie sähe dieser Code in C++ aus?

    Ganz einfach: in C++ sähe sie etwa so aus

    string removeDir(string const& f)
    {
        return f.substr(f.find_last_of("\\"));
    }
    

    ist doch vollkommen richtig.

    Woher willst Du wissen das er nur char benutzen will? mich würde mal so ein typ-cast von wchar_t zu char und umgekehrt interessieren auf templatebasis.



  • std::string removeDir(const std::string& fileName)
    {
    	std::size_t fileNamePosition = fileName.find_last_of('\\') + 1;
    	return fileName.substr(fileNamePosition);
    }
    


  • [offtopic]
    @mein Fersuch:
    "Ver und Vor - ich bin schlau - schreib ich immer nur mit Fau äh... V" :p 😉

    Caipi
    [/offtopic]



  • Shade Of Mine schrieb:

    Ganz einfach: in C++ sähe sie etwa so aus

    string removeDir(string const& f)
    {
        return f.substr(f.find_last_of("\\"));
    }
    

    ist doch vollkommen richtig.

    nein, du erzeugst damit einen neuen string. das ist ganz was anderes
    (aber das schrieb ich bereits). die originalfunktion gibt eine positionsangabe zurück und wir wissen nicht, was damit weiter geschieht. einen ausschnitt aus dem string zu liefern könnte u.u. total falsch sein.

    Shade Of Mine schrieb:

    Wenn jemand fragt: wie sähe die Funktion in Java aus, würde wohl niemand sagen: Das geht nicht, weil Java keine Zeiger kennt.

    in java könnte man einen index zurückgeben, das wäre immerhin passender als einen neuen string zu erzeugen.

    Shade Of Mine schrieb:

    Aber dieser Code ist eine legitime C++ Version der C Version. Sie sind nicht identisch, denn identisch das ist nicht möglich

    das innenleben der funktion muss nicht identisch sein. sie kann völlig anders arbeiten (black box eben). wichtig ist nur, dass input und output kompatibel sind.

    Shade Of Mine schrieb:

    Wenn du es also so siehst, dann ist die einzige Antwort die man gelten lassen kann: C++ kann das leider nicht.

    nein, es geht mit c++. siehe mein beispiel.



  • Junge, Junge. Wie kriegt ihrs nur hin, euch so lange drum zu streiten, ob der, ders so gemacht hat, wies gemeint war, oder der, ders so gemacht hat, wies da stand recht hat?



  • //müll



  • '''''''''''''''''''' schrieb:

    Woher willst Du wissen das er nur char benutzen will? mich würde mal so ein typ-cast von wchar_t zu char und umgekehrt interessieren auf templatebasis.

    Steht nicht in den Anforderungen.

    @net:
    Ja, das wäre _auch_ eine Möglichkeit die Anforderungen zu erfüllen. Aber an Michael E.s Code ist nichts verkehrt. Die Funktion kopiert zwar öfter als die C Funktion: aber an C++ macht man es eben anders als in C. Es wurde ja nach einer C++ Version gefragt und da ist der Code OK, weil er ein removeDir macht. Er macht es an einer Kopie, aber ich sehe nirgendwo die Anforderung dass er das nicht darf.

    Einen index zu liefern ist übrigens auch etwas anderes. Das wäre zB in Java und C++ doof, weil man es so nicht macht. Und damit ist es nicht mehr die C++ Version des Codes.

    Nochmal langsam für dich:

    Wenn du einen index lieferst, ist das nicht das selbe wie einen Zeiger. Folglich ist es nicht möglich den Code in C++ zu schreiben.

    zufrieden?

    Nein?
    ganz klar. Man macht es in C++ halt anders. In Java auch. Deshalb wird der Code nicht 1:1 übernommen werden. Dein Code zB ist absoluter blödsinn, sowas macht man nicht.

    Nirgendwo steht etwas von Interface Kompatibilität. Es steht etwas von "Wie sieht das in C++ aus" und in C++ hat es ein anderes Interface. Ist das selbe wie
    "wie sieht"
    char p[100];
    strcpy(p, "hallo");

    in C++ aus.

    Die Antwort ist nicht:
    vector<char> p(100);
    strcpy(&p[0], "hallo");

    sondern:
    string s;
    s="hallo";

    man beachte, dass man in C++ das Problem gänzlich anders löst.

    Um interface kompatibilität zu wahren, müsste man etwas machen, was man normalerweise nicht tun würde. Und ich sehe nirgendwo die forderung danach. du etwa?



  • Hi,

    danke leute für die vielen Möglichkeiten!

    Aber ich wollte es dann für wchar_t bzw. char benutzen können, deshalb fänd ich Templatebasis besser 🙂

    Wie sähe eigentlich so ein cast aus über den hier gerade jeder redet ?



  • Shade: Danke. Du kannst deine Meinung saugut rüberbringen 🙂



  • 0xdeadbeef schrieb:

    Junge, Junge. Wie kriegt ihrs nur hin, euch so lange drum zu streiten...

    aber nein, wir streiten uns doch gar nicht. das ist eine lockere diskussion bei der wir verschiedene ansichten haben

    Shade Of Mine schrieb:

    Die Funktion kopiert zwar öfter als die C Funktion: aber an C++ macht man es eben anders als in C.

    das ist zwar nicht besonders toll aber auch nicht verboten 😉

    Shade Of Mine schrieb:

    Es wurde ja nach einer C++ Version gefragt und da ist der Code OK, weil er ein removeDir macht.

    ...wenn man sich nur am namen der funktion orientiert als an deren funktionalität.

    Shade Of Mine schrieb:

    Einen index zu liefern ist übrigens auch etwas anderes. Das wäre zB in Java und C++ doof

    in java kann man mit adressen nicht viel anfangen, ein index kommt dem aber am nächsten.
    mit einem pointer hat man gleich mehrere fliegen mit einer klappe geschlagen. wenn du stattdessen einen neuen string zurückgibst, musst du eventuell danach string-suchfunktionen anwenden, um etwas zu erreichen, was die funktion selbst machen könnte (und im original auch gemacht hat). ...und wenn die funktion von mehreren stellen im programm aufgerufen würde, müsstest du alle ändern, damit das programnm weiterhin so läuft wie bisher. sowas ist nicht schön.

    Shade Of Mine schrieb:

    weil man es so nicht macht.

    das ist keine begründung. du solltest mal öfter schreiben 'warum' etwas deiner meinung nach nicht ok ist und einfach 'das ist schlecht, das macht man nicht, ...'

    Shade Of Mine schrieb:

    Folglich ist es nicht möglich den Code in C++ zu schreiben.

    ist es doch, siehe mein beispiel. in c++ kann man im gegensatz zu java pointer verwenden. deshalb ist es möglich, eine c++-version des codes zu schreiben

    Shade Of Mine schrieb:

    Dein Code zB ist absoluter blödsinn, sowas macht man nicht.

    gut, es geht bestimmt bessser. das war nur schnell dahin gehackt aber ich denke du weisst was ich damit meinte

    Shade Of Mine schrieb:

    Ist das selbe wie
    "wie sieht"
    char p[100];
    strcpy(p, "hallo");

    in C++ aus.

    Die Antwort ist nicht:
    vector<char> p(100);
    strcpy(&p[0], "hallo");

    sondern:
    string s;
    s="hallo";

    funktioniert das mit dem strcpy in den vector überhaupt? ich glaub' nicht. aber mal davon abgesehen, bei dem beispiel bin ich ganz deiner meinung



  • funktioniert das mit dem strcpy in den vector überhaupt? ich glaub' nicht. aber mal davon abgesehen, bei dem beispiel bin ich ganz deiner meinung

    da der standard garantiert, dass vector den speicher am stück hält, ist das sehr wohl möglich


Anmelden zum Antworten