30/09/2018, 16:22

Lỗi cannot convert parameter trong C

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
struct HocSinh
{
	char MSHS[10],Hoten[30];
	float DiemToan,DiemAnh,DiemVan;
};
typedef struct HocSinh HOCSINH;
void Nhapthongtin(HOCSINH *x[],int n)
{
	for(int i=0;i<n;i++)
	{
		printf("STT: %d",i);
		fflush(stdin);
		printf("
Nhap MSHS: ");
		gets(x[i]->MSHS);
		fflush(stdin);
		printf("
Nhap Ho ten: ");
		gets(x[i]->Hoten);
		printf("
Diem Toan: ");
		scanf("%f",&x[i]->DiemToan);
	    printf("
Diem Anh: ");
		scanf("%f",&x[i]->DiemAnh);
		printf("
Diem Van: ");
		scanf("%f",&x[i]->DiemVan);
		printf("
----------------------------------------");
	}
}
void Xuatdulieu(HOCSINH *x[],int n)
{
	for(int i=0;i<n;i++)
	{
		printf("STT: %d",i+1);
		printf("
MSHS: %s",x[i]->MSHS);
		printf("
Ho ten: %s",x[i]->Hoten);
		printf("
Diem Toan: %.2f",x[i]->DiemToan);
		printf("
Diem Anh: %,2f",x[i]->DiemAnh);
		printf("
Diem Anh: %,2f",x[i]->DiemVan);
		printf("
----------------------------------------");
	}
}
void main()
{
    int n;
	HOCSINH *x;
     x = (HOCSINH*)malloc(n*sizeof(HOCSINH));
	printf("
Nhap so luong HS: ");
	scanf("%d",&n);
	Nhapthongtin(x,n);
	Xuatdulieu(x,n);
	getch();

}

Lỗi error C2664: ‘Nhapthongtin’ : cannot convert parameter 1 from ‘HOCSINH *’ to ‘HOCSINH *[]’
error C2664: ‘Xuatdulieu’ : cannot convert parameter 1 from ‘HOCSINH *’ to ‘HOCSINH *[]’
Sữa lại như thế nào?

... viết 18:29 ngày 30/09/2018
void main()
{
    int n;
	HOCSINH *x;
     x = (HOCSINH*)malloc(n*sizeof(HOCSINH));
	printf("\nNhap so luong HS: ");
	scanf("%d",&n);
	Nhapthongtin(x,n);
	Xuatdulieu(x,n);
	getch();

}

Bạn chưa nhập n mà đã dùng malloc cấp phát cho nó rồi à?

Nguyễn Hữu Điền viết 18:25 ngày 30/09/2018

Mình không hiểu bạn viết HOCSINH *x[] là gì, bình thường viết HOCSINH *x là được rồi

... viết 18:24 ngày 30/09/2018

Mình sửa lại như thế này, dùng compiler bên C++ cho quen mắt thôi. Vấn đề chính ở việc bạn truyền tham số con trỏ vào hàm có tham số mảng con trỏ nên nó báo lỗi. Các trường trong struct không phải là con trỏ nên không dùng dấu ->

#include<stdio.h>
#include <iostream>
//#include<conio.h>
#include<string.h>
#include<stdlib.h>
struct HocSinh
{
	char MSHS[10],Hoten[30];
	float DiemToan,DiemAnh,DiemVan;
};
typedef struct HocSinh HOCSINH;
void Nhapthongtin(HOCSINH *x,int n)
{
	for(int i=0;i<n;i++)
	{
		printf("STT: %d",i);
		fflush(stdin);
		printf("\nNhap MSHS: ");
		std::cin.getline(x[i].MSHS,10);
		fflush(stdin);
		printf("\nNhap Ho ten: ");
		std::cin.getline(x[i].Hoten,30);
		printf("\nDiem Toan: ");
		scanf("%f",&x[i].DiemToan);
	    printf("\nDiem Anh: ");
		scanf("%f",&x[i].DiemAnh);
		printf("\nDiem Van: ");
		scanf("%f",&x[i].DiemVan);
		printf("\n----------------------------------------");
	}
}
void Xuatdulieu(HOCSINH *x,int n)
{
	for(int i=0;i<n;i++)
	{
		printf("STT: %d",i+1);
		printf("\nMSHS: %s",x[i].MSHS);
		printf("\nHo ten: %s",x[i].Hoten);
		printf("\nDiem Toan: %.2f",x[i].DiemToan);
		printf("\nDiem Anh: %,2f",x[i].DiemAnh);
		printf("\nDiem Anh: %,2f",x[i].DiemVan);
		printf("\n----------------------------------------");
	}
}
int main()
{
    int n;
	HOCSINH *x;
	printf("\nNhap so luong HS: ");
	scanf("%d",&n);
	x = (HOCSINH*)malloc(n*sizeof(HOCSINH));
	Nhapthongtin(x,n);
	Xuatdulieu(x,n);
	//getch();

}

Với lại bạn dùng malloc() mà chưa thấy free() ở đâu cả.

Kelvin Nguyễn viết 18:33 ngày 30/09/2018

sữa lại rồi, cũng vậy thôi.

void main()
{
    int n;
	printf("\nNhap so luong HS: ");
	scanf("%d",&n);
	 HOCSINH *x = (HOCSINH*)malloc(n*sizeof(HOCSINH));
	Nhapthongtin(x,n);
	Xuatdulieu(x,n);
	getch();

}
Kelvin Nguyễn viết 18:24 ngày 30/09/2018

x*[] mãng gồm nhiều SV mà

... viết 18:38 ngày 30/09/2018

Mảng bao nhiêu sinh viên bạn cũng chỉ cần truyền địa chỉ đầu của con trỏ thôi, nó sẽ tìm được những phần tử ngay sau nó. Mảng những con trỏ và con trỏ được cấp phát phần tử là 2 khái niệm hoàn toàn khác nhau. Trước mình cũng hay nhầm.

Nguyễn Hữu Điền viết 18:26 ngày 30/09/2018

Con trỏ *x cũng là mảng thôi vì nó trỏ đến vị trí đầu tiên của mảng, các trường bên trong bạn có thể nhập bằng cách dùng con trỏ thay cho mảng và khi đó dùng đến -> thay dấu chấm. Theo mình nghĩ thì *x[] là mảng các con trỏ rồi, khi đó tham số bị truyền sai

Nguyễn Hữu Điền viết 18:26 ngày 30/09/2018

Code mình đã sửa và ghi chú 1 chút: http://codepad.org/GBtpbJ8x

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
typedef struct//Nen khai bao nhu nay
{
	char MSHS[10],Hoten[30];
	float DiemToan,DiemAnh,DiemVan;
}HOCSINH;
void Nhapthongtin(HOCSINH *x,int n)
{
	int i;
	for(i=0;i<n;i++)
	{
		printf("STT: %d",i);
		printf("\nNhap MSHS: ");
		gets(x[i].MSHS);// co the dung gets((x+i)->MSHS)
		fflush(stdin);
		printf("\nNhap Ho ten: ");
		gets(x[i].Hoten);
		printf("\nDiem Toan: ");
		scanf("%f",&x[i].DiemToan);
	    printf("\nDiem Anh: ");
		scanf("%f",&x[i].DiemAnh);
		printf("\nDiem Van: ");
		scanf("%f",&x[i].DiemVan);
		fflush(stdin);
	}
}
void Xuatdulieu(HOCSINH *x,int n)
{
	int i;
	for(i=0;i<n;i++)
	{
		printf("STT: %d",i+1);
		printf("\nMSHS: %s",x[i].MSHS);
		printf("\nHo ten: %s",x[i].Hoten);
		printf("\nDiem Toan: %0.2f",x[i].DiemToan);
		printf("\nDiem Anh: %0.2f",x[i].DiemAnh);
		printf("\nDiem Anh: %0.2f",x[i].DiemVan);
	}
}
int main()
{
    int n;
	HOCSINH *x;
	printf("\nNhap so luong HS: ");
	scanf("%d",&n);
	fflush(stdin);
    x = (HOCSINH*)malloc(n*sizeof(HOCSINH));
	Nhapthongtin(x,n);
	Xuatdulieu(x,n);
	getch();

}

Bạn xem ở đây Markdown on diễn đàn

Nguyễn Hữu Điền viết 18:38 ngày 30/09/2018

À nhân tiện các bạn cho hỏi đửa code vào thẻ code như nào nhỉ, sao mình ko tìm thấy chức năng ấy nhỉ?

Hồng Thiện viết 18:23 ngày 30/09/2018

Là sao ? Câu hỏi không hiểu lắm

Bài liên quan
0