Domanda stampa file con matrice

sara20

Utente Silver
6 Febbraio 2020
116
29
1
54
buongiorno sapete dirmi perchè la matrice non viene stampata:

C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "nodo.h"

static Matrice *allocaMatrice(int m, int n)
{
    Matrice *A;
    int i;
    
    A = malloc(sizeof(Matrice));
    A->m = m;
    A->n = n;
    
    A->mat = malloc(m*sizeof(float *));
    for (i=0; i<m; i++) {
        A->mat[i] = malloc(n*sizeof(float));
    }
    
    return A;
}


void freeMatrice(Matrice *A)
{
    int i;
    int m;
    
    m = A->m;
    
    for (i=0; i<m; i++) {
        free(A->mat[i]);
    }
    
    free(A->mat);
    
    free(A);
}

void stampaMatrice(Matrice *A)
{
    int i, j, m, n;
    
    m = A->m; n = A->n;
    
    for (i=0; i<m; i++) {
        for (j=0; j<n; j++) {
            printf("%f ", A->mat[i][j]);
        }
        printf("\n");
    }
}

Matrice *leggiMatrice(FILE *fp)
{
    Matrice *A;
    int m, n, i, j;
    
    fscanf(fp, "%d%d",&m,&n);
    
    A = allocaMatrice(m,n);
    
    A->m = m;
    A->n = n;
    for (i=0; i<m; i++) {
        for (j=0; j<n; j++) {
            fscanf(fp,"%f", A->mat[i] + j);
        }
    }
    
    return A;
}
C:
#ifndef nodo_h
#define nodo_h

#include <stdio.h>

struct matrice {
    int m; //numero di righe
    int n; //numero di colonne
    float **mat; //dati della matrice
};

typedef struct matrice Matrice;

Matrice *leggiMatrice(FILE *fp);
void stampaMatrice(Matrice *A);
void freeMatrice(Matrice *A);


#endif /* nodo_h */
C:
#include <stdio.h>
#include <stdlib.h>
#include "nodo.h"


int main()
{
    Matrice *A;
    FILE *fp;
 
    
    fp = fopen("input.txt", "r");
    
    A = leggiMatrice(fp);
    fclose(fp);
    stampaMatrice(A);
    

    freeMatrice(A);
}

l file di testo è:
 

Allegati

  • input.txt
    1.8 KB · Visualizzazioni: 3
Ciao, la matrice devi allocarla in due step:

1. Allochi memoria per la variabile di tipo Matrice
2. Allochi memoria per gli m per n elementi

NOTA: Puoi vedere una matrice m per n come un array monodimensionale m per n, quindi basta allocare una sola volta e non m volte come fai tu nella funzione allocaMatrice.

Di conseguenza, tale funzione dovrebbe essere qualcosa del genere:

C:
struct matrice {
    int m; //numero di righe
    int n; //numero di colonne
    float *mat; // è un puntatore, NON un puntatore ad un puntatore
};

static Matrice *allocaMatrice(int m, int n)
{
    Matrice *A;
    int i;
    
    A = malloc(sizeof(Matrice));
    A->m = m;
    A->n = n;
    
    A->mat = (float *)malloc(m*n*sizeof(float));
    
    return A;
}
 
  • Mi piace
Reazioni: sara20
Ultima modifica:
Ciao, la matrice devi allocarla in due step:

1. Allochi memoria per la variabile di tipo Matrice
2. Allochi memoria per gli m per n elementi

NOTA: Puoi vedere una matrice m per n come un array monodimensionale m per n, quindi basta allocare una sola volta e non m volte come fai tu nella funzione allocaMatrice.

Di conseguenza, tale funzione dovrebbe essere qualcosa del genere:

C:
struct matrice {
    int m; //numero di righe
    int n; //numero di colonne
    float *mat; // è un puntatore, NON un puntatore ad un puntatore
};

static Matrice *allocaMatrice(int m, int n)
{
    Matrice *A;
    int i;
 
    A = malloc(sizeof(Matrice));
    A->m = m;
    A->n = n;
 
    A->mat = (float *)malloc(m*n*sizeof(float));
 
    return A;
}
capito, facendo così ho due errore:
C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "funzioni.h"

static Matrice *allocaMatrice(int m, int n)
{
    Matrice *A;
   
    A = malloc(sizeof(Matrice));
    A->m = m;
    A->n = n;
   
    A->mat = (float *)malloc(m*n*sizeof(float));
   
    return A;
}

void freeMatrice(Matrice *A)
{
    int i;
    int m;
   
    m = A->m;
   
    for (i=0; i<m; i++) {
        free(A->mat[i]);
    }
   
    free(A->mat);
   
    free(A);
}

void stampaMatrice(Matrice *A)
{
    int i, j, m, n;
   
    m = A->m; n = A->n;
   
    for (i=0; i<m; i++) {
        for (j=0; j<n; j++) {
            printf("%2f ", A->mat[i][j]);
        }
        printf("\n");
    }
}

