如何解决此错误? '[错误]不匹配'operator []'(操作数类型为'empl'和'int')'

时间:2019-03-27 13:22:42

标签: c++

我正在完成作业,但是我遇到了这个问题,我尝试了一切更改变量名称,更改函数的方法.... 是因为标签问题?

#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);
}

4 个答案:

答案 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成为字符串-当前仅是一个字符。