[C++]Zmienne globalne definiowanie

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
lukas_j
Sędziwy Jeż
Sędziwy Jeż
Posty: 54
Rejestracja: 20 lut 2009, 10:25
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86

[C++]Zmienne globalne definiowanie

Post 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 ;)
arrevalk
Piegowaty Guziec
Piegowaty Guziec
Posty: 29
Rejestracja: 07 sie 2006, 16:51
Płeć: Mężczyzna
Wersja Ubuntu: 8.10
Środowisko graficzne: GNOME

Odp: [C++]Zmienne globalne definiowanie

Post 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.
Awatar użytkownika
Hauleth
Wytworny Kaczor
Wytworny Kaczor
Posty: 382
Rejestracja: 18 sie 2008, 17:43
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86

Odp: [C++]Zmienne globalne definiowanie

Post autor: Hauleth »

a po za tym w nagłówku nie definiuj zmiennych jedynie deklaruj bo ci się linker rzuci
Jeśli problem rozwiązany dodaj na początku tematu [SOLVED].

Biblioteka do C++ - Bust Lib: http://code.google.com/p/bust/
Awatar użytkownika
lukas_j
Sędziwy Jeż
Sędziwy Jeż
Posty: 54
Rejestracja: 20 lut 2009, 10:25
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86

Odp: [C++]Zmienne globalne definiowanie

Post autor: lukas_j »

Wlasnie tak mam! Dokladnie tka i nie dziala.
adrian5632
Przyjaciel
Przyjaciel
Posty: 259
Rejestracja: 17 gru 2006, 16:07
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: KDE Plasma

Odp: [C++]Zmienne globalne definiowanie

Post 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.
[IMG]http://www.ubudsl.com/media/UbuDSL.png[/IMG]
Masz problem z UbuDSL? Nie zapomnij wygenerować i załączyć loga do postu!
mikolajs
Wytworny Kaczor
Wytworny Kaczor
Posty: 352
Rejestracja: 15 paź 2008, 18:30
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: KDE Plasma

Odp: [C++]Zmienne globalne definiowanie

Post autor: mikolajs »

Napisz ten program obiektowo (tak jak się powinno pisać w C++ ) i zobaczysz, że zniknie potrzeba tworzenia zmiennych globalnych.
Fanael
Piegowaty Guziec
Piegowaty Guziec
Posty: 2
Rejestracja: 10 lip 2009, 14:31
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Inne
Architektura: x86_64
Kontakt:

Odp: [C++]Zmienne globalne definiowanie

Post 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).
adrian5632
Przyjaciel
Przyjaciel
Posty: 259
Rejestracja: 17 gru 2006, 16:07
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: KDE Plasma

Odp: [C++]Zmienne globalne definiowanie

Post 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...
[IMG]http://www.ubudsl.com/media/UbuDSL.png[/IMG]
Masz problem z UbuDSL? Nie zapomnij wygenerować i załączyć loga do postu!
Awatar użytkownika
el.pescado
Zakręcona Traszka
Zakręcona Traszka
Posty: 734
Rejestracja: 26 maja 2005, 11:43
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: [C++]Zmienne globalne definiowanie

Post 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).
mikolajs
Wytworny Kaczor
Wytworny Kaczor
Posty: 352
Rejestracja: 15 paź 2008, 18:30
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: KDE Plasma

Odp: [C++]Zmienne globalne definiowanie

Post 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.
Razi
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 150
Rejestracja: 20 paź 2007, 16:23
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: KDE Plasma
Kontakt:

Odp: [C++]Zmienne globalne definiowanie

Post 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
Johny_B.
Piegowaty Guziec
Piegowaty Guziec
Posty: 11
Rejestracja: 24 mar 2008, 10:25
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME

Odp: [C++]Zmienne globalne definiowanie

Post 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
adrian5632
Przyjaciel
Przyjaciel
Posty: 259
Rejestracja: 17 gru 2006, 16:07
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: KDE Plasma

Odp: [C++]Zmienne globalne definiowanie

Post 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ć.
[IMG]http://www.ubudsl.com/media/UbuDSL.png[/IMG]
Masz problem z UbuDSL? Nie zapomnij wygenerować i załączyć loga do postu!
Johny_B.
Piegowaty Guziec
Piegowaty Guziec
Posty: 11
Rejestracja: 24 mar 2008, 10:25
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME

Odp: [C++]Zmienne globalne definiowanie

Post 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.
Awatar użytkownika
lukas_j
Sędziwy Jeż
Sędziwy Jeż
Posty: 54
Rejestracja: 20 lut 2009, 10:25
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86

Odp: [C++]Zmienne globalne definiowanie

Post autor: lukas_j »

Ok, dobra, narazie porzucilem pisanie gier - poprostu robilem to duzo czasu i mi sie odechcialo ;) Ale dzieki za pomoc ;)
Johny_B.
Piegowaty Guziec
Piegowaty Guziec
Posty: 11
Rejestracja: 24 mar 2008, 10:25
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME

Odp: [C++]Zmienne globalne definiowanie

Post 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ć. :)
Awatar użytkownika
lukas_j
Sędziwy Jeż
Sędziwy Jeż
Posty: 54
Rejestracja: 20 lut 2009, 10:25
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86

Odp: [C++]Zmienne globalne definiowanie

Post 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 ;)
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

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