1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Deutsch
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

structs..

  • sommeralex
  • 22. Juli 2005 um 12:29
  • Unerledigt
  • sommeralex
    11
    sommeralex
    Mitglied
    Punkte
    1.325
    Beiträge
    188
    • 22. Juli 2005 um 12:29
    • #1

    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

  • hal
    32
    hal
    Mitglied
    Reaktionen
    52
    Punkte
    11.122
    Beiträge
    2.208
    • 22. Juli 2005 um 12:41
    • #2
    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!

  • sommeralex
    11
    sommeralex
    Mitglied
    Punkte
    1.325
    Beiträge
    188
    • 22. Juli 2005 um 12:46
    • #3

    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;
    }

  • hal
    32
    hal
    Mitglied
    Reaktionen
    52
    Punkte
    11.122
    Beiträge
    2.208
    • 22. Juli 2005 um 12:53
    • #4

    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!

  • sommeralex
    11
    sommeralex
    Mitglied
    Punkte
    1.325
    Beiträge
    188
    • 22. Juli 2005 um 12:59
    • #5

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

  • hal
    32
    hal
    Mitglied
    Reaktionen
    52
    Punkte
    11.122
    Beiträge
    2.208
    • 22. Juli 2005 um 13:01
    • #6

    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!

  • Plantschkuh!
    24
    Plantschkuh!
    Mitglied
    Reaktionen
    163
    Punkte
    6.173
    Beiträge
    1.181
    • 22. Juli 2005 um 13:15
    • #7
    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*

  • sommeralex
    11
    sommeralex
    Mitglied
    Punkte
    1.325
    Beiträge
    188
    • 22. Juli 2005 um 13:26
    • #8

    wann hab ich gecastet?!

  • sauzachn
    17
    sauzachn
    Mitglied
    Reaktionen
    51
    Punkte
    3.101
    Beiträge
    606
    • 22. Juli 2005 um 20:06
    • #9

    (struct a*)(...) ist ein Cast von void* auf struct a*.

    Dipper dipper dii dipper dii dipper dii duuu

  • Maximilian Rupp 27. Dezember 2024 um 12:06

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

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

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung

  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  • Deutsch
  • English
Zitat speichern