Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Esikääntäjä laskemaan

Metabolix [25.09.2004 23:01:21]

#

/* Tämä pitäisi saada laskettua esikääntäjällä. Ideana on, että en jaksaisi laskea sitä itse joka kerta, kun muutan arvoja, ja noin pitkä lauseke hidastaa ohjelmaa, kun se lasketaan aika monta kertaa. Lopulliseen versioon voisin laskea itse, mutta ei näin debugatessa jaksaisi. VC++:aa käytän. Koodi on räiskintäpelini bottia varten, jotta sen sihti pitäisi kohteessa samalla kun se tekee väistöliikkeitä. */

#define PII           3.14159265758979323846264338
#define KAANNOS       0.24
#define STRAFENOPEUS  0.8
#define MIN_ETAISYYS  80

#define KAANNOKSIA_PER_STRAFE (STRAFENOPEUS / (PII * MIN_ETAISYYS / 180 * KAANNOS))

Deewiant [26.09.2004 10:16:56]

#

Mikä estää laskemasta sitä vain kerran ohjelman alussa? Tyyliin:

double kaannoksia_per_strafe = STRAFENOPEUS / (PII * MIN_ETAISYYS / 180 * KAANNOS);

int main()
// ...

Ei tämä paljoa ohjelmaasi hidasta.

Metabolix [26.09.2004 11:25:38]

#

Ei mikään, mutta haluan tietää, onko se mahdollista laskea esikääntäjällä. Jotakin tällaista oli käsittääkseni käytetty huijauksena Datatähti-kilpailussa joskus muinoin.

Deewiant [26.09.2004 17:10:16]

#

Jaah. No itse en ainakaan tiedä, onko moinen edes mahdollista. Jos on, minuakin kiinnostaa.

Antti Laaksonen [27.09.2004 13:41:58]

#

Kun käytät #defineä, niin silloin koodissa olevat vakiot muutetaan niitä vastaaviksi teksteiksi ennen varsinaista käännöstä. Sulut ja jakolaskut jäävät siis lopulliseen koodiin. Mutta voisin kuvitella, että järkevä kääntäjä laskee lausekkeen arvon jo käännösvaiheessa, jos kaikki luvut ovat tiedossa.

Käännösvaiheessa tapahtuvan laskennan hyödyntämistä ohjelmointikilpailuissa rajoittaa se, että silloin kaikkien arvojen täytyy olla tiedossa jo käännösvaiheessa. Tämä vastannee suunnilleen samaa, kuin että jos tehtävänä on laskea pii, kirjoittaa ohjelman näin:

#include <stdio.h>

int main(void) {
    printf("3.141592654");
    return 0;
}

Jos ohjelmalle annetaan joka kerta eri syöttöarvot, niin eihän kääntäjä saa niistä tietää lainkaan...

P.S. PII-vakiossasi on virhe, yhdeksännen desimaalin kuuluu olla 3. Muutenkin noin tarkka vakio on ehkä liioittelua. :)

Metabolix [27.09.2004 16:06:34]

#

Tosiaan, tullut typo tuohon piin arvoon, kun nopeasti kirjoittelin. Oli tarkoitus tulla juuri oikea määrä desimaaleja doublea varten (siis 16), mutta väsyneenä kirjoitin kymmenen liikaa...

Kun nyt tarkemmin katsoo, niin kyllähän tuo VC++ näköjään sen laskee... Mutta laskevatko muut kääntäjät?

	double A = KAANNOKSIA_PER_STRAFE;
00411C0E  fld         qword ptr [__real@4003193d6684bb10 (428020h)]

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta