eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingKonwersja kodu › Re: Konwersja kodu
  • Data: 2015-09-26 18:49:45
    Temat: Re: Konwersja kodu
    Od: bartekltg <b...@g...com> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    On 26.09.2015 17:27, szemrany wrote:
    > Hejka,
    >
    > Widzę, że niektórym się na grupie nudzi i próbują podkarmiać trolla, więc

    Przyłączyłbyś się do wspólnego wysiłku a nie tak tylko korzystasz;>

    > może wykorzystam ten power w słusznym celu ;-)


    > Mianowicie niejaki AK mnie porzucił z pomocą w konwersji kodu z C do
    > Pascala i potrzebuję pomocy.
    > Już prawie wszystko mam przetłumaczone, ale jeszcze pojawiają się
    > wątpliwości. Oto one.
    >
    > ret->allocated = (size / wordbitsize + 1);
    >
    > gdzie allocated to int
    >
    > Czy w C przypisanie wyniku dzielenia konwertuje/obcina go do typu
    > całkowitego?

    Tak. Bardzo łatwo sprawdziłbyś to w google;>


    > Kolejna rzecz.
    >
    > if (trailing_bits) {}
    >
    > gdzie trailing_bits to char


    > Czy char jest odpowiednikiem typu byte z pascala?

    char ma 256 różnych wartośći, ale lepiej użyć unsigned char
    albo uint8_t (z <cstdint>)

    > Czy takie sprawdzanie warunku to sprawdzenie czy trailing_bits <> 0?

    w C i C++ if(x) to to samo co if(x!=0)


    > I następna.
    >
    > x = (word_t) ~0;

    > gdzie word_t to uint64

    Nie ma czegoś takiego. Jest uint64_t.


    > Czy to jest równoważne zapisowi:
    >
    > x = max_uint64;

    Tak. Ale umiesz odpowiedzieć, dlaczego 0, które jest intem ze znakim
    promuje się do _szerszego_ inta bez znaku, a dopiero potem jest negowane
    bitowo? Jest na to werset w standardzie, czy to zależy od kompilatora?
    ;-)


    Zależnie od kontekstu, pewnie lepiej:
    #include <limits>
    ...
    x = numeric_limits<uint64_t>::max();
    lub
    numeric_limits<decltype(res)>::max(); //wtedy jak zmienisz typ x
    wartość też sie zmieni.

    > Kolejny niejasny moment:
    >
    > ret->trailing_bits = *(ret->bitset + ret->allocated - 1) ? (word_t) ~0 : 0;

    > Co ta linia przypisuje do trailing_bits?

    Ta linia reprezentuje brzydkie hackerstwo;)

    > I definicje, żeby było łatwiej:
    >
    > ret to IntBitSet
    >
    > typedef unsigned long long int word_t;
    >
    > typedef struct {
    > int size;
    > int allocated;
    > word_t trailing_bits;
    > int tot;
    > word_t *bitset;

    Nie zjadłeś tu klamerki?

    > IntBitSet;
    >
    > Dziękuję :-)


    ret->trailing_bits =
    (ret->bitset[ret->allocated - 1] !=0 ) ? (word_t) ~0 : 0;

    Teraz jasne? bitset to wskaźnik na dynamicznie zaalokowaną tablicę
    (domyślam się z kontekstu), allocated to dligość zaalokowanej tablicy,
    ret->bitset + ret->allocated - 1 to wskaźnik na ostatni elemnt tablicy.
    * to dereferencja. Więc to to samo co
    ret->bitset[ret->allocated - 1]
    size,allocated bitset, jeśli robią to co myślę, zalecam wywalić
    w cholerę i zastąpić przez vector:) Z drugiej strony jeśli robią
    to co myśle, to powinno być +size, nie +allocated;)

    Miło by było wrzucić to jako metodę

    typedef struct {
    int size;
    int allocated;
    uint64_t trailing_bits;
    int tot;
    uint64_t *bitset;
    void set_trialing_bits() {
    trailing_bits=(bitset[allocated - 1]!=0) ?
    numeric_limits<uint64_t>::max() : 0;}
    } IntBitSet;


    Jeśli ostatni element zaalokowanej pamieci (a właśnie, czemu patrzymy
    na allocated, nie size?) jest niezerowy, trailbits wypełniamy jedynkami,
    w przeciwmy razie zerem.

    Uwaga dotycząca ~0 jak poprzednio.

    pzdr
    bartekltg





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: