dereferencing pointer to incomplete type [Gelöst]



  • Hallo zusammen,
    ich bin gerade damit beschäftigt ein Pogramm für die FH zu schreiben in dem eine Struktur erstellt wird und diese dann mit einer zweidimensionale Matrix aufgebaut wird und Werte zwischen 0.0 und 1.0 in die Matrix eingelesen werden sollen. jedoch stehe ich vor dem Problem das mir mein Kompiler an der Stelle folgendes sagt "[Error] dereferencing pointer to incomplete type" laut den Vorlesungsfolien und tante google sollte die Syntax richtig sein, aber Compiler sagt nein

    struct matrix
    	{
    		double Array[5][6];
    		//double index = 0.0;
    		//int *pZeiger = NULL;
    	};
    		
    int main(int argc, char *argv[]) {
    	
    	struct matrix matrix1;
    	
    	init_rand_matrix(&matrix1);
    	
    	return 0;
    }
    
    void init_rand_matrix(struct matrix *matrix1)
    {
    	int i = 0, j = 0;
    	
    	for(i = 0; i<= 4; j++)
    	{
    		for(j = 0; j <= 5; j++)
    		{
    			matrix1 -> Array[i][j] = (double)rand()/RAND_MAX;	// Hier ist der Compiler Fehler
    		}
    	}
    	
    }
    

    Über Hilfestellungen oder Lösungsvorschläge würde ich mich sehr freuen!
    Mit freundlichen Grüßen
    Sven



  • Der Compiler bemängelt nicht die Syntax, sondern er sagt, dass er den Aufbau von matrix nicht kennt. Warum steht die Definition nicht in einem Header?



  • @SirRust Sind das zwei Dateien?
    Eine für struct matrix und main, die andere für init_rand_matrix?



  • @DirkB
    nein es handelt sich um den inhalt aus einer Datei. Es wurden (noch) keine Funktionen in andere Dateien oder Header ausgelagert.



  • Das ergibt dann

    x.c: In function ‘main’:
    x.c:12:2: warning: implicit declaration of function ‘init_rand_matrix’ [-Wimplicit-function-declaration]
    init_rand_matrix(&matrix1);
    ^~~~~~~~~~~~~~~~
    x.c: At top level:
    x.c:17:6: warning: conflicting types for ‘init_rand_matrix’
    void init_rand_matrix(struct matrix *matrix1)
    ^~~~~~~~~~~~~~~~
    x.c:12:2: note: previous implicit declaration of ‘init_rand_matrix’ was here
    init_rand_matrix(&matrix1);
    ^~~~~~~~~~~~~~~~
    x.c: In function ‘init_rand_matrix’:
    x.c:25:37: warning: implicit declaration of function ‘rand’ [-Wimplicit-function-declaration]
    matrix1 -> Array[i][j] = (double)rand()/RAND_MAX; // Hier ist der Compiler Fehler
    ^~~~
    x.c:25:44: error: ‘RAND_MAX’ undeclared (first use in this function)
    matrix1 -> Array[i][j] = (double)rand()/RAND_MAX; // Hier ist der Compiler Fehler
    ^~~~~~~~
    x.c:25:44: note: each undeclared identifier is reported only once for each function it appears in

    Der von dir genannte Fehler lommt nicht vor.



  • Der von dir genannte Fehler lommt nicht vor.

    mhhh dann muss ich wohl mal einen anderen Compiler zu rate ziehen 🤔
    Dev C++ scheint an der Stelle etwas zu versagen.



  • Die Warnungen von manni66 kannst du beheben, indem du

    • die nötigen Standardheader inkludierst
    • die Funktion main an das Ende vom Code stellst


  • Ich glaube es ist einfacher wenn ich einmal den gesamten Code zur verfügung Stelle

    #include <stdio.h>
    #include <stdlib.h>
    
    /* run this program using the console pauser or add your own getch, system("pause") or input loop */
    
    neue_matrix(int n, int m) //kann erstmal ignoriert werden
    {
    	
    }
    
    void init_rand_matrix(struct matrix *matrix1)
    {
    	int i = 0, j = 0;
    	
    	for(i = 0; i<= 4; j++)
    	{
    		for(j = 0; j <= 5; j++)
    		{
    			matrix1 -> Array[i][j] = (double)rand()/RAND_MAX;	
    		}
    	}
    	
    }
    
    void print(struct matrix *matrix1 ) // kann auch ignoriert werden
    {
    	int i = 0,j = 0; 
    	for(i = 0;i <= 4; i++)
    	{
    		for(j = 0; j <= 5; j++)
    		{
    			printf("%d", matrix1 ->Array[i][j]);
    		}
    		printf("\n");
    	}
    }
    
    struct matrix
    	{
    		double Array[5][6];
    		//double index = 0.0;
    		//int *pZeiger = NULL;
    	};
    		
    int main(int argc, char *argv[]) {
    	
    	struct matrix matrix1;
    	
    	init_rand_matrix(&matrix1);
    	
    	return 0;
    }
    


  • Entweder main nach unten oder eine Funktionsdeklaration darüber:

    void init_rand_matrix(struct matrix *matrix1);
    
    int main(int argc, char *argv[]) {
    ...
    }
    

    init_rand_matrix wird aber so nicht zurückkehren (Endlosschleife).



  • @SirRust

    Tja, jetzt steht die Definition von matrix plötzlich hinter den Funktionen. Das isr der Fehler.



  • @SirRust Wenn der Compiler init_rand_matrix compiliert, kennt er den Aufbau der struct matrix noch nicht.

    Der Compiler geht einmal durch den Code, von oben nach unten.



  • Ahhhh OK macht Sinn wenn man Struct Global nimmt 🤦🏻♂.
    Manchmal sieht man echt den Wald vor lauter Bäumen nicht.
    Vielen Dank für die Hilfe 😃



  • @SirRust
    Die Definition des struct-Typs muss global sein.

    Die Definition der struct-Variable aber nicht.