Creazione di un header:e' corretto?[C]

fk16
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);

Risposte
apatriarca
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.

fk16
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);

apatriarca
Sì, così va meglio. Ma sarebbe meglio inserire anche le include guard.

Raptorista1
Scusate se mi intrometto :)
Nelle funzioni somma e k_prodotto non è inutile dire le dimensioni delle matrici?

apatriarca
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.

Raptorista1
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?

apatriarca
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.

Raptorista1
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.

vict85
"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.

Raptorista1
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! :)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.