Repository 32bit  Forum
Repository 64bit  Wiki

[RISOLTO] [C] Matrice allocata dinamicamente

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

[RISOLTO] [C] Matrice allocata dinamicamente

Messaggioda boh » lun gen 13, 2014 21:15

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[i][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);
Ultima modifica di boh il mer gen 15, 2014 23:36, modificato 2 volte in totale.
"Be yourself. Everyone else is already taken." ~ Oscar Wilde
Avatar utente
boh
Linux 2.6
Linux 2.6
 
Messaggi: 939
Iscritto il: gio set 15, 2005 23:00
Località: Milano
Slackware: 14.1 (x64)
Kernel: 3.10.17
Desktop: KDE 4.10.5

Re: [C] Matrice allocata dinamicamente

Messaggioda Vito » lun gen 13, 2014 21:25

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[i][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.
"Stat rosa pristina nomina, nomina nuda tenemus." [ Umberto Eco - Il nome della rosa]

"Faber est suae quisque fortunae ." [ Appio Claudio Cieco]
Avatar utente
Vito
Staff
Staff
 
Messaggi: 4124
Iscritto il: mar dic 05, 2006 17:28
Località: Augsburg
Nome Cognome: Vito
Slackware: 64 14.0 multilib
Kernel: 3.2.29-xps
Desktop: KDE 4.10.2
Distribuzione: Linux Mint 17

Re: [C] Matrice allocata dinamicamente

Messaggioda Blallo » lun gen 13, 2014 21:32

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[i][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.
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3212
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: [C] Matrice allocata dinamicamente

Messaggioda boh » mar gen 14, 2014 11:22

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?
"Be yourself. Everyone else is already taken." ~ Oscar Wilde
Avatar utente
boh
Linux 2.6
Linux 2.6
 
Messaggi: 939
Iscritto il: gio set 15, 2005 23:00
Località: Milano
Slackware: 14.1 (x64)
Kernel: 3.10.17
Desktop: KDE 4.10.5

Re: [C] Matrice allocata dinamicamente

Messaggioda targzeta » mer gen 15, 2014 0:48

Cosa intendi con "troppo lunghe"? Quanti caratteri?

Emanuele
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6149
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: [C] Matrice allocata dinamicamente

Messaggioda boh » mer gen 15, 2014 9:14

Vorrei arrivare a dare in input due stringhe da 16000 caratteri l'una.
"Be yourself. Everyone else is already taken." ~ Oscar Wilde
Avatar utente
boh
Linux 2.6
Linux 2.6
 
Messaggi: 939
Iscritto il: gio set 15, 2005 23:00
Località: Milano
Slackware: 14.1 (x64)
Kernel: 3.10.17
Desktop: KDE 4.10.5

Re: [C] Matrice allocata dinamicamente

Messaggioda targzeta » mer gen 15, 2014 19:41

Dovrebbe essere possibile. Non è che tra questi caratteri c'è qualche '&' o caratteri da quotare?

Emanuele
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6149
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: [C] Matrice allocata dinamicamente

Messaggioda brg » mer gen 15, 2014 20:21

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?
Avatar utente
brg
Linux 2.4
Linux 2.4
 
Messaggi: 240
Iscritto il: sab mar 12, 2011 14:20
Località: Montecatini
Slackware: 14.1
Kernel: 3.10.17
Desktop: KDE4

Re: [C] Matrice allocata dinamicamente

Messaggioda boh » mer gen 15, 2014 23:36

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>
"Be yourself. Everyone else is already taken." ~ Oscar Wilde
Avatar utente
boh
Linux 2.6
Linux 2.6
 
Messaggi: 939
Iscritto il: gio set 15, 2005 23:00
Località: Milano
Slackware: 14.1 (x64)
Kernel: 3.10.17
Desktop: KDE 4.10.5


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite