Pomoč pri C/C++ jeziku

Vse o programiranju na in za PC

Moderatorji: Kroko, tilz0R

Pomoč pri C/C++ jeziku

OdgovorNapisal/-a rizzo » 06 Apr 2020, 17:41

Pozdravljeni.

Rabil bi pomoč pri naslednji kodi... Namreč ne poznam c jezika in nemorem točno razvozlati operacij v naslednji kodi.

id prebran iz eproma je 58 71 91 98

Koda: Izberi vse
 // Convert to uint64
    *id = (uint64_t) id_rx_bytes[7] << 56u | (uint64_t) id_rx_bytes[6] << 48u | (uint64_t) id_rx_bytes[5] << 40u |
           (uint64_t) id_rx_bytes[4] << 32u | (uint64_t) id_rx_bytes[3] << 24u | (uint64_t) id_rx_bytes[2] << 16u |
           (uint64_t) id_rx_bytes[1] << 8u | (uint64_t) id_rx_bytes[0];


Rad bi namreč spisal program v Bascomu vendar nikakor ne dobim pravih rezultatov.

Hvala.
rizzo
 
Prispevkov: 9
Pridružen: 05 Avg 2015, 10:29
Zahvalil se je: 6 krat
Prejel zahvalo: 1 krat
Uporabnika povabil: Iztok
Število neizkoriščenih povabil: 0

Re: Pomoč pri C/C++ jeziku

OdgovorNapisal/-a radix » 06 Apr 2020, 18:21

To zlepi bajte v arrayu id_rx_bytes v 64-bitno nepredznačeno število. << je operacija zamika v levo, | je bitni ali.
Zamik v levo je tukaj enakovreden množenju s potenco 2, bitni ali je pa (ker se bajti ne prekrivajo) enakovreden seštevanju.
Z bascomom ne morem pomagat, ker nimam pojma kakšen je to jezik.
radix
 
Prispevkov: 1469
Pridružen: 04 Feb 2015, 20:19
Kraj: Ljubljana
Zahvalil se je: 226 krat
Prejel zahvalo: 350 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 25

Re: Pomoč pri C/C++ jeziku

OdgovorNapisal/-a rizzo » 06 Apr 2020, 18:46

Bascom je compiler za Mikrokontrolerje avr uporablja se jezik Basic.

Hvala za odgovor.
rizzo
 
Prispevkov: 9
Pridružen: 05 Avg 2015, 10:29
Zahvalil se je: 6 krat
Prejel zahvalo: 1 krat
Uporabnika povabil: Iztok
Število neizkoriščenih povabil: 0

Re: Pomoč pri C/C++ jeziku

OdgovorNapisal/-a GJ » 06 Apr 2020, 19:53

Tvoj OS uporablja "big-endian" ali "little-endian"?
Omenjena funkcija ne naredi nič drugega kot da zloži byte iz polja id_rx_bytes v 64 bitno variablo ID. Sedaj pa moraš ugotoviti v kakšnem načinu se zapisuje variabla ID torej v "big-endian" ali "little-endian".

LP :mrgreen: GJ
Če si jezen, si žrtev!
GJ
 
Prispevkov: 319
Pridružen: 18 Jan 2015, 23:26
Kraj: Ljubljana
Zahvalil se je: 156 krat
Prejel zahvalo: 86 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 19

Re: Pomoč pri C/C++ jeziku

OdgovorNapisal/-a s54mtb » 06 Apr 2020, 22:02

Ravno danes smo imeli drugo predavanje, kjer smo obravnavali tudi operatorje. Sicer nisi nič zamudil, saj je posnetek tudi na voljo.

http://scidrom.sc-nm.si/2020/04/06/mala-sola-c-002/


Se pa na tem mestu zahvaljujem Krokotu za navdih in del vsebine.
Namesto "Zahvali se" sprejemam tudi šalco kofeta: https://www.buymeacoffee.com/s54mtb
Uporabniški avatar
s54mtb
 
Prispevkov: 11208
Pridružen: 15 Jan 2015, 01:10
Zahvalil se je: 1559 krat
Prejel zahvalo: 4068 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Pomoč pri C/C++ jeziku

OdgovorNapisal/-a tilz0R » 06 Apr 2020, 22:44

radix je napisal/-a:bitni ali je pa (ker se bajti ne prekrivajo) enakovreden seštevanju.


To velja le, če se biti znotraj byte-a ne prekrivajo in sta na istih pozicijah (brez shift operacije). A to izpostavljat je izredno nevarno.
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1819
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 229 krat
Prejel zahvalo: 511 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: Pomoč pri C/C++ jeziku

OdgovorNapisal/-a rizzo » 06 Apr 2020, 23:23

