Ongelma osoittimien kanssa:
(käytän wxDevc++:saa)
kun käännän projektin, toimii IDE:n kautta ajettuna ihan hyvin. Jos kuitenkin yritän ajaa tiedoston IDE:n ulkopuolella, windows antaa virheilmoituksen. Kun kommentoin pois kaikki kohdat, joissa käytetään osoittimia ja käännän uudelleen, ohjelma toimii ihan hyvin. Osaisiko joku sanoa miten saisin windowsin hyväksymään osoittimet, ja miksi ohjelma toimii IDE:n kautta ajettuna?
Onkos parametrit kunnossa???
En tiedä, epäilin jo aiemmin että parametreissa olisi jotain vikaa mutta en onnistunut löytämään mitään lähdettä josta ne voisi tarkistaa.
Hetkinen? Siis ohjelma ei pyöri IDE:n ulkopuolella??? Jos näin on, kerropa mitä virheilmoitus sanoo. Jos tarkoitat että et saa käsin käännettyä, niin jos käytät Dev-c++:aa katso Project->Parameters->Compiler ja sieltä parametrit kääntäjälle.
Aluksi kannattanee selvittää tarkasti, mihin nimenomaiseen kohtaan ohjelma kaatuu ja sen jälkeen vertailla, mitä eroa IDE:n ajaman ja suoraan ajetun ohjelman tilassa on kyseisessä kohdassa. En kyllä näin äkkiä osaa sanoa, miten ohjelman toiminta voisi erota riippuen siitä, kuka/mikä sen ajaa. Krayn mainitsemat parametrit ovat tietysti yksi asia, mutta jollet mitenkään käsittele parametreja ohjelmassasi, niilläkään ei pitäisi olla vaikutusta. Toinen asia, joka tulee mieleen: Jos käsittelet tiedostoja, niin oletushakemisto, josta tiedostoja luetaan, saattaa riippua ohjelman suorittajasta.
Ohjelma kääntyy hyvin, sen voi ajaa kääntäjässä, mutta ei voi ajaa kääntäjän ulkopuolella.
hunajavohvelin ehdotus oli hyvä: Käsitteletkö tiedostoja?
En käsittele tiedostoja projektissani.
Uusi ongelma: Kun yritin poistaa kohdat joissa käytin osoittimia kommenteista, ohjelma ei enää pyöri ollenkaan.
Koodia?
Tuo kaikki on puhtaasti muistivuodon oireita ja oman kokemukseni perusteella voin sanoa varman päälle, että se myöskin on kyseessä. Eli suomeksi: käsittelet sellaista muistia, jota ei ole varattu ohjelmalle.
Katso, että varaat kaikille käsiteltäville alueille muistia ja et ohi-indeksoi missään vaiheessa taulukoita käyttäessäsi.
Yritin selvittää ongelmaa debuggerin avulla. Se kertoi, että eräs while-silmukka, joka tarkasti ovatko eräät arvot sopivia, suoritettiin liian monta kertaa? Silmukan poistaminen poisti ongelman. en ymmärrä, miksi ongelma ilmeni vain kun käytin osoittimia.
Kukaan tuskin omistaa sellaista kristallipalloa, että osaisi vastata, miksi juuri silmukan poistaminen ratkaisi ongelman. Jos kaipaat vastausta, pistä sitä koodia.
Kyseessä oli joka tapauksessa muistivuoto.
Ongelma vaikuttaisi olevan kääntäjässä. Se näyttää toimivan muutenkin melko sattumanvaraisesti.
Kääntäjässä en usko olevan vikaa. Huomaa, että IDE ja kääntäjä ovat aivan eri asia. Sinun tapauksessasi IDE on tuo wxdev-cpp ja kääntäjä mingw(ellet sitten ole mennyt muuttamaan sitä, jota en usko). Käytän itse mingw:tä, enkä ole vielä kolmen vuoden aikana löytänyt siitä mitään vikaa. En myöskään ole koskaan kuullut, että se kääntäisi ohjelman väärin ilman optimointeja.
Jos se sinun idesi tulkkaa c++:aa(jota en kyllä usko), voi siinä olla jotain vikaa.
Kuitenkin edelleen pidän todennäköisimpänä sitä, että sohit muistia holtittomasti, jätät muuttujia alustamatta tai olet tehnyt ajatusvirheitä.
Ohjelmat toimivat sattumanvaraisesti silloin, kun tarvittavia muuttujia ei alusteta tai sohitaan muistia, jota ei ole varattu ohjelman käyttöön.
Edit: Ja vaikka kääntäjä olisikin ohjelman kotisivuilla mainittu Microsoftin visual c++, sekään tuskin toimii sattumanvaraisesti.
Ongelma taitaa johtua siitä, että windowsini on ilmeisesti 64-bittinen. Mistä saisi yhteensopivan kääntäjän/IDE:n?
amjh kirjoitti:
Ongelma taitaa johtua siitä, että windowsini on ilmeisesti 64-bittinen. Mistä saisi yhteensopivan kääntäjän/IDE:n?
Miten tulit tuollaisen johtopäätökseen? Todennäköisesti kyseessä on edelleen ylivuoto. Näyttäisitkö koodiasi niin olisi helpompaa sanoa varmemmin?
IDEstä käsin ajamisen ei pitäisi tehdä mitään oleellisesti eri tavalla kuin käsin ajamisen, koska IDE ei mitenkään salaperäisesti tulkkaa koodia, vaan siitä tehdään ihan yhtä lailla käännetty versio, joka ajetaan aivan normaalisti. Ei pidä lähteä etsimään ongelmaan syytä ties mistä kaukaa, jos ei ole aivan varma, että omassa ohjelmassa on kaikki kohdallaan.
Yksinkertainen debuggausmenetelmä on lisätä ohjelmaan lauseita, jotka ilmoittavat jotenkin, missä mennään. Voit vaikkapa tulostaa aina välillä tiedostoon tilanteen (muista flush, jotta tiedot pääsevät varmasti perille asti). Tässä on yksi hyvä funktio debugausta varten:
// tiedosto:rivi <funktio>: [oma teksti] #define debugprintf(...) (\ fprintf(stderr, __FILE__ ":%d <%s>: ", __LINE__, __func__), \ fprintf(stderr, __VA_ARGS__), \ fflush(stderr) \ ) debugprintf("a = %d\n", a); // koodi.cpp:12 <main>: a = 123
Aihe on jo aika vanha, joten et voi enää vastata siihen.