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

[C] Definicja typu 5-bajtowego

narasta 03 Gru 2010 13:02 864 6
  • #1 8820154
    narasta
    Poziom 21  
    Jak stworzyć typ który miałby 40 bitów? (5bajtów)

    chodzi mi o to, żeby potem zrobić do tego wzkaźnik w ten sposób

    _40bit *ptr = (unsigned int *) (ptr_address);
  • #2 8821063
    szelus
    Poziom 34  
    Ale co ten typ ma przechowywać? Jeżeli chcesz zmienną typu integer o długości 40 bitów to się zasadniczo nie da - chyba, że jakiś nietypowy kompilator/architektura wspiera taki niestandardowy typ.

    Jeżeli po prostu bity, to tablica bajtowa pięcioelementowa zajmie na 8-mio bitowych architekturach prawdopodobnie 5 bajtów, ale dla procesorów o dłuższym słowie i tak zostanie wyrównana najczęściej do granicy słowa.
  • #3 8821121
    Dżyszla
    Poziom 42  
    Typ tak dokładnie to może być problem. Ale klasa już jak najbardziej tak. Danymi bedzie 5-elementowa tablica 8-bitowych danych (tryb 8-bitowy jest - powiedzmy - natywnym, podobnie jak 32 lub 64 bitowym - przy standardowych opcjach kompilatora nie powinno nastąpić rozszerzenie). Następnie do tej klasy przeciążone operatory do operacji (w zalezności od tego, do czego chcesz to wykorzystywać i co ma przechowywać).
  • #4 8821161
    szelus
    Poziom 34  
    Generalnie, rozwiązanie mocno zależy do tego, na czym właściwie polega problem ;) i (często) od architektury systemu docelowego.
    Wykonywanie wszystkich obliczeń na poszczególnych bajtach i wymuszenie na kompilatorze upakowania i wyrównania takiej zmiennej do bajtu powinno zadziałać zawsze, chociaż może mieć reperkusje wydajnościowe.
  • #5 8822011
    narasta
    Poziom 21  
    Wszytko odbywa się w C na AVR :)

    Zrobiłem strukturę zawierajacą tablice unsigned char[5]

    tablica ta zajmuje dokładnie 5 bajtów :)

    Nie podoba mi się tylko odwoływanie do tej tablicy, no ale niech będzie. :)

    definicja typu:
    typedef struct {unsigned char a[5]} _40bit;


    Inicjalizacja wzkażnika w tym typie:
    _40bit *xram = (unsigned int *) (XRAM_start_pointer);


    W każdej 40 bitowej komórce chce umieścić 4 liczby 10bitowe. Nie chciałem allokować tego po 16 bitów bo wtedy traciłbym te 6 bitów pustych.
  • #7 8823909
    tmf
    VIP Zasłużony dla elektroda
    W C pogodziłbym się z utratą tych 6 bitów. Ew. operacje na tak nietypowym wskaźniku będą koszmarne, nie tylko z powodów wydajnościowych, ale przede wszystkim wygody dostępu. Jak chcesz pobrać poszczególne liczby? Trzeba będzie robić wrapper. W C++ ma to jeszcze o tyle sens, że co prawda wydajność ciągle by leżała, ale przeciążenie operatorów dałoby wygodny dostęp do poszczególnych pól. W C można jeszcze spróbować z polami bitowymi - zdefiniować upakowaną strukturę, która ma 4 pola po 10 bitów. Dzięki temu dostęp do poszczególnych pól byłby jako tako wygodny. A pytanie pomocnicze, skoro masz zewnętrzną pamięć SRAM, nie prościej dodać jej tyle, że te 6 bitów straty będzie bez znaczenia? Pamięć czy 32 czy 64 kB to praktycznie ten sam koszt, a nawet jeśli jest ciut droższa, to jak sądzę nie będziesz budował miliona kopii tego urządzenia, żeby kombinowanie jak to zrobić na około było opłacalne.
REKLAMA