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

c++: przekazywanie list poprzez referencje w pliku nagłówkowym

Object Storage Arubacloud
0 głosów
553 wizyt
pytanie zadane 7 stycznia 2017 w C i C++ przez heros22pt Użytkownik (950 p.)
edycja 7 stycznia 2017 przez heros22pt

Witam, jestem w trakcie pisania prostego programu w c++ i mam problem dotyczący przekazywania listy struktur poprzez referencje (bo to chyba jest jedyny, przynajmniej mi znany sposób). Otóż chodzi mi o program zawarty w 3 plikach (nagłówkowy, główny i z kodem). Ma on za zadanie działać na osobach (taka mała baza danych). No i problem zaczyna się już w przekazaniu listy z osobami z pliku głównego, poprzez plik nagłówkowy do pliku źródłowego. Gdy pominę zapis nagłówka  w pliku nagłówkowym, wszystko jest ok, poza tym że nie ma komunikacji, jednakże jak wpisze dany nagłówek do pliku nagłówkowego wyskakują błędy. Najlepiej jeśli pokażę ten problem:

 

plik główny (main.cpp):
 

#include<iostream>

//#include<list>

#include"osoby.h"

 

using namespace std;

 

int main()

{

list<person> lista_osob;

int menu;

cin >> menu;

switch (menu)

{

case 1:

{

dodaj_osobe(lista_osob);

}

}

 


system("pause");

}


 

plik nagłówkowy (zadanie.h):

 

#ifndef OSOBY_H

#define OSOBY_H

#include<list>

struct person

{

char imie[20];

char nazwisko[20];

int wiek;

double waga;

int wzrost;

};

 

void podaj_dane(person &nowa);

void dodaj_osobe(list<person> &lista_osob);  //W Tym miejscu jest opisywany problem

 

 

 

#endif


 

 

plik źródłowy (zadanie.cpp):
 

#include<iostream>

//#include<list>

#include"osoby.h";

 

using namespace std;

 

 

 

 

person podaj_dane()

{

person nowa;

 

cout << "imie: ";

cin.getline(nowa.imie, 20);

cout << "nazwisko: ";

cin.getline(nowa.nazwisko, 20);

cout << "wiek: ";

cin >> nowa.wiek;

cout << "waga: ";

cin >> nowa.waga;

cout << "wzrost: ";

cin >> nowa.wzrost;

// cout << nowa.wzrost;

 

return nowa;

}

 

void wyswietl_dane(person &nowa)

{

cout << nowa.nazwisko << endl << nowa.wiek;

}

 

 

/*

void dodaj_osobe(list<person> &lista_osob)

{

person nowa;

podaj_dane(nowa);

lista_osob.push_front(2);

}

*/

 

void dodaj_osobe(list<person> &lista_osob)

{

lista_osob.push_back(podaj_dane());

}


 

 



błędy:

Error    11    error C2365: 'dodaj_osobe' : redefinition; previous definition was 'data variable'   
Error    2    error C2275: 'person' : illegal use of this type as an expression   
Error    8    error C2275: 'person' : illegal use of this type as an expression   
Error    4    error C2182: 'dodaj_osobe' : illegal use of type 'void'   
Error    10    error C2182: 'dodaj_osobe' : illegal use of type 'void'   
Error    3    error C2065: 'lista_osob' : undeclared identifier   
Error    9    error C2065: 'lista_osob' : undeclared identifier   
Error    1    error C2065: 'list' : undeclared identifier    
Error    7    error C2065: 'list' : undeclared identifier   
Error    5    error C2064: term does not evaluate to a function taking 1 arguments  

 
 


proszę o pomoc, ponieważ głowię się nad tym pozornie banalnym problemem już dobre pare godzin. Z góry dziękuję :)

 

Głównym problemem jest to że w pliku nagłówkowym (z rozszerzeniem .h) nie mogę wstawić takiego kodu:

void dodaj_osobe(list<person> &lista_osob);

bez tego nie mogę odwoływać się do listy umieszczonej  w pliku głównym (main.cpp)

komentarz 7 stycznia 2017 przez unknown Nałogowiec (39,560 p.)
http://forum.pasja-informatyki.pl/faq#jak-wstawic-kod-zrodlowy

I jakie jest problem, bo nigdzie nie napisałeś?
komentarz 7 stycznia 2017 przez heros22pt Użytkownik (950 p.)
napisałem " No i problem zaczyna się już w przekazaniu listy z osobami z pliku głównego, poprzez plik nagłówkowy do pliku źródłowego. Gdy pominę zapis nagłówka  w pliku nagłówkowym, wszystko jest ok, poza tym że nie ma komunikacji, jednakże jak wpisze dany nagłówek do pliku nagłówkowego wyskakują chaszcze"

 

chcę w pliku źródłowym działać na liście utworzonej w pliku głównym. nie mogę tego zrobić, ponieważ nie mogę dodać "void dodaj_osobe(list<person> &lista_osob);" do pliku nagłówkowego. wywala mi mase błędów
komentarz 7 stycznia 2017 przez unknown Nałogowiec (39,560 p.)
Co to są "chaszcze" i jakie błędy dokładnie. Jak na razie jedynie co zrozumiałem z twojego pytania to: "nie działa"
komentarz 7 stycznia 2017 przez heros22pt Użytkownik (950 p.)

Te błędy nie pojawiają się po usunięciu z pliku nagłówkowego " 

void dodaj_osobe(list<person> &lista_osob);"

komentarz 7 stycznia 2017 przez unknown Nałogowiec (39,560 p.)
Wklej logi kompilatora tutaj, na forum, do posta a nie na zdjęciu, na którym nie można nic zobaczyć.
komentarz 7 stycznia 2017 przez heros22pt Użytkownik (950 p.)
zrobione. przepraszam, jestem nowy na forum.

2 odpowiedzi

+1 głos
odpowiedź 7 stycznia 2017 przez criss Mędrzec (172,590 p.)

W "pliku źródłowym" (cokolwiek to znaczy) definiujesz inną metode niż tą zadeklarowaną w pliku nagłówkowym...

Deklarujesz void podaj_dane(person &nowa); i definiujesz person podaj_dane()

PS (przyczepie do kilku błędów logicznych w twoim pytaniu) :P

w 3 plikach (nagłówkowy, główny i z kodem)

Rozumiem, że w dwóch pozostałych kodu nie ma? XD

dotyczący przekazywania listy struktur poprzez referencje (bo to chyba jest jedyny, przynajmniej mi znany sposób)

Dlaczego wg ciebie nie można przekazywać listy w jakikolwiek inny sposób?

 No i problem zaczyna się już w przekazaniu listy z osobami z pliku głównego, poprzez plik nagłówkowy do pliku źródłowego.

Danych nie przekazuje się pomiędzy plikami... Pliki to sposób na przetrzymywanie kodu i nie ma żadnego związku z działaniem programu.

Gdy pominę zapis nagłówka  w pliku nagłówkowym, wszystko jest ok, poza tym że nie ma komunikacji

Czym jest "zapis nagłówka"? :| (tak serio to nawet nie chce wiedzieć) Jakiej "komunikacji" nie ma?

wyskakują chaszcze

 ????????????????

No i wrzucaj kod w przeznaczone do tego pole (ikonka {...} z napisem 'code' w edytorze). No i fajnie by było jakby twoje pytanie było zrozumiałe. Byłem w stanie się przyczepić do chyba każdego zdania. I jeszcze jedno - podawaj błędy wyrzucane przez kompilator. Obecnie całe twoje pytanie sprowadza się do "nie działa". Ale rozumiem - nowy na forum. Takie ładne powitanie

komentarz 7 stycznia 2017 przez heros22pt Użytkownik (950 p.)
dziękuję za uwagi, trochę poprawiłem czytelność, oraz wstawiłem błędy. A co do Pańskiego rozwiązania, niestety tą alternatywę też już testowałem i nie pomogła
+1 głos
odpowiedź 7 stycznia 2017 przez czujek22 Dyskutant (7,670 p.)

Błędów sporo narobiłeś w definicji funkcji podaj_dane():

1. Jeżeli w pliku nagłówkowym .h masz zadeklarowaną przez siebie funkcje to w pliku .cpp deklarujesz ją tak samo + dodajesz ciało funkcji z danym kodem.

2. W samej funkcji dajesz return a zadeklarowałeś funkcje jako void.

