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

Unable to pass an array of structs to a function

本文关键字:函数 数组 结构体      更新时间:2023-10-16

我对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);

我很难理解如何将这些数组传递给函数。任何帮助都是感激的。

  • 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
  • 在你的代码中,你使用的是数组,而不是向量

我会用不同的方式回答。恕我直言,你真正想要的是:

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,那么您可以使用新的随机数生成工具。在这个非常好的演讲中,Stephan T. Lavavej解释了为什么你不应该再使用rand()

InserirNomea的类型为,一个包含10个dnasc 的数组。

&a的类型是指向的指针,dnasc 为10个数组。在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);

函数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);

和相应的its调用看起来像

CriaData(a, contador);