Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Dzielenie kodu na kilka plików źródłowych - "struktury globalne" a kilka plików

Ostatnio zmodyfikowano 2012-09-27 22:23
Autor Wiadomość
tariel36
Temat założony przez niniejszego użytkownika
Dzielenie kodu na kilka plików źródłowych - "struktury globalne" a kilka plików
» 2012-09-25 01:46:18
Witam,

Po pierwsze, nie jestem pewien czy wybrałem dobry dział (problem chyba wykracza lekko poza samą lekcje), jeśli tak jest, to przepraszam i prosiłbym o przeniesienie.

Problem:
Staram się podzielić mój kod na kilka plików. Mam kilka struktur które są używane w całym programie przez różne funkcje. W kursie jest poruszony problem struktur i funkcji ale ograniczający się tylko do 3 plików (main.cpp, "funkcje.hpp i funkcje.cpp"). Ja staram się podzielić kod na więcej plików.

Powiedzmy że mam zestaw:
main.cpp
globals.hpp
funkcje_x.cpp i .hpp
funkcje_y.cpp i .hpp

W pliku main.cpp wiadomo główne ciało programu.
W pliku globals.hpp przechowuje kilka definicji oraz kilka struktur.
W plikach funkcje_x.cpp i funkcje_y.cpp znajdują się funkcje korzystające ze struktury znajdujących się w pliku globals.hpp

I teraz pojawia się problem:

Kiedy w pliku main.cpp zastosuję taką operacje:
#include "globals.h"
#include "funkcje_x.hpp"
#include "funkcje_y.hpp"
Kompilator nie odnajduje tych struktur, także kolejny pomysł który przyszedł mi do głowy to dołączenie pliku globals.hpp do plików funkcje_x.hpp i funkcje_y.hpp. Niestety kiedy dołączę to do obydwu plików nagłówkowych kompilator zwraca mi redefinicje struktur -> program się nie kompiluje. Kiedy dołączę globals.hpp tylko do jednego z nich, to wiadomo, drugi nie znajduje struktur.

Jak rozwiązać ten problem?

Czy powinienem złączyć obydwa pliki funkcje_x.cpp i funkcje_y.cpp w 1 i wtedy zaimplementować struktury w 1 pliku nagłówkowym? Tylko że po jakimś czasie pewnie znów trafie na ten problem, także ten sposób raczej odpada.
P-65495
DejaVu
» 2012-09-25 04:24:23
Zapewne w globals.hpp dołączasz function_x.hpp bądź function_y.hpp - dlatego się nie kompiluje. Nie można robić cyklicznych odwołań do plików nagłówkowych (jeżeli przyjmiesz, że wierzchołkami są pliki *.hpp, a krawędziami skierowanymi dyrektywy #include to nie może powstać w grafie cykl). Wspomniany problem cykli nie jest rozpatrywany w plikach *.cpp, ponieważ kompilator sobie z tym radzi.
P-65497
tariel36
Temat założony przez niniejszego użytkownika
» 2012-09-25 12:49:57
Niestety w globals.hpp mam dołączone tylko biblioteki, żadnych plików nagłówkowych zrobionych przez moją osobę :(
P-65505
DejaVu
» 2012-09-25 17:20:28
Weź kartkę i rozrysuj na niej powiązania między własnymi plikami *.hpp - musi być gdzieś cykl, że się nie kompiluje. Drugą opcją jest po prostu brak dowiązania do pliku w którym są definicje struktur/deklaracje funkcji.
P-65516
tariel36
Temat założony przez niniejszego użytkownika
» 2012-09-26 22:05:18
No nie jestem w stanie tego rozgryźć nawet po odrysowaniu układu:
http://i166.photobucket.com/albums/u107/tariel36/WYKRES.png

Może gdzieś w definicjach popełniłem błąd:

globals.hpp:

#ifndef globals_hpp
#define globals_hpp
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <fstream>
using namespace std;
#define C_BS 10
#define C_RS 10
#define C_PS 2

struct g_struct {
    int eg;
    int pt;
    int me;

};
g_struct g_ctrl;

struct b {
    int id;
    string ne;
    int php;
};
b bs[C_BS];

struct r {
    int id;
    string ne;
    int ie;

};
r rs[C_RS];

struct ps {
    int id;
    string ne;
    int hp;

};
ps p[C_PS];
#endif
main.cpp:

#include "globals.hpp"
#include "funkcje_y.hpp"
#include "funkcje_x.hpp"
//normalny kod
funkcje_x.hpp
#ifndef funkcje_x_hpp
#define funkcje_x_hpp
void p_a();
void p_bl();
void p_re();
#endif
funkcje_x.cpp
#include "funkcje_x.hpp"
//reszta kodu
funkcje_y.hpp
#ifndef funkcje_y_hpp
#define funkcje_y_hpp
int p_t_p(int p_pis, int f_pis);
void load_files();
#endif
funkcje_y.cpp
#include "funkcje_y.hpp"
//funkcje
P-65606
DejaVu
» 2012-09-26 22:12:15
Bez logu kompilacji nic nie jesteśmy w stanie powiedzieć.
P-65608
cyklopek11
» 2012-09-26 22:46:59
Z ciekawości zbudowałem kilku plikowy projekt w Code::Blocks z kodem który wkleiłeś powyżej i ... projekt buduje się bez problemów.

W Visual Studio 2010 też się buduje...

Wprowadziłeś mnie w błąd zawartość plików różni się od tego co napisałeś w pierwszym poście. Działa dopiero jak wy-externujesz jak napisał Admixior. Przed:
C/C++
extern g_struct g_ctrl;
potrzeba jeszcze deklaracji zapowiadającej:
C/C++
struct g_struct; // i kolejnych
P-65609
Admixior
» 2012-09-26 23:16:08
Ja obstawiam że musisz przenieść definicje globalne (obiektów) takie jak tablice czy pojedyncze elementy np:g_struct g_ctrl;
do plików cpp. Plików nie dołączać do nagłówków tylko wstawić do projektu. A w nagłówkach napisać deklaracje zmiennych globalnych np.:
extern g_struct g_ctrl;
P-65610
« 1 » 2
  Strona 1 z 2 Następna strona