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

C++, Dziwne zachowanie zmiennych globalnych

Ostatnio zmodyfikowano 2026-09-27 11:34
Autor Wiadomość
czerwonymoskit
Temat założony przez niniejszego użytkownika
C++, Dziwne zachowanie zmiennych globalnych
» 2026-09-24 17:34:20
Mam grę. Zmienne do pliku main dołączam poprzez
#include "zmienne.hpp"
W tym pliku mam wszystkie .hpp wszystkich funkcji void używanych w grze oraz extern dla wszystkich zmiennych. Same zmienne definiuje i inicjalizuje w pliku zmiennne.cpp.

Gra normalnie działa ale czasami niektóre zmienne globalne mają chaotyczne wartości. Niekiedy muszę siłowo przypisywać wartość 0 na początku main'a, choć ta wartość powinna wynosić 0 na tym etapie i nigdzie nie jest nadpisywana jeszcze w tym momencie. Raz na jakiś czas, bardzo rzadko ale jednak mieszają mu sie wartości i zamiast 0 jest 1.

Strasznie to dziwne.
P-184656
DejaVu
» 2026-09-24 18:05:13
Początkowy stan powinieneś zawsze zainicjalizować, a... tak poza tym to pewnie masz jakieś błędy w kodzie, których nie widzisz.
P-184657
czerwonymoskit
Temat założony przez niniejszego użytkownika
» 2026-09-24 19:08:11
Inicializuję te zmienne w pliku zmienne.cpp
Raczej nie jest to jakiś błąd w składni gdyż gra normalnie lata tylko czasem potrafi się zachować dziwnie.
P-184658
czerwonymoskit
Temat założony przez niniejszego użytkownika
» 2026-09-24 19:20:04
Nie wiem, może przeniosę definicje tych zmiennych do main'a.
Ale gra jest best. Najlepszy mecz manager ever ;). Bez bajerów, wodotrysków ale skomplikowany dość.
P-184659
czerwonymoskit
Temat założony przez niniejszego użytkownika
» 2026-09-25 12:52:19
Uzywam sporo zmiennych globalnych i przy przekroczeniu indexu może byc nadpisywany sąsiedni sektor pamięci. Pozamieniam je na lokalne w funkcjach. To powinno pomóc.
P-184660
pekfos
» 2026-09-25 15:00:34
Uzywam sporo zmiennych globalnych i przy przekroczeniu indexu może byc nadpisywany sąsiedni sektor pamięci. Pozamieniam je na lokalne w funkcjach. To powinno pomóc.
Jeśli mogą to powinny być lokalne, ale jeżeli nadpisujesz niepoprawnie pamięć to to nie pomoże bo nie naprawiasz problemu. Możesz spróbować narzędzi typu ASan (address sanitizer) żeby zlokalizować problem.

Niekiedy muszę siłowo przypisywać wartość 0 na początku main'a, choć ta wartość powinna wynosić 0 na tym etapie
Niepoprawne wartości na samym początku programu są trochę dziwne. Upewnij się że nie obserwujesz tych wartości w czasie pracy konstruktora klasy, której obiekt jest sam zmienną globalną. Konstruktory zmiennych globalnych same też się wykonują w jakiejś kolejności i możesz widzieć niezainicjalizowane zmienne (też wymagające wywołania konstruktora). Przy czym to dotyczy przypadku gdzie inicjalizacja zmiennej wymaga wykonania kodu. Jeżeli nie wymaga, takie zmienne globalne są inicjalizowane w czasie ładowania programu i będą gotowe zanim program zdąży wykonać cokolwiek.
P-184661
jankowalski25
» 2026-09-25 21:00:29
Jeden z najprostszych sposobów na "naprawienie" tego jest taki:
C/C++
bool & get_some_global_value()
{
   
static bool some_global_value = false;
   
return some_global_value;
}
Wtedy masz gwarancję, czym ta "zmienna globalna" jest, no i możesz kontrolować to, kto i kiedy po nią sięga.

To tak na początek, bo zwykle lepiej zrobić refaktoring, no ale jak już musisz mieć zmienne globalne, to taka konstrukcja w postaci funkcji, która zwraca referencję do tego, co trzyma w środku, zwykle wypada lepiej, bo możesz po ludzku to zawsze wypełnić dowolnym kodem. No i jednocześnie jeśli nigdy nie będzie to użyte, to taka zmienna w ogóle nie zacznie istnieć.

A jeszcze lepiej jest mieć taką zmienną dostępną tylko lokalnie wewnątrz jednego z plików *.cpp, natomiast do użytkownika wystawić coś takiego:
C/C++
namespace
{
   
bool & priv_some_global_value()
   
{
       
static bool some_global_value = false;
       
return some_global_value;
   
}
}

bool get_some_global_value()
{
   
return priv_some_global_value();
}

void set_some_global_value( bool value )
{
   
priv_some_global_value() = value;
}
Ogólnie lepiej mieć takie zmienne owinięte funkcjami, wtedy da się je lepiej kontrolować, debugować, tudzież nawet sprawdzać, kto i kiedy tego używa, albo choćby zmieniać sposób dostępu do tych rzeczy, gdzie wystarczy wyedytować argumenty, a całą resztę podpowie kompilator, sypiąc błędami tam, gdzie trzeba, przy każdym wywołaniu funkcji.
P-184662
czerwonymoskit
Temat założony przez niniejszego użytkownika
» 2026-09-26 07:49:34
Jak znajdę chwilkę to wrzucę ten kod zmienne.cpp oraz zmienne.hpp bo może tam nie do końca jest ok. Natomiast jeśli mam zmienna globalną ustalona wartością i uruchamiam kilka funkcji nie zmieniając jej wartości to rozumiem że program nie zmieni jej tak sam z siebie. To byłby jakiś hardcore.
P-184664
« 1 » 2 3
  Strona 1 z 3 Następna strona