Witam Serdecznie :-)

Głowie sie nad programem dlugo i prawie skonczylem.
Wyrzuca mnie z programu na ostatniej funkcji.

Mam błąd w funkcji ODEJMIJ. Nie pojawiają sie jednakze komunikaty o błędzie.
W funkcji ODEJMIJ chodzi o to aby ona wzięła pierwszą macierz (powstałą w wyniku mnożenia - patrz funkcja mnożenie) i odjęła ją od drugiej macierzy (powstałej w wyniku dodawania - patrz funkcja dodawanie).

#include <stdlib.h> 
 #include <stdio.h> 
 #define N 100 
 #define M 100 
  
 struct dane 
 { 
     int ilosc_wierszy; 
     int ilosc_kolumn;                    //dane do macierzy pierwszej (powstalej po mnozeniu)
     int wart_pocz_wiersza; 
     int wart_pocz_kolumny; 
     float skok_wiersza; 
     float skok_kolumny; 
      
     int ilosc_wierszy2; 
     int ilosc_kolumn2;         //dane do macierzy drugiej (powstalej z dodawania)
     int wart_pocz_wiersza2; 
     int wart_pocz_kolumny2; 
     float skok_wiersza2; 
     float skok_kolumny2; 
      
     float *tab;           //tablica kolumn za jej pomoca tworze macierz druga
     float *tab2;          //tablica wierszy
     float **tab1w2;  //pierwsza tablica 2w   wpisuje tutaj macierz mnozenie
     float **tab2w2;  //tablica dwuwymiarowa wpisuje do niej macierz dodawanie
     float **tab3w2;     //tutaj wpisuje macierz odejmowanie
 };     
  
 void pobieranie_danych(struct dane *s) 
 { 
     printf("Macierz #1\n");     //mnozenie 
     printf("----------\n\n\n"); 

     printf("Podaj ilosc wierszy: "); 
     scanf("%d",&s->ilosc_wierszy); 

     printf("Podaj ilosc kolumn: "); 
     scanf("%d",&s->ilosc_kolumn);  

     printf("Podaj wartosc poczatkowa wiersza: "); 
     scanf("%d",&s->wart_pocz_wiersza); 

     printf("Podaj wartosc poczatkowa kolumny: "); 
     scanf("%d",&s->wart_pocz_kolumny); 

     printf("Podaj skok wiersza: "); 
     scanf("%f",&s->skok_wiersza);       
      
     printf("Podaj skok kolumny: "); 
     scanf("%f",&s->skok_kolumny); 
      
     printf("\n\n\n"); 
 }      

 void mnozenie(struct dane *s) 
 { 
      printf("   * "); 
      
     float temp12=0; 
     for (int i=0; i<s->ilosc_kolumn; i++) 
     { 
     printf("%10.2f ",(s->wart_pocz_kolumny)+temp12); 
     temp12=temp12+(s->skok_kolumny); 
     } 
     printf("\n"); 
      
     float temp11=0; 
     for (int i=0; i<s->ilosc_wierszy; i++) 
     { 
     float temp1=0; 
     for (int i=0; i<s->ilosc_kolumn; i++) 
     { 
         if (i==0) printf("%.2f ",(s->wart_pocz_wiersza)+temp11); 
         printf("%10.2f ",((s->wart_pocz_wiersza)+temp11)*((s->wart_pocz_kolumny)+temp1)); 
         temp1=temp1+(s->skok_kolumny); 
     } 
     printf("\n"); 
     temp11=temp11+(s->skok_wiersza); 
     } 
     printf("\n\n\n\n"); 
      
      s->tab1w2=(float**)malloc(N*sizeof(float *)); /* alokacja dynamiczna */ 
  
        for(int i=0; i<M; i++) 
        { 
                 s->tab1w2[i]=(float*)malloc(M*sizeof(float)); 
        } 
      
     printf("Zapisuje macierz do tablicy: \n"); 
     printf("---------------------------\n"); 
      
     //float tab1w2[100][100]; 
     float temp11w=0; 
     for (int i=0; i<s->ilosc_wierszy; i++) 
     { 
     float temp1w=0;     
     for (int j=0; j<s->ilosc_kolumn; j++) 
     { 
         s->tab1w2[i][j]=(s->wart_pocz_wiersza+temp11w)*(s->wart_pocz_kolumny+temp1w); 
         temp1w=temp1w+(s->skok_kolumny); 
         printf("%.2f ",s->tab1w2[i][j]); 
     } 
     printf("\n"); 
     temp11w=temp11w+(s->skok_wiersza); 
     } 
     printf("\n\n\n\n"); 
 } 
  
 void pobieranie_danych2(struct dane *s) 
 { 
     printf("Macierz #2\n");        //dodawanie 
     printf("----------\n\n\n"); 

     printf("Podaj ilosc wierszy: "); 
     scanf("%d",&s->ilosc_wierszy2); 

     printf("Podaj ilosc kolumn: "); 
     scanf("%d",&s->ilosc_kolumn2);  

     printf("Podaj wartosc poczatkowa wiersza: "); 
     scanf("%d",&s->wart_pocz_wiersza2); 

     printf("Podaj wartosc poczatkowa kolumny: "); 
     scanf("%d",&s->wart_pocz_kolumny2); 

     printf("Podaj skok wiersza: "); 
     scanf("%f",&s->skok_wiersza2); 

     printf("Podaj skok kolumny: "); 
     scanf("%f",&s->skok_kolumny2); 
      
     printf("\n\n\n"); 
 }    
  
 void dodawanie(struct dane *s) 
 { 
      printf("\n\n\n"); 
      
     //(float*)malloc(sizeof(float)); 
      
     printf("   + "); 
      
     s->tab=(float*)malloc(s->ilosc_kolumn2 * sizeof(float)); 
      
     float temp2=0; 
     for (int i=0; i<s->ilosc_kolumn2; i++) 
     { 
         s->tab[i]=s->wart_pocz_kolumny2+temp2; 
         temp2=temp2+(s->skok_kolumny2); 
         printf("%.2f ",s->tab[i]); 
     } 
     printf("\n"); 
      
     s->tab2=(float*)malloc(s->ilosc_wierszy2 * sizeof(float)); /* alokacja dynamiczna */ 

     float temp22=0; 
     for (int i=0; i<s->ilosc_wierszy2; i++) 
     { 
         s->tab2[i]=s->wart_pocz_wiersza2+temp22; 
         temp22=temp22+(s->skok_wiersza2); 
     } 

     for (int j=0; j<s->ilosc_wierszy2; j++) 
     { 
     float temp222=0; 
     for (int i=0; i<s->ilosc_kolumn2; i++) 
     { 
         if (i==0)printf("%.2f ",s->tab2[j]+temp222); 
         printf("%.2f ",s->tab2[j]+(s->tab[i])); 
         temp222=temp222+(s->skok_wiersza2); 
     }    
     printf("\n"); 
     } 
     printf("\n\n\n\n"); 

     s->tab2w2=(float**)malloc(N*sizeof(float *)); /* alokacja dynamiczna */ 
  
        for(int i=0; i<M; i++) 
        { 
                 s->tab2w2[i]=(float*)malloc(M*sizeof(float)); 
        } 
      
     printf("Zapisuje macierz do tablicy: \n"); 
     printf("---------------------------\n"); 
     //zapisuje Macierz #2 do tablicy dwuwymiarowej 
      
     float temp22w=0; 
     for (int j=0; j<s->ilosc_wierszy2; j++) 
     { 
     float temp222w=0;     
     for (int i=0; i<s->ilosc_kolumn2; i++) 
     { 
         s->tab2w2[i][j]=s->tab2[j]+(s->tab[i]); 
         temp222w=temp222w+(s->skok_wiersza2); 
         printf("%.2f ",s->tab2w2[i][j]); 
     } 
     printf("\n"); 
     } 
 } 
  
 void odejmowanie(struct dane *s) 
 { 
      printf("\n\n\n\n"); 

     printf("Macierz #3\n");            //odejmowanie 
     printf("----------\n\n\n"); 
     printf("Odejmowanie dwoch macierzy:\n\n\n");     <------------ TEN NAPIS WYSWIETLA I WYRZUCA [!!!]  PROGRAM    nie ma komunikatów o bledzie   

    s->tab1w2=(float**)malloc(N*sizeof(float *)); /* alokacja   dynamiczna */ 
  
        for(int i=0; i<M; i++) 
        { 
                 s->tab1w2[i]=(float*)malloc(M*sizeof(float)); 
        } 

     float temp11w=0;         <--------------- TUTAJ jeszcze raz wyswietlam macierz MNOZENIE   
     for (int i=0; i<s->ilosc_wierszy; i++) 
     { 
     float temp1w=0;     
     for (int j=0; j<s->ilosc_kolumn; j++) 
     { 
         s->tab1w2[i][j]=(s->wart_pocz_wiersza+temp11w)*(s->wart_pocz_kolumny+temp1w); 
         temp1w=temp1w+(s->skok_kolumny); 
         printf("%.2f ",s->tab1w2[i][j]); 
     } 
     printf("\n"); 
     temp11w=temp11w+(s->skok_wiersza); 
     } 
      
     printf("\n-\n\n"); 

     s->tab2w2=(float**)malloc(N*sizeof(float *)); /* alokacja dynamiczna */ 
  
        for(int i=0; i<M; i++) 
        { 
                 s->tab2w2[i]=(float*)malloc(M*sizeof(float)); 
        } 
      
     float temp22w=0;        // <--------------- TUTAJ wyswietlam macierz dodawanie   
     for (int i=0; i<s->ilosc_wierszy2; i++) 
     { 
     float temp222w=0;     
     for (int j=0; j<s->ilosc_kolumn2; j++) 
     { 
         s->tab2w2[j][i]=s->tab2[i]+(s->tab[j]); 
         temp222w=temp222w+(s->skok_wiersza2); 
         printf("%.2f ",s->tab2w2[j][i]); 
     } 
     printf("\n"); 
     } 
      
     printf("\n\n\n\nMacierz #3:\n\n"); 
     //tab1w2[100][100]; 
     //tab2w2[100][100]; 
      
      
     s->tab3w2=(float**)malloc(N*sizeof(float *)); /* alokacja dynamiczna */ 
        for(int i=0; i<M; i++) 
        { 
                 s->tab3w2[i]=(float*)malloc(M*sizeof(float)); 
        } 
         
                  // <---------------tutaj jest algorytm do porownania ktora macierz jest wieksza, aby mozna bylo odjac wieksza od mniejszej:( 
     s->ilosc_kolumn = s->ilosc_kolumn > s->ilosc_kolumn2 ? s->ilosc_kolumn2 : s->ilosc_kolumn;  
     s->ilosc_wierszy = s->ilosc_wierszy > s->ilosc_wierszy2 ? s->ilosc_wierszy2 : s->ilosc_wierszy; 
     //  <------------------------- tutaj jest odejmowanie obydwu macierzy (od macierzy powstalej z mnozenia odejmuje macierz powstala z dodawania) 
     for(int i=0; i<s->ilosc_wierszy; i++) 
     { 
     for(int j=0; j <s->ilosc_kolumn; j++) 
     { 
       s->tab3w2[i][j]=((s->tab1w2[i][j])-(s->tab2w2[j][i])); 
       printf("%.2f ",s->tab3w2[i][j]); 
     } 
     printf("\n"); 
     } 
      
 } 
  
  
 int main() 
 { 
      
     struct dane mnoz; 
 	struct dane dodaj; 
 	struct dane odejmij; 

 	pobieranie_danych(&mnoz); 
 	mnozenie(&mnoz); 
 	 
 	pobieranie_danych2(&dodaj); 
 	dodawanie(&dodaj); 
 	 
 	odejmowanie(&odejmij);       //<------ PO WYWOLANIU TEJ FUNKCJI WYRZUCA PROGRAM     
 	 
     system("PAUSE"); 
 }