Toán tử trỏ (->) trong mảng động struct C++

Chào mọi người. Em có một vấn đề liên quan đến toán tử trỏ trong mảng động với struct cần mọi người giúp đỡ ạ.
Yêu cầu của bài là dùng mảng động struct, và toán tử ->, không dùng string.
Phần code cho sẵn gồm có struct Date, struct Employee và hàm main gồm biến n là số lượng EmployeeEmployee *e là cách khai báo mảng struct cho trước như thế!
Bài làm của em:

#include <iostream>
using namespace std;

struct date {
	int dd, mm, yyyy;
};
struct employee {
	char* hoten;
	date ngayvaolam;
	float hesoluong;
};
void inputdate(date& d)
{
	cin >> d.dd >> d.mm >> d.yyyy;
}
employee inputaemployee()
{
	employee *p = new employee();
	p->hoten = new char[31];
	cin.ignore();
	cin.getline(p->hoten, 31);
	inputdate(p->ngayvaolam);
	cin >> p->hesoluong;

	return *p;
}

void inputlistemployee(employee *e[], int numofemployee)
{
	for (int i = 0; i < numofemployee; i++)
	{
		employee *a = new employee();

		//e[i] = inputaemployee();
		cin.ignore();
		a->hoten = new char[31];
		cin.getline(a->hoten, 31);
		inputdate(a->ngayvaolam);
		cin >> a->hesoluong;

		e[i] = a;
	}
}

void printdate(date d) {
	(d.dd < 10) ? cout << 0 << d.dd << "/" : cout << d.dd << "/";
	(d.mm < 10) ? cout << 0 << d.mm << "/" << d.yyyy : cout << d.mm << "/" << d.yyyy;
}

void swap1(employee *&e1, employee *&e2)
{
	char* name = new char[31];
	date d;
	float hs;
	name = e1->hoten;
	d = e1->ngayvaolam;
	hs = e1->hesoluong;
	e1->hoten = e2->hoten;
	e1->ngayvaolam = e2->ngayvaolam;
	e1->hesoluong = e2->hesoluong;
	e2->hesoluong = hs;
	e2->hoten = name;
	e2->ngayvaolam = d;

}

void sortincreasingbysalary(employee *e[], int numofemployee)
{
	for (int i = 0; i < numofemployee - 1; i++)
		for (int j = i + 1; j < numofemployee; j++)
		{
			if (e[i]->hesoluong > e[j]->hesoluong)
				swap1(e[i], e[j]);
		}
}

void printlistemployee(employee *e[], int numofemployee)
{
	for (int i = 0; i < numofemployee; i++)
	{
		cout << e[i]->hoten << endl;
		printdate(e[i]->ngayvaolam);
		cout << endl << e[i]->hesoluong << endl;
	}
}
int main() {

	int numofemployee = 0; cin >> numofemployee;
	employee *e = new employee[numofemployee];

	inputlistemployee(&e, numofemployee);


	
	sortincreasingbysalary(&e, numofemployee);
	printlistemployee(&e, numofemployee);


	delete[] e;
	//system("pause");

	return 0;
}

Lỗi em gặp phải là Stack around the variable 'e' was corrupted.
Lần đầu em post bài nên nếu có sai sót, mọi người bỏ qua cho ạ. Xin cảm ơn mọi người!

Phải là :point_down: chứ (Vì e là mảng lưu các phần tử kiểu employee*)

employee** e = new employee*[numofemployee];

Và sửa lại những chỗ &e bên dưới thành e thôi. :slight_smile:

3 Likes

Do trong phần code cho sẵn trong main nó không cho dùng con trỏ cấp 2 mà yêu cầu là phải dùng toán tử ->, nên em hơi hoang mang chỗ này.
Vậy nếu vẫn phải dùng employee *e; thì làm sao ạ?
Em cảm ơn!

Nếu không sửa được trong main thì sửa lại những hàm bạn đã viết thôi.

Do e là kiểu employee* e nên khi truyền vào hàm thì bạn cũng phải để là employee* chứ không phải là employee *e[] nữa. :slight_smile:

Ví dụ: để truy cập vô tên của employeei trong các hàm thì có thể dùng e[i].hoten hoặc (e + i)->hoten. :slight_smile:

3 Likes

Do không được dùng (.) nên em cứ lăn tăn. Em cũng định dùng kiểu (e+i)-> mà thấy cái này ít người dùng quá, em cứ nghĩ là do em làm sai…
Em cảm ơn ạ.

Vẫn dùng đều đều mà. :sweat_smile:

3 Likes

có ai dùng đâu :V viết e[i]. ko sướng hơn hay sao mà đi viết (e+i)-> :V

chắc ý ông thầy là xài 1 con trỏ để duyệt mảng đó:

for (auto p = e; p < e + numofemployee; ++p)
    // xài p->

ko hiểu tại sao phải xài mảng cấp phát động 2 chiều ở đây khi ko xài đa hình :V

cũng ko hiểu tại sao lại đi xài hoten = new char[31] mà ko khai báo thẳng char hoten[32]; ở trong employee :V nếu xài cấp phát động thì lại ko thấy hàm hủy / hàm giải phóng cho hoten ở đâu

hàm swap viết cũng tầm bậy, cấp phát động 1 mảng tạm name mà ko giải phóng nó, mỗi lần swap là leak 31 bytes :V

4 Likes

Những người thích code nó màu mè dùng á. :laughing: :laughing:

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