problem ze zmienną lokalną

O jezykach programowania w platformach i nie tylko.
wojnowy
Stały bywalec
Stały bywalec
Posty: 63
Rejestracja: 24 wrz 2010, 10:09

problem ze zmienną lokalną

Nieprzeczytany post autor: wojnowy »

Witam,
mam taki trochę dziwny problem i podejrzewam, że jest to banalne ale póki co nie mogę go rozgryźć więc proszę o pomoc.

mam w programie taki fragment, który ma się wykonać tylko raz w trakcie działania programu. W związku z powyższym deklaruję zmienną globalną bool once = true; a w programie daję:

Kod: Zaznacz cały

if(once){
once = false;
// pozostały fragment kodu
}
No i mój problem dotyczy tego właśnie kawałka, bo mam również zmienną lokalną, której przypisuję wartość w tej części kodu a następnie (za tym if-em) chcę ją wyświetlić w funkcji Comment. Niestety funkcja ta wyświetla 0...
Co ciekawe stworzyłem również tablicę zmiennych (również lokalnie) i również zapisuję w niej część operacji w tym fragmencie kodu ale tam się już wszystko ładnie zapisuje i wyświetla.
Oczywiście rozwiązaniem mojego problemu może być stworzenie tych zmiennych globalnie -> wówczas wszystko działa poprawnie ale jednak chciałbym się dowiedzieć o co kaman, że wartość nie chce się zapisać w tej zmiennej? :/
Bardzo proszę o jakąś sugestię z czym to może być związane i jak to rozwiązać.
Pozdrawiam
(\(^.^)/)

rrozak
Stały bywalec
Stały bywalec
Posty: 76
Rejestracja: 19 mar 2010, 16:43

Nieprzeczytany post autor: rrozak »

Nie do końca łapię o co Ci chodzi, ale:

1. Gdybyś próbował wyświetlić zmienną lokalną poza obszarem jej widoczności dostał byś błąd przy kompilacji, a nie 0.
2. Może Comment wyświetla zmienną nie tak jak tego oczekujesz, vide tablice

Awatar użytkownika
Asia
Gaduła
Gaduła
Posty: 319
Rejestracja: 09 gru 2009, 02:00

Nieprzeczytany post autor: Asia »

sugestie

dla zmiennej logicznej
zdaje się = zapisujemy jako ==
może to

i tego nie kumam jako zielona z programowania
jeżeli once jest prawda to once jest fałszem pozostały kod
po co tak
wystarczy jedno sprawdzenie
Czytaj p o w o l i
Dzień dobry, nazywam się ... jestem anonimowym hazardzistą/ką, gram na Forexie
Obrazek

wojnowy
Stały bywalec
Stały bywalec
Posty: 63
Rejestracja: 24 wrz 2010, 10:09

Nieprzeczytany post autor: wojnowy »

Nieaktualne...

Dodano po 3 godzinach 31 minutach:

Kłopotów ciąg dalszy...

