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

Code Blocks błąd przy kompilacji dwóch plików cpp

Object Storage Arubacloud
0 głosów
1,110 wizyt
pytanie zadane 25 lipca 2016 w C i C++ przez Coroys Początkujący (370 p.)

Mam dwa pliki .cpp z pewnej książki, które powinny razem działać.

Plik main.cpp:

// external.cpp -- zmienne zewnetrzne
// kompilowac lacznie z support.cpp
#include <iostream>
using namespace std;
// zmienna zewnerzna:
double warming = 0.3; // definicja zmiennej warming
// prototypy funkcji:
void update(double dt);
void local();

int main()          // korzysta ze zmiennej globalnej
{
    cout << "Globalne ocieplenie wynosi " << warming << " stopni.\n";
    update(0.1);    // wywolanie funkcji modyfikujacej zmienna globalna
    cout << "Globalne ocieplenie wynosi " << warming << " stopni.\n";
    local();        // wywolanie funkcji korzystajacej ze zmiennej lokalnej
    cout << "Globalne ocieplenie wynosi " << warming << " stopni.\n";
    return 0;
}

Oraz drugi plik file2.cpp (nazwa nie ma znaczenia?):

// support.cpp -- stosowanie zmiennych zewnetrznych
// kompilowac razem z external.cpp
#include <iostream>
extern double warming; // deklaracja referencyjna zmiennej warming z innego pliku
// zmienna zewnetrzna:
double warming = 0.3; // deklaracja zmiennej warming
// prototypy funkcji
void update(double dt);
void local();
using std::cout;

void update(double dt) // modyfikuje zmienna globalna
{
    extern double warming; // opcojonalne powtorzenie deklaracji
    warming += dt; // odwolanie do globalnej zmiennej warming
    cout << "Zwiekszam parametr ocieplenia do " << warming;
    cout << " stopni.\n";
}

void local() // korzysta ze zmiennej lokalnej
{
    double warming = 0.8; // nowa zmienna przeslania zmienna zewnetrzna

    cout << "Lokalne ocieplenie wynosi " << warming << " stopni.\n";
    // odwolanie do zmiennej globalnej za pomoca operatora zasiegu
    cout << "Ale globalne ma wartosc " << ::warming;
    cout << " stopni.\n";
}

Wyskakuje błąd: "error: ld returned 1 exit status|".

Używam Code::Blocks 16.01

komentarz 25 lipca 2016 przez DragonCoder Nałogowiec (36,500 p.)
Jezu chryste, co to jest? Ile komentarzy, rob zmienne ktore cos momwia. A gdzie jest plik.h, gdzie jest dołącyenie 2 pliku .cpp. Zeby móc się do niego odnieść musisz go zainkludować. A zmienne w funkcji są widoczne tylko w tej funkcji... Obejrzyj odcinki o włsnaych funkcjach, rozdzielania projektów na kilka plików. Jeżeli się mylę to proszę o poprawę kgoś kto już dług w cpp siedzi.

 Pozdrawiam Krystian
komentarz 25 lipca 2016 przez Coroys Początkujący (370 p.)
Napisałem jasno, że to są KOPIUJ WKLEJ pliki z książki. To są ich zmienne, komentarze wszystko w celach nauki a nie projektu dla programisty 15k, więc proszę nie wzywać Chrystusa.
komentarz 25 lipca 2016 przez MetRiko Nałogowiec (37,110 p.)

Jeżeli zawartość książki do nauki wygląda tak jak tu przedstawiłeś to radzę ją zmienić.. i to szybko. Najlepiej gdy naukę c++ zaczniesz od filmów p. M. Zelenta.
Tu masz link'a do pierwszego filmu.. przebrnij przez wszystko, a zrozumiesz, że to co tutaj pokazałeś jest co najmniej straszne.
Link do pierwszego filmu o c++

1 odpowiedź

0 głosów
odpowiedź 25 lipca 2016 przez MetRiko Nałogowiec (37,110 p.)

