Credo sia comunque utile descrivere meglio in che modo avresti potuto restituire un array e una matrice dalla tua funzione in caso diventi necessario in altre occasioni. Non sempre è infatti sufficiente mostrare tali valori. Siccome l'unico problema reale con quella particolare forma che mi viene in mente è la ricerca di autovalori e autovettori generalizzati, che risolvono cioè il problema \( A\,v = \lambda\,B\,v, \) mi inventerò un problema fittizio molto più semplice. Suppongo per comodità quindi che il vettore \(D\) sia la diagonale del prodotto tra \(A\) e \(B\) e \(C\) sia la somma tra le due matrici. Esistono principalmente due strategie:
1. Usare una struttura come valore di ritorno.
2. Passare i valori di ritorno per riferimento.
Le due strategie sono mostrate nel seguente codice:
- Codice:
#include <stdio.h>
#include <stdlib.h>
typedef struct FunResult {
double *C; // Matrice double[size*size]
double *D; // Vettore double[size]
} FunResult;
FunResult functionStruct(size_t N, double A[N*N], double B[N*N])
{
double *C = calloc(N*N, sizeof(double));
double *D = calloc(N, sizeof(double));
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
C[i*N + j] = A[i*N + j] + B[i*N + j];
D[i] += A[i*N + j] * B[j*N + i];
}
}
return (FunResult){ C, D };
}
void functionArgs(size_t N, double A[N*N], double B[N*N], double C[N*N], double D[N])
{
for (int i = 0; i < N; ++i) {
D[i] = 0.0;
for (int j = 0; j < N; ++j) {
C[i*N + j] = A[i*N + j] + B[i*N + j];
D[i] += A[i*N + j] * B[j*N + i];
}
}
}
int main(int argc, char const *argv[])
{
double A[] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
double B[] = {2.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 3.0, 1.0};
FunResult result = functionStruct(3, A, B);
printf("Matrix C:\n");
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j) {
printf("%lf ", result.C[i*3 + j]);
}
printf("\n");
}
printf("Vector D:\n");
for (int i = 0; i < 3; ++i) {
printf("%lf ", result.D[i]);
}
printf("\n");
free(result.C);
free(result.D);
double C[9] = { 0 };
double D[3] = { 0 };
functionArgs(3, A, B, C, D);
printf("Matrix C:\n");
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j) {
printf("%lf ", C[i*3 + j]);
}
printf("\n");
}
printf("Vector D:\n");
for (int i = 0; i < 3; ++i) {
printf("%lf ", D[i]);
}
printf("\n");
return 0;
}
Una versione alloca la matrice e il vettore nella funzione e restituisce una struttura che le contiene entrambe. L'altra invece riceve in ingresso due ulteriori argomenti che verranno usati come output. E' ovviamente possibile mischiare le due strategie. Restituire quindi uno dei due input come valore di ritorno e ricevere l'altro come argomento.