Matrici allocate dinamicamente linguaggio c

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.
Questo
matrice= (double**) malloc (num_righe*sizeof(double*));
Serve per allocare uno spazio di memoria preciso per la matrice in base alla scelta del numero di righe che ha fatto l'utente. sinceramente non ho capito perchè si deve mettere double** all'inizio e perchè nel double nel sizeof vada un altro asterisco
--- i due messaggi sono stati uniti ---
Questo
matrice= (double**) malloc (num_righe*sizeof(double*));
Serve per allocare lo spazio di memoria preciso in base alla scelta fatta dall'utente sulla dimensione della matrice. Sinceramente non ho capito perchè va messo il "double**" all'inizio e il double* alla fine affianco a sizeof. Scusa l'ignoranza, mi sto impegnando ma sono alle prime armi e certe cose sono difficili per me
 
Ultima modifica:
Serve per allocare uno spazio di memoria preciso per la matrice in base alla scelta del numero di righe che ha fatto l'utente. sinceramente non ho capito perchè si deve mettere double** all'inizio e perchè nel double nel sizeof vada un altro asterisco
Ecco volevo arrivare qui, in c non esite il tipo di dato matrice quello che hai creato è un puntatore ad un puntatore di double. Quindi il tuo elemento matrice punterà ad un vettore di double( in realtà qui c'è un errore ma assumilo come vero perché hai già tante cose a cui pensare) che a sua volta punta ad un'altro vettore di double. Quell'asterisco prima del sizeof è un operatore matematico: la moltiplicazione. Moltiplichi la dimensione di un double per il numero di righe. Attenzione! Questo è un vettore. Fai la stessa cosa nel for successivo. Per ogni "casella" del vettore esegui una malloc che alloca spazione per il numero di colonne moltiplicato per la dimensione di un double e lo salvi in prima posizione nel vettore e così via
 
Ecco volevo arrivare qui, in c non esite il tipo di dato matrice quello che hai creato è un puntatore ad un puntatore di double. Quindi il tuo elemento matrice punterà ad un vettore di double( in realtà qui c'è un errore ma assumilo come vero perché hai già tante cose a cui pensare) che a sua volta punta ad un'altro vettore di double. Quell'asterisco prima del sizeof è un operatore matematico: la moltiplicazione. Moltiplichi la dimensione di un double per il numero di righe. Attenzione! Questo è un vettore. Fai la stessa cosa nel for successivo. Per ogni "casella" del vettore esegui una malloc che alloca spazione per il numero di colonne moltiplicato per la dimensione di un double e lo salvi in prima posizione nel vettore e così via
Quindi se io vedessi questa matrice come un vettore molto lungo non potrei logicamente arrivare ad una formula che mi permetta dato l'indice di riga di accedere alla matrice attraverso uno sfasamento o meglio ancora usando sicuramente il termine del tuo prof un offset?:
matrice[.........]
 
Ecco volevo arrivare qui, in c non esite il tipo di dato matrice quello che hai creato è un puntatore ad un puntatore di double. Quindi il tuo elemento matrice punterà ad un vettore di double( in realtà qui c'è un errore ma assumilo come vero perché hai già tante cose a cui pensare) che a sua volta punta ad un'altro vettore di double. Quell'asterisco prima del sizeof è un operatore matematico: la moltiplicazione. Moltiplichi la dimensione di un double per il numero di righe. Attenzione! Questo è un vettore. Fai la stessa cosa nel for successivo. Per ogni "casella" del vettore esegui una malloc che alloca spazione per il numero di colonne moltiplicato per la dimensione di un double e lo salvi in prima posizione nel vettore e così via
Mi arrendo, non capisco. Puntatori, doppi puntatori, puntatori nelle matrici, mi sembra arabo...
 
Allora matrice è un doppio puntatore. Ecco perche matrice lo dichiari come double ** matrice. Di norma i puntatori vengono utilizzati in c per l'allocazione dinamica dei vettori, per un secondo dimentica che matrice sia un double**, ma fai finta che sia solo un semplice puntatore double*.
Allora matrice in memoria ha l'indirizzo del primo elemento del vettore creato dinamicamente dalla malloc. Anziché metterci i dati in memoria nell'elemento [0] il doppio puntatore(adesso entra il gioco il secondo asterisco) segnala che in realtà il vettore da noi creato è a sua volta un insieme di puntatori che in memoria hanno tanti indirizzi di vettori creati. Quindi se noi volessimo creare una matrice 3x3. avremo che matrice punterà ad un vettore di puntatori di 3 elementi, in ognuno di questi 3 elementi in memoria ci sarà l'indirizzo di un vettore di double di 3 elementi. Ci sei?
P.s.
Scusa il disegno molto blando, ma volevo risponderti il prima possibile
 

Allegati

  • Senza titolo 5.webp
    Senza titolo 5.webp
    11.7 KB · Visualizzazioni: 26
frequento la facoltà di informatica, si ha spiegato la teoria ma nella pratica abbiamo fatto davvero poco, non abbiamo lavorato su progetti veri e propri. E poi i doppi puntatori, queste cose qui, non le abbiamo proprio toccate
Ecco, questo e' un grosso problema.
Quando si studia all'universita' non bisogna aspettare il "prof" per fare gli esercizi. Quella e' roba da scuole di istruzione inferiore dove Il prof spiega la teoria poi dice quali esercizi fare, poi il compito in classe si basa su quegli esercizi. All'universita' il prof spiega la teoria e basta. Per certe materie ci sono gli assistenti che spiegano come si svolgano gli esercizi. Ma poi sta agli studenti di fare esercizi su eserizi finche' non si capisce come farli, perche specialmente in informatica la teoria la si capisce solo mettendola in pratica. Se non si capisce, si torna dal professore (o dai suoi assistenti) nelle ore in cui sono disponibili, e si cerca aiuto da loro. O si cerca in rete, ormai in rete si trova una valanga di codice in ogni linguaggio.
 
Ecco, questo e' un grosso problema.
Quando si studia all'universita' non bisogna aspettare il "prof" per fare gli esercizi. Quella e' roba da scuole di istruzione inferiore dove Il prof spiega la teoria poi dice quali esercizi fare, poi il compito in classe si basa su quegli esercizi. All'universita' il prof spiega la teoria e basta. Per certe materie ci sono gli assistenti che spiegano come si svolgano gli esercizi. Ma poi sta agli studenti di fare esercizi su eserizi finche' non si capisce come farli, perche specialmente in informatica la teoria la si capisce solo mettendola in pratica. Se non si capisce, si torna dal professore (o dai suoi assistenti) nelle ore in cui sono disponibili, e si cerca aiuto da loro. O si cerca in rete, ormai in rete si trova una valanga di codice in ogni linguaggio.
Guarda @Andretti60, sarò fortunato io, ma i professori che ho avuto hanno dato una valanga di esercizi. Certamente non siamo alle superiori dove ti chiedono di aver svolto i "compiti per casa", ma per la mia esperienza personale ho sempre avuto tanto materiale da studiare in relazione con gli esercizi. Dubito fortemente che non ci siano esercizi, però chissà mai dire mai!
 
Allora matrice è un doppio puntatore. Ecco perche matrice lo dichiari come double ** matrice. Di norma i puntatori vengono utilizzati in c per l'allocazione dinamica dei vettori, per un secondo dimentica che matrice sia un double**, ma fai finta che sia solo un semplice puntatore double*.
Allora matrice in memoria ha l'indirizzo del primo elemento del vettore creato dinamicamente dalla malloc. Anziché metterci i dati in memoria nell'elemento [0] il doppio puntatore(adesso entra il gioco il secondo asterisco) segnala che in realtà il vettore da noi creato è a sua volta un insieme di puntatori che in memoria hanno tanti indirizzi di vettori creati. Quindi se noi volessimo creare una matrice 3x3. avremo che matrice punterà ad un vettore di puntatori di 3 elementi, in ognuno di questi 3 elementi in memoria ci sarà l'indirizzo di un vettore di double di 3 elementi. Ci sei?
P.s.
Scusa il disegno molto blando, ma volevo risponderti il prima possibile
Ok, allora, io ho capito che per esempio dichiarando una variabile per esempio puntatore a intero (int *puntatore), puntatore contiene l'indirizzo di memoria di una variabile intera. Quindi, dichiarando una matrice double** matrice, sia *matrice che matrice contengono un indirizzo di memoria?
 
Ok, allora, io ho capito che per esempio dichiarando una variabile per esempio puntatore a intero (int *puntatore), puntatore contiene l'indirizzo di memoria di una variabile intera. Quindi, dichiarando una matrice double** matrice, sia *matrice che matrice contengono un indirizzo di memoria?
Sì esattamente del primo elemento del vettore. Esatto anche per la seconda eccetto per gli * cioé sia **matrice che *matrice contengono indirizzi di memoria. Arrivato a questa comprensione ancora da digerire non sarà difficile per te capire che se sono dichiarate in questo modo le matrici allora posso la sintassi giusta per accedere alla matrice è composta da una sola coppia di quadre.
matrice[.....]
Il punto è cosa ci metto qui dentro??
Prova a scrivere una matrice 3x3 su un foglio di carta dove in 00 c'è 0 in 01 c'è 1 in 02 c'è 2
|0 1 2|
|3 4 5|
|6 7 8|
Riesci a trovare una semplice formula che ti dia l'indice?
 
Sì esattamente del primo elemento del vettore. Esatto anche per la seconda eccetto per gli * cioé sia **matrice che *matrice contengono indirizzi di memoria.
Quindi, *matrice contiene l'indirizzo di memoria del primo elemento del vettore, mentre matrice che indirizzo di memoria contiene?
 
Quindi, *matrice contiene l'indirizzo di memoria del primo elemento del vettore, mentre matrice che indirizzo di memoria contiene?
Occhio agli * altrimenti non ci capiamo.
**matrice ha l'indirizzo del primo elemento di un vettore di puntatori.
*matrice ha l'indirizzo del primo elemento di un vettore di double quindi capisci che all'interno di questi vettori ci sono gli elementi giusto?
Codice:
**matrice--------------->*matrice(x1|x2|x3)
*matrice[x1]------------->(xx|xx|xx) prima tupla di valori.
*matrice[x2]----------->(yy|yy|yy) seconda tupla di valori.
*matrice[x3]------------>(zz|zz|zz) terza tupla di valori-
 
Occhio agli * altrimenti non ci capiamo.
**matrice ha l'indirizzo del primo elemento di un vettore di puntatori.
*matrice ha l'indirizzo del primo elemento di un vettore di double quindi capisci che all'interno di questi vettori ci sono gli elementi giusto?
Codice:
**matrice--------------->*matrice(x1|x2|x3)
*matrice[x1]------------->(xx|xx|xx) prima tupla di valori.
*matrice[x2]----------->(yy|yy|yy) seconda tupla di valori.
*matrice[x3]------------>(zz|zz|zz) terza tupla di valori-
si...capisco
--- i due messaggi sono stati uniti ---
Sì esattamente del primo elemento del vettore. Esatto anche per la seconda eccetto per gli * cioé sia **matrice che *matrice contengono indirizzi di memoria. Arrivato a questa comprensione ancora da digerire non sarà difficile per te capire che se sono dichiarate in questo modo le matrici allora posso la sintassi giusta per accedere alla matrice è composta da una sola coppia di quadre.
matrice[.....]
Il punto è cosa ci metto qui dentro??
Prova a scrivere una matrice 3x3 su un foglio di carta dove in 00 c'è 0 in 01 c'è 1 in 02 c'è 2
|0 1 2|
|3 4 5|
|6 7 8|
Riesci a trovare una semplice formula che ti dia l'indice?
sul libro vengono utilizzate sempre due coppie di quadre
 
Perfetto questa è la struttura di un doppio puntatore, adesso scrivendo la matrice come ti ho detto:

|0 1 2|
|3 4 5|
|6 7 8|
Riesci a trovare una formula da mettere inserire tra le quadre per accedere al valore da te cercato?
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top