Diskuze: fronta a neoprávněný přístup do paměti

C++ C a C++ fronta a neoprávněný přístup do paměti

Avatar
Lukáš Červený:

Zdravím, mám v c++ něco jako toto:

struct policko
{
    int radek;
    int sloupec;
    int tah;
};

queue<policko> fronta;

int e[2] = {0, 0};

policko tmp = {e[0], e[1], 0};
fronta.push(tmp);

while(!fronta.empty()){}

jenže pokaždé, když spustím program, dostanu chybu "Neoprávněný přístup do paměti (SIGSEGV)" (cyklus se vůbec nezačne vykonávat). Stejné je to i pokud dám do podmínky "fronta.size()" Nevíte, prosím, co dělám špatně? Díky moc

Editováno 2.5.2015 19:59
 
Odpovědět 2.5.2015 19:58
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Lukáš Červený
Jan Vargovský:

Tu frontu si implementoval sám?

 
Nahoru Odpovědět 2.5.2015 20:06
Avatar
Lukáš Červený:

ne, používám třídu z std knihovny

 
Nahoru Odpovědět 2.5.2015 20:10
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Lukáš Červený
Jan Vargovský:

Nevím, nevidím tam nic, co by mělo vyhodit seg. fault. Budeš muset počkat na odpověď někoho jiného :)

 
Nahoru Odpovědět 2.5.2015 20:22
Avatar
Lukáš Červený:

Ještě jsem objevil jednu věc - pokud odeberu negaci (vykřičník) u "fronta.empty()", cyklus se normálně přeskočí a chybu to nevyhodí

 
Nahoru Odpovědět 2.5.2015 20:41
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Lukáš Červený
Martin Dráb:

Ten cyklus je ve tvém kódu také prázdný?

Nahoru Odpovědět 2.5.2015 21:05
2 + 2 = 5 for extremely large values of 2
Avatar
Lukáš Červený:

ne, není

 
Nahoru Odpovědět 2.5.2015 21:17
Avatar
Jan Vargovský
Redaktor
Avatar
 
Nahoru Odpovědět 2.5.2015 21:18
Avatar
Lukáš Červený:

Hledám cestu šachového koně do určených bodů... :D nevím, jak to v c++ funguje, ale když dám 'cout << "cyklus"' na zacatek cyklu, nic se nevypise.

 
Nahoru Odpovědět 2.5.2015 21:20
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Lukáš Červený
Jan Vargovský:

Slovní popis je fajn, ale tady bude potřeba asi kód.

 
Nahoru Odpovědět 2.5.2015 21:21
Avatar
Lukáš Červený:

tady:
http://pastebin.com/0KP4YgZQ

Doufám, že mě neukamenujete za ten kód... :D

Je to rozpracované řešení téhle úlohy:
https://ksp.mff.cuni.cz/…zadani4.html#…

Editováno 2.5.2015 21:31
 
Nahoru Odpovědět 2.5.2015 21:28
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Lukáš Červený
Jan Vargovský:

Uff.

Todle by jsi měl směřovat na fórum přímo od KSP (resp. KSP-Z). Jinak sorry, nějak se mi to nechce luštit co tam kde děláš. Zkus to nějakým způsobem vydebugovat, třeba stylem, že si vypisuješ tu šachovnici a sleduj co ti tam vůbec teče za data. Ten index tam potom skáče do rozhodně větších hodnot než 0-4 a to je jeden z problémů co tam vidím.

Jinak, nevím jakým stylem to testuješ, ale pro jakékoliv algoritmické úlohy si vždycky přesměrovávám vstup na soubor, abych nemusel to nemusel při každém debugu vkládat.

Jen na začátek dáš:

FILE * in;
freopen_s(&in, "in.txt", "r", stdin);

A do souboru si hodíš ten vstup:

9
6 1
2 2
6 5
2 6
3 7
8 2
5 3
3 3
7 8
1 8
 
Nahoru Odpovědět 2.5.2015 21:49
Avatar
Lukáš Červený:

Chapu z toho, ze je tedy problem nekde v tom cyklu. I to je podstatna rada :) Jinak vstup ze souboru smeruju v bashi takhle: /path/to/script < /path/to/input

 
Nahoru Odpovědět 2.5.2015 21:58
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Lukáš Červený
Martin Dráb:

Myslím, že při posílání dat na standardní výstup se aplikuje nějaká vyrovnávací paměť knihovny, takže daný výstup nemusíš vidět v okamžiku, kdy k němu v programu reálně dojde. Měla by existovat nějaká funkce typu flush či std::flush řešící tento problém (donutí vyprázdnit vyrovnávací paměť pro daný proud).

Nahoru Odpovědět 2.5.2015 22:35
2 + 2 = 5 for extremely large values of 2
Avatar
Lukáš Červený:

Díky za odpovědi a váš čas :) Už se mi problém podařilo vyřešit. Problém byl skutečně v cyklu - zaráželo mě tedy, že se nevypisovaly výpisy před ním...

 
Nahoru Odpovědět 2.5.2015 22:56
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 15 zpráv z 15.