Problem bei Initialisierung von einer Struktur in einer Klasse

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Problem bei Initialisierung von einer Struktur in einer Klasse

    Folgendes Problem:

    Ich hab ein Struct:

    Quellcode

    1. struct Movie
    2. {
    3. char m_MovieName[5];
    4. int m_Seats;
    5. char m_StartTime[5];
    6. }[3];


    und möchte das in einer Klasse initialisieren

    Quellcode

    1. C_Cinema::C_Cinema(void)
    2. {
    3. Movie* Film;
    4. Film->m_MovieName[0]="Film1";
    5. Film->m_Seats[0]=100;
    6. }


    Er bringt mir folgende Fehlermeldung: Ein Typ von const char* kann keiner Enitität vom Typ char zugewiesen werden.

    Nun stellt sich mir die Frage wieso?

    Film.m_MovieName[0] =*"Film1";
    Mit einem Pointer geht es, das kommt mir aber komisch vor.

    Außerdem zickt der Compiler auch bei
    Film->m_Seats[0]=100;

    Der Ausdruck muss den Typ "pointer-to-object" aufweisen.
    "Irren ist menschlich. Aber wer richtigen Mist bauen will, braucht einen Computer."
  • Checkmateing schrieb:

    Zumal sollte "m_MovieName" doch eher ein char* sein und kein Array, es sei denn du willst mehrere Namen speichern dann wohl char*[], die Größe ist doch eigentlich variabel...
    Ups, ja hast recht.

    Ich glaub ich habs jetzt.. zumindest zeigt er mir da keine Fehler mehr an. Muss dann nur noch funktionieren

    Ich wundert trotzdem noch wozu ich bei der Initialisierung vom m_MovieName Pointer verwenden muss und bei z.b m_Seats nicht.

    Quellcode

    1. Movie* Film;
    2. *Film[0].m_MovieName=*"Film1";
    3. Film[0].m_Seats=100;
    4. Film[0].m_StartTime[0].m_Hour=15;
    5. Film[0].m_StartTime[0].m_Minute=0;
    6. Film[0].m_StartTime[1].m_Hour=18;
    7. Film[0].m_StartTime[1].m_Minute=30;
    8. Film[0].m_StartTime[2].m_Hour=22;
    9. Film[0].m_StartTime[2].m_Minute=0;


    Wenn ich die Pointer weglasse, also so:
    Film[0].m_MovieName="Film1";

    sagt er mir das Film ein änderbarer lvalue sein muss.
    Leider kann ich mit dieser Information nichts anfangen.
    "Irren ist menschlich. Aber wer richtigen Mist bauen will, braucht einen Computer."
  • Langsam!

    Quellcode

    1. char m_MovieName[5];

    <- Das ist insofern Korrekt, dass du einen Namen mit 5 Buchstaben speichern kannst , abzuglich der Nullterminierung ('\0') sind es halt vier Zeichen.

    Das die Namenlänge variable sein kann und damit auch die "Fünf" auch Variable ist ist klar, dennoch will ich vorerst nicht weiter drauf eingehen (Stichwort new/delete bzw malloc/free), da du anschweinend noch am Basics lernen bist.

    In C kannst du Arrays nicht einfach einem Anderen Array zuweißen, sondern musst die Elemente (Zeichen) nach und nach kopieren und dafür schreibst dir entweder eine Funktion oder verwendest eine fertige.
    Die Nullterminierung wurde eingeführt um zu ermitteln wann der Text zu Ende ist (Zeichen == 0).


    Mit
    *Film[0].m_MovieName=*"Film1";
    kopierst schreibst du an die erste Position von m_MovieName denersten Buchstaben 'F' und nicht mehr.

    Desweiteren auf keinen Fall so wie du es hier machst verwenden:

    Movie* Film;
    ...
    *Film[0].m_MovieName=*"Film1";
    Film[0].m_Seats=100;
    Film->m_Seats[0]=100;


    Die Pointervariable Film hat an dieser Stelle noch einen ungülltigen Wert (Stichwort new/delete etc.) und durch die folgenden Befehle stürt das Programm früher oder später ab!



    Eine richtige Möglichkeit wäre:

    Quellcode

    1. #include <string.h>
    2. ...
    3. struct Movie
    4. {
    5. char m_MovieName[5];
    6. int m_Seats;
    7. char m_StartTime[5];
    8. };
    9. ...
    10. Movie FilmListe[20] = {0}; // Max 20 Filme, alle Daten mit 0 füllen
    11. // Den Text (Array) "Film1" nach m_MovieName des ersten Filmes(0) kopieren
    12. // max. Textlaenge = 5 (da die Variable m_MovieName[5] nicht mehr speichern kann)
    13. strncpy(FilmListe[0].m_MovieName, "Film1" ,5);
    Alles anzeigen


    Mfg Rushh0ur
  • Oh das mit der Nullterminierung ist mir bewusst, jedoch hab ich das völlig vergessen mit zubeachten.

    Einem Array ein anderes Array zuweisen, dürft ja da mit strcpy gehen.

    new = legt neuen Speicherplatz innerhalb des Heaps an
    delete = löscht den angelegten Speicherplatz im Heap wieder.
    Und was man mit new anlegt sollte man auch wieder mit delete löschen.

    malloc/free tun glaub ich das selbe, doch stammen noch aus der prozeduralen Programmierung C, wenn ich nicht ganz falsch liege.
    Ich hab schon so einige Jahre damit zu tun (Ausbild, Schule) jedoch wurde da auf wichtige und grundlegende Dinge nicht eingegangen.
    Und mein Interesse in Programmierung war damals noch nicht so hoch, dass ich mir das auch nicht selber beigebracht hab.

    Das Programm was ich da schreibe, ist eine etwas ältere Aufgabe aus meinem Studium. Mein Prof hat gemeint, das sei eine gute Übungsaufgabe für mich,
    um noch mal grundlegende Dinge und Struktur in der Objektorientierung zu lernen.

    Und ich glaub ich hätte auf die Mischung von der prozuduralen und objektorientierten Programmierung verzichten sollen.
    C++ ist halt nich meine Stärke, vorallem die Thematik Pointer macht mir bei der Umsetzung immer schwer zu schaffen, im Gegensatz zur Theorie.

    Trotzdem danke ich dir für deine Hilfe.
    "Irren ist menschlich. Aber wer richtigen Mist bauen will, braucht einen Computer."