Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Osoitinongelma

Sivun loppuun

amjh [24.01.2008 15:43:36]

#

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?

Kray [24.01.2008 15:54:56]

#

Onkos parametrit kunnossa???

amjh [24.01.2008 16:05:32]

#

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.

Kray [24.01.2008 16:14:20]

#

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.

hunajavohveli [24.01.2008 16:17:21]

#

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.

amjh [24.01.2008 16:18:27]

#

Ohjelma kääntyy hyvin, sen voi ajaa kääntäjässä, mutta ei voi ajaa kääntäjän ulkopuolella.

Kray [24.01.2008 16:33:28]

#

hunajavohvelin ehdotus oli hyvä: Käsitteletkö tiedostoja?

amjh [24.01.2008 16:40:20]

#

En käsittele tiedostoja projektissani.

Uusi ongelma: Kun yritin poistaa kohdat joissa käytin osoittimia kommenteista, ohjelma ei enää pyöri ollenkaan.

Kray [24.01.2008 17:20:12]

#

Koodia?

Gaxx [24.01.2008 17:20:15]

#

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.

amjh [24.01.2008 18:06:07]

#

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.

Gaxx [24.01.2008 18:33:06]

#

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.

amjh [25.01.2008 16:53:50]

#

Ongelma vaikuttaisi olevan kääntäjässä. Se näyttää toimivan muutenkin melko sattumanvaraisesti.

Gaxx [25.01.2008 17:46:32]

#

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.

amjh [27.01.2008 16:19:58]

#

Ongelma taitaa johtua siitä, että windowsini on ilmeisesti 64-bittinen. Mistä saisi yhteensopivan kääntäjän/IDE:n?

hunajavohveli [27.01.2008 17:43:25]

#

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?

Metabolix [27.01.2008 19:20:55]

#

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

Sivun alkuun

Vastaus

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

Tietoa sivustosta