Matrici allocate dinamicamente linguaggio c

Frank2000

Nuovo Utente
17
0
Salve!
Devo creare un programma in c nel quale l'utente inserisce due matrici, di cui viene fatta poi la somma e il prodotto. Devo effettuare queste operazioni tramite funzioni.
Ora mi sto concentrando sulla funzione che crea la matrice, ma sto riscontrando non pochi problemi. In particolare non riesco a capire quali parametri di ingresso inserire nella definizione della funzione. Le matrici vanno allocate dinamicamente, quindi l'utente deve inserire il numero di righe e colonne della matrice e viene utilizzata la funzione malloc.
Ecco il codice finora, dove sto solo facendo la funzione che crea la matrice :
C:
/* inclusione delle librerie */
#include <stdio.h>

/* dichiarazione delle funzioni */

void crea_matrice(double **);

int main(void)
{
    
     double **matrice;
     crea_matrice(matrice[][num_colonne]);
     return(0);
}

/* definizione della funzione per creare una matrice */

void crea_matrice(double ** matrice[][num_colonne])
{


        int num_righe, num_colonne;
        int i, j;
 
        printf("inserisci il numero di righe della matrice --> ");
scanf("%d",&num_righe);

printf("\n\nInserisci il numero di colonne della matrice --> ");
scanf("%d",&num_colonne);

/* inizializzo le righe della matrice */

matrice= (double**) malloc (num_righe*sizeof(double*));

/* inizializzo anche tutte le colonne della matrice */

for(i = 0; i< num_righe; i++)
{
     matrice[I] = (double*)malloc(num_colonne*sizeof(double));
}[/I]

/*riempio la matrice*/

  for( i = 0; i < num_righe; i++)
   {
      for(j = 0; j< num_colonne; j++)
      {
         printf("\nElemento della %d riga e della %d colonna: ", i+1, j+1);
         scanf("%lf", &matrice[j]);
      }
   }
   
   printf("Ecco la matrice:\n\n");

   for(i=0; i<num_righe; i++)
   {
      
      for( j=0; j< num_colonne; j++)
      {
          
         printf(" %.2f ",matrice[j]);
      }
      printf("\n");
   }


}
Come dichiaro la matrice, che parametri inserisco, e nella main quali variabili dichiaro? Grazie
 

Andretti60

Utente Èlite
3,805
2,563
In C ci sono due modi per usare matrici multidimensionali: creare un vettore con dimensione (righe*colonne) e poi "lavorare" sugli indici per localizzare il giusto elemento, oppure creare una vettore i cui elementi sono a loro volta dei vettori (come hai fatto tu).
Come crei la "matrice" va bene, ma non la accedi nel modo corretto. Per accedere all'elemento (i,j) devi
C:
    double *riga;
    riga = matrice[i];
    double valore;
    valore = riga[j];
Suggerimento: in C++ si scriverebbe la matrice come una Class, nascondendo i dettagli. In C non puoi farlo, ma qui hai ben tre variabili che occorre tenere assieme: la matrice stessa, il numero delle righe e quello delle colonne. In questi casi e' piu' conveniente usare una struttura:
C:
typedef struct Matrice
{
    double *matrice;
    int numRighe;
    int numColonne;
} Matrice;
Dichiara la tua variable di tipo Matrice e passala alle funzioni, risulta molto piu' facile e incorri in meno errori potenziali.
 
  • Mi piace
Reactions: BAT00cent e fabio93

Frank2000

Nuovo Utente
17
0
In C ci sono due modi per usare matrici multidimensionali: creare un vettore con dimensione (righe*colonne) e poi "lavorare" sugli indici per localizzare il giusto elemento, oppure creare una vettore i cui elementi sono a loro volta dei vettori (come hai fatto tu).
Come crei la "matrice" va bene, ma non la accedi nel modo corretto. Per accedere all'elemento (i,j) devi
C:
    double *riga;
    riga = matrice[i];
    double valore;
    valore = riga[j];