s54mtb je napisal/-a:Ravno danes smo imeli drugo predavanje, kjer smo obravnavali tudi operatorje. Sicer nisi nič zamudil, saj je posnetek tudi na voljo.

http://scidrom.sc-nm.si/2020/04/06/mala-sola-c-002/


Se pa na tem mestu zahvaljujem Krokotu za navdih in del vsebine.


Odlično predavanje nisem vedel da lahko compilaš v windowsih c kodo.
rizzo
 
Prispevkov: 9
Pridružen: 05 Avg 2015, 10:29
Zahvalil se je: 6 krat
Prejel zahvalo: 1 krat
Uporabnika povabil: Iztok
Število neizkoriščenih povabil: 0

Re: Pomoč pri C/C++ jeziku

OdgovorNapisal/-a radix » 07 Apr 2020, 01:05

GJ je napisal/-a:Tvoj OS uporablja "big-endian" ali "little-endian"?
Omenjena funkcija ne naredi nič drugega kot da zloži byte iz polja id_rx_bytes v 64 bitno variablo ID. Sedaj pa moraš ugotoviti v kakšnem načinu se zapisuje variabla ID torej v "big-endian" ali "little-endian".
:_naughty :_naughty :_naughty
Tukaj si pa naredil hudo napako. V jeziku C 1<<60 pomeni 2^60. Ko zlagaš bajte v večbajtno spremenljivko jih vedno zlagaš v enakem vrstnem redu. Moraš pa poznati endianness vhodnih podatkov v arrayu bajtov. (Tukaj je razvidno, da je vhod little endian.)
Endianness bi znal biti pomemben, če bi hotel array v spominu direktno interpretirati kot uint64_t. Potem je odvisno kako prevajalnik zloži bajte v večbajtnih spremenljivkah (AVR je 8-biten in načeloma je endianness nepomemben (razen pri pointer registrih), pa tudi sicer je endianness večinoma določen s strojno opremo in ne z OS).
radix
 
Prispevkov: 1469
Pridružen: 04 Feb 2015, 20:19
Kraj: Ljubljana
Zahvalil se je: 226 krat
Prejel zahvalo: 350 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 25

Re: Pomoč pri C/C++ jeziku

OdgovorNapisal/-a radix » 07 Apr 2020, 01:08

rizzo je napisal/-a:Odlično predavanje nisem vedel da lahko compilaš v windowsih c kodo.
Če se hočeš samo na hitro poigrati, obstajajo tudi spletna orodja, kot na primer tole: https://rextester.com/l/c_online_compiler_gcc.
radix
 
Prispevkov: 1469
Pridružen: 04 Feb 2015, 20:19
Kraj: Ljubljana
Zahvalil se je: 226 krat
Prejel zahvalo: 350 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 25

Re: Pomoč pri C/C++ jeziku

OdgovorNapisal/-a GJ » 07 Apr 2020, 13:16

radix je napisal/-a:
GJ je napisal/-a:Tvoj OS uporablja "big-endian" ali "little-endian"?
Omenjena funkcija ne naredi nič drugega kot da zloži byte iz polja id_rx_bytes v 64 bitno variablo ID. Sedaj pa moraš ugotoviti v kakšnem načinu se zapisuje variabla ID torej v "big-endian" ali "little-endian".
:_naughty :_naughty :_naughty
Tukaj si pa naredil hudo napako. V jeziku C 1<<60 pomeni 2^60. Ko zlagaš bajte v večbajtno spremenljivko jih vedno zlagaš v enakem vrstnem redu. Moraš pa poznati endianness vhodnih podatkov v arrayu bajtov. (Tukaj je razvidno, da je vhod little endian.)
Endianness bi znal biti pomemben, če bi hotel array v spominu direktno interpretirati kot uint64_t. Potem je odvisno kako prevajalnik zloži bajte v večbajtnih spremenljivkah (AVR je 8-biten in načeloma je endianness nepomemben (razen pri pointer registrih), pa tudi sicer je endianness večinoma določen s strojno opremo in ne z OS).

Ahhh...
Kje je moja napaka? Daj razloži prosim!
Mimogrede, v danem primeru je zlaganje več byte-nih spremenljiv povsem spremenljivo v kakršnem koli vrstnem redu!
Pomikov, ki niso deljivi z 8 (byte) ni, torej?
In jasno pomik za 60 bitov, ki ga ti omenjaš, v danem primeru ni sprejemljiv, saj ni deljiv z 8!
In seveda, iz ničesar ni razvidno kakšen je vhod, to pa zato ker se podatki berejo iz rx bufferja, ki ima lahko drugačen endiann kot OS.
In še, iz ničesar ni razvidno kakšen endiann uporablja Bascom, da bo ustrezala funkcija! Niti ne veva, če podpira 64 bitne nepedznačene spremenljivke!

LP :mrgreen: GJ
Če si jezen, si žrtev!
GJ
 
Prispevkov: 319
Pridružen: 18 Jan 2015, 23:26
Kraj: Ljubljana
Zahvalil se je: 156 krat
Prejel zahvalo: 86 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 19

Re: Pomoč pri C/C++ jeziku

OdgovorNapisal/-a MitjaN » 07 Apr 2020, 15:01

Resnica je najbrž nekje vmes. Problem tehničnega jezika je to, da če hočeš nedvomno povedati potem postane jezik tako neberljiv kot pravniški. Iz OP lahko sklepamo (povdarjam sklepamo) da *id kaže na 64 bitni nepredznačeni integer. In tu so stvari jasne. Če imaš
Koda: Izberi vse
unsigned long long id;
id = 1LL<<60;

bo prevajalnik postavil 1 na 60 logični bit. Kako bo pa to zapisano v spominu (v kateri bajt, v kateri fizični bit) za nas ni važno zaenkrat ni važno. Za to poskrbi prevajalnik. Tako v problemu OP "endnianess" *id ni pomembna. Pomembna je, da veš kako so podatki zloženi v "id_rx_bytes". Na to mislim, da se je skliceval radix.

Žal pa "1<<60" v C-ju pomeni 0. "1LL<<60" pomeni 2^60. Tako je napaka tudi v prispevku radix-a. In zelo verjetno je napaka tudi v mojem prispevku.
MitjaN
 
Prispevkov: 88
Pridružen: 24 Feb 2015, 12:45
Zahvalil se je: 10 krat
Prejel zahvalo: 36 krat
Uporabnika povabil: aly
Število neizkoriščenih povabil: 7

Re: Pomoč pri C/C++ jeziku

OdgovorNapisal/-a GJ » 07 Apr 2020, 16:19

MitjaN je napisal/-a:Žal pa "1<<60" v C-ju pomeni 0. "1LL<<60" pomeni 2^60. Tako je napaka tudi v prispevku radix-a. In zelo verjetno je napaka tudi v mojem prispevku.

???
Zaženi tole kodo...

https://rextester.com/LFNMPU10405

Koda: Izberi vse
#include  <stdio.h>

int main(void)
{
    unsigned long long id;
    id = 1ll<<60;
    printf("%llu", id);
    return 0;
}


Pride: 1152921504606846976

LP :mrgreen: GJ
Če si jezen, si žrtev!
GJ
 
Prispevkov: 319
Pridružen: 18 Jan 2015, 23:26
Kraj: Ljubljana
Zahvalil se je: 156 krat
Prejel zahvalo: 86 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 19

Re: Pomoč pri C/C++ jeziku

OdgovorNapisal/-a s54mtb » 07 Apr 2020, 16:28

Če delaš or, je dobri, da prej prirediš 0, če si seveda hotel le 60. bit postavit na 1, ostalo pa "naj bi bilo" 0...



https://rextester.com/DVTVE83910
Namesto "Zahvali se" sprejemam tudi šalco kofeta: https://www.buymeacoffee.com/s54mtb
Uporabniški avatar
s54mtb
 
Prispevkov: 11208
Pridružen: 15 Jan 2015, 01:10
Zahvalil se je: 1559 krat
Prejel zahvalo: 4068 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Pomoč pri C/C++ jeziku

OdgovorNapisal/-a radix » 07 Apr 2020, 16:44

GJ je napisal/-a:Kje je moja napaka? Daj razloži prosim!
Logični pomik levo je popolnoma neodvisen od endiannessa. Pomik ne razporeja stvari po spominu, ampak po spremenljivki.
GJ je napisal/-a:Pomikov, ki niso deljivi z 8 (byte) ni, torej?
Kaj so pa 56u, 48u, 40u, 32u, 24u, 16u, 8u? S koliko so deljivi?
GJ je napisal/-a:In jasno pomik za 60 bitov, ki ga ti omenjaš, v danem primeru ni sprejemljiv, saj ni deljiv z 8!
Hotel sem povedati, da nam zamik enice levo za 60 vedno da enko na bitu z utežjo 2^60. Kar je seveda narobe, ker pride do overflowa in je rezultat 0, kot me je MitjaN že popravil. Če dodaš LL, je pa to long long, ki ima dovolj bitov.
Če bi torej zamikal 1LL, bi bil po tvoji logiki rezultat zamikanja odvisen od endiannessa. Torej lahko bi bil rezultat enak 2^60, ali pa 32? Seveda ne!
GJ je napisal/-a:In seveda, iz ničesar ni razvidno kakšen je vhod, to pa zato ker se podatki berejo iz rx bufferja, ki ima lahko drugačen endiann kot OS.
Razvidno je iz tega, da je id_rx_bytes[7] pomaknjen levo za 56 in id_rx_bytes[0] ni pomaknjen.