Powiem szczerze, że zaczynam się trochę poddawać :(. Rozwiązałem już większość problemów i wiem, gdzie tkwi przyczyna ale ciągle nie wiem jak ją rozwiązać dlatego bardzo proszę o jakąś próbę pomocy (może jakąś podpowiedź ;P).

Zacznę może od tego, że pomimo mniejszych błędów w kodzie błąd był oczywisty:
jak deklaruję zmienną i przypisuję jej wartość -> następnie robię if-a(Once) i znowu przypisuję jej wartość to przy następnym ticku zmienna znowu otrzyma wartość, którą przypisałem na samym początku czyli 0 tzn. może lepiej to wyjaśnię na przykładzie....

Kod: Zaznacz cały

bool once = true;

void start()
       {
       double zmienna = 0.0; //przypisanie wartości, które będzie się powtarzać co tick!!!

       if(once)
          {
           once = fasle; //kod nie zostanie więcej razy wykonany
           funkcja(zmienna); //przypisanie wartości tej zmiennej przez referencję
           }
      Comment("zmienna = ",  zmienna); //przy pierwszym ticku chyba powinno być ok -> później zmienna to zwróci 0 (przypisanie na starcie)
   } 
Jak widać powód jest raczej oczywisty. Problem w tym, że nie wiem jak go rozwiązać bez tworzenia tablicy (przypadkiem na to wpadłem) lub deklaracji zmiennej globalnie...

Jednym z rozwiązań jest coś takiego:


Kod: Zaznacz cały

bool once = true;

void start()
       {
       double zmienna;
       double tablica[1];
       if(once)
          {
           once = fasle;
           zmienna = funkcja();
           tablica[0] = zmienna;
           }
           zmienna = tablica[0];
      Comment("zmienna = ",  zmienna); //i jest O.K. :D
   } 
Niestety ten sposób na dłuższą metę jest strasznie niewygodny...
No i moje pytanie jest czy da się to zrobić mniej więcej tak (na chwilę obecną nie wychodzi...):

Kod: Zaznacz cały

bool once = true;

void start()
       {
       if(once)
          {       
           once = fasle;

           double zmienna = 0.0; //deklaracja zmiennej wewnątrz if-a (więc wartość 0 powinno być przypisane tylko raz, do tego przed funkcją, która zmieni tą wartość)

           funkcja(zmienna); //przypisanie nowej wartości zmiennej
           }
      Comment("zmienna = ",  zmienna); //tak by mi najbardziej pasowało jednak nie działa :(
   } 
Czy może mi ktoś wyjaśnić w czym tkwi haczyk i czy da się to w ogóle rozwiązać tak jak ja to planuję (do czego dążę)?
Pozdrawiam i dziękuję z góry
(\(^.^)/)

Awatar użytkownika
13Spekulant
Gaduła
Gaduła
Posty: 91
Rejestracja: 08 wrz 2010, 22:34

Nieprzeczytany post autor: 13Spekulant »

Skoro i tak masz już zmienną globalną once, to zamień ją na zmienną 'zmienna', zainicjuj jej wartość np. -13 i w ifie sprawdzisz, czy wartość == -13 zamiast sprawdzać, czy once.

Poważnie tablica lokalna zapamiętuje wartość a zwykłej zmiennej nie?? Moim zdaniem to zbyt daleko idąca interpretacja. Niektóre kompilatory przy deklaracji zmiennej nie inicjuja jej wartości na jakąś domyślną, więc co siedzi w pamięci, to sie w tej zmiennej znajdzie (czyli nalezy przyjąć, że wartość zmiennej inicjowana jest na losową).

W żadnym normalnym języku programowania nie da się osiągnąć tego, co potrzebujesz.

wojnowy
Stały bywalec
Stały bywalec
Posty: 63
Rejestracja: 24 wrz 2010, 10:09

Nieprzeczytany post autor: wojnowy »

13Spekulant pisze:Skoro i tak masz już zmienną globalną once, to zamień ją na zmienną 'zmienna', zainicjuj jej wartość np. -13 i w ifie sprawdzisz, czy wartość == -13 zamiast sprawdzać, czy once.
Ty chyba żartujesz?...
13Spekulant pisze:Poważnie tablica lokalna zapamiętuje wartość a zwykłej zmiennej nie??
Tak! tablica zapamiętuje, ale to rozwiązanie nie jest wygodne. Chciałem również zaznaczyć, że nie chodzi mi tak naprawdę o jedną zmienną a przynajmniej kilkanaście. więc ich deklarowanie globalne nie jest chyba dobrym rozwiązaniem.
13Spekulant pisze:Moim zdaniem to zbyt daleko idąca interpretacja.
Interpretacja czego? faktów?
13Spekulant pisze:Niektóre kompilatory przy deklaracji zmiennej nie inicjuja jej wartości na jakąś domyślną, więc co siedzi w pamięci, to sie w tej zmiennej znajdzie (czyli nalezy przyjąć, że wartość zmiennej inicjowana jest na losową).
MQL4 przypisuje od razu 0 -> zresztą to akurat nie ma znaczenia czy będę miał 0 czy jakąś inną liczbę na początku. Chodzi mi o to, że jak deklaruję zmienną wewnątrz ifa a później przypisuję jej wartość a if nie wykona się więcej razy to logiczne chyba jest, że zmienna powinna mieć przypisaną wartość a nie zainicjowaną...
Jak mam kod:

Kod: Zaznacz cały

if(Once) //wykona się tylko raz w trakcie działania programu
   {
   Once = fasle; //więcej if się nie wykona (ale zmienna zostanie zadeklarowana!)
   double zmienna = 2.0; //deklaracja zmiennej z przypisaniem jej wartości
   zmienna = 4.0; //nadanie nowej wartości zmiennej
   }
Comment("zmienna = ", zmienna); //co powinno być zwrócone? Moim zdaniem 4.0 (ostatnio przypisana wartość!) a zwraca 0... :(
(\(^.^)/)

artur_ar
Stały bywalec
Stały bywalec
Posty: 22
Rejestracja: 09 gru 2009, 15:55

Nieprzeczytany post autor: artur_ar »

Jeśli musi być w taki sposób, to daj static

Kod: Zaznacz cały

static double zmienna = 2.0; //deklaracja zmiennej z przypisaniem jej wartości 
Obrazek

wojnowy
Stały bywalec
Stały bywalec
Posty: 63
Rejestracja: 24 wrz 2010, 10:09

Nieprzeczytany post autor: wojnowy »

artur_ar pisze:Jeśli musi być w taki sposób, to daj static
W sumie to było banalne -> dzięki!! zupełnie wyleciało mi z głowy takie coś jak "static" :D
(\(^.^)/)

Awatar użytkownika
13Spekulant
Gaduła
Gaduła
Posty: 91
Rejestracja: 08 wrz 2010, 22:34

Nieprzeczytany post autor: 13Spekulant »

wojnowy pisze:MQL4 przypisuje od razu 0
Moim zdaniem przypisuje zero zmiennej, bo ją inicjujesz na 0, tablicy nie inicjujesz, więc wartość tam jest "losowa". Na chłopski rozum gdybys nie inicjował zmiennej, to też wartość byłaby "losowa". A jeśli z tablicami jest inaczej niż ze zwykłymi zmiennymi, to jest to coś nienaturalnego.

Static... :doh:

LowcaG
Pasjonat
Pasjonat
Posty: 1068
Rejestracja: 05 paź 2007, 15:39

Nieprzeczytany post autor: LowcaG »

hm..tyle kwiatków w jednym wątku ;)

13Spekulant pisze:Moim zdaniem przypisuje zero zmiennej, bo ją inicjujesz na 0, tablicy nie inicjujesz, więc wartość tam jest "losowa". Na chłopski rozum gdybys nie inicjował zmiennej, to też wartość byłaby "losowa". A jeśli z tablicami jest inaczej niż ze zwykłymi zmiennymi, to jest to coś nienaturalnego.
Tu nie chodzi o zdanie czy nie, tu chodzi o fakty i specyfikacje jezyka.
A w mqlu jezeli nie zainicujesz zmiennej zmienna ta przyjmuje wartosc 0 (tablice tez) (oczywiscie nie mówie o stringach ;) ).

Odpowiedza oczywiscie jest uzycie static, ale z moich obserwacji dawanie duzej ilosci zmiennych (static) w funkcji start jest tak samo "zasmiecajace" jak bys dal to w zmiennej globalnej a inicjowanie w funkcji init (skoro chcesz tylko raz).

Z rad jakie mogę dac, to pakowanie wszystkiego co tylko sie da, czyli zmienne i kod w funkcje, a w Start() zostawic tylko szkielet systemu który jest latwy i czytelny.

ODPOWIEDZ