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

Weryfikacja funkcji obliczającej Checksumę w C dla Arduino

Franek k 20 Sty 2025 09:41 453 6
REKLAMA
  • #1 21401047
    Franek k
    Poziom 15  
    Posty: 411
    Pomógł: 2
    Ocena: 24
    Cześć.

    Potrzebuję w swoim programie pisanym w C (Arduino) zaimplementować wyliczanie Checksumy według poniższych wytycznych.

    Zasady obliczania bajtu kontrolnego Checksum.

    Stworzyłem taką funkcję, która będzie obliczała Checksumę z danych umieszczonych w tablicy. Parametrem "lenght" określam wielkość tablicy.

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


    Proszę o zweryfikowanie czy to co stworzyłem jest prawidłowe? Funkcja wylicza dobrze Checksumę bo jej wynik porównywałem z kalkulatorem online, ale nie wiem czy to nie jakiś przypadek? Nie rozumiem dobrze tego zagadnienia i dlatego proszę Was o zweryfikowanie :)
  • REKLAMA
  • #2 21401197
    oscil1
    Poziom 24  
    Posty: 639
    Pomógł: 49
    Ocena: 175
    Dobrze. Nie jest to przypadek ponieważ liczby bez znaku "przekręcają się" (wraparound) w sposób zdefiniowany przez standard języka.
  • REKLAMA
  • Pomocny post
    #3 21401320
    riman
    Poziom 12  
    Posty: 14
    Pomógł: 3
    Ocena: 3
    Cześć,
    Zasadniczo dobrze, ale nie w pełni zgodne z wytycznymi jakie podałeś.
    Teoretycznie brak modulo 256 w zależności od implementacji procesora w pewnych sytuacjach może spowodować, że wynik może być nieprzewidywalny.
    Checksum += data[i] % 256;
  • REKLAMA
  • #4 21402410
    michal.zd
    Poziom 31  
    Posty: 1672
    Pomógł: 84
    Ocena: 274
    riman napisał:
    Teoretycznie brak modulo 256 w zależności od implementacji procesora w pewnych sytuacjach może spowodować, że wynik może być nieprzewidywalny.

    Mógłbyś mi coś więcej powiedzieć na ten temat?
    Jakoś nie przychodzi mi do głowy hipotetyczna sytuacja. Dane są zadeklarowane jako tablica bajtów.
  • #5 21403655
    oscil1
    Poziom 24  
    Posty: 639
    Pomógł: 49
    Ocena: 175
    michal.zd napisał:
    Mógłbyś mi coś więcej powiedzieć na ten temat?
    Jakoś nie przychodzi mi do głowy hipotetyczna sytuacja. Dane są zadeklarowane jako tablica bajtów.

    Nie może, bo post "riman"a jest nieprawdziwy (a mówiąc otwarcie to co twierdzi to są bzdury). Standard języka C++ (C zachowuje siędokłądnie tak samo) dokładnie mówi co się dzieje w takiej sytuacji i twój kod jest prawidłowy. "Implementacja procesora" (cokolwiek by to miało znaczyć - bo w tym przypadku o implementacji można tylko mówić w kontekście kompilatora) nie ma tu żadnego znaczenia.

    Dodawanie (Checksum += data):
    Mimo że Checksum i data[i] są typu uint8_t, to w wyrażeniu arytmetycznym obie te wartości są promowane do typu co najmniej int. Oznacza to, że sama operacja dodawania odbywa się w typie int (o większym zakresie niż uint8_t). Dopiero wynik tej operacji — po zakończeniu dodawania — zostaje z powrotem rzutowany (zawężony) do uint8_t przy zapisie do zmiennej Checksum.

    Zawężenie do uint8_t:
    Jeśli suma przekroczy 255, nastąpi po prostu obcięcie (mod 256), co dla niektórych zastosowań (np. klasycznych sum kontrolnych) bywa zachowaniem pożądanym. Overflow w typie bez znaku uint8_t jest w C/C++ dobrze zdefiniowany (wykonywany modulo 2^8).

    Cytaty ze standardu C++17
    Cytat:

    A prvalue of an integer type whose integer conversion rank is less than the rank of int can be converted to type int if int can represent all the values of the source type; otherwise, it is converted to unsigned int. These conversions are called integral promotions.


    Cytat:
    If the destination type is unsigned, the resulting value is congruent to the original value modulo 2^n, where n is the number of bits used to represent the destination type.
    [/i]
  • #6 21403781
    michal.zd
    Poziom 31  
    Posty: 1672
    Pomógł: 84
    Ocena: 274
    oscil1 napisał:
    "Implementacja procesora" (cokolwiek by to miało znaczyć - bo w tym przypadku o implementacji można tylko mówić w kontekście kompilatora) nie ma tu żadnego znaczenia.

    No właśnie tego nie mogłem sobie wyobrazić, jakakolwiek architektura by nie była, kompilator ma za zadanie utrzymać w ryzach typ zmiennej, w tym przypadku uint8_t czy tam char.
    Chciałem wiedzieć, czy riman spotkał się z taką sytuacją, czy filozofuje.
  • REKLAMA
  • #7 21404161
    oscil1
    Poziom 24  
    Posty: 639
    Pomógł: 49
    Ocena: 175
    michal.zd napisał:
    No właśnie tego nie mogłem sobie wyobrazić, jakakolwiek architektura by nie była, kompilator ma za zadanie utrzymać w ryzach typ zmiennej,

    Jak napisałem architektura nie ma znaczenia. Kompilator ma wygenerować taki kod, który będzie sprawować się dokładnie jak jest to napisane w standardzie, nawet jak by miało to być kosztowne. Na tym polega język C.

    Standard czasami nie podaje dokłądnie zachowania programu i tu są dwie kategorie:

    1. Implementation defined behaviour - gdzie twórca kompilatora (portu) moze zdecydować jak program ma się zachować. Przykłąd - jeżeli zamiast uint8_t byśmy użyli int8__t w dyskutowanej funkcji.
    2. Undefined Bahaviour - gdzie zachowanie programiu może być dowolne i z reguły oznacza bład programisty - np. derefencja NULL wskaźnika

Podsumowanie tematu

✨ W dyskusji poruszono implementację funkcji obliczającej sumę kontrolną (Checksum) w języku C dla platformy Arduino. Użytkownik przedstawił swoją funkcję, która sumuje wartości z tablicy bajtów, jednak pojawiły się wątpliwości co do jej zgodności z wytycznymi. Odpowiedzi wskazały, że kod jest zasadniczo poprawny, ale brak zastosowania operacji modulo 256 może prowadzić do nieprzewidywalnych wyników w niektórych sytuacjach. Wyjaśniono, że w języku C wartości typu uint8_t są promowane do typu int podczas operacji arytmetycznych, co zapewnia prawidłowe obliczenia, a ewentualne przekroczenie zakresu jest obcinane do 256. Podkreślono również, że architektura procesora nie wpływa na zachowanie kompilatora w kontekście standardu języka C.
Wygenerowane przez model językowy.
REKLAMA