Dumme Frage


  • Mod

    Dummy2332 schrieb:

    Wusste es nicht zu formulieren, und dachte mir dass sowas eigentlich n selbstgänger sein sollte.
    hab den Code jetzt so abgeändert :

    --------------------------------
    int main()
    {
    using std::string;
    char* pNAME;
    pNAME = "Ahnung.";
    printf ("Ich hab keine %s ", pNAME);
    return 0;
    }
    ---------------------------------

    Hab zwar keine Ahnung wieso das jetzt funktioniert, aber es funktioniert 🙂
    Schätze mal ich sollte mich ne Runde mit Pointern beschäftigen.

    besser wäre, printf zu vergessen (und höchstens irgendwann viel später darauf zurückzukommen).



  • das ist aber falsch :p

    Das mag zwar u.U. funktionieren - Allerdings wird hier Speicher beschrieben, der deinem Prog nicht gehört

    entweder:

    char * ch = "Bla, bla...";
    

    oder:

    char * ch;
    ch = new char[16];
    strcpy(ch, "Bla, bla...");
    delte[] ch;
    

    Gruß, Winnie


  • Mod

    Winnie01 schrieb:

    das ist aber falsch :p

    Das mag zwar u.U. funktionieren - Allerdings wird hier Speicher beschrieben, der deinem Prog nicht gehört

    huh? Da wird nichts in irgendeinen Speicher geschrieben. Das ist 100% standardkonformer Code. Das es - möglicherweise - schlechter Code ist, spielt dabei erst mal keine Rolle.



  • Winnie01 schrieb:

    das ist aber falsch :p

    Das mag zwar u.U. funktionieren - Allerdings wird hier Speicher beschrieben, der deinem Prog nicht gehört

    Interessant. Wenn Du uns jetzt noch zeigen magst wo hier Speicher beschrieben wird?

    char * ch = "Bla, bla...";
    

    ist hier exakt dasselbe wie

    char * ch; ch = "Bla, bla...";
    


  • Zeiger auf ein char (4 Byte):

    char * ch;
    

    und beim

    ch = "irgendaw";
    

    wird im Speicher geschrieben, wo keins vorher mit new angeforder war -> also ins Leere...

    Habe ich da im Unterricht etwa gepennt?

    Dies ist auch möglich und kein Fehler (aber definitiv falsch):

    char * c;
    c = new char[2];
    c = "bla, bla...";
    

    frohe Weihnachten :xmas1:



  • Winnie01 schrieb:

    Zeiger auf ein char (4 Byte):

    char * ch;
    

    und beim

    ch = "irgendaw";
    

    wird im Speicher geschrieben, wo keins vorher mit new angeforder war -> also ins Leere.......

    Nein !
    Der Zeiger ch wird auf den Anfang des Stringliterals "irgendaw" gesetzt.
    Kopiert oder geschrieben wird da nichts.

    Dies hier:

    Winnie01 schrieb:

    Zeiger auf ein char (4 Byte):

    ...
    [cpp]char * c;
    c = new char[2]; // (*)
    c = "bla, bla...";
    

    hingegen hinterlässt verwaiste 2 Byte, die Du bei (*) allokierst, in der Folgezeile aber ihre Adresse "vergisst".

    Gruß,

    Simon2.



  • Winnie01 schrieb:

    wird im Speicher geschrieben, wo keins vorher mit new angeforder war -> also ins Leere...

    Nö, in den Speicher schreiben tun strcpy und Konsorten. Hier wird einfach ein Zeiger auf einen konstanten String im Datenbereich des Programms in die Zeigervariable c gelegt. Ist wie gesagt exakt das gleiche wie

    char * c = "bla, bla...";
    

    Dies ist auch möglich und kein Fehler (aber definitiv falsch):

    char * c;
    c = new char[2];
    c = "bla, bla...";
    

    Korrekt, denn hier wird erst ein Zeiger auf neu allokierten Speicher in eine Zeigervariable gelegt, der dann durch einen Zeiger auf einen konstanten String im Datenbereich des Programms ersetzt wird, womit Du Dich der Möglichkeit beraubt hast, den allokierten Speicher jemals wieder freizugeben 😃



  • um nochmal auf die ausgangsfrage zu antworten:

    int main()
    {
    using std::string;
    string name;
    name = "Ahnung.";
    printf ("Ich hab keine %s ", name[b].data()[/b] );
    return 0;
    }
    

    name ist nur die Stringinstanz. Um an die in der Klasse gespeicherten daten zu kommen, gibts die data()-funktion.



  • #include <string>
    #include <iostream>
    
    int main()
    {
        std::string name = "Ahnung.";
        std::cout << "Ich hab keine " << name << std::endl;
        return 0;
    }
    

    So, und jetzt verwirrt den armen OP nicht mit dem Pointer Quark :p


  • Mod

    THX 1138 schrieb:

    #include <string>
    #include <iostream>
    
    int main()
    {
        std::string name = "Ahnung.";
        std::cout << "Ich hab keine " << name << std::endl;
        return 0;
    }
    

    So, und jetzt verwirrt den armen OP nicht mit dem Pointer Quark :p

    wieder #include <ostream> vergessen 😉



  • Witzig wie so eine "dumme frage" für soviel interesse sorgt 🙂
    Ich kann nicht mehr 100% folgen, denke mal ich werd mir das vorgeschlagene tutorial mal zu gemüte führen.
    klingt spannend und ich hab ja zeit :>
    Also danke für die hilfe.



  • in C++ würde ich es so machen:

    #include <iostream>
    #include <string>
    
    class Ausgabe
    {
        private:
            std::string _s;
    
        public:
            Ausgabe() : _s(0) {}
            Ausgabe(std::string Text);
    
            ~Ausgabe() {}
    
            void sehen() const;
    };
    
    Ausgabe::Ausgabe(std::string Text)
    {
        _s = Text;
    }
    
    void Ausgabe::sehen() const
    {
        std::cout << _s.c_str() << std::endl;
    }
    
    int main()
    {
        Ausgabe a("Ich habe keine Ahnung!");
    
        a.sehen();
    
        return 0;
    }
    

    bin für alle Verbeserungsvorschläge natürlich offen 😉

    Gruß, Winnie


  • Mod

    Winnie01 schrieb:

    bin für alle Verbeserungsvorschläge natürlich offen 😉

    alles streichen?



  • Winnie01 schrieb:

    in C++ würde ich es so machen:

    #include <iostream>
    #include <string>
    
    class Ausgabe
    {
        private:
            std::string _s;
    
        public:
            Ausgabe() : _s(0) {}
            Ausgabe(std::string Text);
            
            ~Ausgabe() {}
    
            void sehen() const;
    };
    
    Ausgabe::Ausgabe(std::string Text)
    {
        _s = Text;
    }
    
    void Ausgabe::sehen() const
    {
        std::cout << _s.c_str() << std::endl;
    }
    
    int main()
    {
        Ausgabe a("Ich habe keine Ahnung!");
        
        a.sehen();
        
        return 0;
    }
    

    bin für alle Verbeserungsvorschläge natürlich offen 😉

    Gruß, Winnie

    😕 😕 😕



  • nich akzeptiert? Warum?



  • Overkill? Ich meine wenn Du mit Deinem Auto von A nach B willst, verlädst Du es dann auch in einen Grossraum-LKW und fährst dann mit dem? 😃



  • LordJaxom schrieb:

    Overkill? Ich meine wenn Du mit Deinem Auto von A nach B willst, verlädst Du es dann auch in einen Grossraum-LKW und fährst dann mit dem? 😃

    Wenn es hier um C++ geht, dann aber richtig :p



  • In c++ ist es genau das 3 Zeilen Programm (von den Includes abgesehen) das vorher gepostet wurde.

    Wieso ne eigene Klasse schaffen, wenn es die Klasse string schon gibt? Wieso eine Memberfunktion zum couten, wenn es den operator<< fuer strings eh schon gibt.

    Wie gesagt ein absoluter Overkill fuer ein an sich einfaches Programm.



  • wie sagt man so schön: es gibt keine dummen Fragen... Ich wollte halt auch mal was dazu beitragen 😉

    Andererseits - wozu den Compiler mit dem Dreizeile bemühen, das mir nur sagen will - dass ich doof bin... Scripte tuhen es auch.

    Batch, Bash, Sh und Ä.

    echo ich bin doof.
    

    oder mal was anspruchvolles - VB\1:

    MsgBox "ich auch.", vbInformation
    

    Vielleicht sollte man sich zuerst überlegen - wozu man das braucht, bevor man mit Programmieren anfängt (und das auch noch in C++). Viele Sachen lassen sich oft viel einfacher lösen (sonst würde es ja die dummen äh die schlauen Scriptsprachen nicht geben)... 😃



  • littlejohn schrieb:

    um nochmal auf die ausgangsfrage zu antworten:

    int main()
    {
    using std::string;
    string name;
    name = "Ahnung.";
    printf ("Ich hab keine %s ", name[b].data()[/b] );
    return 0;
    }
    

    name ist nur die Stringinstanz. Um an die in der Klasse gespeicherten daten zu kommen, gibts die data()-funktion.

    Nimm statt dem 'data()' lieber 'c_str()'. Es ist nicht garantiert, daß data() einen null-terminierten String zurückgibt - und das kann im Zweifelsfall ungesund sein, wenn du ihn im C-Stil weiterverarbeiten willst.


Anmelden zum Antworten