Oppure

Loading
30/10/14 16:35
manu1294
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.

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 31/10/14 20:38
aaa
30/10/14 20:55
manu1294
Nessuno che mi sappia aiutare?:d
aaa
31/10/14 8:19
Bonny
Prova con:

(*vett_colonna[i][k]).valore = ....
aaa
31/10/14 20:37
manu1294
Risolto, si trattava di un errore dovuto ad una allocazione fatta male! grazie cmq :)
aaa