struct problem



  • Also das heißt das ich immer bei 0 anfange und in diesen speicher schreibe ?

    z.B:

    m[0].color=COLOR_BLUE;

    muss ich dann auch bei dem funktions aufruf m[0] statt m einsetzen ?



  • newbie1337 schrieb:

    Also das heißt das ich immer bei 0 anfange und in diesen speicher schreibe ?

    z.B:

    m[0].color=COLOR_BLUE;

    Ja, das heißt es (btw, im Inneren der Funktion wendest du die Indizes halbwegs korrekt an)

    muss ich dann auch bei dem funktions aufruf m[0] statt m einsetzen ?

    Nein, mußt du nicht - m[0] ist das erste Array-Element, m bezeichnet das komplette Array (und wird vom Compiler bei Bedarf in einen Zeiger auf den Array-Anfang umgewandelt).



  • Ahh jetzt hab ichs verstanden 😃
    Also mit dem [var] kann ich in den speicher dieser var schreiben und so auch einzenl auslesen und m ist der "über speicher"

    Dankeschöne



  • Du mußt noch viel lernen 🙂 (vor allem über den Umgang mit Variablen und Arrays):

    Eine Variable ist ein einzeln stehender Wert, den du über seinen Namen ansprechen kannst, z.B. int x .
    Ein Array ist eine Sammlung von mehreren identisch aufgebauten Werten unter einem gemeinsamen Namen (z.B. ist m der Name für eine Gruppe von zwei structs). Um zu unterscheiden, welchen dieser Werte du ansprechen willst, verwendet man den Index-Operator - mit m[i] greifst du auf das i-te Element zu (von 0 an gezählt).
    (Zeiger sind wieder etwas anderes, sie enthalten die Adresse einer anderen Variablen. Aber sie bieten ebenfalls einen Index-Zugriff an, der davon ausgeht, daß der Zeiger nicht auf eine alleinstehende Variable verweist, sondern auf ein Element eines Arrays.)



  • Ahh ok.
    Ich habe jetzt in meinem buck etwas weiter gelesen doch nicht so ganz verstanden was der

    & operator
    

    macht.Schreibt er jetzt die adresse eines poiters wo anders rein oder den speicher oder was anders ? In meinem buch ist das ganze mit einem klassen bsp dargestellt :

    Klasse MeineKlasse;
    Klasse* meineKlassepointer = &MeineKlasse;

    ?
    Ich denke mein buch ist doch nicht so gut wie es angepriesen war , denn ich hab im internet rumgeschaut und da sah es einfacher aus.

    PS: Das buch heißt C++ echt einfach von Franzis verlag und geschrieben von oliver böhm.Eig find ich es ganz nett , doch ist es nicht sehr anfänger freundlich , meiner meinung nach



  • newbie1337 schrieb:

    Ahh ok.
    Ich habe jetzt in meinem buck etwas weiter gelesen doch nicht so ganz verstanden was der

    & operator
    

    macht.Schreibt er jetzt die adresse eines poiters wo anders rein oder den speicher oder was anders ? In meinem buch ist das ganze mit einem klassen bsp dargestellt :

    Klasse MeineKlasse;
    Klasse* meineKlassepointer = &MeineKlasse;

    Kurzfassung: Der Operator ermittelt die Adresse einer Variablen, als Umkehrung dazu gibt es auch noch den * Operator, der den Wert hinter einem Zeiger holt:

    int i = 4711;
    int* p = &i; //p bekommt die Adresse von i zugewiesen
    *p = 42;     //Dereferenzierung - greife auf den Wert zu, dessen Adresse in p steht (d.h. indirekt auf i)
    

    (außerdem gibt es noch den Typ-Modifizierer(?) & für Referenzen und den binären & Operator (bitweise UND-Verknüpfung))



  • [cpp]
    struct MenuItem
    {
    *char Caption; !!! Das wird auch ordentlich scheppern
    TEXT_ALIGN text_align;
    byte color;
    };
    [/cpp]

    Sich nur den Zeiger auf einen string zu merken wird mit Sicherheit auch zu Problemen führen, wenn die Lebenszeit des zugewiesenen Strings abläuft, denn dann hast du einen Zeiger auf einen nicht mehr existierenden String -> Rumms!
    Am besten ersetzt du char* Caption durch std::string Caption .



  • Sich nur den Zeiger auf einen string zu merken wird mit Sicherheit auch zu Problemen führen, wenn die Lebenszeit des zugewiesenen Strings abläuft, denn dann hast du einen Zeiger auf einen nicht mehr existierenden String -> Rumms!
    Am besten ersetzt du char* Caption durch std::string Caption.

    Er weist direkt ein zur Compilezeit bekanntes Stringliteral zu, da wird nichts scheppern und er darf sich gerne den Umweg über den Heap sparen. 😉



  • Sich nur den Zeiger auf einen string zu merken wird mit Sicherheit auch zu Problemen führen, wenn die Lebenszeit des zugewiesenen Strings abläuft, denn dann hast du einen Zeiger auf einen nicht mehr

    Auch wenn das , wie die anderen sagen nicht stimmt (ich wieß es nicht) würde ich gerne wissen was man damit meint.Wann genau läuft die "Lebenszeit" ab und auch wie ?



  • newbie1337 schrieb:

    Wann genau läuft die "Lebenszeit" ab und auch wie ?

    // Automatisch (char-Array): Bis ans Ende der Funktion
    char array[] = "text";
    
    // Dynamisch: Bis zur expliziten Freigabe
    char* ptr = new char[5];
    std::strcpy(ptr, "text");
    delete[] ptr;
    
    // Statisch (Zeiger auf Stringliteral): Bis Programmende
    const char* ptr = "text";
    
    // Automatisch (std::string): Bis ans Ende der Funktion,
    // kann aber kopiert werden; Text bleibt somit gültig
    std::string str = "text";
    

    Nehmt statt der char -Array-Frickelei einfach std::string , es sei denn ihr habt einen guten Grund es nicht zu tun. Besser als "ich habe gehört std::string sei langsam"...



  • Ethon schrieb:

    Sich nur den Zeiger auf einen string zu merken wird mit Sicherheit auch zu Problemen führen, wenn die Lebenszeit des zugewiesenen Strings abläuft, denn dann hast du einen Zeiger auf einen nicht mehr existierenden String -> Rumms!
    Am besten ersetzt du char* Caption durch std::string Caption.

    Er weist direkt ein zur Compilezeit bekanntes Stringliteral zu, da wird nichts scheppern und er darf sich gerne den Umweg über den Heap sparen. 😉

    Das meinst du jetzt nicht ernst, oder? 😮



  • DocShoe schrieb:

    Ethon schrieb:

    Sich nur den Zeiger auf einen string zu merken wird mit Sicherheit auch zu Problemen führen, wenn die Lebenszeit des zugewiesenen Strings abläuft, denn dann hast du einen Zeiger auf einen nicht mehr existierenden String -> Rumms!
    Am besten ersetzt du char* Caption durch std::string Caption.

    Er weist direkt ein zur Compilezeit bekanntes Stringliteral zu, da wird nichts scheppern und er darf sich gerne den Umweg über den Heap sparen. 😉

    Das meinst du jetzt nicht ernst, oder? 😮

    Doch.

    Schau mal seinen Code an:

    m[1].Caption="Test";
    

    "Test" sitzt in .rdata und bleibt da auch bis zum Programmende, also passt das so.



  • Das war mir schon klar, das das in diesem Fall so ist. Aber eine Klasse undokumentiert so einzuschränken ist grob fahrlässig und ohne triftige Gründe wohl nicht zu rechtfertigen. Daher erstaunt mich dein Einwand etwas.



  • Vor allem sollte man, sofern man diese Einschränkung für gerechtfertigt hält, const char* statt char* nehmen.



  • Auch wenn ich eure Konversation nicht stören möchte , würde ich nun gerne wissen was nun was sein soll und bo nun string oder char oder const char einzusetzen sind



  • Normalerweise und speziell für dynamische Zeichenketten nimmst du std::string . Für Stringliterale kannst du auch const char* nehmen.

    Zu char* mit manueller Speicherverwaltung besteht in C++ unter normalen Umständen kein Anlass.



  • Also so wie es aussieht in dem fall ist eine Zeichenkette angebracht.



  • newbie1337 schrieb:

    Also so wie es aussieht in dem fall ist eine Zeichenkette angebracht.

    Eine weise Erkenntnis, doch was für eine Zeichenkette?



  • string ?



  • string!


Anmelden zum Antworten