Matrici allocate dinamicamente linguaggio c

Programmazione

Frank2000

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
 
#1

Andretti60

Utente Èlite
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: BAT e fabio93
#2

Frank2000

Andretti60 ha detto:
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
 
#3

Andretti60

Utente Èlite
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.
 
#4

ilfe98

Staff Forum
Utente Èlite
Frank2000 ha detto:
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.
 
#5

Frank2000

Lo so avete ragione ragazzi, il problema è che ho davvero poco tempo...
 
#6

ilfe98

Staff Forum
Utente Èlite
Frank2000 ha detto:
Lo so avete ragione ragazzi, il problema è che ho davvero poco tempo...
Per cosa scusa?
 
#7

Frank2000

ilfe98 ha detto:
Per cosa scusa?
Questo programma devo farlo per un esame universitario, e devo terminarlo entro il 19
 
#8

ilfe98

Staff Forum
Utente Èlite
Frank2000 ha detto:
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.
 
#9

Frank2000

lo so, ma guardare il codice e come funziona mi aiuterebbe a capirlo
 
#10

ilfe98

Staff Forum
Utente Èlite
Frank2000 ha detto:
lo so, ma guardare il codice e come funziona mi aiuterebbe a capirlo
Scusa che università frequenti? Il prof. nelle slide non ti ha spiegato come si fa?
 
#11

Frank2000

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
 
#12

ilfe98

Staff Forum
Utente Èlite
Frank2000 ha detto:
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++){
      }
}
 
#13

Frank2000

ilfe98 ha detto:
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?
 
#14

ilfe98

Staff Forum
Utente Èlite
Questo
matrice= (double**) malloc (num_righe*sizeof(double*));
 
#15
Stato
Discussione chiusa ad ulteriori risposte.