• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z definicją funkcji.

Cloud VPS
0 głosów
735 wizyt
pytanie zadane 23 stycznia 2019 w C i C++ przez Hailon Początkujący (310 p.)

Witam!

Mam problem z definicją funkcji setgolf. Mianowicie, kiedy próbuje ustawić, aby funkcja w strukturze golf ustawiała dane nazwisko i handicap na podstawie wywołanych argumentów, kompilator daje komunikat o "incompatible types in assignment of 'const char*' to 'char [40]'".

Mój kod:

a) plik nagłówkowy

const int Len = 40;
struct golf
{
    char fullname[Len];
    int handicap;
};
void setgolf(golf & g, const char * name, int hc);
void setgolf(golf & g);
void handicap(golf & g, int hc);
void showgolf(const golf & g);

b) definicje funkcji

#include<iostream>
#include "golf.h"
void setgolf(golf & g, const char * name, int hc)
{
    g.fullname = name;
    g.handicap = hc;
}


 

1 odpowiedź

0 głosów
odpowiedź 23 stycznia 2019 przez RafalS VIP (122,820 p.)

Próbujesz zrobić coś takiego:

char fullname[40];
fullname = "abcde";

Co oczywiście nie zadziała, bo nie można przypisać wskaźnika do tablicy, ale można przypisać tablice to wskaźnika. Polecam wykorzystać ten drugi fakt.

komentarz 23 stycznia 2019 przez Hailon Początkujący (310 p.)

Dzięki za pomoc.

Mam jeszcze problem z cin.getline, bo po odpaleniu program pomija linijke podaj imie i przechodzi od razu do podaj handicap. A druga sprawa to, że nie wyswietla się prawidłowo imię "Ann Birdfree" podane w wywołaniu funkcji :/

#include<iostream>
#include "golf.h"
using namespace std;
void setgolf(golf & g, const char * name, int hc)
{
    name = g.fullname;
    g.handicap = hc;
}
void setgolf(golf & g)
{
    cout << "Podaj imie: ";
    cin.getline(g.fullname, Len);
    cout << "Podaj handicap: ";
    cin >> g.handicap;
}
void handicap(golf & g, int hc)
{
    g.handicap = hc;
}
void showgolf(const golf & g)
{
    cout << "Imie: " << g.fullname << endl;
    cout << "Handicap: " << g.handicap << endl;
}
#include <iostream>
#include "golf.h"
using namespace std;

int main()
{
    cout << "Podaj ilosc osob: ";
    int N;
    cin >> N;
    golf osoba[N];
    for(int i = 0; i < N; i++)
    {
        setgolf(osoba[i]);
        showgolf(osoba[i]);
    }
    golf ann;
    setgolf(ann, "Ann Birdfree", 24);
    showgolf(ann);
    golf andy;
    handicap(andy, 50);
    showgolf(andy);

    return 0;
}

 

 

komentarz 23 stycznia 2019 przez j23 Mędrzec (195,240 p.)

To, że @RafalS napisał Ci, że możesz przypisać tablicę do wskaźnika, nie znaczy, że to zawsze będzie działać. Tak powinno być:

void setgolf(golf & g, const char * name, int hc)
{
    strcpy(g.fullname, name);
    g.handicap = hc;
}

 

BTW, dlaczego nie użyjesz klasy std::string zamiast tablic znakowych?

komentarz 23 stycznia 2019 przez Hailon Początkujący (310 p.)
Nie za bardzo wiem jak używać stringa jako argumentu funkcji :/
komentarz 23 stycznia 2019 przez j23 Mędrzec (195,240 p.)

Tak samo jak strukturę golf - przekazujesz przed (const) referencję.

komentarz 23 stycznia 2019 przez Hailon Początkujący (310 p.)
void setgolf(golf & g, const string & name, int hc);

'string' does not name a type :/
komentarz 23 stycznia 2019 przez j23 Mędrzec (195,240 p.)

Załącz plik <string>.

komentarz 23 stycznia 2019 przez Hailon Początkujący (310 p.)
Ciągle ten sam błąd :(
komentarz 23 stycznia 2019 przez j23 Mędrzec (195,240 p.)
Pokaż całą funkcję.
komentarz 23 stycznia 2019 przez Hailon Początkujący (310 p.)

Plik nagłowkowy:

#include<string>
#include<iostream>
const int Len = 40;
struct golf
{
    string fullname[Len];
    int handicap;
};
void setgolf(golf & g, const string & name, int hc);
void setgolf(golf & g);
void handicap(golf & g, int hc);
void showgolf(const golf & g);

Definicje:

#include<iostream>
#include "golf.h"
#include<string>
using namespace std;
void setgolf(golf & g, const string * name, int hc)
{
    strcpy(g.fullname, name);
    g.handicap = hc;
}
void setgolf(golf & g)
{
    cout << "Podaj imie: ";
    cin.getline(g.fullname, Len);
    cout << "Podaj handicap: ";
    cin >> g.handicap;
}
void handicap(golf & g, int hc)
{
    g.handicap = hc;
}
void showgolf(const golf & g)
{
    cout << "Imie: " << g.fullname << endl;
    cout << "Handicap: " << g.handicap << endl;
}

 

1
komentarz 23 stycznia 2019 przez j23 Mędrzec (195,240 p.)

W nagłówku daj using namespace std; (nie powinno się tego robić, ale ...). Tę samą linię wywal z pliku z definicjami.

 

struct golf
{
    string fullname;
    int handicap;
};
...

void setgolf(golf &g, const string &name, int hc)
{
    g.fullname = name;
    g.handicap = hc;
}

U Ciebie w nagłówku name jest referencją, a w źródle wskaźnikiem. Bądź bardziej uważny.

komentarz 23 stycznia 2019 przez Hailon Początkujący (310 p.)
Ogromnie dzieki za poswiecony czas, straszne dzisiaj robie bledy ;)
komentarz 23 stycznia 2019 przez Hailon Początkujący (310 p.)

@j23, Jeszcze jedno szybkie pytanie, jak zrobić żeby wczytało mi wyrazy po spacji np. Jan Kowalski w tej funkcji:

void setgolf(golf & g)
{
    cout << "Podaj imie: ";
    cin.getline(g.fullname, Len);
    cout << "Podaj handicap: ";
    cin >> g.handicap;
}

 

 

1
komentarz 23 stycznia 2019 przez Hailon Początkujący (310 p.)
Już wiem, przypomniałem sobie, jeszcze raz dzięki ;)
komentarz 29 marca 2019 przez dziubi21 Początkujący (310 p.)

A dlaczego wyskakuje mi błąd: "golf.cxx:8:4: error: ‘strcpy’ was not declared in this scope"?

#include <iostream>
#include "golf.h"
#include <string>


void setgolf(golf & g, const std::string * name, int hc)
{		
		 strcpy(g.fullname, name);
		g.handicap = hc;		
}

 

komentarz 29 marca 2019 przez dziubi21 Początkujący (310 p.)
edycja 29 marca 2019 przez dziubi21
note: suggested alternative: 'strtoq'

Podobne pytania

0 głosów
1 odpowiedź 308 wizyt
pytanie zadane 23 marca 2019 w C i C++ przez Hailon Początkujący (310 p.)
0 głosów
1 odpowiedź 174 wizyt
pytanie zadane 23 marca 2019 w C i C++ przez Hailon Początkujący (310 p.)
0 głosów
1 odpowiedź 655 wizyt
pytanie zadane 1 marca 2019 w C i C++ przez Hailon Początkujący (310 p.)

93,488 zapytań

142,421 odpowiedzi

322,772 komentarzy

62,906 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...