Pagina 1 di 1

[RISOLTO] [C] Matrice allocata dinamicamente

Inviato: lun 13 gen 2014, 21:15
da boh
Ciao a tutti!
Sto lavorando ad un progetto e ho bisogno di usare una matrice le cui dimensioni sono lunghezze di stringhe passate come parametri al main e quindi note solo a runtime.
Nel main alloco le stringhe, ne recupero la lunghezza e poi passo tutto a una funzione (le due stringhe (char*) più le lunghezze (int)).
Nella funzione ho dichiarato una matrice usando le lunghezze delle stringhe come dimensioni.
Tutto funzionava a dovere, fino a quando sono arrivato a dover usare stringhe di lunghezza > 2000 (per intenderci, sarebbero sequenze di DNA, quindi è logico che siano così lunghe). Con stringhe così lunghe ho ottenuto una bellissima segmentation fault.
Ne consegue che ho la necessità di allocare la matrice dinamicamente. Ho letto in giro un po' di modi, tra cui il più comune è il seguente:

Codice: Seleziona tutto

int **score, i;

// Allocazione righe
if ((score = malloc(len1*sizeof(int*))) == NULL)
	return -1;

// Allocazione colonne
for(i=0; i<len1; i++) {
        if ((score[i] = malloc(sizeof(int) * len2) == NULL)
                return -1;
}
Avrei un paio di domande a riguardo:
  • È l'unico modo in cui posso allocare la matrice o è possibile farlo con un'unica malloc (con una conseguente unica free)?
  • Più avanti accedo agli elementi della matrice nel modo usuale (score[j]); vorrei non dover cambiare tutto. Avrò problemi in tal senso con l'allocazione dinamica?


EDIT: la free sarebbe corretta in questo modo?

Codice: Seleziona tutto

for(i=0; i < len1; i++)
		free(score[i]);

free(score);

Re: [C] Matrice allocata dinamicamente

Inviato: lun 13 gen 2014, 21:25
da Vito
boh ha scritto: È l'unico modo in cui posso allocare la matrice o è possibile farlo con un'unica malloc (con una conseguente unica free)?
Mi sa che è l'unico modo (è noioso lo so..).

boh ha scritto:Più avanti accedo agli elementi della matrice nel modo usuale (score[j]); vorrei non dover cambiare tutto. Avrò problemi in tal senso con l'allocazione dinamica?

Assolutamente no (ovviamente rispettando le dimensioni della matrice).
Quando dichiari un array, altro non fai che dichiarare un puntatore.
Poi se ne dichiari uno allocato staticamente, questo viene allocato sullo stack e della sua allocazione/deallocazione se ne occupa il compilatore.
Se ne dichiari uno dinamico, spetta a te allocare/deallocare, e l'array viene allocato in area heap.
La gestione è esattamente la stessa.

Re: [C] Matrice allocata dinamicamente

Inviato: lun 13 gen 2014, 21:32
da Blallo
boh ha scritto:È l'unico modo in cui posso allocare la matrice o è possibile farlo con un'unica malloc (con una conseguente unica free)?
Si, è l'unico modo.
Ma fidati, è anche più pratico. :)
boh ha scritto:Più avanti accedo agli elementi della matrice nel modo usuale (score[j]); vorrei non dover cambiare tutto. Avrò problemi in tal senso con l'allocazione dinamica?

No, una volta allocata, alla matrice si accede sempre in un modo.
Ricordati che sono pur sempre puntatori (e pertanto puntatore++ punta all'elemento successivo).
boh ha scritto:EDIT: la free sarebbe corretta in questo modo?

Codice: Seleziona tutto

for(i=0; i < len1; i++)
		free(score[i]);

free(score);
Si.

Re: [C] Matrice allocata dinamicamente

Inviato: mar 14 gen 2014, 11:22
da boh
Grazie ad entrambi per le risposte :D
Un'ultima domanda non strettamente correlata: ho notato che se passo in input stringhe troppo lunghe bash non le prende (interpreta la parte "di troppo" come un nuovo comando).
Come posso ovviare a questo problema?

Re: [C] Matrice allocata dinamicamente

Inviato: mer 15 gen 2014, 0:48
da targzeta
Cosa intendi con "troppo lunghe"? Quanti caratteri?

Emanuele

Re: [C] Matrice allocata dinamicamente

Inviato: mer 15 gen 2014, 9:14
da boh
Vorrei arrivare a dare in input due stringhe da 16000 caratteri l'una.

Re: [C] Matrice allocata dinamicamente

Inviato: mer 15 gen 2014, 19:41
da targzeta
Dovrebbe essere possibile. Non è che tra questi caratteri c'è qualche '&' o caratteri da quotare?

Emanuele

Re: [C] Matrice allocata dinamicamente

Inviato: mer 15 gen 2014, 20:21
da brg
Come glieli passi gli argomenti? Dubito che tu scriva 16000 caratteri a mano. Ad ogni modo se esegui getconf -a | grep ARG_MAX ottieni la lunghezza massima della stringa di parametri passabili ad un programma, circa 2.000.000 sul kernel standard di Slackware64.

Non sarebbe più comodo far leggere i dati da un file?

Re: [C] Matrice allocata dinamicamente

Inviato: mer 15 gen 2014, 23:36
da boh
ARG_MAX effettivamente è poco più di 2M, quindi non dovrebbero esserci problemi. Le stringhe sono due e le passo come argv[1] e argv[2], quindi come parametri del main.
Le faccio generare da un generatore online su un alfabeto di soli 4 caratteri (ACGT come le sequenze genetiche) e poi copio-incollo in bash.

Ho riprovato e ha funzionato, quindi siamo a posto :D
Non so perchè mi aveva dato quel problema!

Metto risolto e grazie a tutti per le risposte! =D>