我正在完成作业,但是我遇到了这个问题,我尝试了一切更改变量名称,更改函数的方法.... 是因为标签问题?
#include<stdio.h>
#include<iostream>
struct empl {
char nom;
char pre;
float salaire;
double cin;
}empl;
struct empl t[50];
struct empl E;
int taille(int n)
{
printf("saisie la taille de tableaux\n");
scanf("%d\n", &n);
return 0;
}
int remplire(int n, struct empl t, int i)
{
for (i = 1; i <= n; i++)
{
printf("t[%d].nom= ", i);
scanf("%s\n", &t[i].nom);
printf("t[%d].prenom= ", i);
scanf("%s\n", &t[i].pre);
printf("t[%d].salaire= ", i);
scanf("%f\n", &t[i].salaire);
printf("t[%d].CIN= ", i);
scanf("%lf\n", &t[i].cin);
}
}
int main()
{
int i, n;
int taille(int n),
taille(n);
int remplire(int n, struct empl t, int i);
remplire(n, t, i);
}
答案 0 :(得分:3)
尽管您的代码主要是用C风格编写的,但您似乎正在使用C ++编译器进行编译,因为它接受#include <iostream>
(尽管您似乎并没有使用它)。操作符重载。 C和C ++是不同的语言,这里的区别在某种程度上是相关的。
但是,使用任何一种语言,您提供的代码都是有缺陷的。问题出在函数remplire
中遵循以下模式的几个表达式:&t[i].nom
。缺少任何运算符重载(无论如何在C中都不可用),这些表达式中的[]
运算符需要其一个操作数来指定指针或数组,而另一个则指定一个整数。尽管有一个文件范围变量t
是一个数组,但在remplire()
内它被具有相同名称的函数参数阴影遮盖了。然后,在该函数内部,t
引用参数,它是一个struct empl
,而不是数组或指针(或整数)。
您的编译器也应该为您提供另一个线索,您可以在哪里调用该函数...
remplire(n,t,i);
...,将全局t
作为参数传递。编译器非常应该抱怨第二个参数(t
)和相应的函数参数之间的类型不匹配。
也许您只是想声明remplire()
来接受结构 pointer 作为其第二个参数:
int remplire(int n, struct empl *t, int i)
在使用时,请在main()
内删除该函数的冗余本地声明。只要在remplire()
之前定义了main()
,就不需要它,如果您想对该函数进行单独的声明,则最好将其放置在文件范围内,并且可能放在标头中文件。
答案 1 :(得分:2)
您的代码中有很多问题。
建议开始阅读一本好的C教科书。
您可能想要这样:
#include <stdio.h>
#include <iostream>
struct empl {
char nom[30];
char pre[30];
float salaire;
double cin;
}empl;
struct empl t[50];
struct empl E;
int taille(int & n)
{
printf("saisie la taille de tableaux\n");
scanf("%d", &n);
return 0;
}
void remplire(int n, struct empl *t)
{
for (int i = 0; i < n; i++)
{
printf("t[%d].nom= ", i);
scanf("%s", &t[i].nom);
printf("t[%d].prenom= ", i);
scanf("%s", &t[i].pre);
printf("t[%d].salaire= ", i);
scanf("%f", &t[i].salaire);
printf("t[%d].CIN= ", i);
scanf("%lf", &t[i].cin);
}
}
int main()
{
int n;
taille(n);
remplire(n, t);
}
它仍然是差劲的代码,主要是用C风格编写的,但是可以按预期进行编译和工作。
在C ++中,您将完全不同。
答案 2 :(得分:2)
首先iostream
是来自标准库的C ++头文件,不适用于C程序。现在问题:
int taille (int n)
{
printf("saisie la taille de tableaux\n");
scanf("%d\n",&n);
return 0;
}
使用输入参数调用此函数-这意味着您可以将值传递给函数,但不能访问该参数,希望将其用于其他地方。要更正此问题,您应该声明该函数应如下所示:
int taille (int * n)
{
printf("saisie la taille de tableaux\n");
scanf("%d\n", n);
return 0;
}
下一个功能-类似的问题,应该看起来像这样:
int remplire (int n , struct empl * t ,int i)
{
for (i=1;i<=n;i++)
{
printf("t[%d].nom= ",i);
scanf("%s\n",&t[i].nom);
printf("t[%d].prenom= ",i);
scanf("%s\n",&t[i].pre);
printf("t[%d].salaire= ",i);
scanf("%f\n",&t[i].salaire);
printf("t[%d].CIN= ",i);
scanf("%lf\n",&t[i].cin);
}
}
甚至是这样:
int remplire (int n , int i)
因为t
是全局变量。同样,此函数应返回声明为返回int
的值。
现在是main
函数:
int main()
{
int i,n;
int taille(int n),
taille(n);
int remplire(int n,struct empl t,int i);
remplire(n,t,i);
}
即使在允许的情况下也不要在其他函数中重新声明函数,这并不意味着您应该这样做。如果一切正常,main函数也应返回0。要更正该函数,请像这样编写它:
int main()
{
int i,n;
taille(& n);
remplire(n,& t,i);
}
一些好的建议,如果您愿意的话,请阅读一些书籍以学习如何使用C编程。
答案 3 :(得分:0)
您已经声明了此全局数组变量t
struct empl t[50];
,并且在此函数中还声明了参数t
int remplire (int n , struct empl t ,int i)
在函数内部,它将把t
的任何实例都视为参数,因为它在范围上比全局变量更近。因此,当您拥有这样的代码...
scanf("%s\n",&t[i].nom);
...这将引发错误,因为t
不是数组。
解决方案是使用变量名称,其含义类似于“ employee_array”,而不是单个字母。
对scanf
的调用也是错误的,因为对于字符串,您不需要传递指向变量的指针,因此它看起来应该像
scanf("%s\n",t[i].nom);
但是您还需要使nom
成为字符串-当前仅是一个字符。