[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