logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Zerowanie zmiennej w funkcji

ViktorMC 05 Wrz 2011 22:26 3453 10
REKLAMA
  • #1 9899114
    ViktorMC
    Poziom 14  
    Witam.
    Mam wydaje mi się błahy problem, ale pomimo wertowania forum nie mogę sobie z nim poradzić. Otóż chodzi o to, że mam funkcję w której chcę zwiększać zmienną. Z niewiadomych przyczyn zmienna zostaje wyzerowana po wejściu do funkcji oraz przed wyjściem z niej. Funkcja mniej więcej taka:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Wywołanie w main funkcja(zmienna);
    Wartość z PORTD jest podawana na wyświetlacz.
  • REKLAMA
  • Pomocny post
    #2 9899156
    tmf
    VIP Zasłużony dla elektroda
    Nie zostaje wyzerowana, ona całkowicie znika. To co napisałeś powoduje utworzenie zmiennej lokalnej, o takiej samej nazwie jak zmienna globalna (jest ona w ciele funkcji przesłonięta). Zmieniasz więc wartość zmiennej lokalnej, która po opuszczeniu funkcji jest niszczona i tworzona ponownie po wejściu do tej funkcji. W efekcie zmienna globalna zmienna ciągle zawiera zero. Aby było inaczej przekaż do funkcji wskaźnik na zmienna (int *zmienna) i w wywołaniu podawaj adres (funkcja(&zmienna)). W C++ możesz dodatkowo używać przekazywania przez referencję (int &zmienna), ale nie da się tak z zwykłym C.
  • REKLAMA
  • REKLAMA
  • Pomocny post
    #4 9899259
    gaskoin
    Poziom 38  
    A po co volatile skoro to tylko funkcja wywołana w mainie ?:P Sposobów jest kilka ale nie będę wprowadzał zamieszania.

    Uważaj też na PORTD |= liczba;
    Pamiętaj że raz ustawiony bit nie zostanie już nigdy wykasowany w ten sposób.
  • REKLAMA
  • #6 9899440
    gaskoin
    Poziom 38  
    tylko to volatile psu na bude :)
  • #8 9899479
    gaskoin
    Poziom 38  
    Chodziło mi o taki przypadek, volatile zbędne:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #10 9901193
    ViktorMC
    Poziom 14  
    Wielkie dzięki.
    Wiedziałem, że to jakieś głupstwo ale nie mogłem do tego dojść.
    To volatile i tak będzie bo to jest funkcja wywoływana przerwaniem.
    Słuszna uwaga z ustawieniem zmiennej PORTD|=zmienna bo za chwilę miałbym kłopot.
  • #11 9902032
    sulfur
    Poziom 24  
    W C++ można odwołać się do przysłoniętej zmiennej globalnej za pomocą operatora ::.
REKLAMA