Restituire array da una funzione

di il
6 risposte

Restituire array da una funzione

Salve a tutti,
ho fatto un programmino per il calcolo matriciale.
All'interno del main() chiamo la funzione Prod_Matrix come si può vedere nel codice di seguito.
Ho eliminato delle parti per farlo più corto.
#include<stdio.h>
#include<math.h>

double Prod_Matrix (double X[][4], double X_T[][6], int r1, int c1, int r2, int c2);

int main() {

	int i, j, r1=6, c1=4, r2=4, c2=6;
	double X [6][4] =   {{167.4,.......17.1,1}},
		X_T [4][6],
		Matrix_X [4][4];
	double *z;

	printf ("La matrice X è:\n");
	for (i=0; i<r1; i++)
	for (j=0; j<c1; j++){
	printf ("%f;",X[i][j]);
	if (j==3)
	printf (";\n");
	}

	z = Prod_Matrix (X, X_T, 6, 4, 4, 6); 	//chiamo la funzione che moltiplica le matrici

	for (i=0; i<r1; i++)		 	//riassegno in un array i valori del prodotto
	for (j=0; j<c1; j++)
	Matrix_X[j][i] = *z++;

	printf ("Il prodotto tra le matrici è:\n");	//stampo il prodotto tra matrici

	for (i=0; i<4; i++)
	for (j=0; j<4; j++){
	printf ("%f;",Matrix_X[i][j]);
	if (j==3)
	printf (";\n");
	}

	return 0;
}
La funzione Prod_Matrix è questa:
#include<stdio.h>
#include<math.h>

//prodotto matricale (nota: è possibile se r1 == c2)

double Prod_Matrix (double a[][4], double b[][6], int r1, int c1, int r2, int c2)
{

int i, j, k;
double prod[r1][c2];
double *c;

for (i=0; i < r1; i++)
for (j=0; j < c2; j++)
for (k=0; k < c1; k++)
prod[i][j] += a[i][k] * b[k][j];

printf ("Il prodotto tra le matrici è:\n");

	for (i=0; i<4; i++)
	for (j=0; j<4; j++){
	printf ("%f;",prod[i][j]);
	if (j==3)
	printf (";\n");
	}

c = prod[0][0];

return &c ;
}

Stampando nella funzione Prod_Matrix non ci sono problemi il programma funziona anche se ho 2 valori sbagliati.

Ma come faccio a stamparlo nel main().
So che in C le funzioni non possono restituire array quindi ho provato a fare due cose:
1) mettere l'array prodotto come variabile globale mettendela fuori dal main() e è ok.
2) restituire l'indirizzo del primo elemento dell'array con un puntatore (esempio precedente) ma non va. Qualcuno sa dirmi dove ho sbagliato?

Grazie per qualsiasi consiglio o spiegazione

6 Risposte

  • Re: Restituire array da una funzione

    So che in C le funzioni non possono restituire array quindi ho provato a fare due cose:
    1) mettere l'array prodotto come variabile globale mettendela fuori dal main() e è ok.
    2) restituire l'indirizzo del primo elemento dell'array con un puntatore (esempio precedente) ma non va. Qualcuno sa dirmi dove ho sbagliato?
    Generalmente, se restituisci il puntatore ad una variabile locale (che sta sullo stack) ci sta che uscito dalla funzione questa sia stata "sporcata" perchè comunque lo stack è cambiato: non si fa.
    La soluzione più semplice è quella di passare oltre ai puntatori alle due matrici a e b anche il puntatore alla matrice con il risultato.
  • Re: Restituire array da una funzione

    Grazie per la risposta.

    Ma che ci faccio con a e b?
    Mi puoi scrivere che modifiche proponi al programma?
  • Re: Restituire array da una funzione

    Ma che ci faccio con a e b?
    a e b non sono gli input della tua funzione?
    double Prod_Matrix (double a[][4], double b[][6], int r1, int c1, int r2, int c2)
    Mi puoi scrivere che modifiche proponi al programma?
    no mi dispiace
  • Re: Restituire array da una funzione

    Sì, ok... poi ci provo...
  • Re: Restituire array da una funzione

    Ho definito la matrice finale come Matrix_X e ho modificato la funzione cosi:

    Prototipo:
    double Prod_Matrix (double X[][4], double X_T[][6], double Matrix_X [][4], int r1, int c1, int r2, int c2);
    Funzione:
    double Prod_Matrix (double a[][4], double b[][6], double Matrix_X [][4], int r1, int c1, int r2, int c2)
    {
    int i, j, k;
    double prod[r1][c2];
    
    for (i=0; i < r1; i++)
    for (j=0; j < c2; j++)
    for (k=0; k < c1; k++)
    Matrix_X [i][j] += a[i][k] * b[k][j];
    
    printf ("Il prodotto tra le matrici è:\n");
    
    	for (i=0; i<4; i++)
    	for (j=0; j<4; j++){
    	printf ("%f;",Matrix_X [i][j]);
    	if (j==3)
    	printf (";\n");
    	}
    
    return Matrix_X [0][0];
    }
    main():
    
    double *z;
    
    z = Prod_Matrix (X, X_T, Matrix_X, 6, 4, 4, 6); 	//chiamo la funzione che moltiplica le matrici
    
    	for (i=0; i<r1; i++)		 	//riassegno in un array i valori del prodotto
    	for (j=0; j<c1; j++)
    	Matrix_X[j][i] = *z++;
    Mi da il seguente errore dove chiamo la funzione:
    incompatible types when assigning to type 'double *' from type 'double'

    Oppure:
    Prototipo:
    double* Prod_Matrix (double X[][4], double X_T[][6], double *p, int r1, int c1, int r2, int c2);
    Funzione:
    
    double* Prod_Matrix (double a[][4], double b[][6], double *p, int r1, int c1, int r2, int c2)
    {
    
    int i, j, k;
    double prod[r1][c2];
    
    for (i=0; i < r1; i++)
    for (j=0; j < c2; j++)
    for (k=0; k < c1; k++)
    prod [i][j] += a[i][k] * b[k][j];
    
    printf ("Il prodotto tra le matrici è:\n");
    
    for (i=0; i<4; i++)
    for (j=0; j<4; j++){
    printf ("%f;", prod [i][j]);
    if (j==3)
    printf (";\n");
    }
    
    p = prod[0][0];
    
    return &p;
    }
    
    errore su p = prod[0][0]; incompatible types when assigning to type 'double *' from type 'double'
    errore su return &p;
    Multiple markers at this line
    - return from incompatible pointer type [-Wincompatible- pointer-types]
    - function returns address of local variable [-Wreturn-local-addr]

    main ():
    double *z, *p;
    
    z = Prod_Matrix (X, X_T, p, 6, 4, 4, 6); 
  • Re: Restituire array da una funzione

    La funzione Prod_Matrix() non deve ritornare niente, al limite può ritornare un intero per dire ad esempio 1=prodotto eseguito e 0=errore nell'operazione (come per es. le dimensioni non corrette).
    Inoltre, quando richiami Prod_Matrix devi passare una matrice già adeguatamente allocata, così come fai per le due matrici di input.
Devi accedere o registrarti per scrivere nel forum
6 risposte