|
Forum - Polski Portal COLOBOTa |
|
|
Funkcja errmode |
Autor |
Wiadomość |
bbiidduull
Dołączył: 09 Lut 2009 Posty: 140
|
Wysłany: 20-02-2010, 19:21 Funkcja errmode
|
|
|
Jak się posługiwać tym errmode? Próbuje próbuje i nie działa |
|
|
|
|
Bartek c++
Twoja ulubiona misja: Tropica - Czas na atak
Pomógł: 6 razy Wiek: 20 Dołączył: 07 Lip 2009 Posty: 390
|
Wysłany: 20-02-2010, 19:29
|
|
|
errmode służy temu żeby nie wyskakiwał błąd lub żeby program sie nie wyłaczal gdy nastąpi bląd.
Wykorzystuje sie go w obcych jako . |
_________________
|
|
|
|
|
bbiidduull
Dołączył: 09 Lut 2009 Posty: 140
|
Wysłany: 20-02-2010, 21:46
|
|
|
To i ja wiem bo to pisze w podręczniku CBot. A co z tym zrobić?
Np mam sobie taki kod:
Kod: | object yyy;
yyy=radar(Me);
goto(yyy.position); |
Wtedy wywali mi błąd że miejsce docelowe zajęte. Co zrobić z tym errmode(0); ? Gdzie wstawić czy coś? Te przykłady co dali w podręczniku nie działają |
|
|
|
|
Schocker
Wants cookies!
Twoja ulubiona misja: Hmm... All.
Pomógł: 3 razy Wiek: 22 Dołączył: 31 Maj 2009 Posty: 177 Skąd: Wadowice
|
Wysłany: 20-02-2010, 21:49
|
|
|
errmode najlepiej dać tuż przed komendą, która sprawia problemy. W tym wypadku, będzie to prawdopodobnie ten fragment:
bbiidduull napisał/a: |
goto(yyy.position); |
|
_________________ But there's no sense crying over every mistake, you just keep on trying 'till you ran out of cake -GlaDOS
|
|
|
|
|
bbiidduull
Dołączył: 09 Lut 2009 Posty: 140
|
Wysłany: 20-02-2010, 22:08
|
|
|
No i działa Dzięki.
P.S. Mogli byście napisać podręcznik CBota oD nowa |
|
|
|
|
FE4R
Twoja ulubiona misja: Saari - Inwazja
Pomógł: 4 razy Wiek: 24 Dołączył: 21 Paź 2009 Posty: 144
|
Wysłany: 20-02-2010, 22:15
|
|
|
Funkcje w programie mogą wywalić błąd(i zatrzymać program).
Najprostszy przykład to funkcja goto i błąd: 'goto: miejsce docelowe zajęte'.
Jeśli instrukcja lub funkcja działa poprawnie, to wynik jej akcji będzie równy 0.
Jeśli wyrzuci błąd, wynikiem będzie 1.
Jest to bardzo prosty sposób na pokazanie, czy funkcja jest poprawna.
Niepoprawna funkcja to na przykład:
Kod: | extern void object::Program1()
{
int a;
a = dzielenie();
}
int dzielenie()
{
float number = 10/0;
} |
Wynik funkcji lub instrukcji jest typu int. Jeśli wywołasz funkcję dzielenie, będzie ona chciała podzielić 10 na 0. Wiadomo, że nie dzieli się przez zero, więc wynikiem funkcji będzie 1, gdyż zwróci ona błąd. Dlatego też 'a' będzie równać się jeden. Gdyby podzielić 10 na 1, funkcja byłaby poprawna i 'a' równałoby się 0.
Funkcja errmode(0); umieszczona przed instrukcją lub funkcją wywołującą błąd sprawi, że program się nie zatrzyma, tylko przejdzie od błędnej funkcji do następnej. Domyślną wartością jest funkcji errmode jest 1, czyli wtedy, gdy nic ona nie robi.
Umieśćmy więc funkcję errmode(0); w w/w programie:
Kod: | extern void object::Program2()
{
int a;
errmode(0);
a = dzielenie();
message(a);
}
int dzielenie()
{
float number = 10/0;
} |
Umieszczenie errmode(0); na początku programu sprawi, że błędy zostaną pominięte.
Dlatego też program nie zatrzyma się po linijce 'float number = 10/0;'. Wynik funkcji dzielenie, a, wyniesie 1. Dlatego też message(a); wyświetli liczbę 1.
Umieszczanie errmode(0); na początku programu jest niemądre, gdyż wszelkie błędy mogą sprawić, że robot stanie w miejscu i będzie czekać na zbawienie, a Ty nic nie będziesz wiedzieć, bo nie wyświetli komunikatu o błędzie. Używa się tego w owadach tylko dlatego, że owady nie powinny się zatrzymywać ni wywalać błędów.
Najlepiej umieszczać errmode(0); tylko wtedy, gdy z powrotem zmieniasz to na errmode(1); i masz rozwiązanie problemu.
Dajmy na to, że chcesz stworzyć program, gdzie robot chce podładować ogniwo, ale inny robot stoi na miejscu i się ładuje. Dopóki inny robot nie zejdzie, funkcja goto będzie wywalać błąd, że miejsce jest zajęte. A ty nie chcesz czatować nad przyciskiem startu programu, tylko zrobić sobie herbatkę.
Więc stosujesz rozwiązanie problemu błędu z użyciem errmode:
Kod: | extern void object::Program3()
{
int err;
object station = radar(PowerStation);
errmode(0); // jeśli goto wywali błąd, program się nie zatrzyma, tylko pójdzie dalej
err = goto(station); // jeśli nie będzie można dojść do stacji, err będzie się równać 1 i robot nie pójdzie, natomiast jeśli będzie można, to err będzie równe 0 i robot dojdzie do stacji
errmode(1); // jeśli operację można wykonać, powróć do normalnego stanu.
while(err != 0) // jeśli nie można dojść...
{
do
{
errmode(0);
err = goto(station.position); // próbuj dojść do stacji...
errmode(1);
}
while(err == 1); // ...dopóki program wywala błąd.
}
} |
W razie problemu, polecam się na przyszłość. : |
|
|
|
|
bbiidduull
Dołączył: 09 Lut 2009 Posty: 140
|
Wysłany: 20-02-2010, 22:23
|
|
|
yyy Ten kod też jest poprawny?
Kod: | object stacja;
stacja=radar(PowerStation);
errmode(0);
goto(stacja.position);
while(goto(stacja.position) != 0)
{
wait(1);
}
dalsze instrukcje...
|
|
|
|
|
|
Berserker
Dark Ness
Twoja ulubiona misja: Ofrenia
Pomógł: 16 razy Wiek: 24 Dołączył: 24 Mar 2009 Posty: 496 Skąd: Bigos
|
Wysłany: 20-02-2010, 23:12
|
|
|
Fear ty klamczuchu, specjalnie musialem weryfikowac to co piszesz.
Cytat: | Umieszczenie errmode(0); na początku programu sprawi, że błędy zostaną pominięte.
Dlatego też program nie zatrzyma się po linijce 'float number = 10/0;'. Wynik funkcji dzielenie, a, wyniesie 1. Dlatego też message(a); wyświetli liczbę 1. |
Bullshit.
Ustawienie errmode() na 0 powoduje dwie rzeczy:
Funkcje wbudowane w cbot (goto(), fire(), turn() i podobne bzdety) jesli nie moga byc wykonane (zablokowane miejsce docelowe i takie bzdety) zwracaja wartosc int. Jesli funkcja zostanie (zostanie, nie jest mozliwa do) wykonana, zwraca wartosc 0. Jesli funkcja nie jest mozliwa do wykonania - jest przerywana, zwraca jakastam wartosc (mozna nawet po wartosci rozroznic jakiego typu blad jest, np miejsce docelowe zajete = 212, jak da sie grabberowi fire(2) = 160) i program jest kontynuowany.
Jesli nastapi blad jakiegokolwiek innego typu, program zostaje zakonczony bez wysylania o tym powiadomienia (dlatego owady maja errmode(0) na starcie, w ten sposob gracz nie dowie sie o bledzie programu i nie bedzie goraczkowo szukac az odkryje, ze bezczelni tworcy dali mozliwosc programowania mrowek). Czyli w przykladzie Feara z funkcja dzielenie() po prostu program sie skonczy podczas dzielenia.
@up
Bedzie dzialac, mozesz nawet usunac instrukcje goto() sprzed petli. |
_________________
|
|
|
|
|
FE4R
Twoja ulubiona misja: Saari - Inwazja
Pomógł: 4 razy Wiek: 24 Dołączył: 21 Paź 2009 Posty: 144
|
Wysłany: 21-02-2010, 01:06
|
|
|
Berserker napisał/a: | Ustawienie errmode() na 0 powoduje dwie rzeczy:
Funkcje wbudowane w cbot (goto(), fire(), turn() i podobne bzdety) jesli nie moga byc wykonane (zablokowane miejsce docelowe i takie bzdety) zwracaja wartosc int. Jesli funkcja zostanie (zostanie, nie jest mozliwa do) wykonana, zwraca wartosc 0. Jesli funkcja nie jest mozliwa do wykonania - jest przerywana, zwraca jakastam wartosc (mozna nawet po wartosci rozroznic jakiego typu blad jest, np miejsce docelowe zajete = 212, jak da sie grabberowi fire(2) = 160) i program jest kontynuowany. |
Nie jestem pewien przykładu podanego z głowy. W każdym razie Twój grnialny program obronny, który testowałem często kończył się błędem 'Dzielenie przez zero'. Nie jest on rozpoznawany przez kompilator, tak samo jak niemożność wykonania goto. Akurat fire oraz turn nie wywalą błędu, gdyż nie ma czynników, które mogły by blokować robota w tym aspekcie, pomijając ogniwo, które przyczyną błędu nie jest.
Dlatego też zmienna 'a' powinna zostać zainicjowana wartością 1, jeśli operacja jest niemożliwa do wykonania.
Nie spotkałem się z błędami, które konczą program bez ostrzeżenia. Jeśli to błędy syntaktyczne, powinny być wykrywane przez kompilator.
A jak ktoś lubi się w takie rzeczy bawić, można popróbować z traktowaniem wyjątków za pomocą try, catch i throw. |
|
|
|
|
Berserker
Dark Ness
Twoja ulubiona misja: Ofrenia
Pomógł: 16 razy Wiek: 24 Dołączył: 24 Mar 2009 Posty: 496 Skąd: Bigos
|
Wysłany: 21-02-2010, 01:29
|
|
|
Cytat: | W każdym razie Twój grnialny program obronny, który testowałem często kończył się błędem 'Dzielenie przez zero'. |
Blad "Dzielenie przez 0" jest wywalany gdy osa jest dokladnie nad twoja glowa. Wtedy teoretycznie nalezy podniesc lufe na 90°, a ze kat liczony jest za pomoca arcus tangensow to dzielnik (w tym wypadku odleglosc w plaszczyznie poziomej) wynosi 0 i wywala blad. Ja nie uzywalem programu dla osy uzywajacej instrukcji goto() i mi nie wywalalo
Cytat: | Nie jest on rozpoznawany przez kompilator, tak samo jak niemożność wykonania goto. |
Tu nie chodzi o bledy wykrywane przez kompilator, bo takich jest mnostwo. A roznica miedzy niemoznoscia wykonania goto() a dzieleniem przez 0 jest taka, ze wykonywalnosc goto() jest relatywna.
Cytat: | Nie spotkałem się z błędami, które konczą program bez ostrzeżenia. Jeśli to błędy syntaktyczne, powinny być wykrywane przez kompilator. |
Ehh. Chodzilo mi o to, ze danie errmode(0) neguje komunikat o bledzie. Blad ciagle jest, jesli sprobujesz zadeklarowac zmienna p typu object, nadac jej wartosc null i sprobowac uzyskac pozycje za pomoca p.position, to nawet errmode(0) nie pomoze. Ale nie dostaniesz komunikatu "Obiekt nieznany". |
_________________
|
|
|
|
|
FE4R
Twoja ulubiona misja: Saari - Inwazja
Pomógł: 4 razy Wiek: 24 Dołączył: 21 Paź 2009 Posty: 144
|
Wysłany: 21-02-2010, 12:57
|
|
|
Berserker napisał/a: | Blad "Dzielenie przez 0" jest wywalany gdy osa jest dokladnie nad twoja glowa. Wtedy teoretycznie nalezy podniesc lufe na 90°, a ze kat liczony jest za pomoca arcus tangensow to dzielnik (w tym wypadku odleglosc w plaszczyznie poziomej) wynosi 0 i wywala blad. Ja nie uzywalem programu dla osy uzywajacej instrukcji goto() i mi nie wywalalo |
Sądząc po Twoich programach do os chyba jednak używałeś os z goto do testów, bo moje używają tylko motor(). Who's the liar now, huh?
Cytat: | Tu nie chodzi o bledy wykrywane przez kompilator, bo takich jest mnostwo. A roznica miedzy niemoznoscia wykonania goto() a dzieleniem przez 0 jest taka, ze wykonywalnosc goto() jest relatywna. |
Nie ma zbyt dużej różnicy, gdyż funkcja licząca 10/0 i niemożliwe do wykonania goto to to samo, bo i tak wywala błąd, a wynik obu funkcji to 1.
Cytat: | Ehh. Chodzilo mi o to, ze danie errmode(0) neguje komunikat o bledzie. Blad ciagle jest, jesli sprobujesz zadeklarowac zmienna p typu object, nadac jej wartosc null i sprobowac uzyskac pozycje za pomoca p.position, to nawet errmode(0) nie pomoze. Ale nie dostaniesz komunikatu "Obiekt nieznany". |
To o co ci chodzi, skoro miałem na myśli to samo?
Program nie zatrzyma się na linijce powodującej błąd i nie wywali komunikatu, tylko przejdzie dalej (gdzie można umieścić rozwiązanie problemu...). |
|
|
|
|
Berserker
Dark Ness
Twoja ulubiona misja: Ofrenia
Pomógł: 16 razy Wiek: 24 Dołączył: 24 Mar 2009 Posty: 496 Skąd: Bigos
|
Wysłany: 21-02-2010, 13:04
|
|
|
Zatrzyma sie, sprawdz sam
Cytat: | Sądząc po Twoich programach do os chyba jednak używałeś os z goto do testów, bo moje używają tylko motor(). Who's the liar now, huh? |
Oj, moge nawet dac program na ktorym testowalem ten program
Cytat: | Nie ma zbyt dużej różnicy, gdyż funkcja licząca 10/0 i niemożliwe do wykonania goto to to samo, bo i tak wywala błąd, a wynik obu funkcji to 1. |
1) funkcja liczaca 10/0 nie da wyniku 1 tylko zakonczy program
2) goto() nie zwroci zawsze 1, zwroci wartosc rozna od 0, czyli rownie dobrze 1203245 |
|
|
|
|
|
|
| |
|
|
|
|
Polski Portal COLOBOTa © 2008 - 2012 |
|
|