Problema matrice trasposta

di il
2 risposte

Problema matrice trasposta

Sto facendo un programma che chiede di inserire delle triple(riga, colonna e valore) di una matrice e le inserisce in una matrice sparsa, di questa poi ne fa una matrice trasposta, funziona tutto tranne alla fine che stampa tutta la matrice trasposta escluso un numero e da errore di segmentation fault...Il problema dovrebbe essere o nel main o nella funzione di trasposizione ma non essendo sicuro allego l'intero codice e lo screen dell'errore

image uploader
#include <stdio.h>
#include <stdlib.h>

#define NUMC 15
#define NUMR 10

typedef struct{
    int riga;
    int colonna;
    int valore;
}Mat_spar;

int numUsedIntegerClassic;
int numUsedIntegerSparse;

void fill_classic_matrix(int matrix[][NUMC], int numr, int numc);
void print_classic_matrix(int matrix[][NUMC], int numr, int numc);
void search_element_in_classic_matrix(int matrix[][NUMC], int numr, int numc, int numric);
Mat_spar* fill_sparse_matrix(int, int, int);
void print_sparse_matrix(Mat_spar *, int, int, int);
void search_element_in_sparse_matrix(Mat_spar *, int, int);
Mat_spar *trasp_rapida(Mat_spar *, Mat_spar *);
int main()
{
    int matrix[NUMR][NUMC] = {{0}};
    int numric=71;     // assegnare a num il numero da cercare.
    int numrig, numcol, nelem;
    Mat_spar *matrice_sparsa, *matrice_trasp=NULL;
    matrice_trasp=malloc(nelem+1*sizeof(Mat_spar));
    
    // INIZIO TEST MATRICE CLASSICA
    fill_classic_matrix(matrix, NUMR, NUMC);
    print_classic_matrix(matrix, NUMR, NUMC);
    search_element_in_classic_matrix(matrix, NUMR, NUMC, numric);
    // FINE TEST MATRICE CLASSICA
    
    printf("Inserisci numero di righe: ");
    scanf("%d", &numrig);
    printf("Inserisci numero di colonne: ");
    scanf("%d", &numcol);
    printf("Inserisci numero di elementi non nulli: ");
    scanf("%d", &nelem);
    matrice_sparsa = fill_sparse_matrix(numrig, numcol, nelem);
    print_sparse_matrix(matrice_sparsa, numrig, numcol, nelem);
    search_element_in_sparse_matrix(matrice_sparsa, nelem, numric);
    matrice_trasp=trasp_rapida(matrice_sparsa, matrice_trasp);
    print_sparse_matrix(matrice_trasp, numcol, numrig, nelem);
    return 0;
}

void fill_classic_matrix(int matrix[][NUMC], int numr, int numc)
{
    matrix[1][0] = 71;
    matrix[2][14] = 99;
    matrix[3][11] = 53;
    matrix[4][7] = 95;
    matrix[6][14] = 39;
    matrix[8][1] = 27;
    matrix[9][14] = 14;
}

void print_classic_matrix(int matrix[][NUMC], int numr, int numc)
{
    int i, j = 0;
    for(i=0; i<numr; i++)
    {
        for(j=0; j<numc; j++)
        {
            printf("%d\t", matrix[i][j]);
        }
        printf("\n");
    }

}

void search_element_in_classic_matrix(int matrix[][NUMC], int numr, int numc, int numric)
{
    int i, j = 0;
    for(i=0; i<numr; i++)
    {
        for(j=0; j<numc; j++)
        {
            if(matrix[i][j] == numric)
            {
                printf("Elemento %d trovato in posizione (%d, %d).\n", numric, i, j);
                return;
            }
        }
    }
    printf("Elemento non trovato.\n");
}

