Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [RISOLTO]Problema matrice di puntatori a strutture.
Forum - C/C++ - [RISOLTO]Problema matrice di puntatori a strutture.

Avatar
manu1294 (Normal User)
Newbie


Messaggi: 3
Iscritto: 30/10/2014

Segnala al moderatore
Postato alle 17:35
Giovedì, 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++

  1. typedef struct numero{   //creo un tipo nuovo
  2.     int indice_col;
  3.     float valore;
  4. }elemento;
  5.  
  6. float Cerca(elemento**, int, int, int*);
  7. int Simmetrica(elemento**, int, int *);
  8.  
  9. int main(int argc, char*argv[])
  10. {
  11.     int nr, nc, i, j, k=0, *conta;
  12.     float **matr, trovato;
  13.     FILE *fp;
  14.     elemento **vett_colonna;   //faccio una "matrice di strutture
  15.  
  16.     if(argc!=2){
  17.         fprintf(stderr, "Errore numero argomenti.\n");
  18.         exit(1);
  19.     }
  20.  
  21.     fp=fopen(argv[1], "r");
  22.     if(fp==NULL){
  23.         fprintf(stderr, "Errore apertura file.\n");
  24.         exit(2);
  25.     }
  26.  
  27.     fscanf(fp, "%d %d", &nr, &nc);     //alloco la matrice dinamicamente
  28.  
  29.     conta=malloc(nr*sizeof(int));
  30.     if(conta==NULL){
  31.         fprintf(stderr, "impossibile allocare.\n");
  32.         exit(3);
  33.     }
  34.     for(i=0; i<nr; i++){
  35.         conta[i]=0;
  36.     }
  37.  
  38.     matr= malloc(nr*sizeof(float*));
  39.     if(matr==NULL){
  40.         fprintf(stderr, "Impossibile allocare la matrice.\n");
  41.         exit(4);
  42.     }
  43.  
  44.     for(i=0; i<nr; i++){
  45.         matr[i]=malloc(nc*sizeof(float));
  46.         if(matr[i]==NULL){
  47.             fprintf(stderr, "Errore allocazione matrice.\n");
  48.             exit(5);
  49.         }
  50.     }
  51.  
  52.     for(i=0; i<nr; i++){
  53.         for(j=0; j<nc; j++){
  54.             fscanf(fp, "%f", &matr[i][j]);
  55.  
  56.             if(matr[i][j]!=0){     //mentre alloco la matrice mi conto quanti elementi non nulla per ogni riga e li metto in un vettore
  57.                 conta[i]++;        //che ho allocato prima dinamicamente
  58.             }
  59.         }
  60.     }
  61.  
  62.  
  63.     rewind(fp);
  64.  
  65.     vett_colonna= (elemento**) malloc (nr*sizeof(elemento*));   //alloco dinam la matrice di strutture, sfruttando cont[i]
  66.     if(vett_colonna==NULL){
  67.         fprintf(stderr, "Impossibile allocare vettore dinamico.\n");
  68.         exit(6);
  69.     }
  70.  
  71.  
  72.     k=0;
  73.     for(i=0; i<nr; i++){
  74.         vett_colonna[i]=(elemento*)malloc(conta[i]*(sizeof(elemento)));
  75.         if(vett_colonna[i]==NULL){
  76.             fprintf(stderr, "Impossibile allocare vettore dinamico.\n");
  77.             exit(7);
  78.         }
  79.         k=0;
  80.         for(j=0; j<nc; j++){
  81.             if(matr[i][j]!=0){
  82.                 vett_colonna[i][k].indice_col = j+1;
  83.                                                         //perchè non funziona?
  84.                 vett_colonna[i][k].valore = matr[i][j];
  85.                 k++;
  86.                 printf("Indice: %d   valore:%f\n", vett_colonna[i][k].indice_col, vett_colonna[i][k].valore);
  87.  
  88.             }
  89.         }
  90.     }



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
PM Quote
Avatar
manu1294 (Normal User)
Newbie


Messaggi: 3
Iscritto: 30/10/2014

Segnala al moderatore
Postato alle 21:55
Giovedì, 30/10/2014
Nessuno che mi sappia aiutare?:d

PM Quote
Avatar
Bonny (Member)
Expert


Messaggi: 435
Iscritto: 24/04/2009

Segnala al moderatore
Postato alle 9:19
Venerdì, 31/10/2014
Prova con:

Codice sorgente - presumibilmente Plain Text

  1. (*vett_colonna[i][k]).valore = ....



Bonny
PM Quote
Avatar
manu1294 (Normal User)
Newbie


Messaggi: 3
Iscritto: 30/10/2014

Segnala al moderatore
Postato alle 21:37
Venerdì, 31/10/2014
Risolto, si trattava di un errore dovuto ad una allocazione fatta male! grazie cmq :)

PM Quote