Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500

    [C] gestione matrici dinamiche di caratteri

    ciao, ho avuto un problema con un programma che gestisce le matrici totalmente dinamiche, ovvero matrici che vengono allocate dinamicamente sia il numero delle righe sia la lunghezza di ciascuna stringa.
    Il programma richiedeva:
    1. la lettura da file con questo formato utilizando una matrice dinamica:
    codice:
    topolino
    pluto
    minnie
    dove su ogni riga c'è solo una parola che non può superare i 100 caratteri, e non è nota la lunghezza del file;
    2. stampa della matrice su video;
    3. ordinameto alfabetico della matrice;
    4. stampa a video della matrice ordinata alfabeticamente;
    io ho fatto solo la lettura e mi da un errore nella allocazione delle singole parole suppongo
    nella funzione read_mat:
    codice:
    m[i] = (char*)alloco_parola ( &dim_parola );
    posto qua il codice così potete dare un occhiata, soprattuto per quanto riguarda i passaggi di parametri delle funzioni e le varie allocazioni, che non so se sono proprio corretti...
    Grazie
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int dim_valutation ( void );
    char** alloco_row ( int*  );
    char** read_mat ( int* );
    int parola_valutation ( char* );
    char* alloco_parola ( int* );
    
    int main ()
    {
        char** mat;
        int i, j;
        int dim;
        
        dim = valutation_dim ( );
        
        mat = (char**)alloco_row ( &dim ); 
        
        mat = read_mat ( &dim );
        
        for ( i=0; i<dim; i++ ) {
            printf ("%s\n", mat[i]);
        }
        
        system ("pause");
        return (1);    
    }
    int valutation_dim ( void )
    {
        int i;
        char str[100];
        FILE *aptr;
        
        aptr = fopen("testo.txt","r");
        i=0;
        while ( fscanf (aptr,"%s", str) != EOF ) {
              i++;
        }
        fclose(aptr);
        
        if ( i<=0 ) {
             printf ("Errore file!\n");
             exit(1);
        }
        return(i);
    }
    char** alloco_row ( int* dim )
    {
          char** m;
          
          m = (char**)malloc((*dim)*sizeof(char*));
          
          if ( m == NULL ) {
               printf ("Errore allocazione matrice!\n");
               exit(1);
          }
          return (m);
    }
    char** read_mat ( int* dim ) 
    {
          char **m;
          int i, dim_parola;
          char str[100];
          FILE *aptr;
          
          aptr=fopen("testo.txt","r");
          if ( aptr == NULL ) {
               printf ("Errore apertura file!\n");
               exit(1);
          }
          i=0;
          while ( fscanf (aptr,"%s", str ) != EOF && i<(*dim) ) {
                
                dim_parola = parola_valutation( str );
                
                m[i] = (char*)alloco_parola ( &dim_parola );
                
                strcpy ( m[i], str );
          i++;      
          }
          return (m);
    }
    int parola_valutation ( char* str )
    {
        int dim_parola;
        
        dim_parola = strlen(str)+1;
        
        if ( dim_parola <= 0 ) {
             printf ("Errore valutazione parole!\n");
             exit(1);
        }
        return(dim_parola);
    }
    char* alloco_parola ( int* dimParola ) 
    {
          char *parola;
          
          parola = (char*)malloc((*dimParola)*sizeof(char));
          
          if ( parola == NULL ) {
               printf ("Errore allocazione parole!\n");
               exit(1);
          }
          return (parola);
    }

  2. #2

    Re: [C] gestione matrici dinamiche di caratteri

    Originariamente inviato da MrX87

    codice:
    char* alloco_parola ( int* dimParola ) 
    {
          char *parola;
          
          parola = (char*)malloc((*dimParola)*sizeof(char));
          
          if ( parola == NULL ) {
               printf ("Errore allocazione parole!\n");
               exit(1);
          }
          return (parola);
    }
    A prima vista, che se ne fa "alloco_parola" del puntatore in argomento? nulla.

    Trasformala in (ed ovviamente modifica di conseguenza il chiamante):
    codice:
    char* alloco_parola (const int dimParola ) 
    {
          char * parola = (char*)malloc((dimParola)*sizeof(char));
          
          if ( NULL == parola) {
               printf ("Errore allocazione parole!\n");
               exit(1);
          }
          return (parola);
    }

  3. #3
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    A prima vista, che se ne fa "alloco_parola" del puntatore in argomento? nulla.
    eh...bhè si in effetti non se ne fa niente...non lo avevo notato...grazie...cmq il problema principale rimane sempre...spero che il codice sia abbastanza comprensibile...
    grazie ancora

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    "mi da un errore" ...

    Quale errore? Dai i dettagli ....
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    "mi da un errore" ....quale errore??...
    il programma compila...però all'esecuzione da un segmentation fault....

  6. #6
    non sono sicuro che nella lettura da file delle singole parole il carattere della stringa di terminazione venga aggiunto automaticamente ed in str ti trovi la parola senza il '\0' finale.
    Tuttavia non l'ho provata.
    Prova a fare un debugging con gdb.
    ciao
    sergio

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da MrX87
    il programma compila...però all'esecuzione da un segmentation fault....
    Nella funzione read_mat utilizzi un puntatore doppio

    char **m;

    nella riga

    m[i] = ...

    Ma non hai mai allocato lo spazio per il vettore di puntatori ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    tra l'altro...riguardando il codice...mi sono scordato di mettere una fclose() nella funzione read_mat e le varie free() ...che suppongo vadano messe così:
    codice:
    int main ()
    {
        char** mat;
        int i, j;
        int dim;
        
        dim = valutation_dim ( );
        
        mat = (char**)alloco_row ( &dim ); 
        
        mat = read_mat ( &dim );
        
        for ( i=0; i<dim; i++ ) {
            printf ("%s\n", mat[i]);
            free(mat[i]);
        }
        free(mat);
        system ("pause");
        return (1);    
    }
    giusto??

  9. #9
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    Nella funzione read_mat utilizzi un puntatore doppio
    char **m;
    nella riga
    m[i] = ...
    Ma non hai mai allocato lo spazio per il vettore di puntatori ...
    come no...scusa c'è la funzione alloco_row che dovrebbe fare questo...o sbaglio??

  10. #10
    si, ma l' m di read_mat è locale
    ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.