Allocazione dinamicadi una matrice

di il
7 risposte

Allocazione dinamicadi una matrice

Salve a tutti gente devo fare un programma che mi allochi dinamicamente una matrice letta da file in cui le dimensioni sono specificate sulla prime riga del file una volta allocata e acquisita(nel codice grazie alle funzione malloc2dr e acquisisci_matrice),fin qui tutto ok il problema sorge quando devo allocare altre due matrici che conterranno le diagonali e le antidiagonali della matrice precedentemente acquisita per calcolare quanto spazio mi servira utilizzo la funzione alloca matrice diag che con due for scorre la prima riga (da destra sinistra) e la prima colonna(dll'alto in basso) e ad ogni passo scende lungo la diagonale aggiornando un contatore che sarà poi la dimensione del mio vettore dinamico contenente la diagonale i-esima dopo di che con lo stesso for che scorre la cornice acquisisco le diagonali e le antidiagonali e le metto nelle matrici recedentemente allocato, per la diagonale superiore della matrice non ho problemi viene allocata e acquisita perfettamente, il problema sorge quando deve acquisire le diagonali inferiori li il programma si arresta e crasha, credo che l'errore sia nel for che scorre la prima colonna dall'alto in basso ma non riesco proprio a capire, so che è un pò lungo ma e 3 giorni che mi scervello senza arrivare a capire l'errore credo mi sfugga qualcosa nell'allocazione dinamica della memoria, in allegato metto il testo dell'esercizio, è il numero 2, (in realtà ho problemi pure con il numero 1 ma quello è decisamente piu lungo mi farò aiutare da una persona reale =D) grazie a chiunque voglia mettersi a provare dato che è un po lunghetto!
#include <stdio.h>
#include <stdlib.h>

int **malloc2dr(int righe,int colonne);
void acquisisci_matrice(int **matrix,int max_r,int max_c,FILE*fp);
int** alloca_matrice_diag(int max_r,int max_c);
void acquisisci_diag(int*** diagonali,int max_r,int max_c,int**matrix);

int main()
{
    int **matrix,**diagonali,**anti_diag;
    int max_r, max_c;
    FILE*fp;
    //Apertura file e controllo
    fp=fopen("matrice.txt","r");
    if (fp==NULL){
        printf("ERRORE: FILE NON TROVATO\n");
        return 0;
    }
    //fine
    //Acusizione lunghezza righe e colonne
    fscanf(fp,"%d %d",&max_r,&max_c);
    //fine
    matrix=malloc2dr(max_r,max_c);//allocazione dinamica
    acquisisci_matrice(matrix,max_r,max_c,fp);
    fclose(fp);
   //allocazione della matrice contenente le diagonali o antidiagonali (stessa dimensione)
    diagonali=alloca_matrice_diag(max_r,max_c);
    anti_diag=alloca_matrice_diag(max_r,max_c);
    //acquisizone diagonali nella matrice dinamica appena allocata
    printf("indirizzo della matrice:%p \n",&diagonali);
    system("pause");
    printf("indirizzo di cio a cui punta la diag:%p \n",diagonali);
    system("pause");
    acquisisci_diag(&diagonali,max_r,max_c,matrix);//per modificare la matrice diagonali devo passargli un puntatore alla matrice quindi 3 ***






    return 0;
}

int **malloc2dr(int max_r,int max_c)//Sovradimensionamento del nome del file
{
    int i;
    int **matrix;

    //allocazione dinamica del vettore di puntatori a interi
    matrix=(int**)malloc(max_r*sizeof *matrix);
    //allocazione dinamica del vettore di interi
    for(i=0;i<max_r;i++){
        *(matrix+i)=(int*)malloc(max_c*sizeof(int));
    }
    //fine
    return matrix;
}

void acquisisci_matrice(int **matrix,int max_r,int max_c,FILE*fp)
{
    int i,j;
    for(i=0;i<max_r;i++){
        for(j=0;j<max_c;j++){
            fscanf(fp,"%d",&matrix[i][j]);
            printf("%d ",matrix[i][j]);//debug
        }
         printf("\n");//debug
    }
}

int** alloca_matrice_diag(int max_r,int max_c)
{
    int **diagonali=NULL;
    int i,j,k,peso=0;
     //generazione delle matrici dinamiche delle diagonali e anti diagonali
    diagonali=malloc2dr((max_c+max_r)-1,0);//in questo caso sfrutto la mia malloc consecondo parametro pari a 0 per allocare solo la memoria che mi serve per un vettore di puntatori soltanto
    for(k=max_c-1;k>=0;k--){
        peso=0;
        for(i=0,j=k;i<max_r && j<max_c;i++,j++){
            peso++;
        }
        diagonali[max_c-(k+1)]=(int*)malloc(peso*sizeof(int));
    }
    for(k+=2;k<max_r;k++){
        peso=0;
        for(i=k,j=0;i<max_r && j<max_c;i++,j++){
            peso++;
        }
        diagonali[k+2]=(int*)malloc(peso*sizeof(int));
    }

    return diagonali;

}

void acquisisci_diag(int*** diagonali,int max_r,int max_c,int** matrice)
{
    printf("indirizzo dell matrice: %p \n",diagonali);
    system("pause");
    printf("indirizzo di cio a cui punta diag[0]: %p \n",*diagonali);
    system("pause");
    int i,j,k,peso=0;
    for(k=max_c-1;k>=0;k--){
        peso=0;
        for(i=0,j=k;i<max_r && j<max_c;i++,j++){
            *diagonali[max_c-(k+1)][peso]=matrice[i][j];
            printf("%d ",*diagonali[max_c-(k+1)][peso]);
            peso++;

        }
        printf("\n");

    }
    for(k=1;k<max_r;k++){//questa parte della matrice cioè le diagonali inferiori creano problemi forse è stato allocato male
        peso=0;
        for(i=k,j=0;i<max_r && j<max_c;i++,j++){
            *diagonali[k+2][peso]=matrice[i][j];
            printf("%d ",*diagonali[max_c-(k+1)][peso]);
            peso++;

        }
         printf("\n");

    }

}

Allegati:
Questo è il testo dell'esercizio il numero 2
Questo è il testo dell'esercizio il numero 2

7 Risposte

  • Re: Allocazione dinamicadi una matrice

    Prima di controllare il codice, mi sfugge il motivo per cui allochi una matrice per la diagonale e per l'antidiagonale.

    Per una matrice del tipo

    1 2
    3 4

    ad esempio, cosa allochi per le diagonali?
  • Re: Allocazione dinamicadi una matrice

    Una matrice dinamica tipo
    per le diagonali
    2
    1 4
    3
    per le antidigaonali
    1
    2 3
    4

    la dimensione viene messa nella variabile peso che poi mi servira per allocare dinamicamente ogni riga e viene calcolata dalla funzione alloca diagonale

    credo che l'errore sia nel secondo for con cui mi calcolo il peso e alloco le righe
  • Re: Allocazione dinamicadi una matrice

    Scusa ... ma che matrice è questa

    2
    1 4
    3

    ?
  • Re: Allocazione dinamicadi una matrice

    Che vuol dire che matrice è? E' la matrice che contiene tutte le diagonali principale della matrice di partenza partendo da quella in alto a destra in allegato ho messo un pdf in cui è illustrato er bene cosa chiede l'esercizio
  • Re: Allocazione dinamicadi una matrice

    BlackSheep ha scritto:


    Che vuol dire che matrice è?
    Infatti, NON è una matrice (e non chiamarla così) ma un vettore di vettori di varia lunghezza allocati dinamicamente. È tutt'altra storia e solo leggendo il pdf si comincia a capire.

    Darò un'occhiata al codice quando avrò un po' di tempo...
  • Re: Allocazione dinamicadi una matrice

    Ciao, mi sembra di aver capito che tu sia uno studente del poli e che la materia in questione sia APA. Vorrei consigliarti di rivolgerti ai collaboratori, presenti in ogni laboratorio, che riusciranno a risolvere meglio il tuo problema poiché puoi parlare con loro di persona.
    PS : sono disponibili anche se li contatti via email !!!!!
  • Re: Allocazione dinamicadi una matrice

    Queste righe
    
    diagonali=alloca_matrice_diag(max_r,max_c);
    anti_diag=alloca_matrice_diag(max_r,max_c);
    
    non sono corrette. Come ti dicevo prima, non devi allocare delle matrici per diagonali e antidiagonali, l'esercizio lo dice chiaramente.

    Devi allocare un vettore di puntatori ad interi (usando un doppio puntatore).
    E ogni elemento del vettore deve puntare ad un vettore di dimensioni variabili da allocare singolarmente.
Devi accedere o registrarti per scrivere nel forum
7 risposte