Strona 1 z 1

[C++]Zmienne globalne definiowanie

: 02 lip 2009, 10:25
autor: lukas_j
Ostatnio robie program (a dokladniej gre). Chcialem zdefiniowac zmienne i rozne rzeczy, po to aby byly dostepne w calym pliku. Dokladniej gre robie przez biblioteke allegro i mam np

Kod: Zaznacz cały

int lx,ly,mx,my,ox,oy;
int status;

FONT *czcz;

BITMAP *bufor;
BITMAP *tlo;
BITMAP *maluch;
BITMAP *ludek;
BITMAP *object;
i dalem to do pliku global.h
I teraz mam problem. Jesli chodzi o kompilacje w przypadku dolaczenia tego z jednego pliku to jest ok. Jednak teraz mam drugi plik, wpisalem w nim tez #include <global.h> tak jak w pierwszym i mam np. takie bledy:

Kod: Zaznacz cały

multiple definition of `lx' 
first defined here
Prosze o pomoc. Z gory dziekuje ;)

Odp: [C++]Zmienne globalne definiowanie

: 02 lip 2009, 11:51
autor: arrevalk
W C zawsze robilem to tak:
plik.h:

Kod: Zaznacz cały

#ifndef _PLIK_H     //te podkreślenia tutaj są po to aby symbol definiowany na 100% był różny 
#define _PLIK_H    //od wszelkich możliwych zmiennych i definicji w programie

//tresc pliku

#endif
I teraz plik.h można dodawać wielokrotnie a kompilator załączy go tylko raz w trakcie kompilacji.

Odp: [C++]Zmienne globalne definiowanie

: 02 lip 2009, 15:12
autor: Hauleth
a po za tym w nagłówku nie definiuj zmiennych jedynie deklaruj bo ci się linker rzuci

Odp: [C++]Zmienne globalne definiowanie

: 05 lip 2009, 23:48
autor: lukas_j
Wlasnie tak mam! Dokladnie tka i nie dziala.

Odp: [C++]Zmienne globalne definiowanie

: 06 lip 2009, 00:15
autor: adrian5632
lukas_j pisze:Wlasnie tak mam! Dokladnie tka i nie dziala.
a po za tym w nagłówku nie definiuj zmiennych jedynie deklaruj bo ci się linker rzuci
Jednak teraz mam drugi plik, wpisalem w nim tez #include <global.h> tak jak w pierwszym i mam np. takie bledy:
No i dlaczego zaprzeczasz samemu sobie?? Jak już kolega wspomniał - NIE DEFINIUJ zmiennych w plikach NAGŁÓWKOWYCH. W plikach nagłówkowych TYLKO je DEKLARUJESZ....

Przykład:
Plik a.h:

Kod: Zaznacz cały

int a1;
int a2;
Plik a.cpp:

Kod: Zaznacz cały

#include "a.h"
a1 = 0;
// część kodu pominięta
Plik b.cpp:

Kod: Zaznacz cały

#include "a.h"
a2 = 3;
// i tu już przy kompilacji tego pliku dostaniesz błąd...
A teraz poprawnie:
Plik a.h:

Kod: Zaznacz cały

extern int a1;
extern int a2;
Plik a.cpp:

Kod: Zaznacz cały

#include "a.h"
int a1= 0; // Dopiero tu definiujesz zmienną!
Plik b.cpp:

Kod: Zaznacz cały

#include "a.h"
int a2 = 3; // Dopiero tu definiujesz zmienną!
PODSUMOWUJĄC:
Jeśli już musisz mieć zmienną globalną dostępną w kilku plikach, to definiujesz ją tylko i wyłącznie w pliku z implementacją (.cpp). Zaś aby "poinformować" o tej zmiennej inne jednostki kompilacji, to podajesz jej deklarację w pliku nagłówkowym ze słowem kluczowym extern. Jednakże (jak zapewne większość osób mających doświadczenie w programowaniu powie ci), używanie zmiennych globalnych nie należy do zbyt poprawnych technik. Chociaż czasem zachodzi potrzeba użycia takowych. Ale wyobraź sobie taką sytuację: masz dwie zmienne globalne - jedną definiujesz w pliku a.cpp, a drugą w b.cpp:

Plik a.h:

Kod: Zaznacz cały

extern int a1;
extern int a2;
Plik a.cpp:

Kod: Zaznacz cały

#include "a.h"
int a1 = a2;
Plik b.cpp:

Kod: Zaznacz cały

#include "a.h"
int a2 = a1;
I co teraz?? Jak nietrudno się domyślić, inicjalizacja nie przebiegnie prawidłowo, bo wartość jednej zmiennej jest przypisywana do innej i na odwrót. Problem w tym, że przypisanie może nastąpić, zanim jedna ze zmienych zostanie utworzona, tudzież zainicjalizowana.

Odp: [C++]Zmienne globalne definiowanie

: 06 lip 2009, 15:42
autor: mikolajs
Napisz ten program obiektowo (tak jak się powinno pisać w C++ ) i zobaczysz, że zniknie potrzeba tworzenia zmiennych globalnych.

Odp: [C++]Zmienne globalne definiowanie

: 10 lip 2009, 14:56
autor: Fanael
mikolajs pisze:Napisz ten program obiektowo (tak jak się powinno pisać w C++ )
Nie powinno się - C++ to język z założenia wieloparadygmatowy, nie obiektowy (chociaż programowanie obiektowe wspiera).

Odp: [C++]Zmienne globalne definiowanie

: 10 lip 2009, 15:10
autor: adrian5632
Fanael pisze:Nie powinno się - C++ to język z założenia wieloparadygmatowy, nie obiektowy (chociaż programowanie obiektowe wspiera).
Dobra, weź nie 'filozuj' i nie przytaczaj części zdania, bo ignorujesz cały kontekst, który przedstawił poprzednik...

Odp: [C++]Zmienne globalne definiowanie

: 10 lip 2009, 16:09
autor: el.pescado
Nie powinno się - C++ to język z założenia wieloparadygmatowy, nie obiektowy (chociaż programowanie obiektowe wspiera).
Ta, tylko ta "wieloparadygmatowowść" C++ sprowadza się w zasadzie do dwóch paradygmatów: obiektowego i proceduralnego, przy czym należy pamiętać, że C++ to z grubsza proceduralne C z dodaną obiektowością - tak więc programowanie nieobiektowe w C++ jest o tyle bez sensu, że wtedy z powodzeniem można pisać w czystym C (do tego się to sprowadza).

Odp: [C++]Zmienne globalne definiowanie

: 10 lip 2009, 21:55
autor: mikolajs
tak więc programowanie nieobiektowe w C++ jest o tyle bez sensu, że wtedy z powodzeniem można pisać w czystym C (do tego się to sprowadza).
Zgadzam się z przedmówcą! To właśnie miałem na myśli.

Odp: [C++]Zmienne globalne definiowanie

: 11 lip 2009, 13:52
autor: Razi
moim zdaniem też lepiej obiektowo, zwłaszcza gry. I rozdzielić wszystko na pliki .cpp i .h, a potem przekazywać wskaźniki do konkretnych obiektów. Programowanie gier bez obiektów jest bardzo trudne i chaotyczne

Odp: [C++]Zmienne globalne definiowanie

: 20 lip 2009, 23:55
autor: Johny_B.
lukas j przede wszystkim przeczytaj dokładnie co pisze kompilator, wielokrotnie zdefiniowałeś zmienną lx i o to się linker rzuca. Proponuję Ci wszystkie zmienne używane w całym programie zdefiniować tylko w jednym pliku, w pliku global.h umieścić tylko że będą te zmienne globalne używane w innym pliku. W drugim pliku tego programu już nie definiujemy tych zmiennych, jedynie się do nich odwołujemy!!!! "Symfonia C++" rozdział 5.11 poza tym nie powinieneś wstawiać #include <global.h> tylko #include "global.h" i plik global.h trzymasz z pozostałymi plikami tego programu.

EDIT:
Na koniec nie wiem jakiego kompilatora używasz, napiszę jak ja bym to zrobił.
Po napisaniu plików wydaję w konsoli polecenie g++ -o ************ ########## ######## #########
Gdzie ************ to nazwa pliku który ma powstać w wyniku kompilacji w miejscu gdzie się znajdujemy w konsoli, ################# oraz ############### nazwy plików z rozszerzeniem .cpp bądź innym odpowiednim dla języka C++
Konsolowy kompilator powinien Ci wyrzucić w jakim pliku masz błąd i w której linijce, wystarczy później tylko dobrze sprawdzić.

I byłbym wdzięczny gdyby bardziej doświadczeni programiści przyznali mi rację :D

Odp: [C++]Zmienne globalne definiowanie

: 21 lip 2009, 13:19
autor: adrian5632
Raczej nikt ci jej nie przyzna :P Nie zdefiniował wielokrotnie zmiennej, tylko zrobił to raz, ale w pliku nagłówkowym, który jest dołączany w kilku plikach, przez co jest błąd. Acha - i pisz ładniej, bo tekst rozciągnięty jak nie wiem i ledwo się da przeczytać.

Odp: [C++]Zmienne globalne definiowanie

: 22 lip 2009, 00:19
autor: Johny_B.
Ok, następnym razem będę ładnie zaznaczał wszystko co najważniejsze!!!
A do Adriana będę miał jeszcze prośbę ale to nie w obrębie tego tematu.

Przyznaję rację zdefiniował tą zmienną w pliku nagłówkowym, gdzie nie powinien definiować,
tylko deklarować że jest to zmienna exterytorialna.

Odp: [C++]Zmienne globalne definiowanie

: 25 lip 2009, 12:44
autor: lukas_j
Ok, dobra, narazie porzucilem pisanie gier - poprostu robilem to duzo czasu i mi sie odechcialo ;) Ale dzieki za pomoc ;)

Odp: [C++]Zmienne globalne definiowanie

: 26 lip 2009, 09:59
autor: Johny_B.
lukas_j nie zrażaj się porażkami. Po prostu musisz jeszcze trochę poczytać i eksperymentować. Pamiętaj to nie może być żmudna praca, to musi być zabawa. Jeżeli tak nie jest to musisz zacząć się tym bawić. :)

Odp: [C++]Zmienne globalne definiowanie

: 01 sie 2009, 22:43
autor: lukas_j
No wiesz, ja mam rozne swoje projekty, ktore przewyzszaja mnie i moj wiek :/. Probowalem bez skutku m.in: Napisac klienta GG pod konsole dla win$hita.
Napisac gre mi sie udalo, ale nie umiem dolaczac tych cholernych plikow, musze cos poprobowac
I wogole rzecz bez pojecia - napisac proszego OSa. Narazie w asm. Udalo mi sie do tej pory pobawic przerwaniami karty graficznej :D.

Jak co to dzieki wszystkim za pomoc, bo porzucilem na pewien czas pisanie gier, gdyz jest to juz nudne, napisalem kilka gier, ale wiadomo, ma sie tysiac linii kodu w jednym pliku to to troche denerwujące jest, dlatego cche to rozdzielic. Moze wroce do tematu jak zaczne pisac gry. Dzieki wszystkim za dobre chęci ;)