Giải thích giúp lỗi trong chương trình

Giải thích giúp em lỗi này ạ

#include <conio.h>
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
typedef struct{
	int day;
	int month;
	int year;
}Date;
typedef struct{
	string name;
	Date birthday;
	char role[20];
	float salary;
}employee;
void InitStruct(employee *myemployee){
	myemployee = new employee;
	cout << "Name: ";
	getline(cin, myemployee->name);
	fflush(stdin);
	cout << "Day of birth: ";
	cin >> myemployee->birthday.day;
	fflush(stdin);
	cout << "Month of birth: ";
	cin >> myemployee->birthday.month;
	fflush(stdin);
	cout << "Year of birth: ";
	cin >> myemployee->birthday.year;
	fflush(stdin);
	cout << "Role: ";
	cin >> myemployee->role;
	fflush(stdin);
	cout << "Salary: ";
	cin >> myemployee->salary;
	return;
}
void display(employee *myemployee){
	cout << "Name: " << myemployee->name << endl;
	cout << "Birthday: " << myemployee->birthday.day << "/" << myemployee->birthday.month << "/" << myemployee->birthday.year << endl;
	cout << "Role: " << myemployee->role << endl;
	cout << "Salary: " << myemployee->salary << endl;
	return;
}
void main(){
	employee *myemployee=NULL;
	InitStruct(myemployee);
	display(myemployee);
	return;
}

* List item

Lỗi gì vậy?
p/s: đủ 20 kí tự.

Dạ không có lỗi nhưng nó không chạy đc ạ

Void main mà còn return nữa là sao. Cái này trên visual studio là báo lỗi liền.

Qua code của bạn thì ở function InitStruct bạn có khai báo 1 con trỏ, rồi bạn cấp phát bộ nhớ cho nó nhưng không ghi là cấp bao nhiêu myemployee = new employee [<số lượng ô nhớ cần cấp>];, là lỗi thứ nhất. Lỗi thứ 2 là bạn nhập vào danh sách mà không dùng vòng lặp để nhập.

KHông báo lỗi ạ … em cũng đang dùng visual studio. nó chỉ chạy được phần nhập còn phần display thì k chạy đc

Thì Debug đi không biết debug à. Theo anh đoán là trong chương trình của em nó không lưu gì hết nên tới chỗ display nó bỏ qua luôn vì có gì đâu mà hiện.

1 Like

con trỏ myemployee ở đây chỉ là một biến con trỏ thôi chứ không phải là con trỏ mảng nên mình nghĩ khai báo thế đúng rồi. :slight_smile: Ý mình không hiểu ở đây là tại sao chương trình không thực thi hàm Display trong khi trình soạn thảo không báo lỗi :frowning:

Thế thì phải làm thế này

#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
typedef struct{
	int day;
	int month;
	int year;
}Date;
typedef struct{
	string name;
	Date birthday;
	char role[20];
	float salary;
}employee;
void InitStruct(employee *myemployee){
	cout << "Name: ";
	getline(cin,  (*myemployee).name);
	fflush(stdin);
	cout << "Day of birth: ";
	cin >> (*myemployee).birthday.day;
	fflush(stdin);
	cout << "Month of birth: ";
	cin >> (*myemployee).birthday.month;
	fflush(stdin);
	cout << "Year of birth: ";
	cin >> (*myemployee).birthday.year;
	fflush(stdin);
	cout << "Role: ";
	cin >> (*myemployee).role;
	fflush(stdin);
	cout << "Salary: ";
	cin >> (*myemployee).salary;
	return;
}
void display(employee *myemployee){
	cout << "Name: " << (*myemployee).name << endl;
	cout << "Birthday: " << (*myemployee).birthday.day << "/" << (*myemployee).birthday.month << "/" << (*myemployee).birthday.year << endl;
	cout << "Role: " << (*myemployee).role << endl;
	cout << "Salary: " << (*myemployee).salary << endl;
	return;
}
int main(){
	employee myemployee;
	InitStruct(&myemployee);
	display(&myemployee);
	return 0;
}

Còn lỗi là do nó chưa được lưu vào đâu cả, nên không có gì để hiển thị => lỗi
Còn muốn nhập vào danh sách thì cứ cấp phát bộ nhớ cho nó rồi dùng for loop nhập như nhập mảng :slight_smile:

1 Like

Dạ. Em cảm ơn ạ. Mới học nên không hiểu lắm về cái vùng nhớ ạ :frowning:

1 Like

Nếu bạn muốn theo cách dùng con trỏ thì hàm này phải sửa thành:

void InitStruct(employee** myemployee)

Bởi vì con trỏ myemployee trong hàm main trỏ tới NULL, sau khi thực hiện hàm InitStruct thì myemployee trỏ tới một vùng nhớ trên Heap, tức là thay đổi nội dung của myemployee thông qua hàm InitStruct —> phải dùng con trỏ cấp 2. (Lưu ý nên giải phóng vùng nhớ được cấp phát động để tránh memory leak)

2 Likes

Em mới hc C++. Trong sách em học không có đề cập con trỏ cấp hai nơi. Anh có thể chỉ em sách có liên quan để em nghiên cứu được không ạ. ( Đang mơ hồ lắm ạ :frowning: )

Bạn có thể đọc cuốn Kỹ thuật lập trình C (GS. Phạm Văn Ất). Tuy nhiên cuốn này chỉ tham khảo thôi, vì phần thực hành dựa theo môi trường DOS nên một số hàm/thư viện không có. Về phần thực hành bạn thử làm mấy bài kiểu như cấp phát động mảng 1/2 chiều thông qua hàm, bài tập về danh sách liên kết,… code nhiều lên là mau thạo :smile:

2 Likes

Dạ em cảm ơn nhiều ạ

1 Like

Thay vì dùng con trỏ cấp 2 thì có thể dùng reference được không anh.

void InitStruct(employee *&myemployee)

Được chứ bạn, vì đang code C++ mà :slight_smile:

1 Like

Như thế sẽ đỡ rối hơn cho người mới học. vì khi dùng
void InitStruct(employee** myemployee) hay nhầm lẫn ở dấu * :blush:

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