Wartość zmiennej w funkcji zawsze zero

0

Witam :)
Natknąłem się na ciekawy problem, podczas przekazywania do funkcji wartości zmiennej.
Mianowicie:
W funkcji nadrzędnej zmieniam wartość zmiennej lokalnej będącej zmienną statyczną, a przy zajściu pewnego zdarzenia wywołuję w tej funkcji inną funkcję (nazwę ją podrzędną) której przekazuję jako argument wartość zmiennej lokalnej statycznej. Całość wygląda tak:

void FunkcjaNadrzędna(void)
{
     static ZmiennaOmawiana = 0;
     uint8_t WarunekZwiekszania = 0;
     switch(WarunekZwiekszania = JakasFunkcja())
     {
     case 1:
          ZmiennaOmawiana++;
          break;
     case 2:
          ZmiennaOmawiana--;
          break;
     default:
          FunkcjaPodrzedna(ZmiennaOmawiana);
          break;
     }
}

Tak, poglądowo wygląda ciało funkcji nadrzędnej, natomiast funkcja podrzędna prezentuje się następująco:

void FunkcjaPodrzedna(uint8_t ZmiennaOmawiana)
{
     printf("%d\n", ZmiennaOmawiana);
}

Oczywiście mój aktualny program wygląda inaczej, jednak jego działanie i zależności między poszczególnymi funkcjami, ich ciałami i wywołaniami jest dokładnie takie samo, więc mam nadzieję, że to wystarczy.
O co chodzi i w czym problem? ZmiennaOmawiana w funkcji nadrzędnej zachowuje się prawidłowo, widzę podczas debugowania, że zależnie od warunku zmieniania (wiem że można byłoby to zrobić: switch(JakasFunkcja()), ale chcialem pokazać ideę tego co sie dzieje... :P) zmienna ZmiennaOmawiana jest zwiększana, bądź zmniejszania. Jednak problem pojawia się przy wejściu do funkcji podrzędnej... tam wartość tej zmiennej przekazanej jako argument jest zawsze równa 0.
Moje pytanie brzmi:

  • Czy prawidłowe jest takie przekazywanie zmiennej do funkcji podrzędnej?
  • Dlaczego wartość argumentu zawsze jest równa 0?

Pozdrawiam :)

0
default:
    printf("przed wejsciem: %d\n", ZmiennaOmawiana);
    FunkcjaPodrzedna(ZmiennaOmawiana);

Dodaj coś takiego i zobacz co wypluje.

0

Na szybko napisałem taki próbny, odrębny kawałeczek aby sprawdzić co się dzieje i czy nie jest to zależne od reszty kodu, którego nie zamieściłem w pierwszym poście. A więc, na podstawie poniższego listingu:

 #include <stdlib.h>
void FunkcjaPodrzedna(int ZmiennaSprawdzana)
{
	ZmiennaSprawdzana++;
	printf("Zmienna w podrzednej = %d\n", ZmiennaSprawdzana);
}
void FunkcjaNadrzedna(void)
{
	static int ZmiennaSprawdzana = 0;
	printf("Zmienna sprawdzana w nadrzednej = %d\n", ZmiennaSprawdzana);
	FunkcjaPodrzedna(ZmiennaSprawdzana);
}


int main(void)
{
	int Licznik = 0;

	for(Licznik = 0; Licznik < 10; Licznik++)
	{
		FunkcjaNadrzedna();
	}
	system("PAUSE");
	return EXIT_SUCCESS;
}

Widzę, że wartość wypluwana przed wskoczeniem do funkcji podrzędnej jest równa zawsze zero, natomiast wartość wyświetlana w podrzędnej wynosi 1 (no bo 0++ = 1...).
Wniosek jest taki, że problem leży w sposobie przekazywania zmiennej do funkcji podrzędnej, ale jak to zrobić prawidłowo? Wiadomo, że problem nie dotyczy reszty kodu.

1

Przekazywanie parametru przez wartość i referencję
W C oczywiście nie ma przekazywania przez referencję, ale reszta artykułu nadal ma zastosowanie.

0

Też myślałem o wskaźnikach, jednak gdzieś muszę popełniać błąd, gdyż po takiej modyfikacji:

void FunkcjaPodrzedna(int *ZmiennaSprawdzana)
{
	*ZmiennaSprawdzana++;
	printf("Zmienna w podrzednej = %d\n", ZmiennaSprawdzana);
}
void FunkcjaNadrzedna(void)
{
	static int ZmiennaSprawdzana = 0;
	printf("Zmienna sprawdzana w nadrzednej = %d\n", ZmiennaSprawdzana);
	FunkcjaPodrzedna(&ZmiennaSprawdzana);
	printf("Po wyjściu z podrzednej = %d\n", ZmiennaSprawdzana);
}

Wartość zmiennej po wyjściu z funkcji podrzędnej nadal jest zerowa...
Jeśli czegoś nie rozumiem, to proszę o naprowadzenie, bo staram się doszukać miejsca w którym popełniam błąd i nie mogę znaleźć.

Dzięki za pomoc i pozdrawiam :)

0

@Bartosz36 Przecież kod w default wykona się tylko jeżeli żaden inny warunek nie zostanie spełniony. A co do drugiego przykładu to ZmiennaSprawdzana w FunkcjaPodrzedna jest tylko lokalną kopią tej zmiennej z FunkcjaNadrzedna, więc oryginalnej w ogóle nie modyfikujesz.

2
(*ZmiennaSprawdzana)++;

Poza tym nie zdziwiłeś się, że w Podrzednej wypisujesz jakieś dziwne liczby zamiast 1?

0

Ależ kaczorze, wiem o tym. Tylko pomyśl o tym algorytmie w ten sposób.

  1. Chcę zmienić wartość zmiennej, to zmieniam:
    • zwiększam
    • zmniejszam
  2. Nie chcę jej modyfikować, to wrzucam do funkcji, która mi tą wartość wyświetli.

Algorytm i kod zaprezentowany do niego jest tylko ideowy, w rzeczywistym kodzie (załóżmy, że w kodzie z postu kolejnego) jest już realny problem dotyczący przekazywania wartości do funkcji i modyfikacja jej tak, by było to odczuwalne/zauważalne poza funkcją podrzędną.

0

Kolego @twonek wiem o tym, wyświetlam adres i to w dodatku poprzez %d, a nie "0x%x" ale to mały szczegół, jednak dzięki :)
Co do sposobu z nawiasami - dzięki wielkie :D Szczegół, a jednak istotny :)

Dzięki wszystkim za pomoc, zamykam :)
Pozdrawiam :)

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