A gdzie ty masz pliki nagłówkowe (te z końcówką .h)? Nie wspomnę już o niezałączeniu pliku do main'a, za pomocą dyrektywy #include. Odsyłam do tej lektury, jak podzielić kod w c++ na osobne pliki: Link.
A co do twojego kodu.. taka wersja będzie poprawna (nie testowałem, ale powinno działać):

//Treść plików została zamieszczona mniej więcej tak jak będzie to robił kompilator w trakcie kompilacji..

//file2.h

//Tutaj mamy deklarację procedur update i local.. 
//Zawartość tego pliku załączamy do main.cpp, dzięki temu kompilator będzie wiedział, że takie funkcje w ogóle istnieją.
//Natomiast ich ciała zamieszczamy w pliku file2.cpp
void update(double dt, double warming);
void local(double warming);

//main.cpp
#include <iostream>
#include <file2.h>
using namespace std;
//double warming = 0.3; Nie opłaca się tworzyć zmiennej globalnej w tym miejscu..
//Lepiej jest to zrobić lokalnie (w main'ie), a potem przesłać ją do funkcji.

void update(double dt);
void local();
 
int main()
{
    double warming = 0.3;
    cout << "Globalne ocieplenie wynosi " << warming << " stopni.\n";
    update(0.1);
    cout << "Globalne ocieplenie wynosi " << warming << " stopni.\n";
    local();
    cout << "Globalne ocieplenie wynosi " << warming << " stopni.\n";
    return 0;
}

//file.cpp

#include <file2.h>
#include <iostream>

using namespace std;
 
void update(double dt, double warming)
{
    warming += dt;
    cout << "Zwiekszam parametr ocieplenia do " << warming;
    cout << " stopni.\n";
}
 
void local(double warming)
{ 
    cout << "Lokalne ocieplenie wynosi " << warming << " stopni.\n";
    cout << "Ale globalne ma wartosc " << ::warming;
    cout << " stopni.\n";
}

 

komentarz 25 lipca 2016 przez Coroys Początkujący (370 p.)
Nie chodzi mi o poprawę kodu, bo to są listingi z książki. Te pliki mają mnie czegoś nauczyć, to nie jest żaden mój projekt. Skoro nie wywala błędu z kodem, to znaczy, że robię coś źle z dodawaniem plików i tworzeniem projektów. Książka nie informuje jak załączać dwa pliki.

Pytanie: Czy używanie plików nagłówkowych .h jest obowiązkowe jeśli korzystam z dwóch plików .cpp?

Czy to błąd w książce? Bo wcześniej były inne listingi i rzeczywiście prototypy funkcji były umieszczone w pliku .h? Bez tego nie pójdzie z obecnym kodem?

O to mi chodzi.
1
komentarz 25 lipca 2016 przez MetRiko Nałogowiec (37,110 p.)
Pliki .h są niezbędne do prawidłowego funkcjonowania kodu gdy dzielisz go na osobne pliki.. Nie będę cię oszukiwał.. da się załączać same pliki .cpp.. ale jest to nieeleganckie, niepoprawne i bardzo często taki kod jest mniej czytelny.. nie wspomnę już o tym, że z takim kodem w przyszłości mogą pojawić się problemy z kompilacją. Dlatego stanowczo odradzam "includowanie" plików .cpp. Przejrzyj sobie linki które wysłałem w komentarzu do posta, oraz w odpowiedzi.
komentarz 25 lipca 2016 przez DragonCoder Nałogowiec (36,500 p.)
Bo w ksiazce masz moze tylko fragmenty kodu... Sam widziałem to w jednym kursie. Program jest rozbijany na mniejsze części żeby przedstawić jak to wyglada i wytłumaczyć na koncu caly program i zadanko. A co do plików .h tak muszą one być. .cpp i .h muszą miec ta sama nazwe i musisz uzyc dyrektyw ( nie recze za nazwe). A pozniej #include "plik.h" dzieki czemu dajesz informacje kompilatorowi ze masz jakis plik ktorego chcesz uzyc czegos tam
komentarz 25 lipca 2016 przez Coroys Początkujący (370 p.)
Dzięki, sam się zdziwiłem, że .h nie ma. Połączyłem to w jeden program. Ogólnie listingi miały pokazywać użycie zmiennych globalnych. Korzystam z książki Stephena Praty.

