Mikähän tässä nyt mättää:
if(random(tappotahti)==0)
jne.
Kääntäjä valittaa:
pah.c: In function `pah_puh':
pah.c:179: too many arguments to function `random'
if(random(tappotahti)==0)
jne.
Kääntäjä valittaa:
pah.c: In function `pah_puh':
pah.c:179: too many arguments to function `random'
Vastaukset 8
Vanhimmat
random-funktio on määritelty:
long int random(void);
Annat siis randomille liikaa argumentteja (kuten virheilmoitus selkeästi kertoo). Oikea tapa kutsua on random(), sillä random ei ota yhtään argumenttia.
Mainittakoon vielä, että randomin palauttama arvo on aika harvoin nolla.
Tuo if(random(tappotahti)==0) on ohjelmassa, joka on listattu kirjassa "Pelien parhaat" (1994). Kirjan mukaan koodi on C-kieltä. Kaikki muut rivit toimivatkin, mutta eivät tuo ja eräs vastaava rivi.
Mikäs tässä on pielessä, onko kirjassa aivan väärää koodia, vai onko kirjan tekijä käyttänyt kääntäjää, joka hyväksyy tuon?
Ilmeisesti kirjan kirjoittaja ei käytä samaa standardikirjastoa, jota oletin sinun käyttävän. Siinä tapauksessa sinun pitää katsoa kyseisen funktion määrittelystä miten ja millä arvoilla sitä randomia pitää kutsua. Koodi on kyllä oikeaa C:tä.
Jos kääntäjä hyväksyy funktion kutsumisen väärällä tavalla (eli sitä voi kutsua eri määrällä argumentteja kuin määrittelyssä kerrotaan), niin se on mitä ilmeisimmin rikki.
Yksi mahdollisuus on vielä se, että olet kirjoittanut alkuun #include , jossa on määritelty random, joten kääntäjä olettaa sinun tarkoittavan sitä eikä kirjan vastaavaa. Tuo vaikuttaisi oikeastaan aika todennäköiseltäkin, koska standardikirjaston random ei ota argumentteja ja kirjan vastaava random ottaa argumentin sekä valitus koski juuri funktion käyttämistä väärällä määrällä argumentteja.
Alussa tosiaan on #include
mutta niin on kirjassakin. Kaikki kirjan käyttämät includet:
#include
#include
#include
#include
#include
Onko kirjailija muka käyttänyt erisisältöistä stdlib.h-kirjastoa kuin minulla? Ja miten kirjailija voisi olettaa, että lukijalla on sama ja lukijalla ohjelmalla toimii?
Voisi olettaa kirjailijan käyttävän samantyyppisiä includeja kuin sinullakin on, sillä tuo include on käytännössä enemmän tai vähemmän standardi. Senkin takia voisi jo olettaa annetun ohjelmanpätkän toimivan kaikilla samalla tavalla.
Toimiiko edes yksinkertainen ohjelma, joka käyttää stdlibin ramdomia:
#include
#include
int main(void) {
if (random() == 0)
printf("puppaa..");
return 0;
}
Kyllä tuo toimii, tulostaa tyhjän rivin.
Mutta mitäs tuo nyt liittyy aiheeseen?
Miksei if(random(tappotahti)==0) toimi ja miksi se kirjan tekijällä toimii?
Yritän vain poistaa mahdollisia vian aiheuttajia testaamalla jotain toimivaksi oletettua koodia tuolla tapaa. Jotta olisi helpompaa tutkia tätä ongelmaa, niin pitäisi käytössä olla sama kääntäjä ja koko lähdekoodi. Muuten menee arvailuksi, sillä kaiken järjen ja annettujen lisätietojen mukaan randomin pitäisi toimia ilman yhtään parametria (siis random()). Tosin eipä olisi ensimmäinen kerta, kun jonkun kirjan kirjoittaja on joko opastanut väärin tai sitten hän on käyttänyt jotain kummaa tapaa joka vain toimii hänellä sattumalta.
if((random()%tappotahti)==0)
taikka sitten tappotahti muuttujan tilalle numeroina se mikä on "yläraja randomille".
En vanno tuon toimivuuteen, mutta jotain tuollaista muistelisin.