Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Czy ta procedura i jej wywołanie jest prawidłowe? Jezyk C

rafiks 07 Wrz 2017 22:49 717 2
  • #1 07 Wrz 2017 22:49
    rafiks
    Poziom 18  

    Mam pewien problem z programem który napisałem doprowadza on do zawieszenia pętli głównej programu ale nie całego procesora timery wciąż działają poprawnie. Co najgorsze to zawieszanie jest losowe raz na 5 minut albo raz na godzinę. Wydaje mi się że problem tkwi w tej procedurze. Proszę Was o "rzucenie" swoim fachowym okiem czy nie popełniłem jakiegoś błędu.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 2
  • #2 08 Wrz 2017 13:02
    JacekCz
    Poziom 36  

    1. if'y po przekroczeniu 60 sekund / minut nie zwiększają o jeden, tylko ustawiają na jeden następną jednostkę (minutę / godzinę). Próbuję zgadnąć, czy tego chciałeś. Zerowanie w else mnie tez nie przekonuje, raczej w else po wojskowemu 'nie ma rozkazów, nic nie rób'. Nie wiem jaki był zamiar, ale ta arytmetyka mi się nie widzi.
    Być może z dwoma a nie trzema argumentami by to było bardziej naturalne. Gdyby sobie kawę na ławę nazwać (punkt 3) co jest 'chwilą w czasie' a co 'odstępem' sztuczność tego dodawania by była widoczna.

    2. powszechne użycie volatile sugeruje mi, że nie jest to zrozumiałe. Nie jest to "uniwersalne zabezpieczenie przed wątkami / przerwaniami" jak wielu programistów domniemywa. Reszta kodu zawiera jakieś timery itd? Więc pokzany kod nie jest bezpieczny pod względem przerwań ingerujących we wspólne dane.
    AddTime ma rozumiem zastosowanie, bo tu nie widać?

    edit: samo rzutowanie do strcat - jak rozumiem aby sie pozbyć warningu o niezgodności typów - pokazuje, że całość funkcji nie spełnia 'volatile' (co z tego, że twój kod traktuje jak volatile, jak wchodzisz w inne funkcje, gdzie volatile nie jest).


    3. generalnie w branży jest tak, że biblioteki z dziedziny data/czas odróżniają "chwilę w czasie" i "odstęp czasu", choć to w podobnych sekundach, minutach wyrażone

    4. pojedynczy sprintf na trzy liczby pewnie będzie efektywniejszy niż trzy wywoałnia i strcat

    Dodano po 4 [godziny] 25 [minuty]:

    Funkcja dodawania w części taka, jaką bym chciał widzieć

    Kod: c
    Zaloguj się, aby zobaczyć kod

    albo tak, niekompatybilne z bardzo starym dialektem C. Przekazanie przez wartość powoduje, że na krótką chwilę struktura pojawia się na stosie (którego na małych uK nie mamy wiele), ale to bardzo mała struktura (w praktyce 3 albo raczej 4 bajty)

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Ze słów kluczowych użyłem tu const. Nie jest to "zamiast" volatile" i można łączyć, ale "przemieszcza projekt" w tą stronę, ze bardziej ufamy kodowi, lepiej wiemy czego NIE zmienia. Jest to ogólnie korzystne, informuje kompilator (skutkuje warningami, których nie trzeba wyłączać tylko się nimi zająć) oraz czytającego to programistę.


    DICLAIMER: pisane w sytuacji, że twoich objaśnień co do większej ilości kodu nie ma.

    0
  • #3 12 Wrz 2017 13:05
    sawitar
    Poziom 17  

    Ja tam lubie proste rozwiązania w stylu KISS:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Ten kod nie jest bezpieczny (w sensie wielowątkowości) bo dostęp to zmiennej now_datetime nie jest w żaden sposób zabezpieczony i jeśli będziesz modyfikował jej zawartość poza pętla główna (np w przerwaniu) to może coś się wywalić.

    0