Matrice *leggiMatrice(FILE *fp)
{
    Matrice *A;
    int m, n, i, j;
   
    fscanf(fp, "%d%d",&m,&n);
   
    A = allocaMatrice(m,n);
   
    A->m = m;
    A->n = n;
    for (i=0; i<m; i++) {
        for (j=0; j<n; j++) {
            fscanf(fp,"%f", &A->mat[i] + j);
        }
    }
   
    return A;
}
In :" free(A->mat);" e in "printf("%2f ", A->mat[j]);" come posso risolvere??
 
capito, facendo così ho due errore:
C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "funzioni.h"

static Matrice *allocaMatrice(int m, int n)
{
    Matrice *A;
 
    A = malloc(sizeof(Matrice));
    A->m = m;
    A->n = n;
 
    A->mat = (float *)malloc(m*n*sizeof(float));
 
    return A;
}

void freeMatrice(Matrice *A)
{
    int i;
    int m;
 
    m = A->m;
 
    for (i=0; i<m; i++) {
        free(A->mat[i]);
    }
 
    free(A->mat);
 
    free(A);
}

void stampaMatrice(Matrice *A)
{
    int i, j, m, n;
 
    m = A->m; n = A->n;
 
    for (i=0; i<m; i++) {
        for (j=0; j<n; j++) {
            printf("%2f ", A->mat[i][j]);
        }
        printf("\n");
    }
}

Matrice *leggiMatrice(FILE *fp)
{
    Matrice *A;
    int m, n, i, j;
 
    fscanf(fp, "%d%d",&m,&n);
 
    A = allocaMatrice(m,n);
 
    A->m = m;
    A->n = n;
    for (i=0; i<m; i++) {
        for (j=0; j<n; j++) {
            fscanf(fp,"%f", &A->mat[i] + j);
        }
    }
 
    return A;
}
In :" free(A->mat);" e in "printf("%2f ", A->mat[j]);" come posso risolvere?

Devi fare il free un'unica volta, perché hai un solo grande array di m per n elementi:

C:
free(A->mat);

NON devi fare il free per ogni riga come nel tuo codice:
C:
// Codice errato
free(A->mat[i]);

Per quanto riguarda il printf dovresti specificare che tipo di errore ottieni.
 
  • Mi piace
Reazioni: sara20
Devi fare il free un'unica volta, perché hai un solo grande array di m per n elementi:

C:
free(A->mat);

NON devi fare il free per ogni riga come nel tuo codice:
C:
// Codice errato
free(A->mat[i]);

Per quanto riguarda il printf dovresti specificare che tipo di errore ottieni.
Per ora questa:

C:
printf("%f ", A->mat[i][j]);

mi dice che:

Codice:
"Subscripted value is not an array, pointer, or vector"
 
Per ora questa:

C:
printf("%f ", A->mat[i][j]);

mi dice che:

Codice:
"Subscripted value is not an array, pointer, or vector"
Certo.

Perché il campo mat è un puntatore non un array bi-dimensionale.

Quindi prova con la classica formula per indirizzare un elemento di una matrice, ovvero:

C:
A->mat[i*n +j]

invece di

C:
A->mat[i][j]
 
Ultima modifica:
Certo.

Perché il campo mat è un puntatore non un array bi-dimensionale.

Quindi prova con la classica formula per indirizzare un elemento di una matrice, ovvero:

C:
A->mat[i*n +j]

invece di

C:
A->mat[i][j]
Okay ho modificato tutto con le tue modifiche così ma ancora non va ce non mi da errori ma non stampa la matrice:
C:
#include "nodo.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static Matrice *allocaMatrice(int m, int n)
{
    Matrice *A;
   
    A = malloc(sizeof(Matrice));
    A->m = m;
    A->n = n;
   
    A->mat = (float *)malloc(m*n*sizeof(float));
   
    return A;
}

void freeMatrice(Matrice *A)
{
    int i;
    int m;
   
    m = A->m;
   
    for (i=0; i<m; i++) {
        free(A->mat);
    }
   
    free(A->mat);
   
    free(A);
}

void stampaMatrice(Matrice *A)
{
    int i, j, m, n;
   
    m = A->m;
    n = A->n;
   
    for (i=0; i<m; i++) {
        for (j=0; j<n; j++) {
            printf("%f", A->mat[i*n +j]);
        }
        printf("\n");
    }
}

Matrice *leggiMatrice(FILE *fp)
{
    Matrice *A;
    int m, n, i, j;
   
    fscanf(fp, "%d%d",&m,&n);
   
    A = allocaMatrice(m,n);
   
    A->m = m;
    A->n = n;
    for (i=0; i<m; i++) {
        for (j=0; j<n; j++) {
            fscanf(fp,"%f", &A->mat[i] + j);
        }
    }
   
    return A;
}
Il problema secondo me è nella stampa