无法将结构数组传递给函数

时间:2014-07-29 22:47:00

标签: c++ struct

我在C ++方面有点新鲜,而且我在练习时遇到了麻烦,这是保持名字和使用结构的10个人的高度所必需的。

结构是:

typedef struct 
{
    char nome[50];
    float altura;
} pserhumano;

typedef struct 
{
    float dia;
    float mes;
    float ano;
 } dnasc;

功能是:

 void CriaData(dnasc *D[], int i)
 {
     D[i]->mes = 1 + (rand() % 12);
     D[i]->ano = 1950 + (rand() % 49);
     D[i]->dia = 1 + (rand() % 30);
 }

 void InserirNome(pserhumano *Z[])
 {
     dnasc a[10];
     for (int contador = 0; contador < 10; contador++) {
       cout << "Insira o seu nome." << endl;
       gets (Z[contador]->nome);
       cout << "Insira a sua idade." << endl;
       cin >> Z[contador]->altura;
       CriaData(&a, contador);
      } 
 }

这是Ubuntu上的输出:

athos@ubuntu:~$ g++ exercicio1.cpp -w -o a
exercicio1.cpp: In function ‘void InserirNome(pserhumano**)’:
exercicio1.cpp:35:33: error: cannot convert ‘dnasc (*)[10]’ to ‘dnasc**’ for  argument ‘1’ to ‘void CriaData(dnasc**, int)’
        CriaData(&a, contador);

我无法理解如何将这些数组传递给函数。任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:2)

  • adnasc
  • 的数组
  • 函数CriaData需要一个指向dnasc
  • 的指针数组

更改为:

 void CriaData(dnasc D[], int i)
 {
     D[i].mes = 1 + (rand() % 12);
     D[i].ano = 1950 + (rand() % 49);
     D[i].dia = 1 + (rand() % 30);
 }

只需致电:

CriaData(a, contador);

备注:

  • 不要使用gets,这是不安全的。使用std::cin
  • 在您的代码中,您使用的是数组,而不是 vectors

答案 1 :(得分:2)

与其他答案相比,我会有所不同。恕我直言,你真正想要的是:

void CriaData(dnasc &D) {
  D.mes = 1 + (rand() % 12);
  D.ano = 1950 + (rand() % 49);
  D.dia = 1 + (rand() % 30);
}

(即,仅通过引用传递dnasc个对象)。

然后在循环中调用:

dnasc a[10];
for(int contador = 0; contador < 10; ++i) {
  ...
  CriaData(a[contador]);
}

无需传递函数无用的下标等。

此外,如果您的编译器支持C ++ 11,那么您可以使用新的random number generation facilities。在这个非常好的talk Stephan T. Lavavej解释了为什么你不应该再使用rand()

答案 2 :(得分:1)

a中的InserirNome类型为 10 dnasc 的数组。

&a的类型是指向数组10 dnasc 的指针。在C ++中,即dnasc (*)[10]

这不能转换为dnasc**,这是CriaData的预期参数类型。

使用

时,这是编译器错误消息
CriaData(&a, contador);

CriaData的以下更改应该更容易。

 void CriaData(dnasc D[], int i)
 {
     D[i].mes = 1 + (rand() % 12);
     D[i].ano = 1950 + (rand() % 49);
     D[i].dia = 1 + (rand() % 30);
 }

然后,您可以使用以下方式调用它:

CriaData(a, contador);

答案 3 :(得分:1)

函数CriaData的第一个参数的类型为dnasc *D[],其类型为dnasc **D

 void CriaData(dnasc *D[], int i)

但是你调用函数传递一个类型dnasc( * )[10]的表达式,你传递一个指向本地数组dnasc a[10];的指针

CriaData(&a, contador);

正确的函数声明看起来像

 void CriaData(dnasc D[], int i);

并且相应的调用看起来像

CriaData(a, contador);

虽然我没有看到为这个本地数组调用此函数的意义。