Oryginalna strona colobot.cba.pl umarła, gdy cba.pl przestało oferować darmowy hosting. To jest statyczny mirror, pobrany w 2018. ~krzys_h
 Polski Portal COLOBOTa - COLOBOT Polish Portal
Forum - Polski Portal COLOBOTa
Strona głównaStrona główna UżytkownicyUżytkownicy GrupyGrupy StatystykiStatystyki


Poprzedni temat «» Następny temat
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
Kod:
errmode(0);
.
_________________

 
     
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ć? :D
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 :D Dzięki.

P.S. Mogli byście napisać podręcznik CBota oD nowa :D
 
     
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ść. : :mrgreen: :mrgreen:
 
     
bbiidduull 


Dołączył: 09 Lut 2009
Posty: 140
Wysłany: 20-02-2010, 22:23   

yyy :D 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? :mrgreen:

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 :P

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
 
 
     
Wyświetl posty z ostatnich:   

Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Polski Portal COLOBOTa © 2008 - 2012