30/09/2018, 17:18

[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

abcxyz viết 19:30 ngày 30/09/2018

up , help me, help me, help me, help me,

*grab popcorn* viết 19:23 ngày 30/09/2018

(*n)++ thay vì *n++ ._.

abcxyz viết 19:31 ngày 30/09/2018

(*n)++ thay vì *n++

bạn có thể nói rõ hơn được không?>

*grab popcorn* viết 19:29 ngày 30/09/2018

(*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ụ

int *n;
int a=10;
n=&a;
printf("%p: %d : %p\n",n,*n++,n);
printf("%d",*n);

sẽ đc

0xabc1 10 0xabc2
43345345 (giá trị rá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é

abcxyz viết 19:33 ngày 30/09/2018

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

Bài liên quan
0