eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingktóre języki 'historyczne' są ważneRe: które języki 'historyczne' sš ważne
  • Data: 2011-02-02 01:01:13
    Temat: Re: które języki 'historyczne' sš ważne
    Od: Jędrzej Dudkiewicz <j...@n...com> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    On 02/02/2011 01:06 AM, Andrzej Jarzabek wrote:
    > On 01/02/2011 21:50, Marek Borowski wrote:
    >>
    >> Cos mam wrazenie ze mylicie systemy z systemami. Operacje bliskie
    >> hardware najwygodniej sie robi w C. Jak np w innych jezykach wysokiego
    >> poziomu deklarujesz wywolanie funkcji z pod konkretnego adresu he ?
    >>
    >> W C prosze bardzo:
    >>
    >> void (*fun)(void) = (void (*)(void))0xFC00;
    >> fun();
    >
    > Naprawdę muszę pisać, jak to można zrobić w C++?
    >
    >> Jak po odebraniu pakietu dobierzesz sie do jego pol, bez dodatkowych
    >> narzutow ?
    >>
    >> W C jest to trywialne:
    >>
    >> uint8_t *buffer;
    >>
    >> a po odebraniu;
    >>
    >> struct Packet* usb = (struct Packet*) buffer;
    >>
    >> usb->requestType i jedziemy.
    >
    > Naprawdę? Szkoda tylko, że jak piszesz tę strukturę, to musisz pilnować,
    > żeby wszystkie pola były na swoim miejscu i żeby Ci kompilator nie
    > namieszał paddingiem na przykład.

    __attribute__((packed)), pola struktury nie mogą być przekładane.

    > Jak w C zapiszesz pole pakietu, które jest zaczyna się od ósmego bajta i
    > jest czterobajtową liczbą, powiedzmy bez znaku, zapisaną w formacie -
    > uwaga - big endian?

    Rozumiem, że chodzi o deklarację tego pola w strukturze? Otóż wstawię na
    początek pól na łączną wartość 7 bajtów, potem wstawię czterobajtową
    zmienną, a potem wywołam funkcję "preprocess_packet", która mi zawoła
    ntohl i pochodne na wskazanych polach, w tym na tej zmiennej.

    > W C++ za to możesz bez problemu wrapnąć bufor bajtowy w klasę, która
    > jako dane pole udotępnia ci dajmy na to 14 bajt bufora albo wartość
    > liczbową w natywnym formacie, zapisaną jako big endian na bajtach od 4
    > do 7.

    Jasne, ale w środku albo będziesz kopiował dane do oddzielnych pól, albo
    będziesz trzymał wskaźniki do nich i wołał ntohl przy dostępie, albo
    wstawisz powyższy syf. To trzecie ma najmniejszy narzut pamięciowy i
    obliczeniowy w czasie wykonania.

    Tak czy owak, zaletą C++ jest to, że jakby co, to można tego rozwiązania
    użyć, ale znacznie ładniej zapakowanego.

    JD

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: