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

Odpowiedz Nowy wątek
2011-12-31 15:08
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

Dev-C++ to zuo! Skompiluj go pod czymś normalnym i sprawdź, czy działa poprawnie. - Patryk27 2011-12-31 15:12
Chcesz powiedzieć, że na uczelni macie coś starszego niż dev 4.9.9.2?:) - kopernik 2011-12-31 17:05
Kompilują na papirusie :D - Patryk27 2011-12-31 17:06

Pozostało 580 znaków

2011-12-31 15:45
0

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


Co kurła debuguj ten kod i streszczaj się klientowi chce się fixa, a jak nie kurła to odpale visuala i ci pomoge a tego byś nie chciał

Pozostało 580 znaków

2011-12-31 16:44
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).

Pozostało 580 znaków

2011-12-31 16:49
0

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


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Pozostało 580 znaków

2011-12-31 17:11
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);
        }
    }
}
edytowany 2x, ostatnio: kopernik, 2011-12-31 17:11

Pozostało 580 znaków

2012-01-01 18:21
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;

2)

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ę)

3)
Nie znalazłem

free(D);

Szacuje się, że w Polsce brakuje 50 tys. programistów
edytowany 3x, ostatnio: vpiotr, 2012-01-01 18:31
@2: ja piszę double* jeśli chodzi o typ zwracany, ale double *tab1 jeśli chodzi o zmienne i parametry. - Azarien 2012-01-01 19:23

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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