variablen neu initialisieren



  • Hier initialisierst du ja auch nix. Du reservierst lediglich 100 Zeichen. Dh in deinem Array steht irgendwas undefiniertes drinne. Woher bekommen denn die Elemente gültige Werte?



  • ansonsten kannst du auch memset benutzen (war das bs spezifisch ? )



  • Delryn schrieb:

    ansonsten kannst du auch memset benutzen (war das bs spezifisch ? )

    memset ist zwar Standard, für sowas aber zu limitiert. Was ist zB, wenn du ein float Array mit dem Wert 1 initialisieren willst? Dann sollte man doch eher auf Funktionen aus <algorithm> zurückgreifen.



  • memset ist eine nette Idee, wie wendet man das genau auf den array an? belegt jedes element einen byte?



  • Jedes Element belegt sizeof(Type) Byte.



  • Die memset-Idee ist genial...viel effizienter und schöner 🙂



  • MaSTaH schrieb:

    Jedes Element belegt sizeof(Type) Byte.

    Aber nur, wenn sizeof(Type) gleich 1 ist.



  • Wie hilft memset denn hier?! o_O

    Wenn du in einer Funktion "char mem[100]" verwendest, weißt du nie, nicht einmal beim ersten Mal, was drin steckt. Also hättest du memset schon vorher brauchen müssen, damit es jetzt hilft. Wenn du ein Array willst, das bei jeder Konstruktion mit Nullen gefüllt ist, nimm "char mem[100] = { 0 }".



  • ah mem[100] = { 0 } setzt also alle Elemente auf 0, hab das immer mittels schleifen gemacht und da war halt memset ne erleichterung.
    der befehl tut ja im grunde das gleiche wie memset, aber ist gut zu wissen, dass es ihn gibt 🙂



  • snake4ever schrieb:

    der befehl tut ja im grunde das gleiche wie memset, aber ist gut zu wissen, dass es ihn gibt 🙂

    Mal ganz abgesehen davon, dass es kein Befehl ist, sollte man der Vollständigkeit wegen noch erwähnen, dass

    char mem[100] = { 0 };
    

    auch nur mit 0 funktioniert (sofern man vorhat, das ganze Array zu initialisieren). Das ganze nennt sich zero-initialization.



  • soso, ich befehle dem Computer also nicht das Array mit 0 zu initialisieren? 🙂

    aber nachträglich in der runtime kann man dies leider nicht mehr machen oder? genau das will ich nämlich und es klappt mit memset.



  • snake4ever schrieb:

    aber nachträglich in der runtime kann man dies leider nicht mehr machen oder? genau das will ich nämlich und es klappt mit memset.

    😕



  • beispiel:

    char mem[100] = { 0 };
    mem="Hallo";
    cout << mem; // ausgabe von Hallo
    mem={ 0 }    // das wünsch ich mir...geht aber leider nicht
                 // hier hilft nur memset(mem,0,100);
                 // oder eine for schleife, die alle elemente auf 0 setzt.
    cout << mem; // kein ausgabe mehr...
    

    ist das jetzt verständlich?

    btw: könnte mir vielleicht noch jemand erklären was es mit dem

    using namespace std;
    

    auf sich hat?

    und warum kann man nicht einfach

    cin >> "";
    

    schreiben, um das Beenden der Konsole zu verhindern?

    wieso wird überhaupt so wenig cout und cin benutzt?



  • snake4ever schrieb:

    btw: könnte mir vielleicht noch jemand erklären was es mit dem

    using namespace std;
    

    auf sich hat?

    Es gibt in C++ den s.g. namespace, um Namenskonflikte bei gleichen Typ/funktionsbezeichnern zu verhindern. mit "using namespace std;" wird dieser Namespace auf alle folgenden Elemente angewand, d.h. die Elemente werden sowohl im globalen namespace als auch im namespace std gesucht. Du könntest stattdessen auch einfach vor jedes Element std:: davorschreiben, das aus dem namespace stammt.
    Dies ist aber meist nur sinnvoll, wenn man Elemente hat, die in verschiedenen eingebundenen Namespaces vorkommen. z.B:

    namespace bla
    {
       int foo;
    }
    int foo;
    
    foo = 1; //geht -> globales foo
    
    using namespace bla;
    foo = 1; // geht nicht -> mehrdeutig
    ::foo = 1; //geht -> globales foo
    bla::foo = 1; //geht -> foo aus dem namespace bla
    

    Ich hoffe, das genügt als kleine Erklärung 🙂

    EDIT: "Mehrdeutigkeit des Beitrages" 😉 + Rechtschreibung



  • jo eigentlich verständlich, aber wo wäre denn jetzt der Unterschied zwischen

    #include <string>
    
    std::string blub;
    

    und

    #include <string>
    
    string blub;
    

    da gibt es keinen oder? da string eh zu der Klasse std gehört?



  • Also statt dem char[] würde ich dann lieber gleich einen string verwenden... Aber im OP klingt es so, als würdest du die gleiche Programmlogik mehrfach aufrufen wollen. Da klingt es sauberer, die so in eine Funktion oder Klasse auszulagern, dass alle relevanten Variablen nur da gültig sind und nicht später manuell neu gesetzt werden müssen.



  • snake4ever schrieb:

    jo eigentlich verständlich, aber wo wäre denn jetzt der Unterschied zwischen

    #include <string>
    
    std::string blub;
    

    und

    #include <string>
    
    string blub;
    

    da gibt es keinen oder? da string eh zu der Klasse std gehört?

    Der Unterschied liegt darin, dass du eventuell selber noch eine Klasse string hast, wenn du die jetz auch verwenden möchtest, gibt es , wenn die andere nicht im namespace std liegen würde einen Namenskonflikt. Daher liegen auch alle Klassen aus der Standardbibliothek im namespace std.
    Dies ist auch der Grund warum der namespace eingeführt wurde, man will gleiche Namen zulassen, aber trotzdem Konflikte vermeiden.
    Man lese dazu "Effektiv C++" von Scott Meyers 😉



  • snake4ever schrieb:

    jo eigentlich verständlich, aber wo wäre denn jetzt der Unterschied zwischen

    #include <string>
    
    std::string blub;
    

    und

    #include <string>
    
    string blub;
    

    Das zweite ist schlichtweg falsch.
    Da müsste noch ein "using namespace std;" davor stehen.

    da gibt es keinen oder? da string eh zu der Klasse std gehört?

    std ist keine Klasse sondern ein Namespace, sollte eigentlich in jedem halbwegs brauchbaren C++-Buch erklärt sein.



  • snake4ever schrieb:

    char mem[100] = { 0 };
    mem="Hallo";
    

    Erstmal wird das sowieso nicht funktionieren. Und zweitens versteh ich nicht, warum du das Array erst nullst, um später die Zeichenkette "Hallo" darin zu speichern.

    snake4ever schrieb:

    mem={ 0 }    // das wünsch ich mir...geht aber leider nicht
                 // hier hilft nur memset(mem,0,100);
                 // oder eine for schleife, die alle elemente auf 0 setzt.
    

    Wie gesagt, ich versteh nicht warum du sowas machen willst. Normalerweise will man ja irgendwas sinnvolles darin speichern. Das ist genauso, wie wenn Leute NULL einem Zeiger zuweisen, um eine Zeile später diesen Wert wieder mit dem zurückgegebenen Zeiger von new/new[] zu überschreiben.

    snake4ever schrieb:

    und warum kann man nicht einfach

    cin >> "";
    

    schreiben

    Weil String Literale read-only sind.

    snake4ever schrieb:

    btw: könnte mir vielleicht noch jemand erklären was es mit dem

    using namespace std;
    

    auf sich hat?

    Neben der using Directive gibt es auch noch die using Deklaration. Damit kannst du dann einzelne Teile aus einem Namensraum in den aktuellen einbinden (falls dir der ganze zu viel ist), zB

    using std::string;
    


  • geht aber beides, also seh ich irgendwie keinen grund den namespace zu verwenden...


Anmelden zum Antworten