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: