Program różnie działa względem kompilatorów

0

Witam,
piszę program na uczelnie na zaliczenie i problem jest taki że on mi działa jak go kompilje w domy w dev 4.9.9.2 a na uczyelni gdzi jest starszy to po skompilowaniu nie działa tak jak chcę.

 #include <stdio.h>



double* mnozMacierz(double *tab1,double *tab2,int x,int y, int d, double* mnozona);
void wypiszMacierz(double *tab, int x, int y);
void wprowadzMacierz( double *tab, int x, int y, char a);





//###########################################################################################
int main(){
    int Aw, Ak;
    int Bw,Bk;
    
    printf("Program przyjmujący i mnożący 2 macierze prostokatne\nMacierze definiowane sa przez wymiar wierszy i kolumn:");
     printf("\n___________________________________________________\n");
     
     //Określanie macierzy A
     printf("\nOkreślanie macierzy A:\n\t\twierszy=");
     scanf("%d",&Aw);//wiersze macierzy
     printf("\n\t\tkolumny=");// kolumny macierzy
     scanf("%d",&Ak);
     double *A;
     A = (double*) malloc(Aw*Ak*sizeof(double));
     wprowadzMacierz( A, Aw,Ak,'A');
     printf("\nPostać macierzy A:\n");   
      wypiszMacierz(A, Aw, Ak);
     printf("\n___________________________________________________\n");
   
    
    //Określanie macierzy B
    printf("\nOkreślanie macierzy B:\n\t\twierszy=");
     scanf("%d",&Bw);//wiersze macierzy
     printf("\n\t\tkolumny=");// kolumny macierzy
     scanf("%d",&Bk);
     double *B ;
     B=(double*) malloc(Bw*Bk*sizeof(double));
      wprowadzMacierz( B, Bw,Bk,'B');
      printf("\nPostać macierzy B:\n");
     wypiszMacierz(B, Bw, Bk);
      printf("\n___________________________________________________\n");
     
     
     //Mnożenie macierzy
     double *C;
     C=(double *) malloc(Aw*Bk*sizeof(double));
     double *D;
     D= (double*) malloc(Bw*Ak*sizeof(double));
     
                printf("Uzyskane wniki mnożenia macierzy:");
                printf("\n A*B:\n");
                           if(Ak==Bw){
                                      
                                       mnozMacierz(A,B,Aw,Bk, Ak,C);
                                      wypiszMacierz( C, Aw, Bk);
                           }else printf("Nie można pomnożyć tych macierzy");
                        
                    
                  printf("\n\n B*A:\n");          
                           if(Bk==Aw){   
                                        
                                        D=mnozMacierz(B,A,Bw,Ak, Aw,D);   
                                        wypiszMacierz(D,Bw, Ak);
                           }else printf("Nie można pomnożyć tych macierzy");
                           printf("\n___________________________________________________\n");
  free(A);
   free(B);
   free(C);
   system("PAUSE");
    getchar();  
    return 0;

}
//################################################################################################
//  
void wypiszMacierz(double *tab, int w, int k){
      int i,j;
     
                          
                          for(i=0;i<w;i++){
                                           for(j=0;j<k;j++){
                                                            printf("%6.2lf  ",*(tab+i*k+j));
                                                          
                                                                                                                  
                                                            }
                                                            printf("\n");
                                           }
                                          printf("\n"); 
                                                  
     
     }
double* mnozMacierz(double* tab1,double* tab2,int w,int k, int d,double* mnozona){
        int i,j,l =0;
       
         for( i=0; i<w; i++) {
                                 for( j=0; j<k; j++){ 
                                                           for(l=0; l<d; l++){
                                                                    
                                                            *(mnozona+i*k+j) += *(tab1+i*d+l) *( *(tab2+l*k+j)); 
                                                                          }
                                                                          }
                                                                          }
                                                                  
                                                                  return mnozona;         
        
         }
void wprowadzMacierz( double *tab, int w, int k, char a){
     int i,j;
     for(i=0;i<w;i++){
                                           for(j=0;j<k;j++){
                                           
                                                            printf("%C(%d,%d) = ", a, i+1,j+1);
                                                            scanf("%lf", tab+i*k+j);
                                                            }              
                                           }
     }

Z tego co sam analizowałem to prolem jest przy alokacji pamięci przy:

  double *C;
     C=(double *) malloc(Aw*Bk*sizeof(double));
     double *D;
     D= (double*) malloc(Bw*Ak*sizeof(double));

Zwykłe proste mnożenie macierzy, a program myli się w alokacji.
Pozdrawiam i dziękuję z góry

0

Tzn. nie kompiluje się - są błędy? Czy źle działa - nie zaalokował pamięci?

0

Kompliluje i nie wyrzuca żadnych błędów przy kompilacji.

Jak skompilowałem w nowszym dev to dobrze wyświetla, a w starym to wypisuje elementy macierzy jakby były to okropnie duże liczby ( adresy).

0

Stare Devy mają zabugowane MinGWy. Zmień kompilator na nowszą wersję.

0

Za bardzo nie wgłębiałem się w kod, ale wkleiłem do normalnego kompilatora i zobaczyłem, że zapomniałeś o bibliotece stdlib. Pamiętam, że Dev jakoś magicznie sam sobie je dodawał, jak zapomniałeś, ale normalne kompilatory nie wróżą z fusów.. Zobacz, chyba o to chodzi..

#include <stdio.h>
#include <stdlib.h>
double* mnozMacierz(double *tab1,double *tab2,int x,int y, int d, double* mnozona);
void wypiszMacierz(double *tab, int x, int y);
void wprowadzMacierz( double *tab, int x, int y, char a);
int main(){
    int Aw, Ak;
    int Bw,Bk;
    printf("Program przyjmujący i mnożący 2 macierze prostokatne\nMacierze definiowane sa przez wymiar wierszy i kolumn:");
    printf("\n___________________________________________________\n");
    printf("\nOkreślanie macierzy A:\n\t\twierszy=");
    scanf("%d",&Aw);//wiersze macierzy
    printf("\n\t\tkolumny=");// kolumny macierzy
    scanf("%d",&Ak);
    double *A;
    A = (double*) malloc(Aw*Ak*sizeof(double));
    wprowadzMacierz( A, Aw,Ak,'A');
    printf("\nPostać macierzy A:\n");
    wypiszMacierz(A, Aw, Ak);
    printf("\n___________________________________________________\n");
    printf("\nOkreślanie macierzy B:\n\t\twierszy=");
    scanf("%d",&Bw);//wiersze macierzy
    printf("\n\t\tkolumny=");// kolumny macierzy
    scanf("%d",&Bk);
    double *B ;
    B=(double*) malloc(Bw*Bk*sizeof(double));
    wprowadzMacierz( B, Bw,Bk,'B');
    printf("\nPostać macierzy B:\n");
    wypiszMacierz(B, Bw, Bk);
    printf("\n___________________________________________________\n");
    //Mnożenie macierzy
    double *C;
    C=(double *) malloc(Aw*Bk*sizeof(double));
    double *D;
    D= (double*) malloc(Bw*Ak*sizeof(double));
    printf("Uzyskane wniki mnożenia macierzy:");
    printf("\n A*B:\n");
    if(Ak==Bw){
        mnozMacierz(A,B,Aw,Bk, Ak,C);
        wypiszMacierz( C, Aw, Bk);
    }
    else printf("Nie można pomnożyć tych macierzy");
    printf("\n\n B*A:\n");
    if(Bk==Aw){
        D=mnozMacierz(B,A,Bw,Ak, Aw,D);
        wypiszMacierz(D,Bw, Ak);
    }
    else printf("Nie można pomnożyć tych macierzy");
    printf("\n___________________________________________________\n");
    free(A);
    free(B);
    free(C);
    system("PAUSE");
    getchar();
    return 0;
}
void wypiszMacierz(double *tab, int w, int k){
    int i,j;
    for(i=0; i<w; i++){
        for(j=0; j<k; j++){
            printf("%6.2lf  ",*(tab+i*k+j));
        }
        printf("\n");
    }
    printf("\n");
}
double* mnozMacierz(double* tab1,double* tab2,int w,int k, int d,double* mnozona){
    int i,j,l =0;
    for( i=0; i<w; i++){
        for( j=0; j<k; j++){
            for(l=0; l<d; l++){
                *(mnozona+i*k+j) += *(tab1+i*d+l) *( *(tab2+l*k+j));
            }
        }
    }
    return mnozona;
}
void wprowadzMacierz( double *tab, int w, int k, char a){
    int i,j;
    for(i=0; i<w; i++){
        for(j=0; j<k; j++){
            printf("%C(%d,%d) = ", a, i+1,j+1);
            scanf("%lf", tab+i*k+j);
        }
    }
}

0

Masz kilka błędów w tym programie...

Najważniejszy:

  • sprawdź czym się różni malloc() od calloc()
  • potem zwróć uwagę że nawet calloc() nie będzie odpowiedni ze względu na alokowany typ danych
  • a potem zajrzyj do mnozMacierz, a konkretnie w linii:
*(mnozona+i*k+j) += *(tab1+i*d+l) *( *(tab2+l*k+j)); 
  • wykorzystujesz poprzednią wartość tablicy "mnozona" ale nigdzie jej nie inicjujesz

Mniejsze błędy, raczej stylistyczne niż faktyczne:
1)

// zamiast:
int i,j,l =0;
// napisz:
int i, j;
int l = 0;
double* mnozMacierz(double *tab1,double *tab2,int x,int y, int d, double* mnozona);
  • musisz się zdecydować - albo piszesz "double* zmienna" albo "double *zmienna" (polecam drugą wersję)

Nie znalazłem

free(D);

1 użytkowników online, w tym zalogowanych: 0, gości: 1