Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Struct Initialisieren - wie geht es "schöner"?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
11.05.2008, 23:34 Uhr
Int Main()



Hallo,

ich müsste einen struct initialisieren. Ich finde allerdings, dass meine Vorgehensweise irgendwie umständlich aussieht.
Geht das Ganze vielleicht auch einfacher, schneller, schöner? Es sollen nur alle Werte von Test1, Test2 usw. mit 0 initialisiert werden.


C++:
int main()
{

    enum Faecher{Deutsch, Mathe, Chemie, Geographie};
    
    unsigned int Leistung[4][5];

    struct Note{unsigned int Test1, Test2, Test3, Test4, Test5;};

    Note TestErgebnis[4];

    Note EinErgebnis = {0, 0, 0, 0, 0};
    unsigned int i;

    for (i=0;i<4;i=i+1)
    {
    TestErgebnis[i] = EinErgebnis;
    }
// restlicher Code
}



Vielen Dank für die Tipps.

mfg

int Main()

Dieser Post wurde am 11.05.2008 um 23:35 Uhr von Int Main() editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.05.2008, 01:20 Uhr
Hans
Library Walker
(Operator)


Hi,

Zitat von Int Main():
ich müsste einen struct initialisieren. Ich finde allerdings, dass meine Vorgehensweise irgendwie umständlich aussieht.

naja, umständlich sieht sie eigentlich nicht aus, aber sie ist falsch. Es würde mich jedenfalls sehr wundern, wenn das von irgend einem Compiler übersetzt wird. Am besten wirfst Du mal ein paar intensive Blicke auf die entsprechenden Kapitel in Deinem Buch oder Skript. Oder auch hier: Initialisierung und Zugriff auf Strukturen.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.05.2008, 10:02 Uhr
0xdeadbeef
Gott
(Operator)


Das kann man schon so machen, und in C ist das auch ziemlich üblich. Naja - zumindest in altem C-Code, inzwischen gibt es da eine schönere Syntax für. In C++ - wenn die Struktur immer gleich initialisiert werden soll, bietet sich ein Konstruktor an, also

C++:
struct Note {
  Note() : test1(0), test2(0), test3(0), test4(0), test5(0) { }

  unsigned int test1, test2, test3, test4, test5;
};

int main() {
  Note n;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
12.05.2008, 10:58 Uhr
Int Main()



Danke für die Antworten.

@Hans
Visual C++ 2008 übersetzt das Ganze problemlos und es funktioniert auch.

@0xdeadbeaf
Das sieht viel elganter aus. Genau soetwas habe ich gesucht.
Gehe ich richtig davon aus, dass die Werte in den runden Klammern hinter den Variablen den Variablen zugewiesen werden?

mfg

int Main()

Dieser Post wurde am 12.05.2008 um 10:59 Uhr von Int Main() editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
12.05.2008, 13:59 Uhr
Int Main()



Nohcmal zum Thema struct.
Der folgende Code definiert einen Struct für eine Schulklass.

Die Defnition klappt auch soweit.

Mit
C++:
Eine_Klasse.Ein_Schueler[0].Fach[0].Test[0] = 1;


kann ich auch einen einzelnen Wert zuweisen.

Nach längerem Probieren und studieren kam ich auf folgende Lösung.
Mit der Testausgabe erhalte ich auch immer 0. Allerdings würde mich interessieren, ob der von mir gewählte Ansatz tatsächlich richtig ist, um aller Werte für alle Tests aller Schueler in allen Fächern mit 0 zu initialisieren.

mfg

int Main()


C++:

int main()
{

    enum Faecher{Deutsch, Mathe, Chemie, Geographie};
    enum TestNr{Test1, Test2, Test3, Test4, Test5};
    enum Die_Schueler{Gerhardt, Schroeder, Horst, Koehler};



    struct Ergebnisse{unsigned int Test[5];} Fach[] = {0, 0, 0, 0, 0};
    struct Schueler{Ergebnisse Fach[4];} Ein_Schueler[] = {Fach[0]};
    struct Klasse{Schueler Ein_Schueler[4];} Eine_Klasse = {Ein_Schueler[0]};


    cout << Eine_Klasse.Ein_Schueler[4].Fach[3].Test[0]; // Testweise Ausgabe
    cin.get();





return 0;
}



return 0;
}


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
12.05.2008, 14:25 Uhr
0xdeadbeef
Gott
(Operator)


Das hier:

C++:
struct Ergebnisse{unsigned int Test[5];} Fach[] = {0, 0, 0, 0, 0};


...und die gleichgeformten Dinge darunter sind ausgemachter Unfug. Du definierst hier ein Array von Structs, nicht ein einfaches struct, und das struct enthält ein Array, nicht Zahlen. Das müsste hier folgendermaßen aussehen:

C++:
struct Ergebnisse { unsigned Test[5]; } Fach[]
  = { // Array
        { // struct
           { // inneres Array
              0, 0, 0, 0, 0 // Werte
           }
        }
    };


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
13.05.2008, 00:08 Uhr
Hans
Library Walker
(Operator)



Zitat von 0xdeadbeef:
Das kann man schon so machen, und in C ist das auch ziemlich üblich. Naja - zumindest in altem C-Code,

Echt?! - In meinen Büchern hab ich solche Konstruktionen noch nicht gesehen. - Und das einzige Buch, wo sie möglicherweise drin zu finden wären (C - Tools vom Dr. Dobb's Journal von 1985, ISBN: 3890901905) ist mir verloren gegangen.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
13.05.2008, 14:32 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


tzetze hört sich nach einer schlecht gepflegten Bibliothek an

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
14.05.2008, 21:17 Uhr
Int Main()



@0xdeadbeef

Ich habe deinen Vorschlag einmal umgesetzt, und er funktionierte recht gut.
Nun ist es aber etwas komplexer geworden und ich komme nicht weiter.


C++:
struct Ein_Fach{char Bezeichnung[15]; unsigned int Note[5];};
struct Ein_Schueler{char Name[30]; Ein_Fach Fach[4];};
Ein_Schueler Schueler;
Schueler ={"Paul", {"Englisch",{1,2,3,4,5},"Deutsch",{6,7,8,9,0},"Mathematik",{0,0,0,0,0},"Geographie",{0,0,0,0,0}}};




bekomme ich jede Menge Fehlermeldungen, dass Klammern und Semikolons fehlen.

Für



C++:
struct Ein_Fach{char Bezeichnung[15]; unsigned int Note[5];};
struct Ein_Schueler{char Name[30]; Ein_Fach Fach[4];};
Ein_Schueler Schueler ={"Paul", {"Englisch",{1,2,3,4,5},"Deutsch",{6,7,8,9,0},"Mathematik",{0,0,0,0,0},"Geographie",{0,0,0,0,0}}};




bekomme ich nur einen Fehler: "Zu viele Initialisierungen"

Ich habe deine Methodik des Wertezuweisens eigentlich beachtet und finde nicht, was ich falsch mache.
Es gilt doch:

C++:
Schueler = {"Paul", {Array Fach[4]}};


Für Fach[4] gilt:

C++:
Fach[4] = {"Englisch",{1,2,3,4,5},"Deutsch",{6,7,8,9,0},"Mathematik",{0,0,0,0,0},"Geographie",{0,0,0,0,0}};


Aber es klappt nicht, wenn ich beide Sachen zusammenführe.

mfg

int Main()
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
14.05.2008, 22:00 Uhr
0xdeadbeef
Gott
(Operator)


Genau so wie vorher auch benötigen sowohl structs als auch arrays ihr eigenes Paar geschweifter Klammern. Also:

C++:
Ein_Schueler Schueler
  = { "Paul",
      { { "Englisch",   { 1, 2, 3, 4, 5 } },
        { "Deutsch",    { 6, 7, 8, 9, 0 } },
        { "Mathematik", { 0, 0, 0, 0, 0 } },
        { "Geographie", { 0, 0, 0, 0, 0 } }
      }
    };


Das Konzept hier ist:

C++:
int a[] = { 0, 1, 2, 3, 4 };
struct s1 { char x[15]; int a[5]; } s =   { "foo", { 0, 1, 2, 3, 4 } };
struct s2 { struct s1 x; }          t = { { "foo", { 0, 1, 2, 3, 4 } } };
struct s1 b[] = { { "foo", { 0, 1, 2, 3, 4 } },
                  { "bar", { 5, 6, 7, 8, 9 } } };


Übrigens ist diese Syntax nur bei Initialisierungen möglich, das heißt, du kannst nicht schreiben

C++:
int a[5];
a = { 0, 1, 2, 3, 4 }; // Compilerfehler


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 14.05.2008 um 22:08 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: