NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

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

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Lukáš Červený:2.5.2015 19:58

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ý
Tvůrce
Avatar
Odpovídá na Lukáš Červený
Jan Vargovský:2.5.2015 20:06

Tu frontu si implementoval sám?

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

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

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

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ý:2.5.2015 20:41

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
Tvůrce
Avatar
Odpovídá na Lukáš Červený
Martin Dráb:2.5.2015 21:05

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ý:2.5.2015 21:17

ne, není

 
Nahoru Odpovědět
2.5.2015 21:17
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Lukáš Červený
Jan Vargovský:2.5.2015 21:18

... Co v něm děláš?

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

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ý
Tvůrce
Avatar
Odpovídá na Lukáš Červený
Jan Vargovský:2.5.2015 21:21

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

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

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ý
Tvůrce
Avatar
Odpovídá na Lukáš Červený
Jan Vargovský:2.5.2015 21:49

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ý:2.5.2015 21:58

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
Tvůrce
Avatar
Odpovídá na Lukáš Červený
Martin Dráb:2.5.2015 22:35

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ý:2.5.2015 22:56

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.