Zugriff auf Struktur



  • Hallo,

    Also mein Programm hat prinzipiell folgenden Aufbau:

    typedef struct
    {
        int a;
    } STRUKTUR;
    
    int FunktionA()
    {
        static STRUKTUR* Struktur = NULL;
        FunktionB(Struktur);
        printf("%i", Struktur.a); /*Stürzt ab (Struktur ist hier wieder NULL)*/
    }
    int FunktionB(STRUKTUR* Struktur)
    {
        int i;
        i = 5;
        Struktur = realloc(Struktur, sizeof(STRUKTUR)*i);
        FunktionC(&Struktur[0]);
        printf("%i", Struktur[0].a); /*geht*/
        /*returnwert ist die anzahl der gelesenen Datensätze*/
    }
    
    int FunktionC(STRUKTUR* Struktur)
    {
        FILE* File;
        fscanf(File, "%i", &Struktur->a);
    }
    

    Wie oben zu sehen lege ich in FunktionA einen Pointer auf eine Struktur an und initialisiere diesen mit NULL, nun leider ist der Pointer wieder NULL nachdem FunktionB fertig ist, dementsprechend stürzt das Programm beim weiteren Zugriff in FunktionA ab, könnt ihr mir da vllt. Hilfe oder ANregeungen geben wie ich das besser lösen könnte, oder diesen Fehler ausmerzen kann?
    Was ich auch nicht ganz verstehe ist warum ich in FunktionA mit

    Struktur.a
    

    auf die Variable zugreifen muss, ich habe ja einen Pointer angelegt.

    Danke & MfG gosha16



  • ^^um einen * zu verändern, musst du ** übergeben.
    oder du nimmst stattdessen rückgabewerte.
    🙂



  • Nun, die Strukturen als Rückgabewerte würde ich gern vermeiden.
    Und wenn ich ** übergebe stürzt das Programm bei realloc ab.



  • Der Rückgabewert wäre ja nicht die Struktur, sondern nur die Adressse bzw. der Zeiger.

    Übergieb den Zeiger doch als Referenz, dann kannst Du in der Funktion direkt drauf zugreifen und brauchst keine Rückgabe.



  • gosha16 schrieb:

    Und wenn ich ** übergebe stürzt das Programm bei realloc ab.

    du must nur genügend *, **, -> und & verwenden:

    void FunktionB(STRUKTUR** Struktur)
    {
      *Struktur = realloc(*Struktur, sizeof(**Struktur));
      (*Struktur)->a = 123;
    }
    
    void FunktionA()
    {
        static STRUKTUR* Struktur = NULL;
        FunktionB (&Struktur);
        printf("%i", Struktur->a); 
    }
    

    Elektronix schrieb:

    Übergieb den Zeiger doch als Referenz, dann kannst Du in der Funktion direkt drauf zugreifen und brauchst keine Rückgabe.

    das schrieb ich bereits
    🙂



  • fricky schrieb:

    Elektronix schrieb:

    Übergieb den Zeiger doch als Referenz, dann kannst Du in der Funktion direkt drauf zugreifen und brauchst keine Rückgabe.

    das schrieb ich bereits
    🙂

    Hab ich mißverstanden, ich dachte, das soll Zeiger auf Zeiger heißen.



  • Elektronix schrieb:

    ich dachte, das soll Zeiger auf Zeiger heißen.

    sollte es auch.
    🙂



  • Zeiger auf Zeiger ist aber keine Referenz, auch, wenn es im Ergebnis ähnlich funktioniert. 😉



  • Die Referenzen, die du meinst, gibt's aber in ANSI C nicht.



  • Mist 😮 , ich hab mich schon gefreut, daß ich auch mal mitreden kann. 😞
    Na schön, wieder was dazugelernt. 😃



  • Erstmal danke für die Antworten, ich denke wir sind auf der richtigen Spur. 🙂
    Also ich hab mal der übersicht wegen ein kleines Programm zum testen gebaut.

    #include <stdio.h>
    typedef struct
    {
    	int a;
    }STRUKTUR;
    
    void FunktionB(STRUKTUR** Struktur, int i) 
    {
        *Struktur = realloc(*Struktur, sizeof(**Struktur)*i);
        (*Struktur[i-1]).a = 123 + i; /*Beim zweiten Aufruf stürzt er warscheinlich hier ab*/
    } 
    
    void FunktionA(int i)
    { 
        static STRUKTUR* Struktur = NULL;
        FunktionB (&Struktur, i);
        printf("%i", Struktur[i-1].a);
    }
    
    int main(void)
    {
    	FunktionA(1); /*Funktioniert*/
    	FunktionA(2); /*Stürzt ab*/
    	FunktionA(3);
    	getchar();
    	return 0;
    }
    

    Nun leider funktioniert das nicht. Beim Zweiten aufruf stürzt er immer ab 😞

    //Edit, auserdem kommt noh folgende Warnung beim Kompilieren:
    1>.\main.c(9) : warning C4047: '=': Anzahl der Dereferenzierungen bei 'STRUKTUR *' und 'int' unterschiedlich



  • gosha16 schrieb:

    Nun leider funktioniert das nicht. Beim Zweiten aufruf stürzt er immer ab 😞

    (*Struktur)[i-1].a, nicht (*Struktur[i-1]).a. [] geht vor *, das geht beim zweiten Aufruf in die Hose, weil es Struktur[1] nicht gibt.

    gosha16 schrieb:

    //Edit, auserdem kommt noh folgende Warnung beim Kompilieren:
    1>.\main.c(9) : warning C4047: '=': Anzahl der Dereferenzierungen bei 'STRUKTUR *' und 'int' unterschiedlich

    #include <stdlib.h>



  • Ahhh, danke! Du bist mein Held des Tages! 😃


Anmelden zum Antworten