#include<stdio.h>
#include<stdlib.h>
/* Teraz zadeklarujemy funkcję i zmienne globalne. Najpierw funkcja mnożenia.
Przyjmuje ona jako swoje parametry wskaźnik do początku macierzy lewej macierzy
składającej się ze zmiennych typu float, następnie ilość wierszy i ilość kolumn.
Potem te same parametry odnoszące się do prawej macierzy. Wartością funkcji jest wskaźnik
do zmiennej, która z kolei jest wskaźnikiem do zmiennej typu float.
*/
float **produkt_macierzy(float *,int,int,float *,int,int);
/* Teraz zadeklarujemy (zdefiniujemy) zmienne globalne, które będą obowiązywać w całym tym pliku,
od momentu deklaracji do końca pliku. Pierwsza zmienna jest tablicą 3 wskaźników do zmiennych
typu float.
*/
float *p[3],rl,cr;
int main(void){
float **wsk_il; /* wsk_il jest wskaźnikiem tego samego typu co wartość funkcji produkt_macierzy. */
/* Dla świętego spokoju, na razie macierze do pomnożenia deklarujemy jako dwie ustalone:
lewa o 2 wierszach i 3 kolumnach, i prawa o 3 wierszach i 4 kolumnach. Takie dwie macierze
da się pomnożyć.
*/
float A[2][3]={{1,2,3},{4,5,6}},B[3][4]={{4,3,2,1},{6,5,4,3},{2,-4,6,-8}};
int i,j;
/* Cała praca zostanie wykonana przez następującą linijkę, przywołującą funkcję produkt_macierzy. */
wsk_il=produkt_macierzy(&A[0][0],sizeof(A)/sizeof(A[0]),sizeof(A[0])/sizeof(float),
&B[0][0],sizeof(B)/sizeof(B[0]),sizeof(B[0])/sizeof(float));
/* Sizeof zwraca wielkość obiektu. W ten sposób drugi parametr funkcji to jest iloświerszy,
a drugi parametr to ilość kolumn macierzy A, i tak samo z macierzą B. wsk_il pokazuje na iloczyn
macierzy. Pozostaje ten iloczyn wypisać.
*/
printf("\n");
for (i = 0 ; i < **wsk_il ; i++){
for (j = 0 ; j < **(wsk_il+1) ; j++){
printf("%f", *(wsk_il[2] + i*((int) *wsk_il[1]) + j));
}
printf("\n");
}
return EXIT_SUCCESS;
}
float **produkt_macierzy(float *lewa , int wiersze_lewa , int kolumny_lewa , float *prawa ,
int wiersze_prawa , int kolumny_prawa){
float **wsk, suma;
int i,j,k;
wsk=p;
rl=wiersze_lewa;
cr=kolumny_prawa;
if (kolumny_lewa != wiersze_prawa){
printf("\nTych macierzy nie da się pomnożyć.\n");
return NULL;
}
p[0]=&rl;
p[1]=&cr;
p[2]=(float*) malloc((2+wiersze_lewa*kolumny_prawa)*sizeof(float));
for(i = 0 ; i < wiersze_lewa ; i++){
for(j = 0 ; j < kolumny_prawa ; j++){
for(k = 0, suma = 0 ; k < kolumny_lewa ; k++){
suma+=(*(lewa + i*kolumny_lewa + k))*(*(prawa+k*kolumny_prawa + j));
}
*(p[2] + i*kolumny_prawa +j) = suma;
}
}
return wsk;
}