PDA

Visualizza versione completa : funzione void con una matrice come parametro


luca881222
02-12-2007, 14.55.50
non sono in grado di risolvere questo problema, spero saprete aiutarmi.
il programma viene compilato correttamente in c, ma quando inserisco gli elementi delle matrici non li prende.
grazie per l'aiuto

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 3
#define MAXX 3

typedef float matrice[MAX][MAXX];
typedef matrice *pointermatrice;
void inserisci(matrice *m1,matrice *m2);
void calcola(matrice m3,matrice m4,matrice *pm);
void stampa(matrice pm);

/*int *m1,*m2,*pm;*/

main()
{char com,s,n;
matrice ma1,ma2,pmm;
pointermatrice m1,m2,pm;
/*matrice m;
m[0][0]=1;
printf("e'%f",m[0][0]);
system("PAUSE");*/
do
{
system("CLS");
inserisci(&ma1,&ma2);
calcola(ma1,ma2,&pmm);
printf("ma1(11)%f\n\n",&ma1[0][0]);
printf("ma1(12)%f\n\n",&ma1[0][1]);
stampa(pmm);
printf("\n vuoi inserire un nuovo valore? s/n \n");
scanf(" %c",&com);
}
while(com=='s');
system("PAUSE");



}
/*ho sottratto a tutto 1 perchè la matrice parte da 0 e non da 1*/

void inserisci(matrice *m1,matrice *m2)
{_flushall();
printf("inserisci a11\n");
scanf("%f",m1[0][0]);
_flushall();
printf("inserisci a12\n");
scanf("%f",m1[0][1]);
_flushall();
printf("inserisci a13\n");
scanf("%f",m1[0][2]);
_flushall();

printf("inserisci a21\n");
scanf("%f",m1[1][0]);
_flushall();
printf("inserisci a22\n");
scanf("%f",m1[1][1]);
_flushall();
printf("inserisci a23\n");
scanf("%f",m1[1][2]);
_flushall();

printf("inserisci a31\n");
scanf("%f",m1[2][0]);
_flushall();
printf("inserisci a32\n");
scanf("%f",m1[2][1]);
_flushall();
printf("inserisci a33\n");
scanf("%f",m1[2][2]);
_flushall();

printf("inserisci b11\n");
scanf("%f",m2[0][0]);
_flushall();
printf("inserisci b12\n");
scanf("%f",m2[0][1]);
_flushall();
printf("inserisci a13\n");
scanf("%f",m2[0][2]);
_flushall();

printf("inserisci b21\n");
scanf("%f",m2[1][0]);
_flushall();
printf("inserisci b22\n");
scanf("%f",m2[1][1]);
_flushall();
printf("inserisci b23\n");
scanf("%f",m2[1][2]);
_flushall();

printf("inserisci b31\n");
scanf("%f",m2[2][0]);
_flushall();
printf("inserisci b32\n");
scanf("%f",m2[2][1]);
_flushall();
printf("inserisci b33\n");
scanf("%f",m2[2][2]);
_flushall();

}

void calcola(matrice m3,matrice m4,matrice *pm)
{*pm[0][0]=(m3[0][0])*(m4[0][0])+(m3[0][1])*(m4[1][0])+(m3[0][2])*(m4[2][0]);
*pm[0][1]=(m3[0][0])*(m4[0][1])+(m3[0][1])*(m4[1][1])+(m3[0][2])*(m4[2][1]);
*pm[0][2]=(m3[0][0])*(m4[0][2])+(m3[0][1])*(m4[1][2])+(m3[0][2])*(m4[2][2]);

*pm[1][0]=(m3[1][0])*(m4[0][0])+(m3[1][1])*(m4[1][0])+(m3[1][2])*(m4[2][0]);
*pm[1][1]=(m3[1][0])*(m4[0][1])+(m3[1][1])*(m4[1][1])+(m3[1][2])*(m4[2][1]);
*pm[1][2]=(m3[1][0])*(m4[0][2])+(m3[1][1])*(m4[1][2])+(m3[1][2])*(m4[2][2]);

*pm[2][0]=(m3[2][0])*(m4[0][0])+(m3[2][1])*(m4[1][0])+(m3[2][2])*(m4[2][0]);
*pm[2][1]=(m3[2][0])*(m4[0][1])+(m3[2][1])*(m4[1][1])+(m3[2][2])*(m4[2][1]);
*pm[2][2]=(m3[2][0])*(m4[0][2])+(m3[2][1])*(m4[1][2])+(m3[2][2])*(m4[2][2]);
}

void stampa(matrice pm)
{printf("pm11=%f \n",pm[0][0]);
printf("pm12=%f \n",pm[0][1]);
printf("pm13=%f \n",pm[0][2]);

printf("pm21=%f \n",pm[1][0]);
printf("pm22=%f \n",pm[1][1]);
printf("pm23=%f \n",pm[1][2]);

printf("pm31=%f \n",pm[2][0]);
printf("pm32=%f \n",pm[2][1]);
printf("pm33=%f \n",pm[2][2]);

}

UG0_BOSS
04-12-2007, 22.11.59
Vediamo... se ho capito bene il programma dovrebbe leggere due matrici come input, calcolare con queste due matrci (non so di preciso cosa :mm: ) i valori di una terza matrice e restituirla come risultato.

Intanto ti consiglierei di non usare i typedef per definire il tipo matrice perchè secondo me crea confusione e basta; inoltre ho notato che hai fatto un po' di confusione con i puntatori: un puntatore ad un vettore è inutile in quanto il nome del vettore è egli stesso un puntatore al primo elemento.
Esempio: se hai un vettore ed una funzione dichiarati nel seguente modo:
int vettore[n];
void funzione(int *vett);
La chiamata potrà avvenire così:
funzione(vettore);
senza dover utilizzare puntatori nella funzione chiamante.

L'operatore & è da utilizzare quando devi assegnare ad un puntatore l'indirizzo di una variabile, quindi molto spesso serve per passare l'indirizzo di una variabile non-puntatore ad una funzione che invece richiede come argomento una funzione.

L'operatore * ha invece due ruoli diversi: in una dichiarazione serve ad indicare che stai dichiarando non una variabile classica ma un puntatore; nelle istruzioni diventa invece un operatore di indirezione, cioè l'operatore che ti consente di modificare la variabile puntata da un puntatore.

In pratica, quando devi chiamare una funzione che come parametro richiede un puntatore puoi passarle l'indirizzo di una variabile "classica" (funzione(&variabile)) oppure il valore di un suo puntatore (funzione(pVariabile));
ricordando sempre che nel caso di vettori passare il nome del vettore è come passare un puntatore all'elemento 0, quindi la funzione andrà chiamata con funzione(vettore) e non con funzione(&vettore) o funzione(pVettore).

Sono stato spiegato? :D