Tham số là một mảng nhiều chiều

Chào các bạn
Trong tài liệu mình đọc có ghi như sau

Giả sử a là mảng 2 chiều
float a[60][50];

Cách 1 họ có ghi là dùng đối con trỏ kiểu float[50], khai báo theo 1 trong 2 mẫu sau:
float (*pa)[50]; -> dùng để khai báo con trỏ kiểu float[50];
float pa[][50]; -> dùng để khai báo đối (chỉ dùng với mảng 2 chiều có 50 cột, số hàng ko quan trọng)

Vậy với trường hợp này thì tại sao lại không được ạ.

float *pa[][50];

Mong mọi người giải thích cho mình hiểu với ạ. Xin cảm ơn.

Trước hết bạn hãy phân biệt các dòng sau giống và khác nhau thế nào đã:

float*    p[50];
float    *p[50];
float  (*p)[50];
float   p[][50];
4 Likes

Trước hết bạn hãy phân biệt các dòng sau giống và khác nhau thế nào đã:

float* p[50];
float *p[50];
float (*p)[50];
float p[][50];

khác nhau là:

float* p[50]; -> khai báo mảng p có 50 phần tử kiểu con trỏ float
float *p[50]; -> khai báo mảng p có 50 phần tử mỗi phần tử là 1 con trỏ kiểu float
float (*p)[50]; -> khai báo con trỏ p chỉ tới mảng có 50 phần tử kiểu float
float p[][50]; -> khai báo mảng 2 chiều p với 50 cột, số dòng ko quan trọng

không biết mình hiểu vậy có đúng ko ạ

pa[][50] ban đầu không phải là 1 con trỏ bạn à
ý mình muốn hỏi là trong 3 cách khai báo

float (*pa)[50];
float  pa[][50];
float *pa[][50]; // tại sao cách này lại không được.

Cái này thì đúng, nhưng chỉ đúng với code C. Mình thấy tag C++ nên cái dòng cuối cùng đã bị error rồi.

3 Likes

xin lỗi mình quên mất, đây đúng là code c, trước mình có post bài bên c++ nên nhầm chút, mình đã sửa lại tag

vậy đối với 3 cách khai báo

float (*pa)[50];
float pa[][50];
float *pa[][50]; // tại sao cách này lại không được.

bạn có thể giải thích cho mình dc ko ạ.

1 sao + 2 ngoặc là 3 chiều rồi mà.

3 Likes

Nếu là C thì cả 3 dòng đều biên dịch được bình thường mà. Chỉ là cách thứ 3 khác kiểu nên không dùng được thôi. Nó rõ ràng là dư một dấu *
Trừ khi là bạn có code sample chứng minh cái không được là gì, báo lỗi gì, còn không thì mình khẳng định luôn là được nha.

4 Likes

Đây là code ví dụ được sử dụng trong tài liệu mình đọc, sử dụng cách khai báo “float pa[][50];”

int _tmain(int argc, _TCHAR* argv[])
{
	float b[30][50];
	float h[30];
	float x; 
	int i,j,m,n;

	printf("\n nhap m, n : ");
	scanf("%d%d", &m, &n);
	
	for(i = 1; i <= m; i++)
	{
		for(j = 1; j <= n; j++)
		{
			printf("\n b[%d][%d] = ", i,j );
			scanf("%f", &x);
			b[i][j] = x;
		}

		tong_h( b, m, n, h );

		for(i = 1; i <= m; i++)
		{
			printf("\n Tong hang %d = %0.2f", i,h[i]);
		}
	}

	return 0;
}


void tong_h( float a[][50], int m, int n, float *th)
{
	int i,j;

	for(i = 1; i <= m; i++)
	{
		th[i] = 0;

		for(j = 1; j <= n; j++)
		{
			th[i] += a[i][j];
		}
	}
}

Khi mình thay bằng kiểu float *pa[][50]; thì nó báo lỗi

Error 3 error C2664:‘tong_h’: Unable to convert the first argument from ‘float [30][50]’ to’float *[][50]’

Mình ko hiểu lắm, có phải là mảng float thì ko chuyển đổi được sang mảng float pointer

Truyền vào hàm thì báo lỗi là phải.
Hàm cần *[][50] (xem như 3 chiều), mà bạn lại truyền vào [30][50] (2 chiều). Đồng thời các số lượng của các chiều cũng không khớp nhau.

- Cho tôi 1 đôi giày cỡ 46.
- Dạ, 1 đôi giày cỡ 30 của bác đây ạ.

4 Likes

dạ mình hiểu rồi ạ, cảm ơn bạn. cái con trỏ này khó nhằn ghê

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?