PDA

Visualizza la versione completa : [C] - Matrici allocate dinamicamente


MattiaMerlini
02-10-2014, 11:35
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


/*
* 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");
}

Scara95
02-10-2014, 11:43
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

MattiaMerlini
02-10-2014, 14:35
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


/* * 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");
}

M.A.W. 1968
02-10-2014, 15:16
Ps: vengo dal php e dal java, dove non ho tutti questi problemi per una stringa ahah


Infatti codesti "linguaggi" sono per definizione diseducativi... :nonono:
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 (http://www.ioprogrammo.it/index.php?topic=14818.msg61642#msg61642) 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.

MattiaMerlini
02-10-2014, 15:54
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.

//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

M.A.W. 1968
02-10-2014, 16:12
Apparentemente nel tuo codice non vi sono errori, anche se la forma più sensata è la seguente:


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). :old:

MattiaMerlini
02-10-2014, 16:28
Gradualmente approderò anche io a quei linguaggi, e spero nella scelta saggia.

Tornando al C, non va ancora ahah


//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");
}

Scara95
02-10-2014, 16:44
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). :old:

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.

Scara95
02-10-2014, 16:48
Posta tutto il codice e il testo dell'errore.

MattiaMerlini
02-10-2014, 16:52
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

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;
}

Loading