Mat_spar* fill_sparse_matrix(int numrig, int numcol, int nelem){
    Mat_spar *matrice_sparsa=(Mat_spar *)malloc(nelem+1*sizeof(Mat_spar));
    int i;
    matrice_sparsa[0].riga=numrig;
    matrice_sparsa[0].colonna=numcol;
    matrice_sparsa[0].valore=nelem;
    for(i=1; i<nelem+1; i++){
        printf("Inserisci riga: ");
        scanf("%d", &matrice_sparsa[i].riga);
        printf("Inserisci colonna: ");
        scanf("%d", &matrice_sparsa[i].colonna);
        printf("Inserisci valore: ");
        scanf("%d", &matrice_sparsa[i].valore);
    }
    return matrice_sparsa;
}

void print_sparse_matrix(Mat_spar *matrice_sparsa, int numrig, int numcol, int nelem){
    int i, j, k;
    int variabile=0;
    for(i = 0; i < numrig; i++){
        for(j = 0; j < numcol; j++){
            for(k = 1; k < nelem+1; k++)
                if(i == matrice_sparsa[k].riga && j == matrice_sparsa[k].colonna){
                    printf("%d\t", matrice_sparsa[k].valore);
                    variabile = 1;
                }
            if(variabile == 0)
                printf("0\t");
            else
                variabile = 0;
        }
        printf("\n");
    }
}

void search_element_in_sparse_matrix(Mat_spar *matrice_sparsa, int nelem, int numric){
    int i;
    for(i=0; i<nelem; i++)
    {
            if(matrice_sparsa[i].valore == numric){
                printf("Elemento %d trovato in posizione (%d, %d).\n", numric, matrice_sparsa[i].riga, matrice_sparsa[i].colonna);
                return;
            }
    }
    printf("Elemento non trovato.\n");
}

Mat_spar *trasp_rapida(Mat_spar *a, Mat_spar *b){
    int num_col = a[0].colonna;
    int num_val = a[0].valore;
    int cur_pos;
    int i;
    b[0].riga = num_col;
    b[0].colonna = a[0].riga;
    b[0].valore =  num_val;
    int *termini_riga;
    int *pos_iniziale;
    termini_riga=malloc(num_col*sizeof(int));
    pos_iniziale=malloc(num_col*sizeof(int));
    if(num_val > 0){
        //  creazione termini_riga
        for(i = 0; i < num_col; i++){
            termini_riga[i] = 0;
        }
        for(i = 1; i <= num_val; i++){
            termini_riga[a[i].colonna] = termini_riga[a[i].colonna]+1;
        }
        // creazione pos_iniziale
        pos_iniziale[0] = 1;
        for(i=1; i < num_col; i++){
            pos_iniziale[i] = pos_iniziale[i-1]+termini_riga[i-1];
        }
        //trasposizione
        for(i=1; i <= num_val; i++){
            cur_pos = pos_iniziale[a[i].colonna];
            pos_iniziale[a[i].colonna] = pos_iniziale[a[i].colonna]+1;
            b[cur_pos].riga = a[i].colonna;
            b[cur_pos].colonna = a[i].riga;
            b[cur_pos].valore = a[i].valore;
        }
    }
    return b;
}

2 Risposte

  • Re: Problema matrice trasposta

    Tanto per cominciare, l'espressione
    
    matrice_trasp=malloc(nelem+1*sizeof(Mat_spar));
    
    Non fa assolutamente quello che ti aspetteresti. Ripassa la predecenza degli operatori aritmetici...
  • Re: Problema matrice trasposta

    M.A.W. 1968 ha scritto:


    Tanto per cominciare, l'espressione
    
    matrice_trasp=malloc(nelem+1*sizeof(Mat_spar));
    
    Non fa assolutamente quello che ti aspetteresti. Ripassa la predecenza degli operatori aritmetici...
    Funzionaaa!! Grazie mille, non avevo proprio notato l'errore
    matrice_trasp=malloc((nelem+1)*sizeof(Mat_spar));
Devi accedere o registrarti per scrivere nel forum
2 risposte