Problema con questo programma[C]

fk16
Ragazzi ho un problema col seguente programma:
/*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
fk16
Nessuno mi sa rispondere???

apatriarca
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.

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

apatriarca
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).

fk16
Scusa l'ignoranza, ma non capisco cosa vuoi dire

apatriarca
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:
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).

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.