C uganka

Vse o programiranju na in za PC

Moderatorji: Kroko, tilz0R

C uganka

OdgovorNapisal/-a tilz0R » 28 Sep 2016, 15:03

Koda: Izberi vse
#include <stdio.h>
int main()
{
    float flt;
    int a = (int)&flt;
 
    flt = 117.6;
    printf("cifra %d\n", a);
    flt = 7.6;
    printf("cifra %d\n", a);
    flt = 5.6;
    printf("cifra %d\n", a);

    return 0;
}


Karkoli vpišem v spremenljivko flt, vedno dobim isto cifro. Zakaj je tako?

Odgovor bi rad podkrepljen z razlago.
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1815
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 229 krat
Prejel zahvalo: 509 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: C uganka

OdgovorNapisal/-a Kroko » 28 Sep 2016, 15:22

Me prav zanimajo odgovori. Tole bo pokazatelj, ali so pointerji vsaj malo razumljivi.
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: C uganka

OdgovorNapisal/-a gumby » 28 Sep 2016, 15:24

Zaradi take banalnosti hitro izgubiš pa ur, če imaš srečo. Če ne, pa par dni :D
my brain hurts
Uporabniški avatar
gumby
 
Prispevkov: 2573
Pridružen: 14 Jan 2015, 19:49
Kraj: Lendava
Zahvalil se je: 108 krat
Prejel zahvalo: 604 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 63

Re: C uganka

OdgovorNapisal/-a DomenV » 28 Sep 2016, 16:15

Tale .6 bo povzročala težave, ker je v vseh treh primerih enaka ;)
lp, D
Uporabniški avatar
DomenV
 
Prispevkov: 399
Pridružen: 18 Jan 2015, 23:38
Kraj: Medvode
Zahvalil se je: 58 krat
Prejel zahvalo: 69 krat
Uporabnika povabil: s54mtb
Število neizkoriščenih povabil: 16

Re: C uganka

OdgovorNapisal/-a Jakey » 28 Sep 2016, 16:15

Ko v Cju deklariramo kazalec, smo s tem rezervirali prostor za 1 spremenljivko, kateri smo dodali podatkovni tip ob deklaraciji.
Ob inicializaciji pa povemo točno lokacijo spremenljivke, na katero kazalec kaže. Kar pomeni, da ne glede na to, koliko mu kasneje spreminjamo vrednost, obveljala bo tista iz inicializacije.
Podpis je izginil.
Uporabniški avatar
Jakey
 
Prispevkov: 2066
Pridružen: 03 Feb 2015, 15:57
Kraj: Ljubljana
Zahvalil se je: 177 krat
Prejel zahvalo: 139 krat
Uporabnika povabil: Proteus
Število neizkoriščenih povabil: 0

Re: C uganka

OdgovorNapisal/-a booxco » 28 Sep 2016, 16:25

Kratek odgovor bi bil, da ker je a definirana kot čisto običajna spremenljivka (in ne kot kazalec!), in ker njene vrednosti sploh ne spreminjaš, dobiš vedno isti izpis.
Kot bi napisal:
Koda: Izberi vse
a=3; b=4;
printf(a);
b=5;
printf(a);
b=6;
printf(a);


Drugo vprašanje je seveda, zakaj je njena vrednost taka, kot je. (&flt vrne naslov, kjer se nahaja spremenljivka flt v pomnilniku. Naslov je sicer sam po sebi unsigned, tule pa ga potem spremenimo v predznačenega, kar lahko pripelje do negativne vrednosti.)

Če prav razumem, želiš dobiti kazalec, ki bo določen del spomina zapisan kot float število prebral kot zaokrožen integer. Se bojim, da direkt ne bo šlo. Bo treba vsakič brat s kazalcem na float in vsakič sproti zaokroževat.
booxco
 
Prispevkov: 113
Pridružen: 25 Sep 2016, 22:17
Zahvalil se je: 18 krat
Prejel zahvalo: 47 krat
Uporabnika povabil: radix
Število neizkoriščenih povabil: 9

Re: C uganka

OdgovorNapisal/-a tilz0R » 28 Sep 2016, 16:28

Ja, booxco je pravilno povedal.

Zapisal sem lokacijo flt spremenljivke in vedno izpisoval to lokacijo.

booxco je napisal/-a:Če prav razumem, želiš dobiti kazalec, ki bo določen del spomina zapisan kot float število prebral kot zaokrožen integer. Se bojim, da direkt ne bo šlo. Bo treba vsakič brat s kazalcem na float in vsakič sproti zaokroževat.


To se absolutno ne da, ker zapis float-a ni isti kot zapis int-a v pomnilniku.
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1815
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 229 krat
Prejel zahvalo: 509 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: C uganka

OdgovorNapisal/-a booxco » 28 Sep 2016, 17:41

tilz0R je napisal/-a:To se absolutno ne da, ker zapis float-a ni isti kot zapis int-a v pomnilniku.


Ja, zgleda je res nujno v dveh korakih: branje floata z * in šele potem preslikava v integer z (int). Zaokrožuje pa navzdol (torej 117, 7 in 5).

Koda: Izberi vse
#include <stdio.h>
int main()
{
    float flt;
    float *a = &flt;
   
    #define AA ((int) *a)
 
    flt = 117.6;
    printf("cifra %d\n", AA);
    flt = 7.6;
    printf("cifra %d\n", AA);
    flt = 5.6;
    printf("cifra %d\n", AA);

    return 0;
}
booxco
 
Prispevkov: 113
Pridružen: 25 Sep 2016, 22:17
Zahvalil se je: 18 krat
Prejel zahvalo: 47 krat
Uporabnika povabil: radix
Število neizkoriščenih povabil: 9

Re: C uganka

OdgovorNapisal/-a S53DZ » 29 Sep 2016, 07:41

Samo droben komentar: (int) ne zaokrožuje ampak odreže decimalna mesta.
(Za "zaokroževanje" lahko uporabimo prištevanje + 0.5 ali pa po potrebi kakšno od ostalih funkcij na float: round, floor, ceil...)
Uporabniški avatar
S53DZ
 
Prispevkov: 1164
Pridružen: 18 Jan 2015, 10:58
Kraj: Ljubljana
Zahvalil se je: 204 krat
Prejel zahvalo: 392 krat
Uporabnika povabil: S52O
Število neizkoriščenih povabil: 42


Vrni se na Programski jeziki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost