Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Język C - Argumentem funkcji początek i koniec tablicy

ienecode 23 Sep 2016 20:08 1251 10
  • #1
    ienecode
    Level 21  
    Witam.

    Mam funkcję do obliczania sumy CRC:
    Code: c
    Log in, to see the code


    Argumentem tej funkcji jest ilość elementów oraz tablica.
    Tablica to :
    u8 ramka[39] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39};

    Chciałbym aby zamiast podawać do argumentu całość tablicy można było podać pierwszy i ostatni element tablicy i żeby tylko z tego przedziału funkcja wyliczała sume CRC ...
    Jak to zrobić ?
  • #2
    JacekCz
    Level 39  
    Tego układu parametrów o jakim myślisz nigdy się nie robi, jest nienaturalny, dziwny.

    Początek i długość na w pełni zastosowanie .

    Co jest NAPRAWDĘ źródłem tego pytania? (w podtekście: coś kombinujesz?)

    EDIT: to jakaś liczba kontrolna, ale ona się nie nazywa CRC.
  • #3
    ienecode
    Level 21  
    chodzi o to że takie wywołanie:
    u16 Get_CRC16(nData,wLength) przy stałej tablicy nData powoduje obliczenie sumy kontrolnej całej tablicy no chyba że podam wLength krótsze to się obliczy suma ale zawsze to będzie od elementu pierwszego.

    A ja chciałbym podawać od którego elementu tej tablicy ma mi liczyć crc.

    W zmiennej "ar" mam numer indeksu tej tablicy od której chciałbym liczyć crc, to może wystarczy tak zmodyfikowac powyższa funkcję:

    Code: c
    Log in, to see the code

    ale nie wiem czy to dobre rozwiązanie?
  • #4
    JacekCz
    Level 39  
    "Najprawdziwy początek" plus dwa indeksy: początkowy i końcowy jest dobrym projektem. Albo indeks początkowy i ilość.
    Są ku temu odniesienia (WinAPI, nowe języki)
    Jest jedynie możliwe gdy to "coś" jest opakowaniem na tablicę a nie tablicą.

    Początek "rzeczywisty" (gdzieś w środku) plus "aktualna" długość (czyli różnica) jest w tradycji C, tak się wbija w środki stringów itd. Jest to podatne na błędy, ale umiejscowione w tradycji.
    Takie API jest nie istniejące w językach interpretowanych, Java, C#.

    Oddziel formalną postać funkcji od jej realizacji (albo ja nie zrozumiałem przekazu???)
  • #5
    ienecode
    Level 21  
    Nie no to dalej będzie źle.

    Mam tablice, długość, oraz ar - czyli numer od którego chce obliczać CRC.

    Teraz mając tak chce zmodyfikować tablicę do obliczania CRC żeby zawsze obliczała CRC z pierwszych trzech elementów, a reszta elementów w zależności od ar i długości .

    Jeśli ar =0 i długość =max to oblicza sumę z całej tablicy jak do tej pory,
    Jeśli ar = 5 i dlugosc =2 to oblicza sumę z następujących elementów tablicy :
    a) pierwsze 3 elementy tej tablicy , [0],[1],[2], potem przeskakuje na element [8][9].
  • #6
    JacekCz
    Level 39  
    Damian7546 wrote:
    Nie no to dalej będzie źle.

    Mam tablice, długość, oraz ar - czyli numer od którego chce obliczać CRC.

    Teraz mając tak chce zmodyfikować tablicę do obliczania CRC żeby zawsze obliczała CRC z pierwszych trzech elementów, a reszta elementów w zależności od ar i długości .

    Jeśli ar =0 i długość =max to oblicza sumę z całej tablicy jak do tej pory,
    Jeśli ar = 5 i dlugosc =2 to oblicza sumę z następujących elementów tablicy :
    a) pierwsze 3 elementy tej tablicy , [0],[1],[2], potem przeskakuje na element [8][9].


    Elegancko by było dwie funkcje, w C++ oraz prawie (???) na pewno nowe standardy C są argumenty deaultowe, można "od końca" ich nie podawać:

    Code: c
    Log in, to see the code


    Elegancko by było nie zero (może wystąpić w realnej sytuacji), ale właśnie minus jeden (ale zmiana na integer ze znakiem)

    I jeszcze jedno, funkcja "ze spójnikiem i w środku" czyli z mieszanym algorytmem trochę tak, trochę siak) uczciwe by było jakby się nazywała adekwatnie JestemTakaAlboSiaka().
    I nie "CRC" bo to jest bardzo dokładnie określone - polska Wikipedia ma błąd (nadmierne uproszczenie), angielska OK.
  • #8
    JacekCz
    Level 39  
    Damian7546 wrote:
    @JacekCz A ciało funkcji ?unsigned fun(const byte * arg, int len, int start = -1)
    ?


    Ciało niechby było kontynuujące twoją koncepcję. Chociaż musiał byś cokolwiek odpuścić z "wynalazków" - o ile przyjmujesz koncepcję że API by miało być "podobne do czegokolwiek".

    Code: c
    Log in, to see the code

    ->
    Code: c
    Log in, to see the code


    Choć nadal zupełnie nie wiem jakie by miały być plusy selektywnej sumy kontrolnej. Są jakieś argumenty PRZECIWKO braniu z całości? Mam intuicję ze to jest zamiatanie pod dywan innego problemu
  • #9
    ienecode
    Level 21  
    @JacekCz to może opiszę jaki mam problem.
    Mam stałą tablice z w której dane aktualizują się co jakiś czas.
    O wartości z tej tablicy odpytuję modbusem którego sam zrobiłem ale nie do końca.
    Układ działa tak że odpytywać mogę o ile chce rejestrów ale zawsze od 0 no bo tak mi program liczy sumę kontrolną.


    Pierwszymi elemetami tej tablicy są : adres, funkcja, ilosc danych , dane...... .

    I teraz jak odpytuję o rejestry od pierwszego to wszystko jest ok bo funkcja do obliczenia sumy kontrolnej weźmie sobie z tablicy adres, funkcje, ilosc bajtow i pierwsze dane.

    a gdybym chciał odpytać o rejestr 5, to funkcja do liczenia sumy kontrolnej musiała by wziąć adres , funkcję, ilość bajtów i potem przeskoczyć o 5 elementów i wziąć te elementy.
  • Helpful post
    #10
    JacekCz
    Level 39  
    Projektowo funkcje należy rozdzielić.
    SprawdzWszystkieRejestry
    i
    SprawdzJedenRejestr()
    Można podać jako numer, jako maska bitowa czy jeszcze kilka by wymyślił.

    Chyba w samym pomyśle jest bład. Jeśli chcesz wykryć zmianę (bo tak sie domyślam) na jednym rejestrze (na niektórych rejestrach) to koncepcja CRC nie jest adekwatna do tego. To jest do wykrywania naruszeń (uszkodzeń) bloków danych.

    Co Ci z informacji że "gdziekolwiek" nastąpiła zmiana? Po drugie aby to wykryć musiałbyś przechowywać po stronie 'klienta' bardzo dużo 'poprzednich wartości CRC' dla wszystkich dla 7-ki, dla 11-ki itd ...

    Najprostsze to posiadać kopię tych danych, szybką pętlą ocenić czy i gdzie jest zmiana.

    Numery jakimi jest zainteresowany klient są znane serwerowi i stałe dłuższy czas, czy nie ma tu żadnej stałości?

    Dodano po 1 [godziny] 14 [minuty]:

    Damian7546 wrote:

    Pierwszymi elemetami tej tablicy są : adres, funkcja, ilosc danych , dane...... .


    .... i taka myśl, właściwą wg mnie szkołą na takie dane jest realistyczne przedstawienie tego w strukturze.

    Ze względu na długość danych się to rozwiązuje na dwa sposoby:
    a)
    Code: c
    Log in, to see the code

    ale to przechodzi tylko dynamicznie alokowane przez malloc, korzystając że w C nie ma kontroli zakresu

    b)
    Code: c
    Log in, to see the code

    o ile we wdrożeniu jest jakiś "MAX".

    Ze strukturą zamiast tablicy cała ta rozmowa nagle staje się naturalna, bez dziwolągów. To jest rozwiązanie tego przeczucia, co miałem, że coś jest pod dywanem ...

    Jeszcze inna szkoła, zależnie czy/jak następuje jej transmisja, to taka struct jest członkiem unii, gdzie drugim jest z bufor byte[]

    Code: c
    Log in, to see the code

    należy zająć się pytaniem, jeśli struktura jest transmitowna przez sieć, wtedy tzreba zadbać o allignment (uporządkowanie???), zwłaszcza delikatne jak po obu stronach są różne architektury.