30/09/2018, 19:49
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);
}
Bài liên quan
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è.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ớ.
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);
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õ đượcBạ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
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ụnga[i]
để truy xuất đến phần tử i thì nó sẽ trả về vị trí củaa[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à đượcuh 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.
Hàm của mình bị sai chỗ if như bạn trên nói mình đã sửa được rồi. Xin cảm ơn