DETAILS fillperson(David, "David Greene", 38, 180.0); //deprecated conversion from string constant to char * [-Wwrite-Strings]
Это потому, что строковые литералы (например, "David Greene") равны const
, и вы передаете его как char[LEN]
. Попробуйте const char[LEN]
.
DETAILS fillperson(struct DETAILS, char[LEN] name, int age, double height) //expected , or ... before 'name'
[]
идет после имени переменной: char name[LEN]
.
Кроме того, откуда эта переменная David
? Имя переменной должно быть в сигнатуре функции (struct DETAILS David
, а не просто struct DETAILS
).
cin>>David.name>>name;
Я думаю, что вы действительно хотите:
DETAILS fillperson(struct DETAILS David, const char name[LEN], int age, double height)
EDIT:
Я думаю, вы не поняли, что я говорил. Эта строка представляет собой странное сочетание определения функции вызова функции.
DETAILS fillperson(struct DETAILS David, "David Greene", 38, 180.0);
Когда вы вызываете функцию, вы не объявляете типы:
fillperson(David, "David Greene", 38, 180.0);
Но они нужны вам в действительном определении функции, поэтому вместо этого:
DETAILS fillperson(struct DETAILS, char[LEN] name, int age, double height)
Сделайте это:
DETAILS fillperson(struct DETAILS David, char name[LEN], int age, double height)
РЕДАКТИРОВАТЬ 2:
Кроме того, я не знаю, что вы пытаетесь сделать здесь (или любой из подобных строк):
cin>>David.name>>name;
Вы пытаетесь скопировать строку? (См. strncpy ) или читать ввод (cin >> David.name
)?
Рекомендация
Если вы используете входные потоки C ++ и C ++, вам просто нужно использовать string
.
РЕДАКТИРОВАТЬ 3
Ваш текущий код не будет работать по нескольким причинам:
DETAILS fillperson(struct DETAILS David, char name[LEN], int age, double height)
{
cout<<"Done"<<endl;
return;
}
Сигнатура функции говорит, что функция возвращает DETAILS
(первая часть строки), но вы ничего не возвращаете. Либо верните входную структуру:
return David;
Или вернуть метод void
(ничего):
void fillperson(...
Моя рекомендация по использованию string
заключается в том, что работать с ней гораздо проще, чем с массивами прямых символов (char[]
):
string name = "Дэвид";
строка name2 = имя; // Копирование намного проще
Так, например, ваш код может выглядеть так:
#include <cstdlib>
#include <iostream>
#include <iomanip>
using namespace std;
struct DETAILS
{
string name;
int age;
double height;
};
// Note that I'm passing a reference for DETAILS (the &). This means
// that we have access to the actual DETAILS instance from outside
// the method, not just a copy.
void fillperson(struct DETAILS&, const string, int, double);
int main()
{
struct DETAILS David;
fillperson(David, "David Greene", 38, 180.0);
cout<<David.name<<endl;
cout<<David.age<<endl;
cout<<David.height<<endl;
return 0;
}
void fillperson(struct DETAILS &person, const string name, int age, double height)
{
person.name = name;
person.age = age;
person.height = height;
cout<<"Done"<<endl;
}