You are not logged in.

  • Login

Dear visitor, welcome to Coder Forum. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

1

Saturday, November 26th 2011, 5:04pm

Problem bei Initialisierung von einer Struktur in einer Klasse

Folgendes Problem:

Ich hab ein Struct:

Source code

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

}[3];


und möchte das in einer Klasse initialisieren

Source code

1
2
3
4
5
6
7
8
C_Cinema::C_Cinema(void)
{
   Movie* Film;

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

}


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.

2

Sunday, November 27th 2011, 12:49pm

Sollte es nicht so heißen:
[cpp]Movie *Film;
Film[0]->m_MovieName="FilmXYZ";
Film[0]->m_Seats=100;[/cpp]

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...

MfG
Check

3

Sunday, November 27th 2011, 1:12pm

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.

Source code

1
2
3
4
5
6
7
8
9
10
	Movie* Film;

	*Film[0].m_MovieName=*"Film1";
	Film[0].m_Seats=100;
	Film[0].m_StartTime[0].m_Hour=15;
	Film[0].m_StartTime[0].m_Minute=0;
	Film[0].m_StartTime[1].m_Hour=18;
	Film[0].m_StartTime[1].m_Minute=30;
	Film[0].m_StartTime[2].m_Hour=22;
	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.

4

Sunday, November 27th 2011, 4:39pm

Langsam!

C/C++ 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:

Quoted


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:

C/C++ Quellcode

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


Mfg Rushh0ur

5

Sunday, November 27th 2011, 5:31pm

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.

Social bookmarks