30/09/2018, 16:15

Xin trợ giúp về struct danh sách học sinh

hocsinh.h

#pragma once
#include <iostream>
#include <string>
using namespace std;
#pragma pack(1)

struct hocsinh
{
	char maSo[20];
	char tenHS[20];
	float diemToan, diemLy, diemHoa;
};
typedef struct hocsinh HOCSINH;
void nhapThongTinHocSinh(HOCSINH *);
void xuatThongTinHocSinhL(HOCSINH *);
float tinhDiemTrungBinh(HOCSINH *);

hocsinh.cpp

#include"hocsinh.h"

void nhapThongTinHocSinh(HOCSINH *&x)
{
	x = new HOCSINH;
	fflush(stdin);
	cout << "
Nhap ma so hoc sinh:";
	//gets(x->maSo); 
	gets_s(x->maSo);
	fflush(stdin);
	cout << "
Nhap ten hoc sinh :";
	gets_s(x->tenHS);
	do 
	{
		cout << "
Moi ban nhap diem Hoa cho hoc sinh :";
		cin >> x->diemHoa;
		if (x->diemHoa<0 || x->diemHoa>10)
		{
			cout << "
Diem Hoa ban nhap ko hop le vui long kiem tra lai!!!";
		}
	} while (x->diemHoa<0||x->diemHoa>10);
	do
	{
		cout << "
Moi ban nhap diem Hoa cho hoc sinh :";
		cin >> x->diemLy;
		if (x->diemLy<0 || x->diemLy>10)
		{
			cout << "
Diem Ly ban nhap ko hop le vui long kiem tra lai!!!";
		}
	} while (x->diemLy<0 || x->diemLy>10);
	do
	{
		cout << "
Moi ban nhap diem Hoa cho hoc sinh :";
		cin >> x->diemToan;
		if (x->diemToan<0 || x->diemToan>10)
		{
			cout << "
Diem Toan ban nhap ko hop le vui long kiem tra lai!!!";
		}
	} while (x->diemToan<0 || x->diemToan>10);

}
void xuatThongTinHocSinhL(HOCSINH *x)
{
	cout << "
		Thong tin hoc sinh : 
";
	cout << "
Ma so hoc sinh : " << x->maSo;
	cout << "
Ten hoc sinh : " << x->tenHS;
	cout << "
Diem toan : " << x->diemToan;
	cout << "
Diem Ly : " << x->diemLy;
	cout << "
Diem Hoa : " << x->diemHoa;
}
float tinhDiemTrungBinh(HOCSINH *x)
{
	return (x->diemHoa + x->diemLy + x->diemToan) / 3;
}

main.cpp

#include "hocsinh.h"
int main(int argc, char **argv)
{
	HOCSINH *x;
	nhapThongTinHocSinh(x);
	xuatThongTinHocSinhL(x);
	float diemTrungBinh = tinhDiemTrungBinh(x);
	cout << "
Diem trung binh : " << diemTrungBinh;
	system("pause");
	return 0;
}

lỗi như sau :

Error	3	error C4700: uninitialized local variable 'x' used	d:visual studio 2013projectsstructdanh sach hoc sinhmain.cpp	5	1	danh sach hoc sinh

trong khi hàm nhập học sinh đã dùng tham chiều và hàm main gọi là 1 giá trị theo nguyên tắc thì đúng rồi

Gió viết 18:23 ngày 30/09/2018

Theo mình là nhapthongtin(hocsinh*&)
thay bằng nhapthontin(hocsinh*) và để đoạn x=new hocsinh ở hàm main

Thực tế khắc nghiệt viết 18:21 ngày 30/09/2018

gió ơi mình đang test thử cấp phát tại hàm nhậpthông tin luôn. nghe nói thì cấp ở main là ổn nhất

Thực tế khắc nghiệt viết 18:27 ngày 30/09/2018

@ltd em cấp phát bộ nhớ trong main thì ko sao mà sao trực tiếp trong hàm rồi tham chiếu lại thì ko được vậy anh?

Gió viết 18:23 ngày 30/09/2018

Neu ma cap tai ham void nhapThongTinHocSinh(HOCSINH *&) thi

void nhapThongTinHocSinh(HOCSINH *);  //-->void nhapThongTinHocSinh(HOCSINH *&); 
void xuatThongTinHocSinhL(HOCSINH *);
float tinhDiemTrungBinh(HOCSINH *);
Thực tế khắc nghiệt viết 18:23 ngày 30/09/2018

thế lỗi là gì vậy gió ?

Nguyễn Minh Dũng viết 18:25 ngày 30/09/2018

Lý do là vì khi em truyền con trỏ x vào hàm nhapThongTinHocSinh thì chỉ có bản copy của con trỏ x được truyền vào. Chứ không phải là bản thân của con trỏ x được truyền vào.

Ở bài này @Dung_Kon đã đưa ra một vấn đề tương tự, anh đã giải thích, em nghiên cứu thử nhé.

#include <stdio.h> #include <stdlib.h> #include <string.h> void myfunction(char *q){ q = (char*)malloc(8); memcpy (q ,"hello", 6); } int main(){ char *p; myfunction(p); printf(p); getchar(); } Có 2 câu hỏi là: 1. Code trên có vấn đề gì? 2. Làm sao để in ra hello
Bài liên quan
0