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