eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming › Konwersja kodu
Ilość wypowiedzi w tym wątku: 10

  • 1. Data: 2015-09-26 17:27:24
    Temat: Konwersja kodu
    Od: szemrany <s...@o...off>

    Hejka,

    Widzę, że niektórym się na grupie nudzi i próbują podkarmiać trolla, więc
    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?

    Kolejna rzecz.

    if (trailing_bits) {}

    gdzie trailing_bits to char

    Czy char jest odpowiednikiem typu byte z pascala?
    Czy takie sprawdzanie warunku to sprawdzenie czy trailing_bits <> 0?

    I następna.

    x = (word_t) ~0;

    gdzie word_t to uint64

    Czy to jest równoważne zapisowi:

    x = max_uint64;

    czyli zapalone wszystkie 64 bity?

    Kolejny niejasny moment:

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

    Co ta linia przypisuje do trailing_bits?

    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;
    IntBitSet;

    Dziękuję :-)

    --
    howgh
    szemrany
    "Trzeba z żywymi naprzód iść, po życie sięgać nowe,
    a nie w uwiędłych laurów liść z uporem stroić głowę"


  • 2. Data: 2015-09-26 18:22:13
    Temat: Re: Konwersja kodu
    Od: "M.M." <m...@g...com>

    On Saturday, September 26, 2015 at 5:27:32 PM UTC+2, szemrany wrote:
    > Hejka,
    >
    > Widzę, że niektórym się na grupie nudzi i próbują podkarmiać trolla, więc
    > 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?
    Pogooglaj za konwersją i promocją typów.
    http://mikrokontrolery.blogspot.com/2011/02/kurs-jez
    yka-c-rzutowanie-promocja-typow.html


    >
    > Kolejna rzecz.
    >
    > if (trailing_bits) {}
    >
    > gdzie trailing_bits to char
    >
    > Czy char jest odpowiednikiem typu byte z pascala?

    O ile pamiętam, to w C była gwarancja tylko co do tego:
    sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long).

    Może gdzieś na jakiejś platformie przy jakiś opcjach char
    ma 10 bitów, moze gdzieś 16.

    Jeśli ilość bitów i bajtów w typach jest ważne, to najlepiej
    je przedefiniować w jakimś miejscu. Nastepnie na starcie
    programu:

    if( sizeof(moj_char) <= 2 ) {
    printf("ten program zadziała tylko na znakach 2bajtowych");
    abort();
    }




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



    > I następna.
    >
    > x = (word_t) ~0;
    >
    > gdzie word_t to uint64
    >
    > Czy to jest równoważne zapisowi:
    >
    > x = max_uint64;
    Zależy czym jest to zero bez sufixów.
    Ja bym napisał , że:
    x = ~0ULL;
    jest równe
    x = max_uint64;


    > czyli zapalone wszystkie 64 bity?


    > Kolejny niejasny moment:
    >
    > ret->trailing_bits = *(ret->bitset + ret->allocated - 1) ? (word_t) ~0 : 0;
    Faktycznie niejasny moment. Nie lepiej unikać takich sytuacji?
    Dlaczego nie sprawdzisz jak Twój kompilator na Twojej platformie z Twoim
    opcjami się zachowa?

    Na pewno
    typ_calkowity x = 0;
    wyzeruje wszystkie bity

    Ustawia się wszystkie bity tak:
    typ_dodatni x = ~((typ_dodatni)0);

    Wyrażenie
    ~0
    jest równe -1. Co się stanie gdy wartość ujemną się przypisze do
    typu dodatniego? Odpowiadam pytaniem, po co coś takiego robić?
    Chcesz wiedzieć jak się zachowa kompilator, a czy w ogóle można
    sensownie się zachować, gdy ktoś każe trzymać wartość ujemną w
    typie bez znaku?

    I odwrotnie:
    ~0u
    to max_uint.
    Przypisywanie max_uint do inta to przekroczenie zakresu. Znowu moje
    pytanie, po co coś takiego robić? Nie lepiej napisać kod tak, aby z
    niego wynikały intencje programisty? Np.:
    int x = -1;

    Mieszanie operacji arytmetycznych ze znakiem z operacjami bitowymi to
    proszenie się o kłopoty. Wiem, można uzyskać szybszy kod. Można nawet w
    typie double ustawiać i zerować bity. Ale



    >
    > Co ta linia przypisuje do trailing_bits?
    >
    > 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;
    > IntBitSet;
    >
    > Dziękuję :-)


  • 3. Data: 2015-09-26 18:49:45
    Temat: Re: Konwersja kodu
    Od: bartekltg <b...@g...com>

    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






  • 4. Data: 2015-09-26 18:57:58
    Temat: Re: Konwersja kodu
    Od: szemrany <s...@o...off>

    On Sat, 26 Sep 2015 09:22:13 -0700 (PDT), M.M. wrote:

    >> 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.

    >> Kolejny niejasny moment:
    >>
    >> ret->trailing_bits = *(ret->bitset + ret->allocated - 1) ? (word_t) ~0 : 0;
    > Faktycznie niejasny moment. Nie lepiej unikać takich sytuacji?

    Może i lepiej, ale ...kolega chyba nie przeczytał wstępu mojego posta.
    To nie mój kod, to kod, który podał mi AK, konkretnie ten:

    https://raw.githubusercontent.com/inveniosoftware/in
    tbitset/master/intbitset/intbitset_impl.c

    a ja go konwertuję do Pascala. Pytam więc o składnię C, która nie jest mi
    bliska i proszę o pomoc w zrozumieniu co te konkretne linie przez mnie
    cytowane robią.

    > Dlaczego nie sprawdzisz jak Twój kompilator na Twojej platformie z Twoim
    > opcjami się zachowa?

    Jaki mój kompilator? Ja piszę w Delphi :-)

    > Na pewno
    > typ_calkowity x = 0;
    > wyzeruje wszystkie bity
    >
    > Ustawia się wszystkie bity tak:
    > typ_dodatni x = ~((typ_dodatni)0);
    >
    > Wyrażenie
    > ~0
    > jest równe -1. Co się stanie gdy wartość ujemną się przypisze do
    > typu dodatniego? Odpowiadam pytaniem, po co coś takiego robić?
    > Chcesz wiedzieć jak się zachowa kompilator, a czy w ogóle można
    > sensownie się zachować, gdy ktoś każe trzymać wartość ujemną w
    > typie bez znaku?

    Chcę tylko zrozumieć, napisane ludzkim językiem, jak mam intepretować to co
    wykonuje ta linia:

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

    Jest to dla mnie niezrozumiałe do końca i pytam.

    --
    howgh
    szemrany
    "Trzeba z żywymi naprzód iść, po życie sięgać nowe,
    a nie w uwiędłych laurów liść z uporem stroić głowę"


  • 5. Data: 2015-09-26 19:01:18
    Temat: Re: Konwersja kodu
    Od: bartekltg <b...@g...com>

    On 26.09.2015 18:57, szemrany wrote:

    > a ja go konwertuję do Pascala. Pytam więc o składnię C, która nie jest mi

    To c czy c++ w końcu. To _różne_ jezyki.

    pzdr
    bartekltg


  • 6. Data: 2015-09-26 19:31:47
    Temat: Re: Konwersja kodu
    Od: szemrany <s...@o...off>

    On Sat, 26 Sep 2015 19:01:18 +0200, bartekltg wrote:

    > On 26.09.2015 18:57, szemrany wrote:
    >
    >> a ja go konwertuję do Pascala. Pytam więc o składnię C, która nie jest mi
    >
    > To c czy c++ w końcu. To _różne_ jezyki.

    Hmm... dobre pytanie :-) Konwertuje to co jest w pliku podanym w linku od
    AK.
    Czy to jet C czy C++ ....nie wiem, jeden pies z mojego punktu widzenia ;-)
    chcę to przenieść do Delphi i proszę o pomoc w trudnych momentach, ot
    wszystko.

    --
    howgh
    szemrany
    "Trzeba z żywymi naprzód iść, po życie sięgać nowe,
    a nie w uwiędłych laurów liść z uporem stroić głowę"


  • 7. Data: 2015-09-26 19:35:17
    Temat: Re: Konwersja kodu
    Od: bartekltg <b...@g...com>

    On 26.09.2015 19:31, szemrany wrote:
    > On Sat, 26 Sep 2015 19:01:18 +0200, bartekltg wrote:
    >
    >> On 26.09.2015 18:57, szemrany wrote:
    >>
    >>> a ja go konwertuję do Pascala. Pytam więc o składnię C, która nie jest mi
    >>
    >> To c czy c++ w końcu. To _różne_ jezyki.
    >
    > Hmm... dobre pytanie :-) Konwertuje to co jest w pliku podanym w linku od
    > AK.
    > Czy to jet C czy C++ ....nie wiem, jeden pies z mojego punktu widzenia ;-)

    > chcę to przenieść do Delphi i proszę o pomoc w trudnych momentach, ot
    > wszystko.

    A, _do_ delphi.
    Nie wiem czemu myślałem, że przenosisz się na coś rozsądnego;p

    pzdr
    bartekltg






  • 8. Data: 2015-09-26 19:47:15
    Temat: Re: Konwersja kodu
    Od: "M.M." <m...@g...com>

    On Saturday, September 26, 2015 at 6:58:06 PM UTC+2, szemrany wrote:

    > Chcę tylko zrozumieć, napisane ludzkim językiem, jak mam intepretować to co
    > wykonuje ta linia:
    > ret->trailing_bits = *(ret->bitset + ret->allocated - 1) ? (word_t) ~0 : 0;
    > Jest to dla mnie niezrozumiałe do końca i pytam.

    Pewnie ustawia wszystkie bity.


  • 9. Data: 2015-09-26 19:56:49
    Temat: Re: Konwersja kodu
    Od: bartekltg <b...@g...com>

    On 26.09.2015 18:49, bartekltg wrote:
    > 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]
    >
    >
    > 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.

    Skoro to z c->delphi, to jeszcze trzaba dodać, że
    x=(warunek)? coś : coś2

    to to samo co:

    if (warunek)
    x=cos;
    else
    x=coś2;

    pzdr
    bartekltg



  • 10. Data: 2015-09-28 09:57:02
    Temat: Re: Konwersja kodu
    Od: Tomasz Kaczanowski <kaczus@dowyciecia_poczta.onet.pl>

    W dniu 2015-09-26 17:27, szemrany pisze:
    > Hejka,
    >
    > Widzę, że niektórym się na grupie nudzi i próbują podkarmiać trolla, więc
    > 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?

    jesli argumentami dzielenia są liczby typu int to mozna przyjąć, że
    bedzie wykonany pascalowy div


    >
    > Kolejna rzecz.
    >
    > if (trailing_bits) {}
    >
    > gdzie trailing_bits to char
    >
    > Czy char jest odpowiednikiem typu byte z pascala?

    char może byc ze znakiem, jeśli chce się mieć pewność co do wielkości i
    znaku to lepiej użyć uint8_t albo int8_t (oczywiście jesli nie sa to
    znaki, bo jesli chcemy znaki to char)


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

    tak

    > I następna.
    >
    > x = (word_t) ~0;
    >
    > gdzie word_t to uint64
    >
    > Czy to jest równoważne zapisowi:
    >
    > x = max_uint64;

    może być, ale nie ma gwarancji

    > czyli zapalone wszystkie 64 bity?

    jeśli jest tak, to tak

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


    w zależności od spełnienia warunku *(ret->bitset + ret->allocated - 1)
    albo 0, albo ~0



    --
    Kaczus
    http://kaczus.ppa.pl

strony : [ 1 ]


Szukaj w grupach

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: