[C]Problemi con struct e funzioni
Sto scrivendo alcuni programmi per la mia tesi, ma sono un po' arrugginito in C. Ho il seguente codice (vedete di non ridere troppo
):
La funzione "input" è la seguente:
Ho intenzione di usare questo struct per tenere memoria, oltre la matrice, anche il numero di righe e colonne, che mi servono per l'algoritmo vero e proprio. Il GCC mi dà i seguenti warning ed errori:
Preciso che il file "main.c" contiene il main (
), mentre il file "algebra_lineare.h" contiene la procedura "input". Qualche suggerimento?

#include <stdio.h> #include "algebra_lineare.h" struct matrix{ float **m; int righe; int colonne; }; int main(){ struct matrix n; n=input(); return 0; }
La funzione "input" è la seguente:
struct matrix input(){ int n,m,i,j; float **aux; struct matrix temp; printf("Dammi il numero di righe: "); scanf("%d",&n); printf("Dammi il numero di colonne: "); scanf("%d",&m); if(m<=0||n<=0){ printf("Errore!"); aux=NULL; } else{ aux=(float**)malloc(n*sizeof(float*)); for(i=0;i<n;i++){ aux[i]=(float*)malloc(m*sizeof(float)); } for(i=0;i<n;i++){ for(j=0;j<m;j++){ printf("Dammi la posizione %d %d",i+1,j+1); scanf("%f",&aux[i][j]); } } } // chiude l'else temp.m=aux; temp.righe=n; temp.colonne=m; return temp; }
Ho intenzione di usare questo struct per tenere memoria, oltre la matrice, anche il numero di righe e colonne, che mi servono per l'algoritmo vero e proprio. Il GCC mi dà i seguenti warning ed errori:
In file included from main.c:3: algebra_lineare.h:1: error: return type is an incomplete type algebra_lineare.h: In function ‘input’: algebra_lineare.h:4: error: storage size of ‘temp’ isn’t known algebra_lineare.h:28: warning: ‘return’ with a value, in function returning void main.c: In function ‘main’: main.c:12: error: void value not ignored as it ought to be main.c:13: error: void value not ignored as it ought to be
Preciso che il file "main.c" contiene il main (

Risposte
prova a mettere al posto di struct matrix input() un matrix input() e basta e vedere come evolve.
Ho provato a effettuare la modifica da te suggerita, ma non funziona. Ecco cosa mi restituisce il GCC:
main.c: In function ‘main’: main.c:12: error: incompatible types in assignment main.c:13: error: incompatible types in assignment main.c: At top level: main.c:16: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘input’
La struttura matrix l'hai definita solo nel main? L'errore "return type is an incomplete type" significa che il compilatore non sa come è fatta la struttura, cioè la sua definizione non è visibile in quella unità di compilazione. Dovresti quindi inserire la definizione di matrix in un header che includi sia nel main che nel file in cui ha implementato input.
mmm...definisci, per completezza, anche la funzione prima di implementarla se gia non l'hai fatto..
Ho letto il codice della funzione input e avrei un commento. Visto che nel tuo codice la lunghezza di ogni riga è la stessa, non ha molto senso definire la matrice in quel modo. Ti complichi solo enormemente la vita sia nella funzione input in cui hai allocato la matrice, sia dopo quando la dovrai deallocare. Normalmente si alloca un singolo blocco di memoria di dimensione mxn e si accede agli elementi nel modo seguente matrix.m[i*matrix.colonne + j]. Lo so che sembra un po' scomodo ma puoi sempre scrivere una funzione inline per poter accedere agli elementi.
Grazie a tutti per le risposte.
Ho risolto includendo un opportuno header, come suggerito da apatriarca.
@apatriarca
Non ho capito il tuo modo per allocare dinamicamente una matrice. Potresti rispiegarmelo in altri termini?
Ho risolto includendo un opportuno header, come suggerito da apatriarca.
@apatriarca
Non ho capito il tuo modo per allocare dinamicamente una matrice. Potresti rispiegarmelo in altri termini?
