30/09/2018, 22:18

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
Phạm Minh Anh Hữu viết 00:32 ngày 01/10/2018

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

Hoang Nhung viết 00:27 ngày 01/10/2018

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

Ngân Béo viết 00:32 ngày 01/10/2018

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.

Phạm Minh Anh Hữu viết 00:20 ngày 01/10/2018

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.

Hoang Nhung viết 00:30 ngày 01/10/2018

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

Ngân Béo viết 00:25 ngày 01/10/2018

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.

Hoang Nhung viết 00:30 ngày 01/10/2018

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. Ý 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

Phạm Minh Anh Hữu viết 00:26 ngày 01/10/2018

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

Hoang Nhung viết 00:34 ngày 01/10/2018

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

viết 00:20 ngày 01/10/2018

void InitStruct(employee *myemployee)

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)

Hoang Nhung viết 00:24 ngày 01/10/2018

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 ạ )

viết 00:27 ngày 01/10/2018

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

Hoang Nhung viết 00:25 ngày 01/10/2018

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

Phạm Minh Anh Hữu viết 00:31 ngày 01/10/2018

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

void InitStruct(employee *&myemployee)
viết 00:22 ngày 01/10/2018

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

Phạm Minh Anh Hữu viết 00:22 ngày 01/10/2018

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 *

Bài liên quan
0