[C] problema tipizzazione

di il
3 risposte

[C] problema tipizzazione

Salve,
ho un problema con un programma scritto in C. Ho bisogno di calcolare l'inversa in C, quando però compilo da terminale Ubuntu mi esce l'errore:
"incompatible type when returning type 'double' b but float * was expected"

Premetto che il codice "base" l'ho trovato su internet, e l'ho modificato utilizzando un unico blocco di memoria (in quanto mi serve in seguito per delle procedure di ottimizzazione):
#define	MATRIX	float*
MATRIX inversa(int n, MATRIX X) {

	MATRIX a = alloc_matrix(n,n);
	MATRIX inversa= alloc_matrix(n,n);
	float m, pivot, det;
	int i, j, k;

	/* Uso una matrice di appoggio `a'		*/
	/* b e' inizializzata all'identita'		*/



	//a=alloca_matrice(n);

	for (i = 0; i < n*n; i++) {

		a[i]=X[i];
		inversa[i] = 0.0;
		inversa[i*(n+1)+i] = 1.0;
	}

	/* Ax = b  ->  LUx = b  ->  Ux = inv(L)b		*/
	/* Fase I: moltiplica per l'inversa di L	*/

	for (k = 0; k < n; k++) {
		pivot = a[k*(n+1)+k];
		if (fabs(pivot) < 5e-16)
		return 0.0;

		for (i = k + 1; i < n; i++) {
			m = a[i*(n+1)+k] / pivot;
			for (j = 0; j < n; j++) /* Ottimizzare: come? */
			inversa[i*(n+1)+j] -= m * inversa[k*(n+1)+j];
			for (j = k; j < n; j++)
			a[i*(n+1)+j] -= m * a[k*(n+1)+j];
		}
	}

	/* Ux = inv(L)b  ->  x = inv(U)(inv(L)b)	*/
	/* Fase II: moltiplica per inv(U)		*/
	/*          = sostituzione all'indietro    	*/
	/* Il det. e` dato dal prodotto degli U_ii	*/

	det = 1.0;
	for (i = n - 1; i >= 0; i--) {
		pivot = a[i*(n+1)+i];
		if (fabs(pivot) < 5e-16)
		return 0.0;
		det *= pivot;
		for (k = 0; k < n; k++) {
			m = inversa[i*(n+1)+k];
			for (j = i + 1; j < n; j++)
			m -= a[i*(n+1)+j] * inversa[j*(n+1)+k];
			inversa[i*(n+1)+k] = m / pivot;
		}
	}

	return inversa;
}
Non riesco a capire dove sbaglio

3 Risposte

  • Re: [C] problema tipizzazione

    Non ho controllato nulla del codice (quindi non so se è logicamente corretto) ma ho visto che esegui

    return 0.0;

    e questo è sbagliato dato che la funzione restituisce un puntatore a double (0.0 non è un puntatore a double)
  • Re: [C] problema tipizzazione

    Infatti ho corretto, mettendo return inversa (anche se il calcolo ritornato alla fine è sbagliato, ma almeno per il momento riesco a testare il resto).. Ma scusa float* non è un puntatore float e non un puntatore double?! Quale è la differenza?!
  • Re: [C] problema tipizzazione

    Sì ... intendevo dire puntatore a float ... double è un tipo di dato simile al float ma più preciso.

    Se vuoi restituire un puntatore nullo puoi scrivere

    return (float *)NULL;
Devi accedere o registrarti per scrivere nel forum
3 risposte