Zmienna globalna fuj...

0

Problem jest z serii optymalizacji kodu.

Wywoluje program z jakims argumentem. Odczytuje go w main. Teraz w funkcji main wiele sie dzieje. sa wywolywane funkcje, a te funkcje wywoluja podfunkcje w ktorych tworzone sa spore obiekty (rozbudowane klasy), a te obiekty maja jeszcze metody w ktorych sa tworzone kolejne obiekty... itd itp... sporo jest tego. W kazdym razie istotne jest to ze w bardzo duzym "zaglebieniu"(cos wywolalo cos i to cos jescze cos itd), to co wprowadzil uzytkownik jako argument, jest dopiero uzywane. Rozwiazanie jest proste, zmienna do ktorej przypisywana jest wartosc argumentu powinna byc globalna, aby wszystkie kolejne funkcje i klasy ja widzialy. No tak, tylko czy jest jakies inne rozwiazanie?? Chce sie pozbyc zm. globalnej (np. bo jest duza, albo na wypadek gdyby moj program byl kiedys czescia jakies biblioteki). bez sensu jest wywolywanie wszystkich podfunkcji z tym argumentem (bedzie sie ciagnela przez caly program poprzez funkcje gdzie jest w ogóle niepotrzebna). Rozwiazaniem wydawalby sie byc plik tymczasowy a'la temp, przechowujacy dane, ale ta dana jest dosc czesto wykorzystywana (tzn te zaglebione funkcje ktore ja wykorzystuja), co doprowadza do znacznego spowonienia programu. czy ktos ma jakis pomysl aby to obejsc? Chetnie zapoznam sie z taim rozwiazaniem

0

A dlaczego w takiej sytuacji nie chcesz miec zm. globalnej????
To jest wlasnie jedna z nielicznych sytuacji kiedy TRZEBA uzyc zmiennej globalnej.
Zapisywanie w pliku? Zasmiecanie dysku.
Ciagniecie tego przez wszystkie funkcje jako argument? Niepotrzebne zapychanie stosu.

Jesli przeszkadza Ci to, ze zmienna bedzie zasmiecala globalna przestrzen nazw, to mozesz umiescic ja w namespace (C++):

namespace moja_biblioteka 
{
	int zmienna_globalna;
}

using namespace moja_biblioteka;
// kod, ktory korzysta z tej zmiennej
0

Niby masz racje... tez sie zgadzam, ale jesli ten rogram bedzie tylko mlutkim elementem jakiegoswielkiego programu (np .1/1000). jak w ten sposob zostanie napisany kazdy z modulow, to caly program to bedzie mial 1000 zmiennych globalnych... a to juz nie jest chyba dobre. Chodzi mi o wyeliminowanie takiej zmiennej.... i nie jest istotne po co... tylko jak?

0

to caly program to bedzie mial 1000 zmiennych globalnych... a to juz nie jest chyba dobre.

Dlaczego?

Nie sa dobre wszystkie proby eliminowania zmiennej globalnej na sile. Zreszta jesli program ma 1000 modulow, to zmienne globalne mozna zwykle jakos rozsadnie pogrupowac w struktury lub obiekty. Wtedy masz zwykle jeden lub kilka obiektow globalnych, za posrednictwem ktorych dostajesz sie do reszty danych. Jesli Twoj kod ma byc biblioteka, to zmienne globalne prywatne (jesli nie programujesz obiektowo) wrzucasz do odrebnej przestrzeni nazw i po klopocie. Nie ma w tym nic zlego.

0

Sprobuj skorzystac ze zmiennej statycznej, czyli np. static int moja_zmienna.
Wowczas nie bedziesz musial wywolywac funkcji z argumentem, poniewaz zmienna statyczna jest widziana w obrebie calego programu doslownie z kazdego miejsca

0

Moze nie wszystko wiem o zmiennych statycznych ale z tego co sobie przypominam to zmienna statyczna oznacza ze jest to zwykla zmienna lokalna z tym ze nawet po zakonczeniu wykonywania np tej funkcji w ktorej sie znajduje) ciagle przechowuje wartosc... i po ponownym wejsciu do funkcji, ta wartosc ciagle jest pod ta zmienna.... zmienna statyczna nie jest widziana na zewnatrz tej funkcji (w calym programie jak to napisales... jesli u ciebie jest inaczej to napisz jak to wyglada... u mnie w kazdym badz razie jest:

error LNK2001: unresolved external symbol "int iZmienna" (?iZmienna@@3HA)
Debug/dziennik.exe : fatal error LNK1120: 1 unresolved externals

Jesli chodzi ci o to aby zadeklarowac zmienna statyczna globalna, to przeciez nie o to tu chodzi... to bedzie wtedy zmienna globalna.

0

Ze zmienna statyczna to jest tak, ze jesli utworzysz jakas klase zawierajaca zmienna statyczna, a potem utworzysz kilka obiektow tej klasy lub tez klasy bazujace na tej klasie, to niezaleznie od tego ile tych obiektow bedzie, zmienna statyczna bedzie istniala zawsze tylko w jednym egzemplarzu dla wszystkich obiektow i klas potomnych. Nie powinno wiec byc z nia problemow.
</cpp>

0

no wlasnie... ale nie w funkcjach... tu pewnie trzeba by bylo tworzyc obiekty takich klas, albo przekazywac taka zmienna przez parametry :(

0

no wiesz, w wiekszosci dobrych poradnikow programowania zaleca sie korzystanie z dobroci c++ jaka z pewnoscia sa klasy ;-)

0

Masz chyba racje... musze pomyslec o przebudowie calego programu... popakuje to w klasy.... powaznie mowie... musze sie do tego zabrac, aby mialo rece i nogi. Niestety troche roboty mnie czeka.

0

Jesli juz wszystko bedziesz mial w klasach, to zastanow sie czy nie byloby dobrze zastosowac singletonow, wtedy zmienne globalne masz w singletonie. Wcale nie bedziesz musial przekazywac do innych klas dodatkowego parametru, a bedziesz mogl ich uzywac.

0

Tak... ciekawe... tylko pierwszy raz slysze o czyms takim jak singletony... moze cos wiecej na ten temat?

0

Slyszalem o czyms takim jak singletony - to tzw. wzorce projektowe. Sa dosc szeroko opisane w drugim tomie "Thinkhing in C++". Mam oba tomy, ale jeszcze tam nie dotarlem :)

Wracajac do klas - jesli juz raz przez to przebrniesz, to nie bedziesz zalowal - i prawdopodobnie juz nie bedziesz chcial wracac do "golych" funkcji :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1