Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: SIGSEGV-virhe

Sivun loppuun

Oskuz [18.01.2014 16:33:42]

#

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?

Metabolix [18.01.2014 16:44:46]

#

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.

Oskuz [18.01.2014 17:08:57]

#

annan sille vectorissa olevan olion, mutta eikö se saa olla vectorissa?

Metabolix [18.01.2014 17:28:30]

#

Saa olla vektorissa. Luultavasti olet nyt ylittänyt vektorin alueen.

Oskuz [19.01.2014 19:00:37]

#

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?

Metabolix [19.01.2014 20:05:39]

#

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.

Taipan [17.02.2014 22:32:56]

#

Ihan uteliaisuuttani kysyisin etta mika kaantaja, versio... ?

Oskuz [18.02.2014 18:08:07]

#

MinGW GCC 4.7.2, 32-bittinen.


Sivun alkuun

Vastaus

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

Tietoa sivustosta