Portál AbcLinuxu, 26. května 2024 00:14

buga, ale funguje

3.9.2007 00:05 | Přečteno: 1769× | Programování | poslední úprava: 3.9.2007 00:19

predcasem jsem objevil ve svem kodu chybu... teda neda se rict, ze bych ji nejak objevil... o tom, ze je tam problem jsem vedel, uz kdyz jsem to psal. a neda se rict, ze by to byla chyba, protoze ten program funguje bez problemu a i pres urcite snahy se mne tu chybu nepodarilo presvedcit, aby se chovala jako chyba.

takze prvni kolo souteze: najdete chybu!

#define INT     (1)
#define FLOAT   (2)

struct object {
        int type;
        union {
                int num_int;
                float num_float;
        } value;
};

#define get_number(x) (x.type == INT ? x.value.num_int : x.value.num_float)

int main(int argc, char ** argv)
{
        struct object foo, bar;
        foo.type = argc; /* INT */
        foo.value.num_int = 42;

        bar.type = argc + 1; /* FLOAT */
        bar.value.num_float = 42.0;

        printf("%s\n", get_number(foo) == get_number(bar) ? "Wow, it works" : "Oops");
        return 0;
}

druhe kolo souteze: proc to sakra funguje? ;-]

jako ve vsech podobnych soutezich, vitez vyhrava cokoladu! (z lidlu za tri padesat) ;-]


poznamka pod carou: udelal jsem mensi update, aby to bylo zasmodrchanejsi... to argc je tam kvuli tomu, aby prekladac nevedel co tam bude za typ.        

Hodnocení: 100 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

mkoubik avatar 3.9.2007 00:23 mkoubik | skóre: 5 | blog: lorem_ipsum | Praha 8 - Bohnice
Rozbalit Rozbalit vše Re: buga, ale funguje
Odpovědět | Sbalit | Link | Blokovat | Admin
treti kolo souteze: na kolik radku by to bylo v pythonu?

To neexistuje nejake elegantnejsi reseni jak v cecku dynamicky menit typ promenne? Nehlede na to, ze takova struktura zabira v pameti misto za oba typy + rezije.
Plesk! | Population | Industry
3.9.2007 01:05 Martin Tůma | skóre: 39 | blog: RTFM | Praha
Rozbalit Rozbalit vše Re: buga, ale funguje

To, že tu režii u pythonu nevidíš, ještě neznamená, že neexistuje... I python si za běhu musí někde pamatovat, co těch N bytů na dané adrese v ten který okamžik vlastně je. A režii při konverzi typů má jakbysmet.

Každý má právo na můj názor!
3.9.2007 03:38 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: buga, ale funguje
IMHO je to ještě horší: Python si to musí pamatovat i v případě, že proměnná svůj typ nemění (co kdyby), na rozdíl od céčka, kde tu režii použijeme jen tam, kde je opravdu k něčemu dobrá.
3.9.2007 01:09 trekker.dk | skóre: 72
Rozbalit Rozbalit vše Re: buga, ale funguje
Nehlede na to, ze takova struktura zabira v pameti misto za oba typy + rezije.
Je to union, takže nezabírá místo za oba typy, ale jenom za ten větší.
Quando omni flunkus moritati
3.9.2007 00:59 ::: | skóre: 14 | blog: e_lama
Rozbalit Rozbalit vše Re: buga, ale funguje
Odpovědět | Sbalit | Link | Blokovat | Admin
pokud to spravne chapu, tak:

get_number(foo) = 42
get_number(bar) = 42.0

takze radek s vypisem:

printf("%s\n", 42 == 42.0 ? "Wow, it works" : "Oops");

jasne ze to funguje. Nevidim jedinej duvod proc by nemelo...

3.9.2007 01:05 disorder | blog: weblog
Rozbalit Rozbalit vše Re: buga, ale funguje
pretoze float nie je int (uklada sa inym sposobom).

ale to neplati pre vsetky cisla, pre 42.0 to ide aj pre ine cisla -- ale taky 3221333323.0 je uz ina kava...
3.9.2007 01:30 ::: | skóre: 14 | blog: e_lama
Rozbalit Rozbalit vše Re: buga, ale funguje
protoze 3221333323 se do int-u nevejde a pretece. To ale imho neni chyba pri porovnavani, ale chyba je neco takovyho do intu vubec cpat...
3.9.2007 01:45 disorder | blog: weblog
Rozbalit Rozbalit vše Re: buga, ale funguje
a co:
#define INT     (1)
#define FLOAT   (2)

