Lỗi tạm dừng khi chạy chương trình

Đây là một bài tạo ma trân bằng con trỏ kép. Nhưng khi e nhập đến ma trận 2 thì nó hiện lỗi "has stopped working’ mà em không biết tại sao. Mong mọi người giúp e với ạ.

typedef struct complex_num{
    double Re;
    double Im;
}num;

int getInt(int *a);
int getDouble(double *a);
void output_matrix(num **p, int n, int m);
void input_matrix_complex(num **p,int n,int m);
void inputMatrixReal (num **p,int n, int m);
void plus_matrix(num **p, num **p1,num **p2, int n, int m);
void multiplication_matrix(num **p, num **p1, num **p2, int n, int m, int q);

int i,j;

int getInt(int *a){
    int n;
    n=(int*)calloc(n,sizeof(int));
    do{
            n=scanf("%d",a,sizeof(int));
            if (n<0)
                return 0;
            if(n==0||(*a<=0)){
                printf("%s\n","Error");
                scanf("%*c",0);
            }
    }while(n==0);
    return 1;
    }

int getDouble(double *a){
    int n;
    do{
            n=scanf("%lf", a, sizeof(double));
            if(n<0)
                return 0;
            if(n==0){
                printf("%s\n","Error");
                scanf("%*c", 0);
            }
    }while (n==0);
    return 1;
}

void output_matrix(num **p, int n, int m){
    for(i=0;i<n;i++){
        for(j=0;j<m;j++)
            if(p[i][j].Im==0.0) printf("\t%10.1lf",p[i][j].Re);
            else if (p[i][j].Re==0.0) printf("\t%0.1lf\t",p[i][j].Im);
            else printf("\t%-0.1f+%0.1fi",p[i][j].Re,p[i][j].Im);
    printf("\n");
    }
}

void input_matrix_complex(num **p,int n,int m){
    for(i=0;i<n;i++){
        for(j=0;j<m;j++){
            printf("Enter[%d][%d]:\t",i,j);
            printf("Re= ");
            getDouble(&p[i][j].Re);
            printf("\t\tIm= ");
            getDouble(&p[i][j].Im);
        }
    }
}

void inputMatrixReal (num **p,int n, int m){
    for(i=0;i<n;i++){
        for(j=0;j<m;j++){
            printf("Enter [%d][%d]: ",i,j);
            getDouble(&p[i][j].Re);
            p[i][j].Im=0.0;
        }
    }
}

void plus_matrix(num **p, num **p1,num **p2, int n, int m){
    for(i=0;i<n;i++){
        for(j=0;j<m;j++){
            p[i][j].Re = p1[i][j].Re + p2[i][j].Re;
            p[i][j].Im = p1[i][j].Im + p2[i][j].Im;
        }
    }
}

void multiplication_matrix(num **p, num **p1, num **p2, int n, int m, int q){
    int k;
    for (i=0; i<n; i++)
    for (j=0;j<m;j++){
        p[i][j].Re = 0.0;
        p[i][j].Im = 0.0;
        for(k=0;k<q;k++){
            p[i][j].Re+=p1[i][k].Re*p2[k][j].Re-p1[i][k].Im*p2[k][j].Im;
            p[i][j].Im+=p1[i][k].Re*p2[k][j].Im+p1[i][k].Im*p2[k][j].Re;
        }
    }
}

void main(){
    int a;
    int n1,m1,n2,m2;
    num **p,**p1,**p2;
    printf("Elements are complex or real number?\n");
    printf("1.Complex number\n");
    printf("2.Real number\n");
    do{
        getInt(&a);
        switch(a){
        case 1:system("cls"); printf("\n-----------------------------Complex num----------------------------------\n");break;
        case 2:system("cls"); printf("\n-----------------------------Real num-------------------------------------\n");break;
        default:printf("Error"); a=0;
        }
    }while(a==0);


    printf("How many lines of matrix 1? N1= ");
    getInt(&n1);
    printf("How mant columns of matrix 1? M1= ");
    getInt(&m1);
    p1=(double**)malloc(sizeof(double)*n1*m1);
    printf("\nMatrix 1:\n");
    if (a==1) input_matrix_complex(p1,n1,m1);
    if (a==2) inputMatrixReal(p1,n1,m1);
    output_matrix(p1,n1,m1);

    printf("How many lines of matrix 2? N2= ");
    getInt(&n2);
    printf("How mant columns of matrix 2? M2= ");
    getInt(&m2);
    p2=(double**)calloc(p2,sizeof(double)*n2*m2);
    printf("\nMatrix 2:\n");
    if (a==1) input_matrix_complex(p2,n2,m2);
    if (a==2) inputMatrixReal(p2,n2,m2);
    output_matrix(p2,n2,m2);

    printf("\n------------------------------------------------\n");
    if(n1!=n2||m1!=m2) printf("Can't plus matrix 1 and matrix 2");
        else{
                printf("\nSum matrix 1 + matrix 2:\n");
                p=(double**)malloc(n1*sizeof(double));
                for(i=0;i<n1;i++){
                    p[i]=(double*)malloc(m1*sizeof(double));
                }
                plus_matrix(p,p1,p2,n1,m1);
                output_matrix(p,n1,m1);
                free(p);
    }
    printf("\n---------------------------------------\n");
    if(m1==m2){
        printf("\nMutiplication matrix 1 X matrix 2:\n");
        p=(double**)malloc(n1*sizeof(double));
        for(i=0;i<n1;i++){
            p[i]=(double*)malloc(m2*sizeof(double));
        }
        multiplication_matrix(p,p1,p2,n1,m2,m1);
        output_matrix(p,n1,m2);
    }
    else printf("\nMatrix 1 can't multiply by matrix 2");
    free(p1);
    free(p2);
    getch();
}

Thay đoạn này

p1=(double**)malloc(sizeof(double)*n1*m1);

bằng

int i; // iteration
// ...
p1 = (num**) malloc(sizeof(num*) * n1);
for (i = 0; i < n1; i++) {
    p1[i] = (num*) malloc(sizeof(num) * m1);

Khi xoá p1, thay

p1 = free(p1);

bằng

for (i = 0; i < n1; i++) {
    free(p1[i]);
}
free(p1);

Tương tự cho p và p2 :kissing:

2 Likes

Sau khi e thay thì nó lại hiện lỗi “error expected expression before double” :thinking:

Mình sửa lại rồi, bạn thử xem. :kissing_smiling_eyes:

À vâng được rồi ạ ^^ Em cảm ơn a

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?