Problema passaggio per riferimento matrice

di il
6 risposte

Problema passaggio per riferimento matrice

Ciao a tutti.
Come da titolo ho un problema con il passaggio per referenza di una matrica allocata dinamicamente. Vi allego il testo dell'esercizio che dovrei fare:
[*]Un file di testo, il cui nome sia passato al programma da linea di comando, contiene le
informazioni relative ad una matrice di interi. Sulla prima riga del file sono riportate le
dimensioni R e C della matrice stessa. Sulle R righe successive, sono riportati i valori delle C
colonne per ogni data riga. Si assuma che il formato del file sia corretto.
Si scriva un programma che allochi dinamicamente la matrice, effettui la lettura del file e infine
calcoli la somma degli elementi delle diagonali e delle antidiagonali della matrice stessa.
Per quanto riguarda l'allocazione della matrice, si implementino due diverse funzioni. La prima
faccia uso del valore di ritorno per restituire la matrice al main. La seconda faccia invece uso di
parametri passati per riferimento. Nello specifico, si implementino due funzioni i cui prototipi
siano nella forma:
int **alloca2d(...);
e
void alloca2d(int***, ...);[*]
vi alleggo il codice che mi crea grossi grattacapi .

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

int **alloca2d_0(int ,int );
void alloca2d_1(int ***,int ,int );

int main(int argc,char *argv[])
{
    int nr,nc,**p=NULL,i,j;
    FILE *f;
    if(argc!=2)
    {
        printf("Errore numero parametri linea di comando.\n");
        return EXIT_FAILURE;
    }
    f=fopen(argv[1],"r");
    if(f==NULL)
    {
        printf("Errore apertura file %s.\n",argv[1]);
        return EXIT_FAILURE;
    }
    fscanf(f,"%d %d",&nr,&nc);
    //p=alloca2d_0(nr,nc);
    alloca2d_1(&p,nr,nc);
    for(i=0;i<nr;i++)
        for(j=0;j<nc;j++)
            fscanf(f,"%d",&p[i][j]);//Si pianta in questo punto!!
    for(i=0;i<nr;i++)
    {
        for(j=0;j<nc;j++)
            printf("%d ",p[i][j]);
        printf("\n");
    }

    fclose(f);
    return 0;
}
int **alloca2d_0(int nr,int nc)
{
    int **p,i;
    p=(int**)malloc(nr*sizeof(int *));
    if(p==NULL)
    {
        printf("Errore allocazione memoria.\n");
        exit(-1);
    }
    for(i=0;i<nr;i++)
    {
        p[i]=(int *)malloc(nc*sizeof(int));
        if(p[i]==NULL)
        {
            printf("Errore allocazione memoria.\n");
            exit(-1);
        }
    }
    return p;
}
void alloca2d_1(int ***p,int nr,int nc)
{
    int i,**pt;
    pt=(int **)malloc(nr*sizeof(int *));
    if(pt==NULL)
    {
        printf("Errore allocazione memoria.\n");
        exit(-1);
    }
    for(i=0;i<nr;i++)
    {
        pt[i]=(int *)malloc(nc*sizeof(int));
        if(pt[i]==NULL)
        {
            printf("Errore allocazione memoria.\n");
            exit(-1);
        }
    }
    p=&pt;
}
Vi prego aiutatemi non ne vengo a capo. Credo di fare un errore concettuale se cosi fosse me lo spieghereste ?? GRAZIE

6 Risposte

  • Re: Problema passaggio per riferimento matrice

    Non devi utilizzare variabili puntatore locali ...
    
    void alloca2d_1(int ***p,int nr,int nc)
    {
        int i;
        *p=(int **)malloc(nr*sizeof(int *));
        if(*p==NULL)
        {
            printf("Errore allocazione memoria.\n");
            exit(-1);
        }
        for(i=0;i<nr;i++)
        {
            (*p)[i]=(int *)malloc(nc*sizeof(int));
            if((*p)[i]==NULL)
            {
                printf("Errore allocazione memoria.\n");
                exit(-1);
            }
        }
    }
    
  • Re: Problema passaggio per riferimento matrice

    Il mio codice iniziale era proprio questo :
    
    void alloca2d_1(int ***p,int nr,int nc)
    {
        int i;
        *p=(int **)malloc(nr*sizeof(int *));
        if(*p==NULL)
        {
            printf("Errore allocazione memoria.\n");
            exit(-1);
        }
        for(i=0;i<nr;i++)
        {
            *p[i]=(int *)malloc(nc*sizeof(int));
            if(*p[i]==NULL)
            {
                printf("Errore allocazione memoria.\n");
                exit(-1);
            }
        }
    }
    Ma crashava all'interno del ciclo for "dove asseganvo le colonne"
    ora dal tuo cambiano solo le parentesi... Perchè ??
    Comunque grazie di cuore non ne venivo a capo
    Volevo chiedere una'altra cosa se possibile:
    il dato da elaborare è un vettore di struct(dinamico) con all'interno oltre a vettori di char "fissi" anche vettori di char "dinamici".
    ora io in questa lista dovrei cancellare degli elementi, la mia domanda e' quando uso la realloc per ridimensionare il mio vettore di struct devo prima liberare con free() i vettori interni dinamici delle n-ultime righe che voglio eliminare oppure fa già tutto la funzione realloc ?
  • Re: Problema passaggio per riferimento matrice

    "Solo" le parentesi? Beh, c'è una grande differenza ...

    Sapendo che p è un int ***, scrivere questo

    *p

    o questo

    (*p)

    per te è la stessa cosa?
  • Re: Problema passaggio per riferimento matrice

    Ora che mi ci fai riflettere forse capisco la differenza... abbiamo appena inziato i puntatori e devo ancora fare mio il concetto, grazie
    Visto che ci siamo, perchè non si possono usare puntatori locali per fare questa cosa ? concettualmente mi sembra giusto
    Per quanto riguarda la realloc() ? se vuoi ti allego parte del codice...
  • Re: Problema passaggio per riferimento matrice

    Invece è concettualmente un grave errore.
    pt è comunque una variabile locale, allocata nello stack e distrutta all'uscita della funzione.
    Se assegni il suo indirizzo in uscita, non esistendo più, se la userai avrai un crash

    Per l'altra domanda è necessario aprire un altro thread perché non riguarda questa discussione
  • Re: Problema passaggio per riferimento matrice

    Ah è vero!! La funzione quando si chiude è come se facesse una free() giusto per capirci no ??
    grazie Oregon
Devi accedere o registrarti per scrivere nel forum
6 risposte