Структурные значения не выводятся на экран - PullRequest
1 голос
/ 22 марта 2012

Я работаю над программой, и часть ее требует от меня создания структуры с именем DETAILS с полями name, age и height. Я хочу заполнить запись данными, используя аргумент функции. У меня были многочисленные проблемы с этим кодом, и мне очень помогли, но мне нужно немного больше. Я не могу вывести заполненную структуру на экран. Если бы кто-нибудь мог помочь мне с этой последней вещью, я был бы так благодарен!

Вот мой код:

#include <cstdlib>
#include <iostream>
#include <iomanip>

using namespace std;

const int LEN=100;

struct DETAILS
{
 char name[LEN];
 int age;
 double height;
};

 DETAILS fillperson(struct DETAILS David, const char[LEN], int, double);


int main()
{
 struct DETAILS David;

 fillperson(struct DETAILS David, "David Greene", 38, 180.0);

 cout<<David.name<<endl;
 cout<<David.age<<endl;
 cout<<David.height<<endl;

 return 0;
}

DETAILS fillperson(struct DETAILS David, char name[LEN], int age, double height) 
{
 cout<<"Done"<<endl;
 return;
}

Ответы [ 2 ]

3 голосов
/ 22 марта 2012
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;
}
1 голос
/ 22 марта 2012
person fillperson(struct DETAILS, char[LEN] name, int age, double height)

должно быть:

struct person fillperson(struct DETAILS,char name[LEN], int age, double height)

Я не могу дать вам более полный ответ без определения struct person

edit:

Thisстрока не имеет никакого смысла:

DETAILS fillperson(struct DETAILS David, "David Greene", 38, 180.0);

Возможно, это должно быть:

fillperson(struct DETAILS David, "David Greene", 38, 180.0);

Как указано выше, вам не следует использовать строки в стиле C с потоками C ++.Выберите язык и используйте эти конструкции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...