Creazione di un header:e' corretto?[C]
Volevo solo sapere se era corretto il seguente esercizio.
/*Scrivere il codice di un file header che contenga solo i prototipi delle funzioni per la gestione di matrici di double. Prevedere almeno le funzioni per la somma e la moltiplicazione di matrici, la moltiplicazione di una matrice per una costante e una funzione per il calcolo della trasposta.*/
#include
#include
void somma(double**,double**,int,int);
void prodotto(double**,double**,int,int);
void k_prodotto(double**,int,int,int);
void trasposta(double**,int,int);
/*Scrivere il codice di un file header che contenga solo i prototipi delle funzioni per la gestione di matrici di double. Prevedere almeno le funzioni per la somma e la moltiplicazione di matrici, la moltiplicazione di una matrice per una costante e una funzione per il calcolo della trasposta.*/
#include
#include
void somma(double**,double**,int,int);
void prodotto(double**,double**,int,int);
void k_prodotto(double**,int,int,int);
void trasposta(double**,int,int);
Risposte
No, non è corretto. Per prima cosa non è chiaro il motivo per cui siano stati inclusi stdio.h e stdlib.h. Sono certamente inutili in una libreria di questo tipo e certamente ancora meno nell'header. Per cui vanno eliminati. Abbastanza importanti in pratica sono invece le include guards che non hai inserito. Forse non te li hanno insegnati.
Infine, non hanno senso i prototipi delle funzioni. In particolare, il risultato non sembra venire restituito in nessun modo. Devi o aggiungere un parametro apposito per restituire il risultato oppure avere come tipo di ritorno double **. Ma la matrice risultato deve essere restituita in qualche modo se no non ha senso. Per quanto riguarda il resto dei parametri delle funzioni, la somma va bene, anche se io non rappresenterei una matrice in quel modo ma come un array monodimensionale. Il prodotto è invece sbagliato. Ci sono infatti 3 dimensioni delle matrici da conoscere in questo caso e non due. Perché si possano moltiplicare due matrici è infatti necessario che la prima sia di dimensione \(m \times k\) e la seconda \(k \times n\) e il risultato avrà dimensione \(m \times n\). Per cui manca un parametro int. k_prodotto va abbastanza bene, ma non è chiaro perché la costante dovrebbe essere un intero invece del più sensato double. La trasposta va infine abbastanza bene come argomenti.
Infine, non hanno senso i prototipi delle funzioni. In particolare, il risultato non sembra venire restituito in nessun modo. Devi o aggiungere un parametro apposito per restituire il risultato oppure avere come tipo di ritorno double **. Ma la matrice risultato deve essere restituita in qualche modo se no non ha senso. Per quanto riguarda il resto dei parametri delle funzioni, la somma va bene, anche se io non rappresenterei una matrice in quel modo ma come un array monodimensionale. Il prodotto è invece sbagliato. Ci sono infatti 3 dimensioni delle matrici da conoscere in questo caso e non due. Perché si possano moltiplicare due matrici è infatti necessario che la prima sia di dimensione \(m \times k\) e la seconda \(k \times n\) e il risultato avrà dimensione \(m \times n\). Per cui manca un parametro int. k_prodotto va abbastanza bene, ma non è chiaro perché la costante dovrebbe essere un intero invece del più sensato double. La trasposta va infine abbastanza bene come argomenti.
Quindi dovrebbe essere così???
double** somma(double**,double**,int,int);
double** prodotto(double**,double**,int,int,int);
double** k_prodotto(double**,double,int,int);
double** trasposta(double**,int,int);
double** somma(double**,double**,int,int);
double** prodotto(double**,double**,int,int,int);
double** k_prodotto(double**,double,int,int);
double** trasposta(double**,int,int);
Sì, così va meglio. Ma sarebbe meglio inserire anche le include guard.
Scusate se mi intrometto 
Nelle funzioni somma e k_prodotto non è inutile dire le dimensioni delle matrici?

Nelle funzioni somma e k_prodotto non è inutile dire le dimensioni delle matrici?
Una volta che un array viene passato ad una funzione, la sua dimensione viene persa e quindi è necessario passare sempre la dimensione insieme ad ogni array.
Ok, ma se sto sommando due matrici, io sommo posto a posto indipendentemente dalla dimensione; potrei benissimo prendere due array, sommare posto a posto e restituire l'array. La dimensione con cui ricostruire la matrice è un problema dello scope in cui la matrice è memorizzata, se vogliamo.
Idem per il prodotto per uno scalare. Dico bene?
Idem per il prodotto per uno scalare. Dico bene?
No, perché all'interno della funzione si ha solo un indirizzo e non si ha alcuna idea di quale possa essere la dimensione della matrice o il numero di elementi. Passando tralaltro la matrice come scelto da fk16, le due dimensioni sono necessarie in quanto ogni riga è memorizzata separatamente.
Sì, vero, quindi al limite se le matrici sono di dimensioni \(m \times n\) dovrei passare il numero \(mn\) e poi muovermi con matrix++ per \(mn\) volte.
"Raptorista":
Sì, vero, quindi al limite se le matrici sono di dimensioni \(m \times n\) dovrei passare il numero \(mn\) e poi muovermi con matrix++ per \(mn\) volte.
In genere non si lavora con matrici bidimensionali ma con array monodimensionali di dimensione \(\displaystyle mn \). D'altra parte la funzione da te proposta la trovo poco coerente con l'interfaccia della matrice. Lo sarebbe se invece si usasse la rappresentazione vettoriale della matrice sin dall'inizio.
Sìsì, penso anche io che sia meglio mantenere la leggibilità del codice piuttosto che risparmiare la memoria di un int.. Era più che altro una curiosità teorica!
