-
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