eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingKonwersja kodu › Re: Konwersja kodu
  • Path: news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!.P
    OSTED!not-for-mail
    From: bartekltg <b...@g...com>
    Newsgroups: pl.comp.programming
    Subject: Re: Konwersja kodu
    Date: Sat, 26 Sep 2015 18:49:45 +0200
    Organization: ATMAN - ATM S.A.
    Lines: 136
    Message-ID: <mu6ib9$oja$1@node2.news.atman.pl>
    References: <1i91n3jkf2r8s$.us4fry1ns183$.dlg@40tude.net>
    NNTP-Posting-Host: 89-73-81-145.dynamic.chello.pl
    Mime-Version: 1.0
    Content-Type: text/plain; charset=utf-8; format=flowed
    Content-Transfer-Encoding: 8bit
    X-Trace: node2.news.atman.pl 1443286185 25194 89.73.81.145 (26 Sep 2015 16:49:45 GMT)
    X-Complaints-To: u...@a...pl
    NNTP-Posting-Date: Sat, 26 Sep 2015 16:49:45 +0000 (UTC)
    User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101
    Thunderbird/38.2.0
    In-Reply-To: <1i91n3jkf2r8s$.us4fry1ns183$.dlg@40tude.net>
    Xref: news-archive.icm.edu.pl pl.comp.programming:208412
    [ ukryj 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: