manu1294 (Normal User)
Newbie
Messaggi: 3
Iscritto: 30/10/2014
|
Salve a tutti, ho da poco cominciato a programmare in C.
come esercizio devo scrivere un programma che letta una matrice sparsa da file deve creare una sua versione "compatta".
Ovvero il programma generi una rappresentazione compatta della matrice stessa, trascurando gli elementi nulli, in una struttura dati organizzata come segue:
- un vettore principale di R elementi, allocato dinamicamente
- ogni elemento del suddetto vettore contenga a sua volta un puntatore a un vettore, allocato dinamicamente, adatto a contenere solamente gli elementi non nulli
- ogni cella dei vettori secondari sia una struct caratterizzata da due campi:
1. indice della colonna associata all'elemento memorizzato
2. valore dell'elemento memorizzato.
All'interno del file da cui leggo la matrice ci sono già scritte le dimensioni della stessa.
Codice sorgente - presumibilmente C++ |
typedef struct numero{ //creo un tipo nuovo int indice_col; float valore; }elemento; float Cerca(elemento**, int, int, int*); int Simmetrica(elemento**, int, int *); int main(int argc, char*argv[]) { int nr, nc, i, j, k=0, *conta; float **matr, trovato; FILE *fp; elemento **vett_colonna; //faccio una "matrice di strutture if(argc!=2){ fprintf(stderr, "Errore numero argomenti.\n"); exit(1); } fp=fopen(argv[1], "r"); if(fp==NULL){ fprintf(stderr, "Errore apertura file.\n"); exit(2); } fscanf(fp, "%d %d", &nr, &nc); //alloco la matrice dinamicamente conta=malloc(nr*sizeof(int)); if(conta==NULL){ fprintf(stderr, "impossibile allocare.\n"); exit(3); } for(i=0; i<nr; i++){ conta[i]=0; } matr= malloc(nr*sizeof(float*)); if(matr==NULL){ fprintf(stderr, "Impossibile allocare la matrice.\n"); exit(4); } for(i=0; i<nr; i++){ matr[i]=malloc(nc*sizeof(float)); if(matr[i]==NULL){ fprintf(stderr, "Errore allocazione matrice.\n"); exit(5); } } for(i=0; i<nr; i++){ for(j=0; j<nc; j++){ fscanf(fp, "%f", &matr[i][j]); if(matr[i][j]!=0){ //mentre alloco la matrice mi conto quanti elementi non nulla per ogni riga e li metto in un vettore conta[i]++; //che ho allocato prima dinamicamente } } } rewind(fp); vett_colonna= (elemento**) malloc (nr*sizeof(elemento*)); //alloco dinam la matrice di strutture, sfruttando cont[i] if(vett_colonna==NULL){ fprintf(stderr, "Impossibile allocare vettore dinamico.\n"); exit(6); } k=0; for(i=0; i<nr; i++){ vett_colonna[i]=(elemento*)malloc(conta[i]*(sizeof(elemento))); if(vett_colonna[i]==NULL){ fprintf(stderr, "Impossibile allocare vettore dinamico.\n"); exit(7); } k=0; for(j=0; j<nc; j++){ if(matr[i][j]!=0){ vett_colonna[i][k].indice_col = j+1; //perchè non funziona? vett_colonna[i][k].valore = matr[i][j]; k++; printf("Indice: %d valore:%f\n", vett_colonna[i][k].indice_col, vett_colonna[i][k].valore); } } }
|
Col debugger ho notato che mi si pianta nell'ultima parte, facendo la printf di indice colonna e del valore escono numeri casuali, es: -123242987
Non so se ho postato il codice nella maniera corretta, o se il post è troppo lungo. Nel caso mi scuso in anticipo. Grazie per l'aiuto.
Ultima modifica effettuata da manu1294 il 31/10/2014 alle 21:38 |