Autor Wątek: Bool zwraca wartość... 212!  (Przeczytany 5501 razy)

swiru

  • Gość
# Lipiec 04, 2008, 18:25:48
Prawdopodobnie używasz tego boola niezainicjowanego. Popatrz na ostrzeżenia kompilatora.
Hmm... Czy przypadkiem bool nie jest domyślnie inicjalizowany jako false?
Nie. Bool nie różni się pod tym względem od int czy char.

Heh - mój głupi błąd. Pomyliło mi się z Javą. Oczywiście kpp ;].

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline RedHot

  • Użytkownik

# Lipiec 04, 2008, 18:36:14
Będzie jeśli zdefiniujesz go jako obiekt globalny, ale to typowe zachowanie dla tego typu definicji.

Offline Kos

  • Użytkownik
    • kos.gd

# Lipiec 04, 2008, 19:24:45
Moim zdaniem bardzo wygodnie jest nie wiedzieć, czym się co "samo z siebie" inicjalizuje i wszystko inicjalizować samemu dla pewności. :)

Offline Kwazar

  • Użytkownik

# Lipiec 05, 2008, 00:09:55
A co jesli pod zmienna bool jest wartosc np 212 podobnie jak u autora tematu i wykonam taki kod:

switch( Zmienna )
{
     case true:
     Funkcja1();
     break;

     case false:
     Funkcja2();
     break;
}

Zadna z funkcji sie nie uruchomi?
Raz mialem taki przypadek ze funkcja z silnika graficznego z ktorego kozystalem zwracala true ale zadna z opcji switch'a sie nie wykonala.
Dopiero po wykonaniu takiej operacji wszystko działalo jak nalezy:
bool ZmiennaZmieniona = Zmienna;
switch( ZmiennaZmieniona )
{
     case true:
     Funkcja1();
     break;

     case false:
     Funkcja2();
     break;
}

Offline Kos

  • Użytkownik
    • kos.gd

# Lipiec 05, 2008, 00:23:13
Albo po prostu można zrobić:
switch (!!zmienna) {
/* ... */



Niemniej nie mogę pozbyć się wrażenia, że mnożymy tu przykłady "dla idei, żeby pokazać że można", nie myśląc o praktyce. Zwróćcie uwagę - kiedy tak naprawdę stosuje się warunki w stylu...
if (foo == true)...? Przecież po to jest w C utarta i czytelna składnia...
if (foo)... by się o takie rzeczy nie martwić. A wyświetlanie na ekranie to przypadek szczególny i np. taką funkcyjką...
inline char* boolToStr(bool b)
{
    return b ? "1" : "0";
}
...możemy rozwiązać wspomniany w temacie problem raz na zawsze, przy okazji mogąc zmienić sobie format wyświetlania na "prawda"/"fałsz" w jednym miejscu.

Offline Esidar

  • Użytkownik

# Lipiec 05, 2008, 02:04:53
if (foo == true)...? Przecież po to jest w C utarta i czytelna składnia...

W C nie ma typu "bool" więc nie ma co się ucierać :) Bool został wprowadzony do C++ właśnie po to żeby uniknąć tej "czytelnej" składni. W C# nie można napisać inaczej niż "if foo == true".

"Jeśli foo" nic nie oznacza. "Jeśli foo wynosi true" mówi o wiele więcej. Nie wspominając o tym że w C są dozwolone takie "czytelne" kwiatki:
if( foo = moo )


swiru

  • Gość
# Lipiec 05, 2008, 09:31:53
[ciach kod ze switchem po bool]
Zadna z funkcji sie nie uruchomi?
Żadna się nie uruchomi. Bool w C++ może przyjmować wartości true, false. Lub, w przypadku wartości niezdefiniowanej, być może wartość różną od true i false.

A wyświetlanie na ekranie to przypadek szczególny i np. taką funkcyjką...
inline char* boolToStr(bool b)
{
    return b ? "1" : "0";
}
...możemy rozwiązać wspomniany w temacie problem raz na zawsze, przy okazji mogąc zmienić sobie format wyświetlania na "prawda"/"fałsz" w jednym miejscu.
To nie jest rozwiązanie. Jeśli z jakiegoś powodu w programie zmienna bool ma wartość niezdefiniowaną to taka funkcja maskuje błąd. Zamiast go rozwiązać.

W C nie ma typu "bool" więc nie ma co się ucierać :)
W C99 jest.

Bool został wprowadzony do C++ właśnie po to żeby uniknąć tej "czytelnej" składni.
Bool został wprowadzony aby mieć zmienną typu logicznego. I ZTCW cały czas składnia skrócona (if(bool_value)) jest preferowana. Poza tym w C89 też możesz pisać:
typedef unsigned char BOOL;
enum {
        TRUE = 1,
        FALSE = 0
};
BOOL b = TRUE;
if (b == TRUE) {
        printf("sss\n");
}

W C# nie można napisać inaczej niż "if foo == true".
A Javie można, żaden argument.

