Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    [C] - Matrici allocate dinamicamente

    Ciao a tutti, sto tentando di creare una matrice allocata dinamicamente che possa contenere delle stringhe (quindi char *), ma il codice sottostante non funziona. Sbaglio qualcosa nell'allocazione della memoria? Grazie
    codice:
    /*
         * Creo la matrice che ritornerò con i dati
         */
        int rows = 10;
        int cols = 3;
    
    //Creo le righe
        char ** result = (char **) calloc(rows, sizeof(char **));
    
    //Creo le colonne
        for (int i = 0; i < cols; i++)
        {
            result[i] = calloc(cols, sizeof(char));
        }
    
    //Carico la matrice
        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                result[i][j] = "ciao";
            }
            printf("\n");
        }
    
    //Stampo la matrice
        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                printf("%c\t", result[i][j]);
            }
            printf("\n");
        }

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    La matrice dovrebbe essere char***
    La prima allocazione calloc(rows, sizeof(char**))
    La seconda (per ogni riga) calloc(cols, sizeof(char *))
    Inoltre dovresti allocare ogni stringa che immetti e copiarla con strcpy

    Infine le stringhe si stampano con %s
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Grazie mille! Ora ho sistemato come hai detto ma nello strcpy mi da un'exception (Bad Access) come se io volessi entrare in una cella non allocata.
    Sai dirmi di nuovo dove sbaglio?
    Grazie davvero

    Ps: vengo dal php e dal java, dove non ho tutti questi problemi per una stringa ahah

    codice:
    /*     * Creo la matrice che ritornerò con i dati
         */
        int rows = 10;
        int cols = 3;
    
    //Creo le righe
        char *** result = calloc(rows, sizeof(char **));
    
    //Creo le colonne
        for (int i = 0; i < cols; i++)
        {
            result[i] = calloc(cols, sizeof(char *));
        }
    
    //Carico la matrice
        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                char * stringa = "ciao";
                strcpy(result[i][j], stringa);
            }
            printf("\n");
        }

  4. #4
    Quote Originariamente inviata da MattiaMerlini Visualizza il messaggio
    Ps: vengo dal php e dal java, dove non ho tutti questi problemi per una stringa ahah
    Infatti codesti "linguaggi" sono per definizione diseducativi...
    Stai ancora tralasciando un passaggio fondamentale: non allochi lo spazio per le singole stringhe. Osserva con attenzione le tue calloc(): nelle sizeof hai char** e char*, ma manca l'ultima della catena, quella che alloca un dato numero di singoli char!

    Questo storico post contiene un esempio didattico pressoché completo su vari casi limite di allocazione, che copre ampiamente le esigenze di qualsiasi corso base sul linguaggio C. Ovviamente il caso della matrice di stringhe è ampiamente contemplato.
    • Un plauso a Grisha Perelman, raro esempio di genuino anticonformismo umano e scientifico.

  5. #5
    Vero, diseducativi ma educativi per molti altri aspetti, tipo OOP che C non ha.
    Ho guardato il tuo intervento che mi hai linkato, molto interessante.

    Il fatto è che anche adesso che alloco lo spazio mi da ancora lo stesso errore, non so dove sbaglio.
    codice:
    //Carico la matrice    for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                result[i][j] = (char *) malloc(100 * sizeof(char));
                char * stringa = "ciao";
                strcpy(result[i][j], stringa);
            }
            printf("\n");
        }
    Mi sto incasinando per il niente mi sa

  6. #6
    Apparentemente nel tuo codice non vi sono errori, anche se la forma più sensata è la seguente:
    codice:
            for (int j = 0; j < cols; ++j)
            {
                result[i][j] = (char *)malloc(100 * sizeof(char));
                if (NULL != result[i][j])
                {
                    strcpy(result[i][j], "ciao");
                }
            }
            puts("");

    PS: purtroppo la OOP implementata in java e PHP è altrettanto pessima, certamente peggiore rispetto a quella (già scadente) di C++. Se vuoi davvero imparare un OOPL puro usato professionalmente e universalmente valido, devi rivolgere la tua attenzione ad Eiffel, Ada, e qualche dialetto Smalltalk (come Squeak).
    • Un plauso a Grisha Perelman, raro esempio di genuino anticonformismo umano e scientifico.

  7. #7
    Gradualmente approderò anche io a quei linguaggi, e spero nella scelta saggia.

    Tornando al C, non va ancora ahah

    codice:
    //Creo le righe    char *** result = calloc(rows, sizeof(char **));
    
    //Creo le colonne
        for (int i = 0; i < cols; i++)
        {
            result[i] = calloc(cols, sizeof(char *));
        }
    
    //Carico la matrice
        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                result[i][j] = (char *)malloc(100 * sizeof(char));
                if (NULL != result[i][j])
                {
                    strcpy(result[i][j], "ciao");
                }
            }
            printf("\n");
        }
    
    //Stampo la matrice
        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                printf("%s\t", result[i][j]);
            }
            printf("\n");
        }

  8. #8
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    PS: purtroppo la OOP implementata in java e PHP è altrettanto pessima, certamente peggiore rispetto a quella (già scadente) di C++. Se vuoi davvero imparare un OOPL puro usato professionalmente e universalmente valido, devi rivolgere la tua attenzione ad Eiffel, Ada, e qualche dialetto Smalltalk (come Squeak).
    Volevo fare lo stesso commento. Anche se a dirla tutta al giorno d'oggi di sono altri linguaggi degni di nota.
    Comunque Eiffel è secondo me molto molto interessante.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  9. #9
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Posta tutto il codice e il testo dell'errore.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  10. #10
    Ecco tutto il codice.
    L'errore riscontrato è : Thread 1: EXC_BAD_ACCESS (code=1, address=0x0) alla riga result[i][j] = (char *)malloc(100 * sizeof(char));

    Ps: uso xCode
    codice:
    int main(int argc, char* argv[]){
    
        /*
         * Creo la matrice che ritornerò con i dati
         */
        int rows = 10;
        int cols = 3;
    
    //Creo le righe
        char *** result = calloc(rows, sizeof(char **));
    
    //Creo le colonne
        for (int i = 0; i < cols; i++)
        {
            result[i] = calloc(cols, sizeof(char *));
        }
    
    //Carico la matrice
        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                result[i][j] = (char *)malloc(100 * sizeof(char));
                if (NULL != result[i][j])
                {
                    strcpy(result[i][j], "ciao");
                }
            }
            printf("\n");
        }
    
    //Stampo la matrice
        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                printf("%s\t", result[i][j]);
            }
            printf("\n");
        }
    
    
        return 0;
    }
    Ultima modifica di MattiaMerlini; 02-10-2014 a 17:03

Tag per questa discussione

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 © 2024 vBulletin Solutions, Inc. All rights reserved.