Hỏi về con trỏ trong c, hàm hoán vị không chạy

em viết chương trình về mảng cấu trúc phân số dùng con trỏ, Sau khi nhập thì sắp xếp mảng giảm dần. Nhưng không hiểu sao hàm hoán vị không chạy. mong mọ người giúp đỡ.

void hoanvi(PhanSo *a, PhanSo *b)
{
	PhanSo temp;
	temp = *b;
	*b = *a; 
	*a = temp;
}

void sapxepMang(PhanSo *a, int n)
{
	for(int i = 0; i < n - 1; i++)
	{
		for(int j = i + 1; j < n; j++)
		{
			if(((float)((a+i)->iTu/(a+i)->iMau)) < ((float)((a+j)->iTu / (a+j)->iMau)))
				hoanvi(a+i, a+j);
		}
	}
	xuatMang(a, n);
}

a là một biến con trỏ chứ đâu phải một mảng đâu mà bạn truyền như thế?

Ví dụ a là một mảng như thế này PhanSo a[10]; thì được nè.

1 Like

Kiểu Phanso của bạn là gì, nếu không phải kiểu chuẩn của C thì bạn không thể dùng phép gán = được. Nếu bạn khai báo đó là một struct, tương đương với một vùng nhớ trong C, C sẽ không hiểu vùng nhớ này bằng vùng nhớ kia được. Bạn phải dùng hàm memcpy để copy vùng nhớ.

1 Like

Không phải hàm hoánvi không hoạt động mà chỗ so sánh không đúng
Có thể sửa lại:
if (1.0a[i].tu/ a[i].mau >1.0 a[j].tu/ a[j].mau)
hoanvi(a+i,a+j);

1 Like

Hàm hoanVi đúng rồi. Mình nghĩ sẽ ở chỗ if(((float)((a+i)->iTu/(a+i)->iMau)) < ((float)((a+j)->iTu / (a+j)->iMau))) ấy. Không biết chi tiết code bạn sao nên mình cũng không rõ được

Bạn nên viết một hàm so sánh riêng trả về boolean để dễ tìm và fix lỗi, code cũng gọn hơn nữa

1 Like

Con trỏ hoàn toàn có thể sử dụng như mảng mà bạn. a chứa địa chỉ của phần tử a[0]. Khi đó nếu sử dụng a[i] để truy xuất đến phần tử i thì nó sẽ trả về vị trí của a[0] + i * n (byte) - n tùy thuộc vào kiểu dữ liệu.Từ đó ta có thể truy xuất được đến các phần tử. Chỉ cần trước đó ta đã cấp phát cho con trỏ a là được

1 Like

uh mình biết nhưng mình đoán là bạn ấy không sử dụng làm mảng nên mới bị lỗi. mà bạn ấy cũng ko nói rõ bị lỗi gì nên mình đoán vậy thôi.

1 Like

Hàm của mình bị sai chỗ if như bạn trên nói :smiley: mình đã sửa được rồi. Xin cảm ơn

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