Matrici allocate dinamicamente linguaggio c

Stato
Discussione chiusa ad ulteriori risposte.

Frank2000

Nuovo Utente
26
0
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
Post unito automaticamente:

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:

ilfe98

Moderatore
Staff Forum
Utente Èlite
3,052
1,278
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
HDD
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
GPU
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
PSU
Corsair HX750
Case
Itek lunar 23
Net
Tiscali ftth
OS
windows 10,mint,debian,Arch linux
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
 

ilfe98

Moderatore
Staff Forum
Utente Èlite
3,052
1,278
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
HDD
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
GPU
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
PSU
Corsair HX750
Case
Itek lunar 23
Net
Tiscali ftth
OS
windows 10,mint,debian,Arch linux
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[.........]
 

Frank2000

Nuovo Utente
26
0
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...
 

ilfe98

Moderatore
Staff Forum
Utente Èlite
3,052
1,278
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
HDD
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
GPU
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
PSU
Corsair HX750
Case
Itek lunar 23
Net
Tiscali ftth
OS
windows 10,mint,debian,Arch linux

ilfe98

Moderatore
Staff Forum
Utente Èlite
3,052
1,278
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
HDD
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
GPU
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
PSU
Corsair HX750
Case
Itek lunar 23
Net
Tiscali ftth
OS
windows 10,mint,debian,Arch linux
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.png
    Senza titolo 5.png
    60.3 KB · Visualizzazioni: 26

Andretti60

Utente Èlite
6,440
5,091
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.
 
  • Mi piace
Reazioni: rctimelines

ilfe98

Moderatore
Staff Forum
Utente Èlite
3,052
1,278
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
HDD
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
GPU
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
PSU
Corsair HX750
Case
Itek lunar 23
Net
Tiscali ftth
OS
windows 10,mint,debian,Arch linux
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!
 

Frank2000

Nuovo Utente
26
0
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?
 

ilfe98

Moderatore
Staff Forum
Utente Èlite
3,052
1,278
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
HDD
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
GPU
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
PSU
Corsair HX750
Case
Itek lunar 23
Net
Tiscali ftth
OS
windows 10,mint,debian,Arch linux
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?
 

Frank2000

Nuovo Utente
26
0
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?
 

ilfe98

Moderatore
Staff Forum
Utente Èlite
3,052
1,278
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
HDD
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
GPU
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
PSU
Corsair HX750
Case
Itek lunar 23
Net
Tiscali ftth
OS
windows 10,mint,debian,Arch linux
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-
 

Frank2000

Nuovo Utente
26
0
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
Post unito automaticamente:

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
 

ilfe98

Moderatore
Staff Forum
Utente Èlite
3,052
1,278
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
HDD
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
GPU
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
PSU
Corsair HX750
Case
Itek lunar 23
Net
Tiscali ftth
OS
windows 10,mint,debian,Arch linux
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.

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili