我在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);
我无法理解如何将这些数组传递给函数。任何帮助表示赞赏。
答案 0 :(得分:2)
a
是dnasc
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
答案 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);
虽然我没有看到为这个本地数组调用此函数的意义。