Tuohon Morabarabaan teen ohjelmaa, mutta nyt debuggeri antaa SIGSEGV virheen.
Sen verran ymmärsin että ohjelma yrittää kirjoittaa paikkaan johon sillä ei ole lupaa?
Koodi pätkä johon töksähtää:
bool alueella(piste const& p) const { return ( 1 <= p.x && p.x <= 3 && 1 <= p.y && p.y <= 3 && 1 <= p.z && p.z <= 3 && (p.x != 2 || p.y != 2) ); }
ja assembly:
0x0041f2cc <+0>: push ebp 0x0041f2cd <+1>: mov ebp,esp 0x0041f2cf <+3>: sub esp,0x4 0x0041f2d2 <+6>: mov DWORD PTR [ebp-0x4],ecx 0x0041f2d5 <+9>: mov eax,DWORD PTR [ebp+0x8] 0x0041f2d8 <+12>: mov eax,DWORD PTR [eax] ;<= tälle riville 0x0041f2da <+14>: test eax,eax 0x0041f2dc <+16>: jle 0x41f32b <pelitilanne::alueella(piste const&) const+95> 0x0041f2de <+18>: mov eax,DWORD PTR [ebp+0x8] 0x0041f2e1 <+21>: mov eax,DWORD PTR [eax] 0x0041f2e3 <+23>: cmp eax,0x3 0x0041f2e6 <+26>: jg 0x41f32b <pelitilanne::alueella(piste const&) const+95> 0x0041f2e8 <+28>: mov eax,DWORD PTR [ebp+0x8] 0x0041f2eb <+31>: mov eax,DWORD PTR [eax+0x4] 0x0041f2ee <+34>: test eax,eax 0x0041f2f0 <+36>: jle 0x41f32b <pelitilanne::alueella(piste const&) const+95> 0x0041f2f2 <+38>: mov eax,DWORD PTR [ebp+0x8] 0x0041f2f5 <+41>: mov eax,DWORD PTR [eax+0x4] 0x0041f2f8 <+44>: cmp eax,0x3 0x0041f2fb <+47>: jg 0x41f32b <pelitilanne::alueella(piste const&) const+95> 0x0041f2fd <+49>: mov eax,DWORD PTR [ebp+0x8] 0x0041f300 <+52>: mov eax,DWORD PTR [eax+0x8] 0x0041f303 <+55>: test eax,eax 0x0041f305 <+57>: jle 0x41f32b <pelitilanne::alueella(piste const&) const+95> 0x0041f307 <+59>: mov eax,DWORD PTR [ebp+0x8] 0x0041f30a <+62>: mov eax,DWORD PTR [eax+0x8] 0x0041f30d <+65>: cmp eax,0x3 0x0041f310 <+68>: jg 0x41f32b <pelitilanne::alueella(piste const&) const+95> 0x0041f312 <+70>: mov eax,DWORD PTR [ebp+0x8] 0x0041f315 <+73>: mov eax,DWORD PTR [eax] 0x0041f317 <+75>: cmp eax,0x2 0x0041f31a <+78>: jne 0x41f327 <pelitilanne::alueella(piste const&) const+91> 0x0041f31c <+80>: mov eax,DWORD PTR [ebp+0x8] 0x0041f31f <+83>: mov eax,DWORD PTR [eax+0x4] 0x0041f322 <+86>: cmp eax,0x2 0x0041f325 <+89>: je 0x41f32b <pelitilanne::alueella(piste const&) const+95> 0x0041f327 <+91>: mov al,0x1 0x0041f329 <+93>: jmp 0x41f32d <pelitilanne::alueella(piste const&) const+97> 0x0041f32b <+95>: mov al,0x0 0x0041f32d <+97>: leave 0x0041f32e <+98>: ret 0x4
apuva?
SIGSEGV tarkoittaa tavallisesti kielletyn alueen lukemista tai kirjoittamista, ja syy on lähes aina viallinen osoitin: NULL, alustamaton osoitin tai esimerkiksi tuhottuun olioon osoittava. Siis vika ei ole tuossa koodissa vaan siinä, mitä syötät funktiolla.
annan sille vectorissa olevan olion, mutta eikö se saa olla vectorissa?
Saa olla vektorissa. Luultavasti olet nyt ylittänyt vektorin alueen.
std::clog<<"HAKU:"<<std::endl; /* for (int i=1;i<=3;i++){ for (int k=1;k<=3;k++){ for(int j=0;j<=0;j++){ if(peli.alueella(piste(i,k,j))){ if (!peli.tyhja(piste(i,k,j))) { continue; } kohteet.push_back(piste(i,k,j)); std::clog<<i<<" "<<k<<" "<<j<<'\n'<<std::endl; } } } } */ for (kohde = piste(1, 1, 1); peli.alueella(kohde); ++kohde) { // Kohteen pitää olla tyhjä. if (!peli.tyhja(kohde)) { continue; } kohteet.push_back(kohde); std::cout << kohde.x << ' ' << kohde.y << ' ' << kohde.z << ' '<<std::endl; } std::clog<<"tyhjät haettu"<<std::endl;
Tämä tulostaa:
HAKU:0x476ee4tyhjät haettu
mikä 0x476ee4?
0x476ee4 on varmaan endl-funktion osoite, ja olet onnistunut jotenkin rikkomaan systeemin niin, että tulostuu tuo osoite eikä rivinvaihtoa. Joka tapauksessa tuo osa koodista ei varmaan liity aiempaan ongelmaasi.
Ihan uteliaisuuttani kysyisin etta mika kaantaja, versio... ?
MinGW GCC 4.7.2, 32-bittinen.
Aihe on jo aika vanha, joten et voi enää vastata siihen.