Siemka, mam napisać program w C, który liczy iloczyn dwóch macierzy. Nie wiem do końca, dlaczego nie działa, podejrzewałbym, że coś spartaczyłem w funkcji liczącej macierz iloczynu (MAC_IL). Dodałem trochę printfów, żeby rozumieć, co się dzieje w środku, ale nie rozumiem tego zupełnie (wyniki printf'ów zupełnie mnie zbiły z tropu), coś jest zupełnie nie tak.
Kody:
funkcja tworząca macierz iloczynu
#include <stdio.h>
#include "MACIERZ_S.h"
int iloczyn (struct MACIERZ_S *MACIERZ1, struct MACIERZ_S *MACIERZ2, struct MACIERZ_S *MAC_IL) {
if ((*MACIERZ1).x != (*MACIERZ2).y)
return 1;
else if ((*MACIERZ1).x == (*MACIERZ2).y) {
int i, j, l;
for (i=0; i < (*MACIERZ1).x ; i++) {
printf ("i = %d", i); //te printfy sprawdzają, co się dzieje w tej funkcji
for (j=0; j < (*MACIERZ2).y ; j++) {
(*MAC_IL).wsk[i+j*4] = 0;
printf ("MI = %d", (*MAC_IL).wsk[i+j*4]);
printf ("j = %d", j);
for (l=0; l < j; l++) {
(*MAC_IL).wsk[i+j*4] = (*MAC_IL).wsk[i+j*4]+(*MACIERZ1).wsk[i+l]*(*MACIERZ2).wsk[l+j*4];
printf ("MI = %d", (*MAC_IL).wsk[i+j*4]);
}
}
}
return 0;
}
else
return 1;
}
program główny
#include <stdio.h>
#include <stdlib.h>
#include "MACIERZ_S.h"
#include "iloczyn.c"
#include "m_create.c"
#include "m_scanf.c"
#include "m_printf.c"
int main () {
struct MACIERZ_S M1, M2, MAC_IL;
printf ("Wpisz rozmiary macierzy\n");
printf ("Wymiar pierwszej: ");
scanf ("%d %d", &M1.x, &M1.y);
printf ("\nWymiar drugiej: ");
scanf ("%d %d", &M2.x, &M2.y);
m_create (&M1);
m_create (&M2);
printf ("\nWprowadź parametry do macierzy\n");
printf ("Macierz 1:\n");
m_scanf (&M1);
printf ("Macierz 2:\n");
m_scanf (&M2);
m_printf (&M1);
printf ("\n");
m_printf (&M2);
m_create (&MAC_IL);
iloczyn (&M1, &M2, &MAC_IL);
m_printf (&MAC_IL);
return 0;
}
struktura MACIERZ_S
#ifndef _MACIERZ_S_H
#define _MACIERZ_S_H
struct MACIERZ_S {
int x; //rozmiar - szerokosc
int y; //rozmiar - wysokosc
int *wsk; // "tablica" x na y
};
#endif /* MACIERZ_S.h */
funkcja pobierająca wartości do obu macierzy
void m_scanf (struct MACIERZ_S *MACIERZ) {
int i,j;
for(i=0; i<(*MACIERZ).x ; i++) {
for(j=0; j<(*MACIERZ).y ; j++) {
scanf("%d", &(*MACIERZ).wsk[(*MACIERZ).y*i+j]);
}
}
return;
}
funkcja wypisująca zawartości macierzy
void m_printf (struct MACIERZ_S *MACIERZ) {
int i,j;
for(i=0; i<(*MACIERZ).x ; i++) {
for(j=0; j<(*MACIERZ).y ; j++) {
printf("%d ", (*MACIERZ).wsk[(*MACIERZ).y*i+j]);
if (j == (*MACIERZ).y - 1)
printf ("\n");
}
}
return;
}
program alokujący pamięć dla macierzy
void m_create(struct MACIERZ_S *MACIERZ) {
printf("%d %d", (*MACIERZ).x, (*MACIERZ).y); //sprawdza, czy podane wartości zgadzają się
(*MACIERZ).wsk=malloc((*MACIERZ).y*(*MACIERZ).x*sizeof(int));
return;
}
for (l=0; l < j; l++) {