Seveda je večino tega razložil že MitjaN in me vmes tudi popravil.
radix
 
Prispevkov: 1469
Pridružen: 04 Feb 2015, 20:19
Kraj: Ljubljana
Zahvalil se je: 226 krat
Prejel zahvalo: 350 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 25

Re: Pomoč pri C/C++ jeziku

OdgovorNapisal/-a GJ » 07 Apr 2020, 17:22

radix je napisal/-a:Logični pomik levo je popolnoma neodvisen od endiannessa. Pomik ne razporeja stvari po spominu, ampak po spremenljivki.

Nikjer nisem trdil drugače!
Kaj so pa 56u, 48u, 40u, 32u, 24u, 16u, 8u? S koliko so deljivi?

Vse je deljivo z 8, ne vem zakaj ti si omenil 60 bitni pomik?

radix je napisal/-a:Razvidno je iz tega, da je id_rx_bytes[7] pomaknjen levo za 56 in id_rx_bytes[0] ni pomaknjen.

Ne veva kje je našel ta primer! Zato je to kar si ti napisal zgolj ugibanje!
Če pa je res tako kot trdiš, je posledično razvidno, da funkcija ni smiselna, oziroma obremenjuje izvajanje procesorskega prostora in časa, ker povsem enak rezultat dobiš, če castaš adreso od id_rx_bytes[0] kot long long kazalec in jo prebereš oziroma naložiš v ID!

LP :mrgreen: GJ
Zadnjič spremenil GJ, dne 07 Apr 2020, 17:28, skupaj popravljeno 1 krat.
Če si jezen, si žrtev!
GJ
 
Prispevkov: 319
Pridružen: 18 Jan 2015, 23:26
Kraj: Ljubljana
Zahvalil se je: 156 krat
Prejel zahvalo: 86 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 19

Re: Pomoč pri C/C++ jeziku

OdgovorNapisal/-a radix » 07 Apr 2020, 17:27

Torej problem je samo v tem, da površno bereš in posledično pišeš neumnosti.
radix
 
Prispevkov: 1469
Pridružen: 04 Feb 2015, 20:19
Kraj: Ljubljana
Zahvalil se je: 226 krat
Prejel zahvalo: 350 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 25

Re: Pomoč pri C/C++ jeziku

OdgovorNapisal/-a GJ » 07 Apr 2020, 17:32

radix je napisal/-a:Torej problem je samo v tem, da površno bereš in posledično pišeš neumnosti.


Ne sodi vse po sebi!
Ampak raje opiši moje neumnosti, pa bomo vsi zadovoljni!

LP :mrgreen: GJ
Če si jezen, si žrtev!
GJ
 
Prispevkov: 319
Pridružen: 18 Jan 2015, 23:26
Kraj: Ljubljana
Zahvalil se je: 156 krat
Prejel zahvalo: 86 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 19

Re: Pomoč pri C/C++ jeziku

OdgovorNapisal/-a tilz0R » 07 Apr 2020, 21:13

Zdravita vidva ego kje drugje. Toliko neumnosti na enmu kupu sam še nisem slišal.
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1819
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 229 krat
Prejel zahvalo: 511 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: Pomoč pri C/C++ jeziku

OdgovorNapisal/-a rizzo » 07 Apr 2020, 21:59

Hahha

O joj.... :D Eni res obvladate te stvari čist sem se zgubu med telimi vašimi premiki.

Celotne kode nebi rad objavil ni za širšo javnost lahko pa podam vrednost ki se operira in poda rezultat.

Rad bi se naučil kako ti shifti (registri) delujejo in poizkusil sam spisati kodo v Bascom AVR prevajalniku.
rizzo
 
Prispevkov: 9
Pridružen: 05 Avg 2015, 10:29
Zahvalil se je: 6 krat
Prejel zahvalo: 1 krat
Uporabnika povabil: Iztok
Število neizkoriščenih povabil: 0

Re: Pomoč pri C/C++ jeziku

OdgovorNapisal/-a Kroko » 07 Apr 2020, 22:26

Odpri windows calculator in ga nastavi na način "Programmer". Tu imaš obe operaciji LSH in RSH. Malo se igraj in opazuj, kaj se dogaja z biti.
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4776
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 681 krat
Prejel zahvalo: 1657 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255


Vrni se na Programski jeziki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost