Hallo Besucher, der Thread wurde 3,1k mal aufgerufen und enthält 13 Antworten

letzter Beitrag von ogd am

Initialisieren von structures in C Frage

  • Ich habe einmal gelesen, dass die Deklaration und das Initialisieren von structures in C an die Deklaration und das Initialisieren von Variablen angelehnt sei.


    In C deklariere und intialisiere ich Variablen wie folgt


    int i;
    i = 5:


    Uebertrage ich das jetzt auf structures, dann muesste das folgende erlaubt sein:


    struct { int x; int y; } point;
    point = { 3 , 5 };


    Das quittiert mein Compiler allerdings mit einer Fehlermeldung in der zweiten Zeile.


    Ist das Initialisieren von structures also doch nicht so an das Initialisieren von Variablen angelehnt?

  • Ist das eine Frage oder eine Feststellung?


    <MOD>Du hast auf eine unfertige Thread-Dublette geantwortet. Habe Deinen Beitrag hierher verschoben, wo das OP vollständig ist und den anderen Thread gelöscht.

    Hier könnte ihre Signatur stehen!

    Einmal editiert, zuletzt von syshack () aus folgendem Grund: Du hast auf eine unfertige Thread-Dublette geantwortet. Habe Deinen Beitrag hierher verschoben, wo das OP vollständig ist und den anderen Thread gelöscht.

  • In C deklariere und intialisiere ich Variablen wie folgt


    int i;
    i = 5:

    Nein.


    Was Du in der zweiten Zeile schreibst, ist bereits die erste Zuweisung zu i in einem Block, keine Initialisierung (ich nehme hier mal ein, daß Du den Ausdruck "i=5" mit einem Semikolon zu einer Anweisung abschließen wolltest und es sich bei dem Doppelpunkt nur um einen Schreibfehler handelt...).


    Eine Initialisierung hast Du dann, wenn Du im Deklarationsteil des Blocks "int i=5;" schreibt. So klappt das dann auch mit structs:


    struct {int x; int y;} point = {3,5};


    im Deklarationsteil eines Blocks funktioniert so wie geschrieben, selbst mit C90.


    Mit unions ist das in den älteren Standards zumindest noch etwas umständlicher, hier wird verlangt, daß der zur Initialisierung verwendete Datentyp zur ersten Alternative kompatibel sein muß.


    Ab C99 kommen dann 'compound literals' und 'designated initializers' dazu - damit ist es dann kein Problem mehr, eben so ein compound literal einer struct - nach derer Deklaration! - zuzuweisen. Insofern ist die Frage von daybyter berechtigt, welchen Compiler Du einsetzt: der kann eben anscheinend "nur" C90.


    Selbst mit C90 kann man sich aber recht gut mit struct-konstruierenden Funktionen behelfen. Wenn Du dein C-Programm wie folgt aufbaust:

    Code
    1. struct point_type { int x; int y; };
    2. struct point_type make_point(int x, int y)
    3. {
    4. struct point_type result;
    5. result.x=x;
    6. result.y=y;
    7. return(result);
    8. }

    und schreibst dann dahinter in einem Block:

    Code
    1. struct point_type point;
    2. point=make_point(3,5);

    dann geht das auch mit C90. Dies Beispiel steht etwa so auch im K&R drin. ;)

  • Also ich initialisiere entweder so

    Code
    1. typedef struct { int x; int y; } Point;
    2. Point point = { 3 , 5 };

    oder so

    Code
    1. struct { int x; int y; } point = { 3 , 5 };


    Ich hatte bisher keine Compiler, der das nicht hinbekommen hat.

  • der kann eben anscheinend "nur" C90.

    Nicht unbedingt. Eine korrekte Zuweisung in C99 würde beim Code des TE so aussehen:


    Code
    1. struct { int x; int y; } point;
    2. point = (struct point) { 3 , 5 };

    Ohne explizite Angabe das Typs ist es kein gültiges compound literal (wäre aber in einer tatsächlichen Initialisierung natürlich ein gültiger initializer).

  • Mein Compiler ist ein MS-DOS Turbo C Compiler.

    Du liebe Zeit ... je nachdem welche Version kann das Ding noch nicht einmal C89/C90. Ich glaube Turbo-C 2 hat da irgendeinen Draft implementiert :o (Damit kannst du jedenfalls ganz sicher keine struct zuweisen -- initialisieren geht allerdings)


    Nunja, wenn man tatsächlich MS-DOS Programme schreiben will ist die Auswahl an Compilern leider gering. Wenn allerdings Code für 386 aufwärts und protected mode akzeptabel ist, gibt's den gcc in DJGPP -- wäre dann doch sehr zu empfehlen, um was die Sprache C angeht mal in der heutigen Zeit anzukommen ;)

  • Der Nachfolger Borland C++ konnte ja C++

    Also ob "Borland" oder "Turbo" war AFAIK einfach ne Frage welche Edition (quasio "professional" vs. "standard"). Ja, irgendwann hieß das Ding C++ statt C und konnte ab da beide Sprachen, macht es allerdings leider eher schlimmer. Es gibt definitiv keine Version, die irgendeinem C++-Standard entspricht (der erste erschien auch erst 1998) -- da ist es dann auch eher ein Ratespiel, was geht und wenn ja mit welcher Syntax.


    Also ähm *hüstel*, Der "djgpp-gcc" enthält natürlich auch einen C++ Compiler :)


    (und nur für den Fall, dass es gar nicht explizit darum geht, Software für MS-DOS zu bauen: Also für aktuelle Betriebssysteme gibt es gleich zwei sehr gute und standardkonforme Compiler, gcc und clang, für sowohl C als auch C++ -- und eine ganze Auswahl freier IDEs, die durchaus brauchbar sind, falls man auf so etwas Wert legt)


    tl;dr -- anhand der Fehlermeldungen eines antiqierten Compilers der keinem Standard entspricht etwas über die Regeln der Sprache lernen zu wollen ergibt wenig Sinn, gönn dir einen vernünftigen Compiler ;)

  • Ich war damals Abonnent der Borland Compiler und bekam auch jedesmal den ganzen Schuber mit Handbüchern mit. Da waren in den ersten Jahren von Borland C++ auch immer sehr gute Bücher mit C++ Tutorials dabei. Musste dann später leider bei einem Umzug mal ein Auto voll Borland Bücher zum Altpapier fahren mangels Platz. ;(
    Aber wenn der Threadstarter die noch irgendwo sieht: empfehlenswert!

  • Ich war damals Abonnent der Borland Compiler und bekam auch jedesmal den ganzen Schuber mit Handbüchern mit. Da waren in den ersten Jahren von Borland C++ auch immer sehr gute Bücher mit C++ Tutorials dabei. Musste dann später leider bei einem Umzug mal ein Auto voll Borland Bücher zum Altpapier fahren mangels Platz. ;(
    Aber wenn der Threadstarter die noch irgendwo sieht: empfehlenswert!


    Habe noch zwei Sätze von jeweils etwa ein dutzend Büchern hier (Borland C++ 3.0 & 3.1). Also, falls jemand Interesse hat :)