struct object {
        int type;
        union {
                int num_int;
                float num_float;
        } value;
};

#define get_number(x) (x.type == INT ? x.value.num_int : x.value.num_float)

int main(int argc, char ** argv)
{
        struct object foo, bar;
        foo.type = argc; /* INT */
        foo.value.num_int = 22133335;

        bar.type = argc + 1; /* FLOAT */
        bar.value.num_float = 22133325.0;

        printf("%s\n", get_number(foo) == get_number(bar) ? "Wow, it works" : "Oops");
        return 0;
}

$ make bug
cc     bug.c   -o bug
bug.c: In function ‘main’:
bug.c:23: warning: incompatible implicit declaration of built-in function ‘printf’
$ ./bug
Oops
3.9.2007 02:33 disorder | blog: weblog
Rozbalit Rozbalit vše Re: buga, ale funguje
sorry, tam tom to preklepol, rozne cisla :D
3.9.2007 02:13 disorder | blog: weblog
Rozbalit Rozbalit vše Re: buga, ale funguje
ozajstny problem je, ze "pretece" float...
3.9.2007 02:28 disorder | blog: weblog
Rozbalit Rozbalit vše Re: buga, ale funguje
teda minimalne v mojom testovacom programe, ten prekladac se sakra dobry...
3.9.2007 03:02 Deleted [8409] | skóre: 14 | blog: darkblog
Rozbalit Rozbalit vše Re: buga, ale funguje
ale pri porovnavani se typy implicitneprevedou.
(4.0000000000000000000000000000000000000000000000000000000001 == 4) -> true
3.9.2007 03:07 Deleted [8409] | skóre: 14 | blog: darkblog
Rozbalit Rozbalit vše Re: buga, ale funguje
a druha vec je ta, ze pri takovem makru musi prekladac vratit jen jeden typ, takze vam toto makro bud vraci neustale float nebo int (ted se mi nechce zkouset, ale rekl bych ze zvoli float:-) )
3.9.2007 03:17 disorder | blog: weblog
Rozbalit Rozbalit vše Re: buga, ale funguje
lenze tu ide o velmi vysoke cisla, ktore float dokaze pojat a nema tam kontolu nad rozlisovanim v rade jednotiek (ma len mantisu a exponent), ale neviem ci sa tak deje uz rozsahu 32-bitoveho signed intu
3.9.2007 03:27 Deleted [8409] | skóre: 14 | blog: darkblog
Rozbalit Rozbalit vše Re: buga, ale funguje
ale jak jsem psal vyse:
#define get_number(x) (x.type == INT ? x.value.num_int : x.value.num_float)
toto makro vrati vzdy stejny typ, takze vrati bud vzdy int, nebo float (vraceny typ tedy neni zavisly na x.type a ani z logiky veci nemuze byt, hodnota je vzdy prevedena)
3.9.2007 03:50 disorder | blog: weblog
Rozbalit Rozbalit vše Re: buga, ale funguje
heureka :)
3.9.2007 03:52 disorder | blog: weblog
Rozbalit Rozbalit vše Re: buga, ale funguje
inac to je zjavne, ze prekladac netusi na co je ten type, ale ten prevod... ake jednoduche
3.9.2007 04:24 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: buga, ale funguje
Podle pravidel implicitních typových konverzí by to měl být double.
3.9.2007 01:20 Sinuhet | skóre: 31
Rozbalit Rozbalit vše Re: buga, ale funguje
Mate tam chybu, spravne je:
get_number(foo) = 42.0
get_number(bar) = 42.0
3.9.2007 01:34 ::: | skóre: 14 | blog: e_lama
Rozbalit Rozbalit vše Re: buga, ale funguje
diky za opravu.

na funkci to nic nemeni: 42.0 == 42.0 taky plati...
3.9.2007 09:52 Sinuhet
Rozbalit Rozbalit vše Re: buga, ale funguje
Na funkci to sice nic nemeni, ale je to dost podstatny detail. Mimochodem, uz nekdo vi v cem spocival onen bug?
3.9.2007 14:04 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: buga, ale funguje
v tomto pripade prekladac minimalne tusi ze by mel udelat implicitni konverzi.... (btw. takove porovnani je zdrojem mnoha oblibenych chyb)

v tom mem pripade je to slozitejsi o ten prvek ternaniho operatoru, kdo prekladac by mel byt ve fazi nevime nic... a minimalne by mel vratit warning
Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
3.9.2007 02:42 disorder | blog: weblog
Rozbalit Rozbalit vše mne sa sniva
Odpovědět | Sbalit | Link | Blokovat | Admin
mas odomna zakaz pisat blog o polnoci
int main(int argc, char ** argv)
{
        struct object foo, bar;
        foo.type = argc; /* INT */
        foo.value.num_int = 13133325;

        bar.type = argc + 1; /* FLOAT */
        bar.value.num_float = 13133325.0;

        printf("%s\n", get_number(foo) == get_number(bar) ? "Wow, it works" : "$
        printf("%d %f\n", get_number(foo), get_number(bar));
        printf("%f %f\n", get_number(foo), get_number(bar));
        return 0;
}

$ ./bug
Wow, it works
14 13133325.000000
13133325.000000 13133325.000000
3.9.2007 02:45 disorder | blog: weblog
Rozbalit Rozbalit vše Re: mne sa sniva
sed -i 's/\$/Oops\"\)\;/'
3.9.2007 03:14 Elwood
Rozbalit Rozbalit vše Re: mne sa sniva
A to je sopuštěno na jaké architektuře. U mě na PC jak GCC tak Visual Studio 2005 hází výstup
Wow, it works
-1610612736 -0.000000
13133325.000000 13133325.000000

A na školním SparcV9
Wow, it works
1097403585 -0.000000
13133325.000000 13133325.000000 :-)
3.9.2007 03:19 disorder | blog: weblog
Rozbalit Rozbalit vše Re: mne sa sniva
problem na ktory poukazujem je vyznaceny boldom -- cislo, ktore ma byt int je float (?!?). je to x86_64
3.9.2007 03:55 disorder | blog: weblog
Rozbalit Rozbalit vše Re: mne sa sniva
http://www.abclinuxu.cz/blog/show/192147#23

tady neni nic k videni :)
3.9.2007 03:23 disorder | blog: weblog
Rozbalit Rozbalit vše Re: mne sa sniva
btw nemas nejake zmenene argc, to snad nie je mozne

ma to prestava bavit, je neskoro, uz mi to ani nemysli
3.9.2007 19:32 marbu | skóre: 31 | blog: hromada | Brno
Rozbalit Rozbalit vše Re: mne sa sniva
Nechápu, proč se v druhém řádku toho výpisu zobrazí -0.000000 místo 13133325.000000, když o řádek níž je to správně. Jediný rozdíl je v tom "%d …", ale to má mít přece vliv jen na první parametr fce printf…
A když v tom kódu nahradím 13133325 za 42, tak se to taky chová divně(i686, gcc (GCC) 4.2.1):
[martin@dione buga]$ ./buga
Wow, it works
0 0.000000
42.000000 42.000000
Zkoušel jsem to kompilovat s gcc ještě na dvou jiných strojích(AMD64 a někaký MIPS) a tam je ten druhý parametr správně … že by bug mého gcc? ;)
There is no point in being so cool in a cold world.
4.9.2007 16:46 2007
Rozbalit Rozbalit vše Re: mne sa sniva
%d ma vliv na pocet bytu co se sezerou ze zasobniku
4.9.2007 17:38 disorder | blog: weblog
Rozbalit Rozbalit vše Re: mne sa sniva
lenze int aj float ma rovnaky sizeof. v kazdom pripade by to podla mna va_arg nemalo robit problem
3.9.2007 10:54 MJ | Tady a teď
Rozbalit Rozbalit vše Re: buga, ale funguje
Odpovědět | Sbalit | Link | Blokovat | Admin
Huh? Tady by měla být nějaká chyba? ;-)

Já bych řekl, že je to zcela korektní program, který otestuje, zda (double)42 == (double)42.0F.
vencour avatar 3.9.2007 11:12 vencour | skóre: 56 | blog: Tady je Vencourovo | Praha+západní Čechy
Rozbalit Rozbalit vše Re: buga, ale funguje

Profesiální programátor nejsem, ale pamatuju, že dvě reálná čísla nelze porovnávat ... vzhledem k reprezentaci dat v počítači ... takže taky čekam na vyjevení pravdy svaté :-)

