Matrice 3D dinamica, in C

di il
22 risposte

Matrice 3D dinamica, in C

Voglio creare una matrice che sia dinamica su i tre livelli di puntatori, ma il programma si blocca durante il debug quando faccio la malloc dell'ultimo livello. In fase di compilazione non mi restituisce nessun errore.
QUESTO E' IL CODICE:

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

int main()
{
    int i, n, res, k;
    char appoggio[10000];
    FILE *fp=fopen("piatti.txt", "r");
    char*** matrice=malloc(100*sizeof(char**));
    for (fscanf(fp, "%d", &n), i=0; res!=EOF; res=fscanf(fp, "%d ", &n), matrice[i]=malloc(n*sizeof(char*)), i++)
    {
        for (k=0; k<n; k++)
        {
            fscanf(fp, "%s", appoggio);
            matrice[i][k]=malloc((strlen(appoggio))*sizeof(char));      <--  QUI CRUSHA IL DEBUG
            strcpy(matrice [i][k], appoggio);

        }

    }
    printf("%s\n", matrice [0][0]);
    return 0;
}

22 Risposte

  • Re: Matrice 3D dinamica, in C

    Intanto per postare il codice dovresti utilizzare il tag CODE, altrimenti risulta illegibile. E poi si dice crAsh, non crUsh
    Per quanto riguarda il tuo problema: non allochi un carattere per il terminatore, dovresti scrivere un +1
    malloc( (strlen(appoggio)+1)*sizeof(char) )
    Poi, sei sicuro del contenuto di appoggio? Magari dopo la fscanf() mettici una printf() per vederne il contenuto.
    Infine, ma propbabilmente non è un problema, la dimensione di appoggio deve proprio essere 10000?
  • Re: Matrice 3D dinamica, in C

    Scusami per il tag, è il primo post che scrivo sul blog
    Giusto non avevo pensato che allo strlen dovevo aggiunge 1 per \0, ma ho modificato il codice e non funziona lo stesso :\
    La stringa appoggio l'ho fatta 10000 perchè non ho problemi di memoria e quindi ho messo un valore alto per questo.
    Ho controllato il contenuto di appoggio ed è giusto.
  • Re: Matrice 3D dinamica, in C

    Non è un blog ma un forum e il regolamento va letto prima di postare ...

    Comunque, quel vettore va nello stack che è limitato a prescindere da quanta memoria hai installata, quindi fallo più piccolo.

    Poi esegui in debug passo passo e individua la linea in cui hai l'errore
  • Re: Matrice 3D dinamica, in C

    Ho ridotto ridotto la stringa.
    ho rifatto il debug riga per riga, e si blocca nella riga dove faccio l'ultima malloc.
  • Re: Matrice 3D dinamica, in C

    Posto anche la formattazione del file:

    5 Salumi Battuto Carpaccio Cozze_Marinara Bruschetta
    4 Pappardelle_Ragu Timballo Bucatini_Amatriciana Spaghetti_Carbonara
    3 Spaghetti_Vongole Penne_Zucchine_Gamberetti Gnocchetti_Nero_Seppia
    6 Spezzatino Stinco Pollo Cotoletta Costine Fiorentina
    8 Pesce_Spada Salmone_Affumicato Tonno Branzino Polpo Astice Aragosta Fritto_Misto
    7 Pannacotta Profiteroles Tiramisu Zeppole Pastiera Crostata Macedonia


    Il numero iniziale mi dice quante stringhe in quella riga.
  • Re: Matrice 3D dinamica, in C

    Ci spieghi perché 3 livelli ?

    Come devi leggere questi dati ?
  • Re: Matrice 3D dinamica, in C

    Un file di testo (piatti.txt) contiene le informazioni relative a tutti i piatti proposti da un ristorante, organizzati per portate. Il numero delle portate non è noto a priori, ma coincide con il numero di righe del file.
    Ogni riga del file rappresenta una portata: la riga inizia con un numero intero N ed è seguita da N stringhe a rappresentare le possibili scelte per quella portata portata.
  • Re: Matrice 3D dinamica, in C

    Lo so che potrei fare il primo livello fatto da una lista, dove all'interno di ogni nodo ho una matrice e il puntatore al nodo successivo.
    Ma volevo provare a fare una matrice dinamica su 3 livelli tutti e tre dinamici.
  • Re: Matrice 3D dinamica, in C

    Quindi
    
        char ***matrice=(char ***)malloc(100*sizeof(char **));
    	res=fscanf(fp, "%d", &n);
        for (i=0; res!=EOF; i++)
        {
    		matrice[i]=(char **)malloc(n*sizeof(char *));
    
            for (k=0; k<n; k++)
            {
                fscanf(fp, "%s", appoggio);
                matrice[i][k]=(char *)malloc(strlen(appoggio+1) * sizeof(char));    
                strcpy(matrice[i][k], appoggio);
            }
    
    		res=fscanf(fp, "%d", &n);
        }
     
  • Re: Matrice 3D dinamica, in C

    Provato non funziona :\
    si blocca sempre li
  • Re: Matrice 3D dinamica, in C

    Non è
                matrice[i][k]=(char *)malloc(strlen(appoggio+1) * sizeof(char));   
    
    ma
                matrice[i][k]=(char *)malloc((strlen(appoggio)+1) * sizeof(char));   
    
    Ad ogni modo suggerisco di inserire una printf("%s\n", appoggio) prima di questa chiamata
  • Re: Matrice 3D dinamica, in C

    Ho fatto il debug con il print e ho tolto l'ultima malloc per fare girare il programma, e legge tutte le stringhe perfettamente.
    Si ferma sempre su quella malloc.
  • Re: Matrice 3D dinamica, in C

    No ... A parte la correzione della strlen deve andare... Riproponi tutto il codice corretto
  • Re: Matrice 3D dinamica, in C

    Ho letto bene il log del debug e ho letto questo errore:
    Child process PID: 8228
    Program received signal SIGSEGV, Segmentation fault.
Devi accedere o registrarti per scrivere nel forum
22 risposte