Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 11 kết quả

Đề tài: [C] Không biết sai ở đâu.

  1. #1
    No Avatar
    Aptechite Khách

    Mặc định [C] Không biết sai ở đâu.

    Yêu cầu là viết 1 chương trình cộng 2 ma trận dùng con trỏ, chương trình của em viết ra chạy đúng khi số nhập vào nhỏ còn khi số nhập vào lớn hay kích thước ma trận lớn là nó chạy ba lăng nhăng. Các bác làm ơn chỉ cho em chỗ sai.
    Code:
    #include <stdio.h>
    #include <conio.h>
    #include <malloc.h>
    
    void main()
    
    {
    
    	int (*a)[10],(*b)[10], i, j, row, col,(*c)[10];
        clrscr ();
    
    	printf("\n Enter the dimension of the matrix : ");
    
    	scanf ("%d %d", &row, &col);
    
    	//Enter matrix a
    
    	a=(int*)malloc(row*col*sizeof(int));
    
    	for(i=0; i<row; i++)
    
    		for(j=0;j<col; j++)
    
    	{
    
    		printf("\n Enter the value of matrix a:\na[%d][%d]", i,j);
    
    		scanf("%d",&a[i][j]);
    
    	}
    
       //Enter matrix b
    
       b= (int*)malloc(row*col*sizeof(int));
    
       for(i=0; i<row; i++)
    
    		for (j=0; j<col; j++)
    
    	{
    
    		printf("\n Enter the value of matrix b:\na[%d][%d]", i, j);
    
    		scanf("%d",&b[i][j]);
    
    	}
    
       for(i=0; i<row; i++)
    
    		for(j=0;j<col; j++)
    
       c[i][j] = a[i][j]+ b[i][j];
    
       for(i=0; i<row; i++)
    
       		for(j=0; j<col; j++)
    
       printf ("\n%d c[%d][%d]",c[i][j],i,j );
    
       getch();
    
    }

  2. #2
    Ngày gia nhập
    10 2006
    Nơi ở
    Rừng Amazon
    Bài viết
    101

    Code:
    int (*a)[10]...
    a=(int*)malloc(row*col*sizeof(int));
    Tôi nghĩ là chương trình không chạy được chứ nhỉ. Theo cách bạn khai báo ở trên thì a là 1 mảng gồm 1 phần tử, mỗi phần tử có kiểu là 1 con trỏ kiểu int. Như vậy a tương được với int **. Một điều nữa, do a là mảng nên a là hằng con trỏ. Vậy làm sao gán được giá trị cho a !

  3. #3
    No Avatar
    Aptechite Khách

    Trích dẫn Nguyên bản được gửi bởi Tarzan
    Code:
    int (*a)[10]...
    a=(int*)malloc(row*col*sizeof(int));
    Tôi nghĩ là chương trình không chạy được chứ nhỉ. Theo cách bạn khai báo ở trên thì a là 1 mảng gồm 1 phần tử, mỗi phần tử có kiểu là 1 con trỏ kiểu int. Như vậy a tương được với int **. Một điều nữa, do a là mảng nên a là hằng con trỏ. Vậy làm sao gán được giá trị cho a !
    Bác nói rõ hơn được không, thế theo bác em phải làm thế nào đây?

  4. #4
    No Avatar
    Aptechite Khách

    Mặc định Em vừa tìm được lỗi sai.

    Em mới tìm được lỗi sai xong, chưong trình chạy được rồi nhưng em mong có bác nào có cách giải khác hay hơn thì làm ơn post lên để em tham khảo.
    Code:
    #include <stdio.h>
    #include <conio.h>
    #include <malloc.h>
    void main()
    
    {
    
    	int r, c, i, j,**p1, **p2,**sum;
    
        clrscr();
    
    	printf ("\nEnter the dimession of the matrix: ");
    
    	scanf ("%d %d", &r, &c);
    
    	p1=(int**)malloc(r*c*sizeof(int));
    
    	p2=(int**)malloc(r*c*sizeof(int));
    
    	//Enter the matrix1
    
    	printf ("\nEnter the value of the matrix 1 : ");
    
    	for(i=0; i<r; i++)
    
    		for(j=0; j<c; j++)
    
    	{
    
    		printf ("\na[%d][%d]",i+1, j+1);
    
    		scanf("%d", &p1[i][j]);
        }
    
    	//Enter the matrix2
    
    	printf ("\nEnter the value of the matrix 2 : ");
    
    	for (i=0; i<c; i++)
    
    		for (j=0; j<c; j++)
    
    
    	{
    		printf ("\nb[%d][%d]", i+1,j+1);
    
    		scanf ("%d",&p2[i][j]);
    
    	}
    
    	//Add 2 matrixes
    
    	for(i=0;i<r; i++)
    
    		for(j=0; j<c;j++)
    
    	{
    
    	sum[i][j]= p1[i][j]+p2[i][j];
    
    	printf ("\nsum[%d][%d] = %d", i+1, j+1, sum[i][j]);
    
    	}
    
    	getch();
    }

  5. #5
    No Avatar
    zeno Khách

    Trích dẫn Nguyên bản được gửi bởi Aptechite
    Yêu cầu là viết 1 chương trình cộng 2 ma trận dùng con trỏ, chương trình của em viết ra chạy đúng khi số nhập vào nhỏ còn khi số nhập vào lớn hay kích thước ma trận lớn là nó chạy ba lăng nhăng. Các bác làm ơn chỉ cho em chỗ sai.
    Code:
    #include <stdio.h>
    #include <conio.h>
    #include <malloc.h>
    
    void main()
    
    {
    
    	int (*a)[10],(*b)[10], i, j, row, col,(*c)[10];
        clrscr ();
    
    	printf("\n Enter the dimension of the matrix : ");
    
    	scanf ("%d %d", &row, &col);
    
    	//Enter matrix a
    
    	a=(int*)malloc(row*col*sizeof(int));
    
    	for(i=0; i<row; i++)
    
    		for(j=0;j<col; j++)
    
    	{
    
    		printf("\n Enter the value of matrix a:\na[%d][%d]", i,j);
    
    		scanf("%d",&a[i][j]);
    
    	}
    
       //Enter matrix b
    
       b= (int*)malloc(row*col*sizeof(int));
    
       for(i=0; i<row; i++)
    
    		for (j=0; j<col; j++)
    
    	{
    
    		printf("\n Enter the value of matrix b:\na[%d][%d]", i, j);
    
    		scanf("%d",&b[i][j]);
    
    	}
    
       for(i=0; i<row; i++)
    
    		for(j=0;j<col; j++)
    
       c[i][j] = a[i][j]+ b[i][j];
    
       for(i=0; i<row; i++)
    
       		for(j=0; j<col; j++)
    
       printf ("\n%d c[%d][%d]",c[i][j],i,j );
    
       getch();
    
    }
    Chương trình này của bạn mình không thể chạy được (và ko hiểu sao bạn lại chạy được ) vì 2 cái mình bôi đỏ,tại sao sai thì tí bạn tham khảo CT của mình sẽ thấy sự khác nhau và bạn dễ dàng nhận ra là mình sai ở đâu.
    Còn CT thứ 2 của bạn thì cũng sai nốt.

    Code:
    #include <stdio.h>
    #include <conio.h>
    #include <malloc.h>
    void main()
    
    {
    
    	int r, c, i, j,**p1, **p2,**sum;//con tro den con tro (:-)?? 
    
        clrscr();
    
    	printf ("\nEnter the dimession of the matrix: ");
    
    	scanf ("%d %d", &r, &c);
    
    	p1=(int**)malloc(r*c*sizeof(int));
    
    	p2=(int**)malloc(r*c*sizeof(int));
    
    	//Enter the matrix1
    
    	printf ("\nEnter the value of the matrix 1 : ");
    
    	for(i=0; i<r; i++)
    
    		for(j=0; j<c; j++)
    
    	{
    
    		printf ("\na[%d][%d]",i+1, j+1);
    
    		scanf("%d", &p1[i][j]);//sai o cho lay dia chi nay
        }
    
    	//Enter the matrix2
    
    	printf ("\nEnter the value of the matrix 2 : ");
    
    	for (i=0; i<c; i++)
    
    		for (j=0; j<c; j++)
    
    
    	{
    		printf ("\nb[%d][%d]", i+1,j+1);
    
    		scanf ("%d",&p2[i][j]);
    
    	}
    
    	//Add 2 matrixes
    
    	for(i=0;i<r; i++)
    
    		for(j=0; j<c;j++)
    
    	{
    
    	sum[i][j]= p1[i][j]+p2[i][j];
    
    	printf ("\nsum[%d][%d] = %d", i+1, j+1, sum[i][j]);
    
    	}
    
    	getch();
    }
    Nói chung bài bạn edit tùm lum à cấp phát bộ nhớ mà ko free() chăng hiểu bạn compile = gì ? mà vẫn chạy được mới là.
    đấy là code của mình về cộng 2 matrix cùng kích thước bạn tham khảo xem :
    Code:
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    
    void main()
    {
    	int (*a)[5],(*b)[5],(*t)[5];
    	int i,j,r,c;
    	int *pa,*pb,*pt;
    
    	//3 con tro tro ve 3 ma tran
    	pa = *a;
    	pb = *b;
    	pt = *t;
    
    	printf("\nNhap vao so hang cua 2 matrix  :");
    	scanf("%d",&r);
    
    	printf("\nNhap vao so cot cua 2 matrix  :");
    	scanf("%d",&c);
    
    	//cap phat bo nho
    	pa = (int *)calloc(r*c,sizeof(int));
    	pb = (int *)calloc(r*c,sizeof(int));
    	pt = (int *)calloc(r*c,sizeof(int));
    
    	//Nhap so lieu vao ma tran a
    	for(i=0;i<r;i++)
    		for(j=0;j<c;j++)
    		{
    			printf("\nNhap vao gia a[%d][%d]= ",i,j);
    			scanf("%d",(pa+c*i+j));
    		}
    	//Nhap so lieu vao ma tran b
    	for(i=0;i<r;i++)
    		for(j=0;j<c;j++)
    		{
    			printf("\nNhap vao gia b[%d][%d]= ",i,j);
    			scanf("%d",(pb+c*i+j));
    		}
    	// tinh tong 2 ma tran
       for(i=0;i<r;i++)
    		for(j=0;j<c;j++)
    		{
    		 *(pt+c*i+j) = *(pa+c*i+j) + *(pb+c*i+j);
    		}
    
    	//in ma tran a
    	for(i=0;i<r;i++)
    	{
    		for(j=0;j<c;j++)
    			printf("%3d",*(pa+c*i+j));
    
    		printf("\n\n");
    	}
    	//in ma tran b
    	printf("\n+\n");
    	for(i=0;i<r;i++)
    	{
    		for(j=0;j<c;j++)
    			printf("%3d",*(pb+c*i+j));
    
    		printf("\n\n");
    	}
    	//in ma tran tong
       printf("\n====================\n");
       for(i=0;i<r;i++)
    	{
    		for(j=0;j<c;j++)
    			printf("%3d",*(pt+c*i+j));
    
    		printf("\n\n");
    	}
    	//giai phong bo nho
    	free(pa);
    	free(pb);
    	free(pt);
    	getch();
    }
    Vài lời nhận xét có gi ko phải mong bỏ quá
    Đã được chỉnh sửa lần cuối bởi zeno : 12-11-2006 lúc 02:08 PM.

  6. #6
    No Avatar
    rongchaua Khách

    Mặc định [C] Không biết sai ở đâu.

    for(i=0;i<r;i++)
    for(j=0;j<c;j++)
    {
    printf("\nNhap vao gia a[%d][%d]= ",i,j);
    scanf("%d",(pa+(r+1)*i+j));
    }
    Lão rồng chưa test nhưng chỗ này lão rồng không hiểu lắm.
    Ví dụ r=3 , c=5
    - Vòng lặp đầu tiên (i =0) các giá trị (pa, pa + 1, pa + 2, pa +3 , pa + 4) sẽ được ghi giá trị.
    - Vòng lặp thứ 2 (i = 1) các giá trị (pa + 4, pa + 5, pa + 6, pa + 7, pa + 8) sẽ được ghi giá trị.

    KL : Tại vị trí (pa + 4) giá trị bị ghi đè lên rồi. Chắc là nó hoạt động có lỗi phải không???

  7. #7
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Các cậu viết code thì cứ thích code mình ít hàng, nhìn cho nó ngắn (!!??). Thực ra 1 hàng hay nhiều hàng thì cũng như nhau thôi, compiler cũng sinh ra bao nhiêu mã đấy, cuối cùng thì chính các cậu làm code của mình rối rắm, khó đọc, khó bảo trì.
    - Khai báo biến riêng biệt, tốt nhất mỗi biến 1 hàng, và phải chắc chắn khởi tạo trị default cho biến, và nếu cần comment luôn biến này dùng làm gì.
    - Luôn dùng { và } cho các block, cho dù block đó chỉ có 1 dòng code. Vd: thêm 1 cặp {} vào cho 2 vòng for ở các code trên.
    - Dùng 2 blank line phân cách các hàm, 1 blank line phân cách các khối code
    - Tập thói quen comment, đừng lười comment.
    - Tránh dùng !, ?. Khi các cậu mệt mỏi vì thức đêm để code, hai cái này sẽ hành các cậu đấy, viết tường minh ra.
    - Viết ngược lại đk so sánh ==, vd: nên viết if (NULL == p), tránh if (p == NULL), chỉ cần thiếu một dấu = là đủ cho các cậu debug mệt nghỉ khi đêm khuya, mệt mỏi đấy.
    - Dùng 1 space sau dấu , ; phân cách space cho các toán tử +, -, *, /, >, <... vd : for (int i = 0; i < 10; i++)
    - Dùng 1 coding style nhất định, cố theo style này, đừng đổi lung tung (cái này cần thời gian).
    Đã được chỉnh sửa lần cuối bởi TQN : 12-11-2006 lúc 01:37 PM.

  8. #8
    No Avatar
    zeno Khách

    Trích dẫn Nguyên bản được gửi bởi rongchaua
    Lão rồng chưa test nhưng chỗ này lão rồng không hiểu lắm.
    Ví dụ r=3 , c=5
    - Vòng lặp đầu tiên (i =0) các giá trị (pa, pa + 1, pa + 2, pa +3 , pa + 4) sẽ được ghi giá trị.
    - Vòng lặp thứ 2 (i = 1) các giá trị (pa + 4, pa + 5, pa + 6, pa + 7, pa + 8) sẽ được ghi giá trị.

    KL : Tại vị trí (pa + 4) giá trị bị ghi đè lên rồi. Chắc là nó hoạt động có lỗi phải không???
    hì lão rồng nói đúng roài xin lỗi đoạn code trên phải là như sau (đã edit code trên):
    Code:
    for(i=0;i<r;i++)
    for(j=0;j<c;j++)
    {
    printf("\nNhap vao gia a[%d][%d]= ",i,j);
    scanf("%d",(pa+c*i+j));
    }
    Nhầm hàng thành cột ( phải nhân với số cột ) lão chỉ đc cái tinh
    Đã được chỉnh sửa lần cuối bởi zeno : 12-11-2006 lúc 02:17 PM.

  9. #9
    No Avatar
    zeno Khách

    Trích dẫn Nguyên bản được gửi bởi TQN
    Các cậu viết code thì cứ thích code mình ít hàng, nhìn cho nó ngắn (!!??). Thực ra 1 hàng hay nhiều hàng thì cũng như nhau thôi, compiler cũng sinh ra bao nhiêu mã đấy, cuối cùng thì chính các cậu làm code của mình rối rắm, khó đọc, khó bảo trì.
    - Khai báo biến riêng biệt, tốt nhất mỗi biến 1 hàng, và phải chắc chắn khởi tạo trị default cho biến, và nếu cần comment luôn biến này dùng làm gì.
    - Luôn dùng { và } cho các block, cho dù block đó chỉ có 1 dòng code. Vd: thêm 1 cặp {} vào cho 2 vòng for ở các code trên.
    - Dùng 2 blank line phân cách các hàm, 1 blank line phân cách các khối code
    - Tập thói quen comment, đừng lười comment.
    - Tránh dùng !, ?. Khi các cậu mệt mỏi vì thức đêm để code, hai cái này sẽ hành các cậu đấy, viết tường minh ra.
    - Viết ngược lại đk so sánh ==, vd: nên viết if (NULL == p), tránh if (p == NULL), chỉ cần thiếu một dấu = là đủ cho các cậu debug mệt nghỉ khi đêm khuya, mệt mỏi đấy.
    - Dùng 1 space sau dấu , ; phân cách space cho các toán tử +, -, *, /, >, <... vd : for (int i = 0; i < 10; i++)
    - Dùng 1 coding style nhất định, cố theo style này, đừng đổi lung tung (cái này cần thời gian).
    hì cảm ơn anh TQN góp ý!Anh pro quá em tập mãi mà chưa quen đc vẫn cẩu thả quá

  10. #10
    Ngày gia nhập
    10 2006
    Bài viết
    107

    hay hay bài viết rất có ích cảm ơn anh TQN...

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

  1. Lỗi chương trình không nhận biến(không return được biến từ public sang main)
    Gửi bởi nang trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 4
    Bài viết cuối: 02-10-2011, 06:04 PM
  2. Thuộc tính khóa ngoài( tham chiếu) biến mất khi biến đổi từ file XML sang DataTable
    Gửi bởi itmanhieu trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 17-08-2011, 08:02 PM
  3. làm sao để 2 biến Datetime trừ nhau ra biến float or double?
    Gửi bởi robocon1183 trong diễn đàn Thắc mắc Microsoft SQL Server & Microsoft Access
    Trả lời: 1
    Bài viết cuối: 10-12-2009, 05:11 PM

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