3 .Musisz się także zastanowić czy robić to przez referencję czy innym sposobem bo w powyższej funkcji parametrem jest referencja do przekazywanej struktury person a potem tworzysz nowa strukture o tej samej nazwie co powoduje zmiany w  nowo utworzonej strukturze i w przekazanej strukturze (kompilator i tak zgłosi błąd bo takie same nazwy).

4. Co do listy to dokładnie nie wiem bo jej nie przerabiałem ale pierwsze co mi sie rzuca w oczy to

lista_osob.push_back(podaj_dane());

nie możesz dać podaj_dane() w parametrze push_back() jeżeli nie zwraca niczego co miałoby tym parametrem być(czytaj 2 punkt).

komentarz 7 stycznia 2017 przez heros22pt Użytkownik (950 p.)

2.W samej funkcji dajesz return a zadeklarowałeś funkcje jako void.

funkcja nie jest zadeklarowana jako void, ale jako struktura (która została utworzona w funkcji nagłówkowej) i tam zwracam cała "informację " o danej osobie.

 3.Musisz się także zastanowić czy robić to przez referencję czy innym sposobem bo w powyższej funkcji parametrem jest referencja do przekazywanej struktury person a potem tworzysz nowa strukture o tej samej nazwie co powoduje zmiany w  nowo utworzonej strukturze i w przekazanej strukturze (kompilator i tak zgłosi błąd bo takie same nazwy).

struktura person jest utworzona tylko raz w pliku nagłówkowym, reszta to działania na niej (dodawanie nowych osób)

 

4.Co do listy to dokładnie nie wiem bo jej nie przerabiałem ale pierwsze co mi sie rzuca w oczy to

...

nie możesz dać podaj_dane() w parametrze push_back() jeżeli nie zwraca niczego co miałoby tym parametrem być(czytaj 2 punkt).

Tu akurat jest poprawnie, ponieważ zwracam w podaj_dane() zmienną, która jest strukturą, czyli defakto całą osobę.

Te wszystkie części kodu raczej działają. Cały problem udało mi się obejść na około, za pomocą zmiennych globalnych, ale mimo to, nadal dręczy mnie problem, dla czego nie mogłem w funkcji nagłówkowej (rozszerzenie *.h) dodać 

void dodaj_osobe(list<person> &lista_osob);

mimo, że jest to to samo co w kodzie, tyle że bez ciała.... Co więcej sama funkcja działa, jeśli nie dodam tego do pliku nagłówkowego, jednakże bez tego nie mogę odwołać się do kodu z funkcji main...

komentarz 7 stycznia 2017 przez czujek22 Dyskutant (7,670 p.)

Zrobiłem to w ten sposób i chyba działa jak należy. Trzeba tylko robić na 3 pliki.

#include <iostream>
#include<list>

using namespace std;

struct person
{
    char imie[20];
    char nazwisko[20];
    int wiek;
    double waga;
    int wzrost;
};

person podaj_dane(void)
{
    person a;

    cout << "imie: ";
    cin.getline(a.imie, 20);
    cout << "nazwisko: ";
    cin.getline(a.nazwisko, 20);
    cout << "wiek: ";
    cin >> a.wiek;
    cout << "waga: ";
    cin >> a.waga;
    cout << "wzrost: ";
    cin >> a.wzrost;

    return a;
}

void dodaj_osobe(list<person> &a)
{
    person x = podaj_dane();
    a.push_back(x);
}

int main()
{
    list<person> lista;

    dodaj_osobe(lista);

    return 0;
}

 

komentarz 7 stycznia 2017 przez czujek22 Dyskutant (7,670 p.)

AD 2) w pliku nagłówkowym zadeklarowałeś funkcje

void podaj_dane(person &nowa);

A w .cpp

person podaj_dane()

Jak ci to zadziałało ?

Podobne pytania

0 głosów
1 odpowiedź 112 wizyt
pytanie zadane 21 grudnia 2016 w C i C++ przez qlucha Obywatel (1,790 p.)
0 głosów
1 odpowiedź 1,018 wizyt
pytanie zadane 26 sierpnia 2018 w C i C++ przez Hinzeq Użytkownik (860 p.)

92,568 zapytań

141,422 odpowiedzi

319,637 komentarzy

61,957 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...