#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;
}