• Hallo! Könnte mir hier jemand bitte helfen? (die hilfe von hal war berechtigt, doch handelte es sich nur um einen rechtschreibfehler und hat das problem nicht behoben, da sich der rechtschreibfehler erst durch das copy&pasten in dieses forum eingeschlichen hat)

    #include <stdio.h>
    #include "extern.h"
    #include <stdlib.h>
    #include<time.h>

    typedef struct a apfel;
    typedef struct w wurm;

    struct a{

    int groesse;
    wurm wurmi[10];

    };

    struct w{

    int essgeschwindigkeit;

    };


    int main(void)
    {

    apfel meinapfel;
    meinapfel.wurmi[2].essgeschwindigkeit = 4; //- geht leider nicht, warum?
    //bzw, prinzipiell: wann muss malloc verwendet werden, und wann nicht?
    //Dabei interessiert mich folgender zusammenhang: warum kann ich auf
    //das struct objekt "wurmi" zugreifen, nachdem der zeiger "meinapfel"
    //deklariert wurde (und speicher alloziirt wurde) ABER "wurmi" selbst kein
    //"zeiger" ist. anders: müsste nicht "wurmi" auch ein pointer sein - den ich
    //vorher explizit über malloc speicher zuweise?



    return 0;
    }

    ----------------------------------
    folgendes geht nämlich:
    ----------------------------------

    #include <stdio.h>
    #include "extern.h"
    #include <stdlib.h>
    #include<time.h>
    typedef struct a apfel;
    typedef struct w wurm;
    struct a{
    int groesse;
    wurm wurmi[10];
    };
    struct w{
    int essgeschwindigkeit;
    };


    int main(void)
    {

    apfel *meinapfel;

    meinapfel = (struct a*)malloc(sizeof(apfel));
    meinapfel->wurmi[1].essgeschwindigkeit = 4;
    //meinapfel.wurmi = (struct w*) malloc(10 * sizeof(wurm));
    int x = meinapfel->wurmi[1].essgeschwindigkeit;
    printf("%d\n", x);

    return 0;
    }


    danke, lg alex

  • Zitat von sommeralex
    Code
    int main(void)
    {
     
    apfel meinapfel;
    [color=red]apfel.wurmi[2].essgeschwindigkeit = 4; //- geht leider nicht, warum?[/color]
    [color=#ff0000]bzw, prinzipiell: wann muss malloc verwendet werden, und wann nicht?[/color]
     
    return 0;
    }

    Apfel ist der typ, nicht die variable. Du musst also meinapfel.wurmi[2] schreiben.

    In der Regel musst du malloc genau dann verwenden, wenn die Variable über das Ende des Blocks hinaus bestehen bleiben soll.

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • ich hab mich natürlich verschrieben, korrektur: (habs im original auch ausgebessert)

    #include <stdio.h>
    #include "extern.h"
    #include <stdlib.h>
    #include<time.h>
    typedef struct a apfel;
    typedef struct w wurm;

    struct a{

    int groesse;
    wurm wurmi[10];
    };

    struct w{

    int essgeschwindigkeit;

    };





    int main(void)
    {

    apfel meinapfel;

    //nicht apfel.wurmi[0].essgeschwindigkeit = 4;

    meinapfel.wurmi[0].essgeschwindigkeit = 4; //compiler fehlermeldung:
    //"process returned -23239384*




    return 0;
    }

  • also wenn ich das struct w vor die typedefs schreib (und #include "extern.h" rausnehm), funktioniert das bei mir.

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • stimmt. danke. anscheinend darf ein typedef immer nur NACH einer struct deklariert werden, auf das es sich bezieht. (was ja auch logisch klingt)

  • naja, ab und zu sollte man halt doch auf die Compilerfehlermeldungen achten:

    Code
    apfel.c:10: error: array type has incomplete element type

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • Zitat von sommeralex

    meinapfel = (struct a*)malloc(sizeof(apfel));


    Jetzt (bevor du dir was unnötiges antrainierst) ist übrigens auch die richtige Zeit, dir gleich das casten abzugewöhnen. Die Funktion malloc gibt einen (void *) zurück, in C wird dieser anstandslos automatisch in alle anderen Objektpointertypen umgewandelt.
    Der einzige Grund, malloc zu casten, ist, wenn du vorhast, deinen C-Code auch irgendwann mit einem C++-Compiler zu compilieren. Was wohl nur selten der Fall ist.
    Man kann auch den sizeof-Ausdruck ändern, sodaß er unabhängig vom Typ ist: sizeof *meinapfel (d.h. die Größe des Objekts, auf das meinapfel zeigt).
    Insgesamt ergibt sich das Muster

    Code
    var = malloc(n * sizeof *var);


    für einen passenden Variablennamen und ein passendes n; das finden viele Leute elegant und hübsch und relativ robust gegenüber Fehlern.

    *plantsch*

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!