Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

[C++] Kompilacja programu składającego się z kilku plików

Moderatorzy: Jacek Bogusz, Moderatorzy

Awatar użytkownika
Darlington
-
-
Posty: 574
Rejestracja: 12 lis 2007, o 18:18
Lokalizacja: stąd!

[C++] Kompilacja programu składającego się z kilku plików

Postautor: Darlington » 17 mar 2009, o 15:57

Witam, mam program składający się z 3 plików:

p021.cpp

Kod: Zaznacz cały

#include <iostream> #include "nagl.h" #include "p021a.cpp" using namespace std; int main() { cout << "Podaj a: "; cin >> a; cout << "Podaj b: "; cin >> b; cout << endl << wieksza(a,b) << endl; druga(); } inline int wieksza(int a, int b) { if(a>b) { return a; } else { return b; } }
p021a.cpp

Kod: Zaznacz cały

#include <iostream> using namespace std; #include "nagl.h" void druga(void) { while(i>0) { cout << wieksza(a,b); i--; } }
nagl.h

Kod: Zaznacz cały

extern int a,b; int i=10; inline int wieksza(int, int); void druga(void);
Kompilator (VC++ 2008 EE SP1) przy kompilacji wyrzuca błąd:
1>(...)\nagl.h(2) : error C2374: 'i' : redefinition; multiple initialization
1> (...)\nagl.h(2) : see declaration of 'i'
Co jest źle i jak to naprawić?
Jest to ćwiczenie XXIX/rozdział 5 z nowej Symfonii

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty: 2650
Rejestracja: 24 sty 2005, o 00:39
Lokalizacja: Winny gród

Postautor: pajaczek » 17 mar 2009, o 16:50

Przed kompilacją do pracy rusza preprocesor, po wykonaniu jego pracy Twój kod będzie wyglądał tak (rozwijam tylko fragmenty Twoich plików):

Kod: Zaznacz cały

#include <iostream> /***************/ extern int a,b; int i=10; inline int wieksza(int, int); void druga(void); /***************/ #include <iostream> using namespace std; /******************/ extern int a,b; int i=10; inline int wieksza(int, int); void druga(void); /*****************/ void druga(void) { while(i>0) { cout << wieksza(a,b); i--; } } using namespace std; int main() { cout << "Podaj a: "; cin >> a; cout << "Podaj b: "; cin >> b; cout << endl << wieksza(a,b) << endl; druga(); } inline int wieksza(int a, int b) { if(a>b) { return a; } else { return b; } }
Dla ułatwienia dodałem linie komentarza oddzielające ciekawe fragmenty.
Jak myślisz, co jest nie tak. Zadanie domowe dla Ciebie (poza próbą rozwiązania problemu teraz), pytanie: dlaczego nie przyczepił się do powtórzenia deklaracji funkcji, a tylko wskazuje *** zmienne?
Jak nie uda Ci się nic wymyślić by rozwiązać problem, później pokażę Ci jak to zrobić. Chciałbym jednak byś wpadł na to sam. Poczytaj o preprocesorze i jakie oferuje dyrektywy.

Awatar użytkownika
Darlington
-
-
Posty: 574
Rejestracja: 12 lis 2007, o 18:18
Lokalizacja: stąd!

Postautor: Darlington » 17 mar 2009, o 17:47

Wiem, że deklarować obiekt można wiele razy, ale definiować go tylko raz.
A co do preprocesora, właśnie czytam rozdział o nim w Symfonii.
Czy trzeba użyć dyrektyw kompilacji warunkowej czy coś w tym stylu?

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty: 2650
Rejestracja: 24 sty 2005, o 00:39
Lokalizacja: Winny gród

Postautor: pajaczek » 19 mar 2009, o 19:45

No jak widać albo nie doczytałeś jeszcze (choć trochę czasu dałem), albo się po prostu nie pochwaliłeś wynikami.

Spróbuj zmienić (uzupełnić) nagl.h na taki

Kod: Zaznacz cały

#ifndef NAGL_H #define NAGL_H 1 extern int a,b; int i=10; inline int wieksza(int, int); void druga(void); #endif
i jeszcze raz skompiluj ;-)

Wróć do „PLD/FPGA i inne zagadnienia techniki cyfrowej”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 20 gości