Ty nejhlubší objevy nečekají nutně za příští hvězdou. Jsou uvnitř nás utkány do vláken, která nás spojují, nás všechny.
5.9.2007 09:18 MJ | Tady a teď
Rozbalit Rozbalit vše Re: buga, ale funguje
Dvě reálná čísla lze porovnávat, jen to nemusí vždycky znamenat to, co od toho člověk na první pohled čeká :-) Může se totiž velice snadno stát, že dva výrazy, které v opravdových reálných číslech dají identický výsledek, ve floating-point reprezentaci dají výsledky maličko jiné, jelikož se zaokrouhlovací chyby zkombinují různě.

Pokud máte zaokrouhlovací chyby pod kontrolou, může být porovnávání floatů na rovnost bezpečné. Jako třeba v našem případě: (double)42 == (double)42.F by neplatilo jen tehdy, kdyby float neměl dostatek přesnosti na zcela přesnou reprezentaci čtyřicetdvojky, a to není pravda. [Tedy úplně striktně vzato, z normy to neplyne, ale sotva existuje stroj, který by používal takové floaty.]
3.9.2007 14:01 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: buga, ale funguje
tak konecne se muzu zapojit do diskuze... problem, je ze ternarni operator by mel vracet jenom jeden typ... coz v tomto pripade, programator nechce... a prekladac si nejak sam od sebe provadi implicitni konverzi na float i kdyz tam ma int, coz on vlastne ani nemuze vedet...

napr. v jave by takovy kod asi nesel zkompilovat bez explicitni konverze
Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
3.9.2007 14:09 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: buga, ale funguje

Proč by to nemohl vědět? On přece ví, že foo.value.num_int je typu int a foo.value.num_float typu float, protože jste mu to tak nadeklarovat. Takže tam máte podmíněný výraz, kde je jeden operand int a druhý float, proto se vám podle standardních pravidel oba konvertují na double a výsledek je double. Je to přesně totéž, jako když napíšete

  int i = 1;
  float f = 0.5;
  result = i + f;

kde proměnná result bude nějakého číselného typu.

3.9.2007 14:26 disorder | blog: weblog
Rozbalit Rozbalit vše Re: buga, ale funguje
no, mne zda sa gcc (to makro) bez akehokolvek ostychu vracia float
3.9.2007 14:46 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: buga, ale funguje

Makro nic nevrací, to není inline funkce. Makro vyhodnotí už preprocesor a překladač místo něj zpracovává výsledek expanze. Takže přes všechnu mlhu to není nic jiného, než kdybyste napsal

  int i = 42;
  float f = 42.0;
  if ((b : i : f) == (!b : i : f)) ...

Protože druhý a třetí operand operátoru ?: jsou různé, provede se implicitní typová konverze obou na double, stejně jako kdybyste tam místo 'b : i : f' měl třeba 'i + f'. Takže nakonec jde jen o to, zda platí

  ((double) 42) == ((double) 42.0)

Což podle platformy a překladače někde platit může a jinde ne.

3.9.2007 15:37 disorder | blog: weblog
Rozbalit Rozbalit vše Re: buga, ale funguje
1) makrom myslim obsah makra, ktore sa dosadzuje (samozrejme, duh)

2) co znamena (b : i : f) ?

3) naspat tematu -- mne dava float

4) get_number(foo) => siezof = 4, printf("%d", ...) vrati nezmysel

uz sa rozumieme, alebo este treba nieco vysvetlit?
3.9.2007 17:01 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: buga, ale funguje
Samozřejmě tam má být 'b ? i : f', b je nějaká proměnná typu int.
3.9.2007 19:13 Marcel Šebek | skóre: 21 | blog: c
Rozbalit Rozbalit vše Re: buga, ale funguje
Mě to taky vrací float. Aspoň podle tohoto to tak chápu, že pokud operátor dostane float a int, výsledek je float.
Real programmers don't comment their code. If it was hard to write, it should be hard to read.
3.9.2007 19:37 disorder | blog: weblog
Rozbalit Rozbalit vše Re: buga, ale funguje
ale tu Mr. Kubecek tvrdi, ze by tam mal byt double
3.9.2007 20:54 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: buga, ale funguje
To tvrdí pánové Kernighan a Ritchie. Ale je možné, že to pan ISO později změnil. :-)
3.9.2007 22:06 disorder | blog: weblog
Rozbalit Rozbalit vše Re: buga, ale funguje
ja to nespochybnujem, bolo by celkom logicke, ze sa pouzije typ, ktory pojme vsetky mozne hodnoty

