Từ 1 tới 10 trên tổng số 10 kết quả

Đề tài: Lỗi segmentation fault khi hàm trả về NULL?

  1. #1
    Ngày gia nhập
    04 2012
    Bài viết
    5

    Question Lỗi segmentation fault khi hàm trả về NULL?

    Chào mọi người, em đang làm bài tập về ma trận nghịch đảo. Em đã làm xong code, code chạy tốt khi ma trận có nghịch đảo, tuy nhiên nếu ma trận nhập vào mà không có nghịch đảo (det =0) thì máy lại báo segmentation fault. Ai biết nguyên nhân giúp em với ạ. Cảm ơn mọi người.
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    
    double **allocation(int TAILLE);
    void delocation(double **matrice, int TAILLE);
    void affiche(double **matrice, int TAILLE);
    double **tranpose(double **matrice, int TAILLE);
    double **multiplication(double **matrice, double **matrice_t, int TAILLE);
    double **inversion(double **A, int TAILLE);
    double **opposition(double **A, int TAILLE);
    double **addition(double **A, double **B, int TAILLE);
    
    int main()
    {
        int n,i,j;
        int TAILLE=2;
        double **matrice, **matrice_t, **A_inv;
        printf("n= ");
        scanf("%d",&n);
    
       	for (i=0; i<n-1; i++)
       	{
           	TAILLE=TAILLE*n;
       	}
        matrice = allocation(TAILLE);
        matrice_t = allocation(TAILLE);
    
      	printf ("Matrice %dx%d.\n",TAILLE, TAILLE);
       	printf ("Valeur: ");
       	for (i=0; i<TAILLE; i++)
       	{
            for (j=0; j<TAILLE; j++)
            {
                scanf("%lg",&matrice[i][j]);
            }
        }
    
    	printf("Matrice: \n");
    	affiche(matrice, TAILLE);
    
    	matrice_t = tranpose(matrice, TAILLE);
    	printf("Matrice tranpose: \n");
    	affiche(matrice_t, TAILLE);
    
    	inversion(matrice,TAILLE);
    	A_inv = inversion(matrice_t, TAILLE);
    	printf("inversion: \n");
        affiche(A_inv, TAILLE);
    	delocation(matrice, TAILLE);
    	delocation(matrice_t, TAILLE);
        delocation(A_inv, TAILLE);
    
    	return EXIT_SUCCESS;
    }
    
    double **allocation(int TAILLE)
    {
    	int i;
    	double **matrice;
    	matrice= (double**) malloc(TAILLE * sizeof(double));
    	for (i=0; i<TAILLE; i++)
    	{
    		matrice[i]=(double*) malloc(TAILLE * sizeof(double));
    	}
    	return matrice;
    }
    
    void delocation(double **matrice, int TAILLE)
    {
    	int i;
    	for (i = 0; i < TAILLE; i++)
        {
    		free(matrice[i]);
    	}
        free(matrice);
    }
    
    void affiche(double **matrice, int TAILLE)
    {
    	int i,j;
    	for (i=0; i<TAILLE; i=i+1)
    	{
    		for (j=0; j<TAILLE; j=j+1)
    		{
    			printf("%lg  ",matrice[i][j]);
    		}
    		printf("\n");
    	}
    }
    
    double **tranpose(double **matrice, int TAILLE)
    {
    	int i,j;
    	double **matrice_t;
    	matrice_t = allocation(TAILLE);
    	for(i=0;i<TAILLE;i++)
    	{
    		for(j=0;j<TAILLE;j++)
    		{
    			matrice_t[i][j]=matrice[j][i];
    		}
    	}
    	return matrice_t;
    }
    
    double **multiplication(double **matrice, double **matrice_t, int TAILLE)
    {
    	double **multi;
    	multi=allocation(TAILLE);
    	int i,j,k;
    	for (i=0; i<TAILLE; i++)
    	{
    		for (j=0; j<TAILLE; j++)
    		{
    			multi[i][j]=0;
    			for (k=0; k<TAILLE; k++)
    			{
    				multi[i][j]=multi[i][j]+matrice[i][k]*matrice_t[k][j];
    			}
    		}
    	}
    	return multi;
    }
    
    double **addition(double **A, double **B, int TAILLE)
    {
        int i,j;
        double **somme;
        somme = allocation(TAILLE);
        for(i=0; i<TAILLE; i++)
        {
           	for(j=0; j<TAILLE; j++)
           	{
          		somme[i][j] = A[i][j] +B[i][j];
           	}
        }
        return somme;
    }
    
    double **opposition(double **A, int TAILLE)
    {
        int i,j;
        double **oppo;
        oppo = allocation(TAILLE);
    	for(i=0; i<TAILLE; i++)
    	{
    		for(j=0; j<TAILLE; j++)
    		{
    			oppo[i][j] = -A[i][j];
    		}
    	}
    	return oppo;
    }
    /* INVERSION MATRICE */
    double **inversion(double **A, int TAILLE)
    {
        int i,j;
        double **A_inv;
        A_inv=allocation(TAILLE);
    
        if (TAILLE==2)
        {
        	double det=A[0][0]*A[1][1]-A[0][1]*A[1][0];
    		if (det==0)
            {
                printf("Il n'y a pas inverse\n");
    			return NULL;
    		}
    		else
    		{
    			A_inv[0][0] = A[1][1] * 1/det;
    			A_inv[1][1] = A[0][0] * 1/det;
    			A_inv[1][0] = -A[0][1] * 1/det;
    			A_inv[0][1] = -A[1][0] * 1/det;
    		}
    	}
        	else
        	{
            	int new_taille=TAILLE/2;
            	double **B, **C_t, **C, **D;
            	B=allocation(new_taille);
            	C=allocation(new_taille);
            	C_t=allocation(new_taille);
            	D=allocation(new_taille);
    
    
            	double **A_inv11, **A_inv12, **A_inv21, **A_inv22;
            	A_inv11=allocation(new_taille);
            	A_inv12=allocation(new_taille);
            	A_inv21=allocation(new_taille);
            	A_inv22=allocation(new_taille);
    
            	for (i=0; i<new_taille; i++)							// 1) coupe en blocs de taille n/2
            	{
               	 	for (j=0; j<new_taille; j++)
                		{
                    		B[i][j]   = A[i][j];
                    		C_t[i][j] = A[i][j + new_taille];
                    		C[i][j]   = A[i + new_taille][j];
                    D[i][j]   = A[i + new_taille][j + new_taille];
                }
            }
    
            double **B_inv = allocation(new_taille);
            B_inv = inversion(B, new_taille);					// 2) calcule B^-1
            double **CB_inv = allocation(new_taille);
            CB_inv = multiplication(C, B_inv, new_taille);			//3) C*B^-1
            double **S = allocation(new_taille);
            S = addition(D, opposition(multiplication(CB_inv,C_t,new_taille),new_taille),new_taille);			//4 Calcule S
            double **S_inv = allocation(new_taille);
            S_inv = inversion(S, new_taille);					//5
    
            A_inv21 = opposition(multiplication(S_inv, multiplication(C, B_inv,new_taille),new_taille), new_taille);		//6
            A_inv11 = addition(B_inv, multiplication(multiplication(B_inv, C_t,new_taille), opposition(A_inv21,new_taille),new_taille),new_taille);//7
            A_inv12 = opposition(multiplication(multiplication(B_inv, C_t,new_taille), S_inv,new_taille),new_taille);
            A_inv22 = S_inv;
    
            for (i=0; i<new_taille; i++)
            {
                for (j=0; j<new_taille; j++)
                {
                    A_inv[i][j] = A_inv11[i][j];
                    A_inv[i][j+new_taille] = A_inv12[i][j];
                    A_inv[i+new_taille][j] = A_inv21[i][j];
                    A_inv[i+new_taille][j+new_taille] = A_inv22[i][j];
                }
            }
        }
    	return A_inv;
    }

  2. #2
    Ngày gia nhập
    07 2011
    Nơi ở
    Modova
    Bài viết
    123

    Code của bạn dài quá và thật khó để soát được, đây là một số thông tin về lỗi này:

    http://en.wikipedia.org/wiki/Segmentation_fault

    Bạn hãy tham khảo và khắc phục.
    A good beginning and a good ending !

  3. #3
    Ngày gia nhập
    11 2010
    Bài viết
    589

    Lý do ở ngay tiêu đề, bạn đã tự trả lời được rồi, còn hỏi gì nữa ?
    Truy cập vào NULL mà không có lỗi thì phải thế nào mới đúng ?

  4. #4
    Ngày gia nhập
    04 2012
    Bài viết
    5

    Trích dẫn Nguyên bản được gửi bởi boss14420 Xem bài viết
    Lý do ở ngay tiêu đề, bạn đã tự trả lời được rồi, còn hỏi gì nữa ?
    Truy cập vào NULL mà không có lỗi thì phải thế nào mới đúng ?
    Cảm ơn anh đã trả lời. Em cũng biết lỗi do return NULL nhưng không biết sửa thế nào. Ở đây em phải làm gì để chương trình đến đó sẽ dừng hẳn luôn ? Cảm ơn anh

  5. #5
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    Muốn dừng chương trình, thì gọi exit(-1);
    C Code:
    1.      exit(-1);
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

  6. #6
    Ngày gia nhập
    04 2012
    Bài viết
    5

    Mặc định Lỗi segmentation fault khi hàm trả về NULL?

    Trích dẫn Nguyên bản được gửi bởi doicanhden Xem bài viết
    Muốn dừng chương trình, thì gọi exit(-1);
    C Code:
    1.      exit(-1);
    nhưng hàm của mình là double ** mà sao trả về int được?

  7. #7
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    ???? double gì cơ chứ?? Bạn cứ thử thêm dòng đó vào rồi chạy thử đi. ~~>"<~~
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

  8. #8
    Ngày gia nhập
    04 2012
    Bài viết
    5

    Trích dẫn Nguyên bản được gửi bởi doicanhden Xem bài viết
    ???? double gì cơ chứ?? Bạn cứ thử thêm dòng đó vào rồi chạy thử đi. ~~>"<~~
    Hàm là: double **inversion(double **A, int TAILLE)

    nên khi chạy vẫn bị báo :
    warning: return makes pointer from integer without a cast|

    Khi chạy chuơng trình, máy vẫn báo kết quả nhưng đến cuối báo tiếp segmentation fault. Giống như khi để return NULL.

  9. #9
    Ngày gia nhập
    11 2010
    Bài viết
    589

    Trích dẫn Nguyên bản được gửi bởi hung91 Xem bài viết
    Cảm ơn anh đã trả lời. Em cũng biết lỗi do return NULL nhưng không biết sửa thế nào. Ở đây em phải làm gì để chương trình đến đó sẽ dừng hẳn luôn ? Cảm ơn anh
    C Code:
    1. if(inve...() == NULL)
    2.      exit(-1);

  10. #10
    Ngày gia nhập
    04 2012
    Bài viết
    5

    Trích dẫn Nguyên bản được gửi bởi boss14420 Xem bài viết
    C Code:
    1. if(inve...() == NULL)
    2.      exit(-1);
    Tiếc là không có nút thank. Cảm ơn bạn nhiều

Các đề tài tương tự

  1. Hàm xử lý Xâu chạy sai, báo lỗi: Segmentation fault
    Gửi bởi xonefmBKA trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 26-11-2011, 11:25 PM
  2. lỗi segmentation fault bài về xâu kí tự
    Gửi bởi pentest trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 45
    Bài viết cuối: 07-05-2011, 07:24 PM
  3. Kỹ thuật C Lỗi segmentation fault xảy ra khi nào ?
    Gửi bởi nmt1402 trong diễn đàn Thắc mắc lập trình C/C++ trên Linux
    Trả lời: 2
    Bài viết cuối: 01-04-2011, 05:33 PM
  4. Lỗi segmentation fault, làm sao sửa?
    Gửi bởi lamhaianh trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 12-04-2010, 07:57 PM
  5. Tại sao bị Segmentation fault ?
    Gửi bởi vietwow trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 5
    Bài viết cuối: 05-01-2009, 09:35 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn