[Hỏi] Mảng và con trỏ không được ghi giá trị khi đưa vào hàm con?
em có 1 chương trình này
// hang co tong cac phan tu cua hang lon nhat
#include <stdio.h>
#include <conio.h>
//----------------------------------------------------------------------------
void Input      (int [][20], int *, int *);
void Output     (int [][20], int,   int);
void Search        (int [][20], int,   int);
//----------------------------------------------------------------------------
main ()
{
    int a [20][20], l, c;
    printf ("Nhap ma tran A: 
");
    Input(a, &l, &c );
    printf ("Ma tran da nhap: 
");
    Output(a, l, c);
    Search(a, l, c);
    getch();
}
//----------------------------------------------------------------------------
void Input (int a[][20], int *l, int *c)
{
    int i,j;
    printf ("Nhap so dong, so cot 
");
    scanf ("%d%d", l, c);
    for ( i=0 ; i<*l; i++)
        for ( j=0 ; j<*c ; j++)
        {
            printf ("Nhap phan tu dong %d cot %d: ", i,j);
            scanf ("%d", &a[i][j]);
        }
}
//----------------------------------------------------------------------------
void Output (int a[][20], int l, int c)
{
    int i,j;
    for ( i=0 ; i<l; i++)
    {
        for ( j=0 ; j<c ; j++)
            printf ("%d   ", a[i][j]);
            printf ("
");
    }
}
//----------------------------------------------------------------------------
void  Search (int a[][20], int l, int c)
{
	int i,j, sum, b[20], n=0,max, hang1=0,hang2=0;
	
	for ( i =0 ; i<l ; i++)    // ghi tong cac phan tu cua moi hang vao mang 1 chieu b
	{
		sum = 0;
		for ( j=0 ; j< c ; j++) sum += a[i][j];
		b[n++] = sum;
	}
	
    max = b[0];       // tim max cua mang 1 chieu b = tong cua hang co gia tri lon nhat
	for ( i =0 ; i<n ; i++) if ( b[i] > max ) 
	{
	max = b[i];
	hang1=i;    // lay so hang co tong phan tu lon nhat
	}
	printf ("Hang co tong cac phan tu lon nhat la   ");
	printf ("%d   ", hang1+1);             // in ra hang co tong phan tu lon nhat
	for ( i =0 ; i<n ; i++)  // truong hop co > 2 hang co tong phan tu = nhau   , in ra nhung hang con lai
	{
		if ( b[i] == max )
		{
			hang2 = i;  // lay hang co tong phan tu lon nhat
			if (hang2 != hang1)  printf ("%d  ", hang2+1);   // neu la hang da in roi thi bo qua khong in ra
		}
	}
}
ở chương trình trên mảng b và biến n e để trong hàm Search thì nó chạy ok cả, nhưng giờ e muốn đưa khai báo mảng b và biến n ở hàm Search về hàm main, để tách phần chương trình của hàm Search ra làm 2 phần ( 2 hàm con ) 1 phần ghi các giá trị tổng của các hàng vào mảng b,1 phần là tìm các hàng có tổng phần tử lớn nhất , e thay đổi chương trình như sau
// hang co tong cac phan tu cua hang lon nhat
#include <stdio.h>
#include <conio.h>
//----------------------------------------------------------------------------
void Input      (int [][20], int *, int *);
void Output     (int [][20], int,   int);
void Sum        (int [][20],int [], int *n, int,   int);
void Search       (int [], int);
//----------------------------------------------------------------------------
main ()
{
    int a [20][20],b[20], n=0, l, c;
    printf ("Nhap ma tran A: 
");
    Input(a, &l, &c );
    printf ("Ma tran da nhap: 
");
    Output(a, l, c);
    Sum(a,b, &n, l, c);
    Search (b, n);
    getch();
}
//----------------------------------------------------------------------------
void Input (int a[][20], int *l, int *c)
{
    int i,j;
    printf ("Nhap so dong, so cot 
");
    scanf ("%d%d", l, c);
    for ( i=0 ; i<*l; i++)
        for ( j=0 ; j<*c ; j++)
        {
            printf ("Nhap phan tu dong %d cot %d: ", i,j);
            scanf ("%d", &a[i][j]);
        }
}
//----------------------------------------------------------------------------
void Output (int a[][20], int l, int c)
{
    int i,j;
    for ( i=0 ; i<l; i++)
    {
        for ( j=0 ; j<c ; j++)
            printf ("%d   ", a[i][j]);
            printf ("
");
    }
}
//----------------------------------------------------------------------------
void Sum   (int a[][20],int b[], int *n, int l, int c)
{
	int i,j, sum;
	for ( i =0 ; i<l ; i++)    // ghi tong cac phan tu cua moi hang vao mang 1 chieu b
	{
		sum = 0;
		for ( j=0 ; j< c ; j++) sum += a[i][j];
		b[*n++] = sum;    // loi nam o day
	}
	printf ("In thu Mang b 
");
	for ( i=0 ; i<*n ;i++)   printf ("%d  ", b[i]);  // khong in ra duoc cai gi ca
}
//----------------------------------------------------------------------------
void Search     (int b[], int n)
{
	int i,j,max, hang1=0,hang2=0;
	max = b[0];       // tim max cua mang 1 chieu b = tong cua hang co gia tri lon nhat
	for ( i =0 ; i<n ; i++)
 	if ( b[i] > max ) 
	{
	max = b[i];
	hang1=i;    // lay so hang co tong phan tu lon nhat
	}
	printf ("Hang co tong cac phan tu lon nhat la   ");
	printf ("%d   ", hang1+1);             // in ra hang co tong phan tu lon nhat
	for ( i =0 ; i<n ; i++)  // truong hop co > 2 hang co tong phan tu = nhau   , in ra nhung hang con lai
	{
		if ( b[i] == max )
		{
			hang2 = i;  // lay hang co tong phan tu lon nhat
			if (hang2 != hang1)  printf ("%d  ", hang2+1);   // neu la hang da in roi thi bo qua khong in ra
		}
	}
}
nhưng sau khi tách hàm Search ra, đã đưa mảng b và biến n về hàm main thì mảng b và biến n trong hàm sum không được ghi giá trị khi hàm này thực hiện
khai báo hàm sum:   void Sum (int [][20],int [], int *n, int, int);
gọi hàm sum:       Sum(a,b, &n, l, c);
định nghĩa hàm sum:
 void Sum   (int a[][20],int b[], int *n, int l, int c)
{
	int i,j, sum;
	for ( i =0 ; i<l ; i++)    // ghi tong cac phan tu cua moi hang vao mang 1 chieu b
	{
		sum = 0;
		for ( j=0 ; j< c ; j++) sum += a[i][j];
		b[*n++] = sum;    // loi nam o day
	}
	printf ("In thu Mang b 
");
	for ( i=0 ; i<*n ;i++)   printf ("%d  ", b[i]);  // khong in ra duoc cai gi ca
}
e đã thử cô lập vùng sai bằng cách thử in mảng b trong hàm sum nhưng khong in ra được gì cả, e nghĩ sai chỗ   	b[*n++] = sum;
nhưng cú pháp đúng sao lại sai được 
 
            




up , help me, help me, help me, help me,
(*n)++ thay vì *n++ ._.
bạn có thể nói rõ hơn được không?>
(*n)++ = tăng giá trị của con trỏ n lên 1
còn *n++ = *(n++) tức lấy địa chỉ tiếp gán địa chỉ đó cho n. Và trả vè giá trị của địa chỉ trc.
Ví dụ
sẽ đc
Mà n không phải là mảng mà nó chỉ là 1 biến. Do vậy địa chỉ tiếp theo của nó toàn giá trị rác. Giá trị rác thg ngẫu nhiên và có thể lớn hơn phần tử mảng b -> tràn mảng -> tạch
._. chỉ nhớ mang máng v. Ko rõ lắm nhé
tks , mình đã hiểu