Problema con questo programma[C]
Ragazzi ho un problema col seguente programma:
Ancora non ho implementato la funzione che richiede l'esercizio perchè non appena compilo mi viene dato errore di segmentazione. Perchè???
/*Scrivere una funzione in lingaggio C che mediante l'algoritmo del bubblesort ordini la i-esima riga di una matrice di puntatori a variabili di tipo complesso. La matrice, il numero di colonne e l'indice della riga dovrannno essere passate come argomento alla funzione. L'ordinamento dovrà essere fatto in base al modulo crescente dei valori.*/ #include<stdio.h> #include<stdlib.h> #include<time.h> #define MAX 500 typedef struct complessi{ double re; double im; }Complex; Complex *mat[MAX][MAX]; void riempi(Complex *mat[MAX][MAX],int,int); void stampa(Complex *mat[MAX][MAX],int,int); void ordina(Complex *mat[MAX][MAX],int,int); int main(){ int n,m; printf("Quante righe ha la matrice?\n"); scanf("%d",&n); printf("Quante colonne ha la matrice?\n"); scanf("%d",&m); riempi(mat,n,m); stampa(mat,n,m); system("pause"); return 0; } void riempi(Complex *mat[MAX][MAX],int n, int m){ int i,j; srand(time(NULL)); for(i=0;i<n;i++){ for(j=0;j<m;j++){ mat[i][j]->re = rand()%10+1; mat[i][j]->im = rand()%10+1; }} return; } void stampa(Complex *mat[MAX][MAX], int n, int m){ int i,j; for(i=0;i<n;i++){ for(j=0;j<m;j++){ printf(" %lf + i%lf",mat[i][j]->re, mat[i][j]->im); } printf("\n"); } return; }
Ancora non ho implementato la funzione che richiede l'esercizio perchè non appena compilo mi viene dato errore di segmentazione. Perchè???
Risposte
Nessuno mi sa rispondere???
Non hai mai allocato la memoria per i numeri complessi. Hai insomma a dei puntatori (non è per niente chiaro il motivo per cui si richieda l'uso di puntatori in questo caso ma è una scelta del professore), ma questi puntatori puntano a memoria non valida.
Per allocare la matrice ho fatto questa funzione, perchè mi compila ma subito dopo va in crash???
void alloca_matrice(Complex ***m ,int r ,int c){ int i,j; *m = (Complex **) malloc ( r * sizeof(Complex *) ); for(i=0;i<r;i++){ printf("\nAllocata riga %d",i+1); *(*m+i) = (Complex *) malloc( c * sizeof(Complex) ); } return; }
Ma non devi allocare una matrice, devi allocare un numero complesso per ogni elemento della matrice in base alle richieste (oppure allocare un blocco e settare ogni puntatore in modo che allochi in una posizione specifica del blocco).
Scusa l'ignoranza, ma non capisco cosa vuoi dire
Dico che ogni elemento della matrice è un puntatore ad un numero complesso. Perché punti a qualcosa devi allocare tale numero complesso. Ma lo devi fare PER OGNI elemento della matrice. Non è affatto necessario che la matrice dei puntatori sia allocata dinamicamente anche se è ovviamente possibile. Credo che sia uno spreco di memoria e un inutile modo di complicarsi la vita, ma il professore è stato chiaro:
Devi avere una matrice con ogni elemento un puntatore ad una variabile di tipo complesso (che andrà allocata dinamicamente).
una matrice di puntatori a variabili di tipo complesso.
Devi avere una matrice con ogni elemento un puntatore ad una variabile di tipo complesso (che andrà allocata dinamicamente).