"Jeśli foo" nic nie oznacza. "Jeśli foo wynosi true" mówi o wiele więcej.
Oba te wyrażenia mówią dokładnie to samo.

// edit
Na nieco głębszym poziomie wyrażenia if (bool_value) i if (bool_value == true) znaczą coś innego. Pierwsze oznacza czy bool_value jest równe true. Drugie: czy wyrażenie logiczne ,,bool_value równe jest true'' jest prawdziwe. Dlatego drugie jest nieco przegadane.
« Ostatnia zmiana: Lipiec 05, 2008, 10:08:47 wysłana przez bies »

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Lipiec 05, 2008, 10:52:11
Jeśli już mówić o tym problemie na takim poziomie koncepcyjnym, to moim zdaniem nie ma nic złego w

if (zmienna_logiczna)

natomiast dobry język (taki co stawia na czytelność zamiast na maksymalne skrócenie kodu) nie powinien pozwalać na:

if (zmienna_liczbowa)
if (wskaźnik)

tylko zamiast tego wymagać

if (zmienna_liczbowa != 0)
if (wskaźnik != NULL)

Offline menajev

  • Użytkownik
    • Karate Inowrocław

# Lipiec 05, 2008, 12:39:02
Problem rozwiązany.
Przyczyna:
Na początku tworzenia gry [kiedy samochody były dwa] używałem tylko jednego obiektu CKM'u, więc pociski dla niego były też wspólne. Żeby się nie zazębiało podczas odpalania pocisków w tablicy były kombinacje typu:
for(int i=0;i<iBulletAmount/2;i++)
if(bullet[i+iBulletAmount/2*ID].checkBusy()==false)
W momencie kiedy wszystkie samochody mają osobny CKM i identyfikator pokroju 6, zrobiły się problemy...
Mimo wszystko dzięki na daremny trud.
Głupio się z tym czuje, wiedziałem, że jeśli gra się wysypuje, to muszę przeszukać wszystkie tablice, ale dziwna wartość bool'a mnie zmyliła.

Offline snakeo

  • Użytkownik

# Lipiec 20, 2008, 14:07:16
switch( Zmienna )
{
     case true:
     Funkcja1();
     break;

     case false:
     Funkcja2();
     break;
}
Jakoś nigdy nie przyszło by mi do głowy, żeby coś takiego napisać.
if(Zmienna) Funkcja1();
else Funkcja2();
Ale to może ze mną jest coś nie tak? Może mi ktoś powiedzieć, kiedy taki switch się może przydać? ;p
« Ostatnia zmiana: Lipiec 21, 2008, 09:20:58 wysłana przez snakeo »

Offline SiMet

  • Użytkownik

# Lipiec 20, 2008, 14:38:24
Niezainicjalizowany bool mi zwrocil 118 wiec prawdopodobnie to jest powodem.
Nie zainicjalizowales zmiennej.

Offline ajur

  • Użytkownik

# Lipiec 20, 2008, 15:38:23
Niezainicjalizowany bool mi zwrocil 118 wiec prawdopodobnie to jest powodem.
Nie zainicjalizowales zmiennej.
jedynie.. zwłaszcza że kod
bool b = 42;
cout << b;
wypisze "1". Standardowa konwersja z int na bool zamienia 0 na false a niezerowe liczby na true, natomiast true to 1 z definicji.


ps.
W skrócie nie udzielaj błędnych porad, tylko szkodzisz.
Aha, w takim razie powiedz to Visualowi c++
Visual wie co robi, choć mógł by ostrzegać, że void main jest niezgodny ze standardem C++. Nie mniej, jest to dopuszczane, ponieważ w C main mógł być typu void) Niemniej, pisanie void main() jest mylące.

Offline Kos

  • Użytkownik
    • kos.gd

# Lipiec 20, 2008, 19:43:40
Nie mniej, jest to dopuszczane, ponieważ w C main mógł być typu void
Pewien w 100%...? :)

swiru

  • Gość
# Lipiec 20, 2008, 20:28:10
Nie mniej, jest to dopuszczane, ponieważ w C main mógł być typu void
Pewien w 100%...? :)
W c void main jest legalne  :) więc...
« Ostatnia zmiana: Lipiec 20, 2008, 20:30:41 wysłana przez swiru »

Offline Kos

  • Użytkownik
    • kos.gd

# Lipiec 20, 2008, 21:28:59
Nie mniej, jest to dopuszczane, ponieważ w C main mógł być typu void
Pewien w 100%...? :)
W c void main jest legalne  :) więc...
Hmm...
Cytat: C99 draft
5.1.2.2.1 Program startup
1 The function called at program startup is named main. The implementation declares no prototype for this function. It shall be defined with a return type of int and with no parameters:
int main(void) { /* ... */ }
or with two parameters (referred to here as argc and argv, though any names may be used, as they are local to the function in which they are declared):
int main(int argc, char *argv[]) { /* ... */ }
or equivalent; or in some other implementation-defined manner.
... Więc chyba też nie jest :)