Zastanawiam się czy dobrze rozumiem użycie zmiennych globalnych między plikami z tym "extern". Chyba najlepiej deklarować je w pliku nagłówkowym?
komentarz 25 lipca 2016 przez MetRiko Nałogowiec (37,110 p.)

Dopisek extern działa podobnie jak "forward declaration". Innymi słowy daje on znać kompilatorowi, że zmienna (z tym dopiskiem) będzie zdefiniowana gdzieś w kodzie.. a to jest tylko jej deklaracja, różnica natomiast leży w szczegółowości.. najłatwiej będzie wyjaśnić to na przykładzie z klasami:
class Klasa; //deklarujesz jakąś klasę (pokazujesz kompilatorowi, że taka klasa znajduje się w kodzie.. jednak, jej ciało pojawi się dopiero potem, innymi słowy "forward declaration")
Klasa NowaKlasa; //definiujesz/tworzysz nowy obiekt typu Klasa
class Klasa {/*Kod klasy*/} //definiujesz klasę Klasa w kodzie (podajesz jej ciało)
extern Klasa NowaKlasa; //deklarujesz jakiś konkretny obiekt (tym razem nie informujemy kompilatora o istnieniu klasy Klasa, ale o całej zmiennej [NowaKlasa] typu Klasa, która gdzieś potem pojawi się w kodzie.. z tego powodu extern jest głównie stosowany przy obiektach/zmiennych globalnych. 

komentarz 25 lipca 2016 przez DragonCoder Nałogowiec (36,500 p.)
Tylko, że wmiennych globalnych powinno się unikać lub tworzyć jak najmniej. Samm mam projekt i póki co mam tylko 1 zmienna globalna.
komentarz 27 lipca 2016 przez Coroys Początkujący (370 p.)

Ech no to teraz książka mnie wkurza:

https://books.google.pl/books?id=lxjqCwAAQBAJ&pg=PA418&lpg=PA418&dq=twofile1.cpp&source=bl&ots=cpbl0JwIuu&sig=jdrzjr5v4FyfdLk-0QMGm72_F3k&hl=pl&sa=X&ved=0ahUKEwi8n4j9qZPOAhVCiywKHQ-bA_wQ6AEIMjAE#v=onepage&q=twofile1.cpp&f=false

Autor nie informuje o plikach .h a twofile1.cpp i twofile2.cpp ma razem działać. Przerobiłem sobie to z plikiem .h, choć musiałem schować dwie zmienne do main(), wtedy tak naprawde użycie STATIC nie ma sensu. Wgl Static jest używane?

Tak z ciekawośći istnieje jakakolwiek możliwość, żeby uruchomić ten kod bez zmian w dwóch plikach .cpp bez .h?

komentarz 27 lipca 2016 przez DragonCoder Nałogowiec (36,500 p.)
Mam pytanie czy to czeski? Kolega mówił, że tak, ale lepiej rozbić projket. Użyj dyrektywy.

#ifndef

#define

#endif

to do pliku .h.... I kolega wyzej mowil, zebys uzyl klas. Będzie łatwiej bo wtedy jest to widocyne dla całego projektu.
komentarz 27 lipca 2016 przez Coroys Początkujący (370 p.)
To czeski, bo znalazłem w internecie ten przykład xD ogólnie mam w domu polską
komentarz 27 lipca 2016 przez DragonCoder Nałogowiec (36,500 p.)
ok, już myślałem że po czeskuczytasz... A więc jak widzisz książka ukazuje jak to zrobić na zmiennych globalnych. Zamiast zmiennych globalnych robisz klase z public i przekazujesz przez referencje. U P. Mirosława nie ma referencji jak się nie mylę

Podobne pytania

0 głosów
2 odpowiedzi 180 wizyt
pytanie zadane 11 grudnia 2018 w C i C++ przez Gryczny Początkujący (320 p.)
–1 głos
1 odpowiedź 521 wizyt
pytanie zadane 22 sierpnia 2015 w C i C++ przez Bartos Użytkownik (610 p.)
0 głosów
1 odpowiedź 1,622 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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!

...