...ale nejak mi to nefunguje?
michich avatar 3.9.2007 22:53 michich | skóre: 51 | blog: ohrivane_parky
Rozbalit Rozbalit vše Re: buga, ale funguje
Nemyslím, že by K&R tvrdili něco o tom, že při použití int a float v operátoru bude výsledek double. Máš nějakou citaci? Podle ANSI to bude určitě float. Nepleteš si to s konverzemi při volání funkce bez prototypu nebo při předávání parametru na místě výpustky?
3.9.2007 23:17 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: buga, ale funguje
Väčšina operátorov vykonáva koverzie a produkuje typy výsledkow podobným spôsobom. Tento postup budeme nazývať obvyklé aritmetické konverzie.
  • Naprv sa kažký operand typu char alebo short konvertuje na int a každý operand float sa konvertuje na double.
  • Potom ak je niektorý z operandov typu double, druhý sa konvertuje na double a výsledok je typu double.
  • ...

(Programovací jazyk C, 2. vydanie, Alfa 1989, příloha A, sekce 6.6)

Ale co jsem se díval do aktuální ISO specifikace, podle ní by to v tomto případě měl opravdu být float. Kam to ten svět spěje, když už člověk nemůže věřit ani autorům jazyka… :-)

3.9.2007 19:40 marbu | skóre: 31 | blog: hromada | Brno
Rozbalit Rozbalit vše Re: buga, ale funguje
No, zkuste do toho kódu na konec přidat:
printf("%d %f\n", get_number(foo), get_number(bar));
a pak to takto přeložit:
[martin@dione buga]$ gcc -std=c99 -pedantic  -Wall   buga.c   -o buga
buga.c: In function ‘main’:
buga.c:28: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘double’
[martin@dione buga]$ 
Je tam z té chybové hlášky pěkně vidět, zě se mi to přetypovalo na double…
There is no point in being so cool in a cold world.
3.9.2007 19:48 disorder | blog: weblog
Rozbalit Rozbalit vše Re: buga, ale funguje
ano, -Wall to pise aj mne, ale sizeof mi vracia 4
3.9.2007 20:29 marbu | skóre: 31 | blog: hromada | Brno
Rozbalit Rozbalit vše Re: buga, ale funguje
hmm,mě taky. Takže to vypadá že máte pravdu a že je chyba v tom varování (a nepoučím se a nepoučím - viz moje patička;-) ).
There is no point in being so cool in a cold world.
3.9.2007 14:41 Sinuhet
Rozbalit Rozbalit vše Re: buga, ale funguje
No pokud dobre ctu standard, tak vysledkem bude float.
3.9.2007 14:47 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: buga, ale funguje
Do standardu bych se musel podívat, ale Kernighan a Ritchie tvrdí že double.
3.9.2007 21:04 Deleted [8409] | skóre: 14 | blog: darkblog
Rozbalit Rozbalit vše Re: buga, ale funguje
Popravde receno ja nevim:-) Mozna by to chtelo zkusit neco jineho nez printf:
printf("1:%d 2:%d 3:%d\n", 1.1f, 1);
Prvni dve cilsa budou nesmysly, ale to treti bude 1, protoze float jako variabilni parametr se vzdy prevede na double (takze jeho velikost obsadi ty prvni 2 parametry u platforem kde double=8 a int=4)
3.9.2007 21:29 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: buga, ale funguje
Obávám se, že takhle to nezjistíte. Abyste to zjistil "zvenku", budete muset tu hodnotu někam přiřadit, a tím ji přetypujete na typ toho, kam ji přiřazujete (taková programátorská Shrödingerova kočka :-) ). Takže spíš udělat překlad do assembleru (s vypnutou optimalizací) a podívat se, co z toho vyleze.
3.9.2007 22:28 Sinuhet | skóre: 31
Rozbalit Rozbalit vše Re: buga, ale funguje
Taky se da vyuzit c++:
#include <iostream>

template<typename T>
struct test
{
        static const bool is_float = false;
};

template<>
struct test<float>
{
        static const bool is_float = true;
};

template<typename T>
bool is_float(T)
{
        return test<T>::is_float;
}

#define INT     (1)
#define FLOAT   (2)

struct object {
        int type;
        union {
                int num_int;
                float num_float;
        } value;
};

#define get_number(x) (x.type == INT ? x.value.num_int : x.value.num_float)

int main(int argc, char ** argv)
{
        struct object foo, bar;
        foo.type = argc; /* INT */
        foo.value.num_int = 42;

        bar.type = argc + 1; /* FLOAT */
        bar.value.num_float = 42.0;

        std::cout << ( is_float(get_number(foo)) ? "Ano\n" : "Ne\n" );

        return 0;
}
3.9.2007 23:20 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: buga, ale funguje
Jenže u takových jemných nuancí se může projevit, že C a C++ jsou přes svou příbuznost ve skutečnosti odlišné jazyky.
3.9.2007 14:51 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: buga, ale funguje
to neni nejaka narazka... ale muzete mi ukazat, nekde ve standardu z ceho plyne ta vlastnost ternarniho operatoru, ze tam da tu implicitni konverzi na float/double... protoze java v takovem pripade rve chybu, ze neco takoveho je hodne hloupy napad... coz si myslim, ze je spravne...

kazdopadne, pritomnost toho prevodu na float muze vest k neprijemnym projevum, ktere se projevi jednou za deset let....
Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
3.9.2007 15:01 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: buga, ale funguje

V tom draftu ISO/IEC 9899, který jsem našel na webu, je to sekce 6.5.15. Podstatné pasáže:

One of the following shall hold for the second and third operands:

  • both operands have arithmetic type;
  • ...

...

If both the second and third operands have arithmetic type, the result type that would be determined by the usual arithmetic conversions, were they applied to those two operands, is the type of the result.

3.9.2007 15:23 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: buga, ale funguje
diky, mate pravdu... ja jsem si to celou dobu myslel, jenom jsem to nemel nicim podlozene, teda krome assembleru...
Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
3.9.2007 15:44 Sinuhet
Rozbalit Rozbalit vše Re: buga, ale funguje
protoze java v takovem pripade rve chybu, ze neco takoveho je hodne hloupy napad
Jste si jist? Nezkousel jsem to, ale podle tohoto odkazu bych rekl, ze to dopadne stejne jako v c/c++.
3.9.2007 15:58 Filip Jirsák | skóre: 68 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: buga, ale funguje
Eclipse compiler ukazuje jako návratový typ výrazu true ? 1 : 1f typ float.
3.9.2007 16:00 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: buga, ale funguje
mate pravdu, rve to, jenom kdyz se tomu podstrci objekty
Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
3.9.2007 16:16 Filip Jirsák | skóre: 68 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: buga, ale funguje
Eclipse kompilátor tedy neřve, ani když do ternárního výrazu dosadíte objekty. Prostě jen výsledkem takového výrazu bude společný předek obou typů.
3.9.2007 16:35 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: buga, ale funguje
public static void main(String[] args) {
   Float f = new Float(42.0f); 
   Integer i = new Integer(42);
   System.out.println(true ? f : i);
}