Suggerimento: in C++ si scriverebbe la matrice come una Class, nascondendo i dettagli. In C non puoi farlo, ma qui hai ben tre variabili che occorre tenere assieme: la matrice stessa, il numero delle righe e quello delle colonne. In questi casi e' piu' conveniente usare una struttura:
C:
typedef struct Matrice
{
    double *matrice;
    int numRighe;
    int numColonne;
} Matrice;
Dichiara la tua variable di tipo Matrice e passala alle funzioni, risulta molto piu' facile e incorri in meno errori potenziali.
okay grazie, ho capito cosa intendi. Scusa il disturbo, potresti mostrarmi il codice completo? Perchè davvero, ho paura di fare errori e bloccarmi
 

Andretti60

Utente Èlite
3,805
2,563
MAI avere paura di fare errori. Altrimenti non si fara' mai nulla nella vita (non solo nella programmazione).
Hai due strumenti a tua disposizione. Il primo e' il compilatore, metti al massimo gli avvisi di compilazione e fanne buon uso. Il secondo e' il debugger, metti un punto break nella linea di codice che puo' avere problemi, e quando si ferma stampa il valore attuale delle variabili.
 

ilfe98

Moderatore
Staff Forum
1,410
438
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
Hard Disk
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
Scheda Video
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
Alimentatore
680 w thermaltake
Case
Itek lunar 23
Internet
Tiscali ftth
Sistema Operativo
windows 10,mint,debian
okay grazie, ho capito cosa intendi. Scusa il disturbo, potresti mostrarmi il codice completo? Perchè davvero, ho paura di fare errori e bloccarmi
Mmm difficile avere il codice completo andrebbe contro ciò che sarebbe costruttivo. Detto questo prova a farlo tu se hai problemi puoi caricare il codice qui, nessuno è mai riuscito a fare qualcosa senza prima sbagliare, anzi nel mondo informatico sono rare le volte in cui il tuo codice compila al 100% al primo tentativo.
 

ilfe98

Moderatore
Staff Forum
1,410
438
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
Hard Disk
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
Scheda Video
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
Alimentatore
680 w thermaltake
Case
Itek lunar 23
Internet
Tiscali ftth
Sistema Operativo
windows 10,mint,debian

ilfe98

Moderatore
Staff Forum
1,410
438
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
Hard Disk
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
Scheda Video
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
Alimentatore
680 w thermaltake
Case
Itek lunar 23
Internet
Tiscali ftth
Sistema Operativo
windows 10,mint,debian
Questo programma devo farlo per un esame universitario, e devo terminarlo entro il 19
Caschi male allora, non è il programma in se, ma puoi capire che se non riesci ad accedere correttamente ai dati allora non puoi neanche lontanamente sperare di manipolarli, se noi ti dessimo il codice servirebbe a ben poco se tu non capissi il funzionamento.
 

ilfe98

Moderatore
Staff Forum
1,410
438
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
Hard Disk
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
Scheda Video
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
Alimentatore
680 w thermaltake
Case
Itek lunar 23
Internet
Tiscali ftth
Sistema Operativo
windows 10,mint,debian

Frank2000

Nuovo Utente
17
0
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
 

ilfe98

Moderatore
Staff Forum
1,410
438
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
Hard Disk
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
Scheda Video
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
Alimentatore
680 w thermaltake
Case
Itek lunar 23
Internet
Tiscali ftth
Sistema Operativo
windows 10,mint,debian
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
Allora vediamo un po' di arrivare ad una soluzione. Quello che hai creato in realtà cos'è?
Aggiungo inoltre che l'innesto dei for va bene quindi
C:
for(size_t i=0;i<rows;i++){
      for(size_t j=0;i<cols;j++){
      }
}
 

Frank2000

Nuovo Utente
17
0
Allora vediamo un po' di arrivare ad una soluzione. Quello che hai creato in realtà cos'è?
Aggiungo inoltre che l'innesto dei for va bene quindi
C:
for(size_t i=0;i<rows;i++){
      for(size_t j=0;i<cols;j++){
      }
}
Quello che ho creato è un codice che serve per riempire una matrice. Questo intendi?
 

ilfe98

Moderatore
Staff Forum
1,410
438
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
Hard Disk
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
Scheda Video
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
Alimentatore
680 w thermaltake
Case
Itek lunar 23
Internet
Tiscali ftth
Sistema Operativo
windows 10,mint,debian
Questo
matrice= (double**) malloc (num_righe*sizeof(double*));
 

Entra

oppure Accedi utilizzando