gcj: error: Incompatible type for '?:'. Can't convert 'java.lang.Float' to 'java.lang.Integer'.
ja uz jsem na to prave jednou narazil v prave v jave a divil jsem se proc to v C proslo...
Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
3.9.2007 16:52 Filip Jirsák | skóre: 68 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: buga, ale funguje
Nevím, jestli bych zrovna gcj považoval za etalon kompilátorů Javy… Tohle taky nepřeloží?
Float f = new Float(42.0f); 
Integer i = new Integer(42);
Number x = true ? f : i;
nebo
float f = true ? 1 : 1f;
3.9.2007 19:15 Marcel Šebek | skóre: 21 | blog: c
Rozbalit Rozbalit vše Re: buga, ale funguje
Kompilátor od Sunu (konkrétně verze 6, ale to je asi jedno) to samozřejmě přeloží.
Real programmers don't comment their code. If it was hard to write, it should be hard to read.
3.9.2007 15:42 depka
Rozbalit Rozbalit vše Re: buga, ale funguje
Odpovědět | Sbalit | Link | Blokovat | Admin
nasel jsem tu chybu, je v neznalosti autora blogu ... ;D a cokoladku nechci dik :)
3.9.2007 15:45 disorder | blog: weblog
Rozbalit Rozbalit vše Re: buga, ale funguje
on ale netvrdi, ze to je bug prekladaca, takze je to realny bug bez ohladu na znalosti autora
3.9.2007 17:00 depka
Rozbalit Rozbalit vše Re: buga, ale funguje
a ja to myslel tak ze to zadny bug neni..
3.9.2007 17:15 disorder | blog: weblog
Rozbalit Rozbalit vše Re: buga, ale funguje
to, ze sa software nesprava ako by mal, nie je bug?
3.9.2007 18:09 depka
Rozbalit Rozbalit vše Re: buga, ale funguje
doporucuju precist celociselna a realna rozsireni v nejake c/c++ referenci
3.9.2007 18:35 disorder | blog: weblog
Rozbalit Rozbalit vše Re: buga, ale funguje
co maju chyby programu spolocne s nejakymi referenciami?
3.9.2007 19:11 depka
Rozbalit Rozbalit vše Re: buga, ale funguje
no potom zjistis ze to neni chyba ale standart, ale ty furt meles svoje...
3.9.2007 19:40 disorder | blog: weblog
Rozbalit Rozbalit vše Re: buga, ale funguje
si debil alebo ano? tretikrat ti hovorim, ze sa nebavime o prekladaci ale o tom ako sa ma spravat software!
3.9.2007 19:59 depka
Rozbalit Rozbalit vše Re: buga, ale funguje
hmmm sam si debil a sam nevis o cem mluvis..
3.9.2007 22:09 disorder | blog: weblog
Rozbalit Rozbalit vše Re: buga, ale funguje
sorry, ale dotycnu implementaciu scheme, ktora nevie poriadne narabat s cislami by som velmi nevyuzil, mojko... bag jak sviňa
3.9.2007 22:32 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: buga, ale funguje
ta chyba se fakt musi projevovat jenom v extremnich pripadech a jestli vubec.... kazdopadne je to chyba... protoze program nedela, to co by od nej clovek cekal... btw. jeste budu muset vyzkouset, jak se bude chovat na procesorech, ktere maji vyrazne mensi pocet FPU (ultrasparc t1) ...protoze vsechny celociselne operace jsou nedopatrenim operacemi v plovouci radove carce... ;-]
Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
3.9.2007 22:45 disorder | blog: weblog
Rozbalit Rozbalit vše Re: buga, ale funguje
trosku som zvelicil, ale predsalen taka chyba sa niekedy niekde moze prejavit a co potom? :D
4.9.2007 17:53 depka
Rozbalit Rozbalit vše Re: buga, ale funguje
potom je to jedine problem programatora.... btw mam dve knihy o c/c++ a kazda me na toto upozornila....
4.9.2007 18:23 disorder | blog: weblog
Rozbalit Rozbalit vše Re: buga, ale funguje
nehovor, ja som myslel, ze bugy robi satan a nie programator. duh!
4.9.2007 19:34 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: buga, ale funguje
vsichni programatori delaji chyby... teda az na radka hulana, ktery od svych ctrnacti let, dokaze napsat denne nekolik mega peclive odladeneho kodu ;-]
Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
4.9.2007 19:32 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: buga, ale funguje
to je bajecne! ja mam taky dve knizky o c/c++! a vite co by bylo bajecne... kdyby vase prispevky mely i nejakou informacni hodnotu...
Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
3.9.2007 15:57 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: buga, ale funguje
problem je, ze pri slozeni konverzi int-float a float-int nemusime vzdy dostat identitu, protoze oba dva typy maji sve omezeni... me by spis zajimal nejaky extremni priklad, kdy se ta chyba projevi....
Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
3.9.2007 16:26 disorder | blog: weblog
Rozbalit Rozbalit vše Re: buga, ale funguje
        float f = 16777216.0;
        int i = 16777216;

        printf("%d\n%d\n%d %f\n", f == i, ++f == ++i, i, f);
staci? vystup je:
1
1
16777217 16777216.000000
3.9.2007 16:43 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: buga, ale funguje
diky... to jsem hledal...
Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
3.9.2007 17:08 Sinuhet
Rozbalit Rozbalit vše Re: buga, ale funguje
Tak to nebyl zrovna nejlepsi priklad...
3.9.2007 17:12 depka
Rozbalit Rozbalit vše Re: buga, ale funguje
asi jste to stale nepochopil, zmente float za double
3.9.2007 17:16 disorder | blog: weblog
Rozbalit Rozbalit vše Re: buga, ale funguje
ty si nejaky chytry, to by som sam nevymyslel, teda...
5.9.2007 09:14 MJ | Tady a teď
Rozbalit Rozbalit vše Re: buga, ale funguje
Ehm? Není to spíš učebnicový příklad nedefinovaného pořadí side-efektů? :-)

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.