Problem z BoolToStr()

dział ogólny

Problem z BoolToStr()

Nowy postprzez Miroo_007 » poniedziałek, 16 marca 2009, 21:34

Funkcja:
Kod: Zaznacz cały
BoolToStr(cos);

zwraca mi wartość -1 lub 0. Ja chcę mieć 1 lub 0. Jaka funkcja to realizuje?
Avatar użytkownika
Miroo_007
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): sobota, 18 października 2008, 10:49
Lokalizacja: Rzeszów
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: Problem z BoolToStr()

Nowy postprzez polymorphism » poniedziałek, 16 marca 2009, 22:21

Litości...
Kod: Zaznacz cały
AnsiString uuu = zmienna_bool ? "1" : "0";
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Problem z BoolToStr()

Nowy postprzez Cyfrowy Baron » wtorek, 17 marca 2009, 11:43

Rozwiązanie podane przez polymorphism jest w tej sytuacji najprostszym, a co za tym idzie najlepszym.
Chciałbym jednak podać rozwiązanie dla funkcji BoolToStr, która rzeczywiście zwraca wynik równy 0 lub -1, lecz przecież wystarczy taki wynik pomnożyć przez -1 by otrzymać 1 gdyż:
  • 0 * -1 = 0
  • -1 * -1 = 1

dla 1:
Kod: Zaznacz cały
Edit1->Text = (String)(BoolToStr(true, false).ToInt() * -1) ;


dla 0:
Kod: Zaznacz cały
Edit1->Text = (String)(BoolToStr(false, false).ToInt() * -1) ;
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Problem z BoolToStr()

Nowy postprzez Miroo_007 » wtorek, 17 marca 2009, 22:24

Jeżeli chodzi o kompilator C++ Builder jest pewna niejasność. Mianowicie, kiedy chcę prze konwertować wartości bool na typ string za pomocą BoolToStr() otrzymuje: 0 = fałsz, -1 = prawda. Jednak kiedy wykonam taki kod:
Kod: Zaznacz cały
AnsiString tekst = "jakis tekst";
tekst.Pos("tekst"); //wynik będzie 6
//drugi przykład
tekst.Pos("nie ma tego tekstu"); //otrzymam wynik -1, czyli false

Tutaj jest rozbieżność między ::Pos(AnsiString), a BoolToStr();

Pytałem wcześniej o inną funkcję, która mogłaby wykonać konwersję, ponieważ widziałem w dokumentacji Delphi funkcje BoolToStrR(); ale nie mogłem jej znaleźć w C++ Builder.
Avatar użytkownika
Miroo_007
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): sobota, 18 października 2008, 10:49
Lokalizacja: Rzeszów
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: Problem z BoolToStr()

Nowy postprzez Cyfrowy Baron » środa, 18 marca 2009, 11:27

Kod: Zaznacz cały
Kod: Zaznacz wszystko
    AnsiString tekst = "jakis tekst";
    tekst.Pos("tekst"); //wynik będzie 6
    //drugi przykład
    tekst.Pos("nie ma tego tekstu"); //otrzymam wynik -1, czyli false


Tutaj jest rozbieżność między ::Pos(AnsiString), a BoolToStr();


Tutaj jest rozbieżność między ::Pos(AnsiString), a BoolToStr();


Najwyraźniej czegoś nie rozumiesz. Funkcja Pos nie zwraca wartości typu BOOL lecz wartość typu INTEGER. Jeżeli funkcja znajdzie w poszukiwanym ciągu znaków wyszukiwany znak lub łańcuch znaków to zwraca pozycję tegoż znaku, w Twoim przykładzie jest to wartość równa 6, ale jeżeli nie znajdzie poszukiwanego ciągu znaków, to nie zwraca wartości typu BOOL lecz wartość 0, co jest tutaj równoznaczne z wartością typu false. Dlaczego funkcja Pos w przypadku gdy nie znajdzie poszukiwanego znaku zwraca wartość 0, ano dlatego, że musi zwrócić wartość typu INTEGER (int), nie może jednak zwrócić wartości powyżej zera, gdyż oznaczałoby to, że jednak coś tam znalazła, więc z konieczności funkcja zwraca wartość 0, co oznacza, że nie odnaleziono poszukiwanego znaku, Ponieważ wartości typu INTEGER można konwertować bez żadnych dodatkowych funkcji na wartości typu BOOL, dlatego jeżeli zmiennej typu BOOL przypiszesz wartość równą 0 to otrzymasz wynik false, ale jeżeli przypiszesz wartość różną od zera to zawsze otrzymasz wartość typu true, więc -1 i 1, jak i 2 i -2 zawsze dadzą wartość true.

Kod: Zaznacz cały
tekst.Pos("nie ma tego tekstu"); //otrzymam wynik -1, czyli false


Otrzymałeś wynik 0 a nie -1, to równoznaczne z false, jak to sprawdzić, najlepiej posługując się kodem zaproponowanym przez polymorphism:

0 = false, wynik false
Kod: Zaznacz cały
bool zmienna_bool = 0;
Edit1->Text  = zmienna_bool ? "1 = TRUE" : "0 = FALSE";


1 = true, wynik true
Kod: Zaznacz cały
bool zmienna_bool = 1;
Edit1->Text  = zmienna_bool ? "1 = TRUE" : "0 = FALSE";


-1 = true, wynik true
Kod: Zaznacz cały
bool zmienna_bool = -1;
Edit1->Text  = zmienna_bool ? "1 = TRUE" : "0 = FALSE";


-2 = true, wynik true
Kod: Zaznacz cały
bool zmienna_bool = -2;
Edit1->Text  = zmienna_bool ? "1 = TRUE" : "0 = FALSE";


2 = true, wynik true
Kod: Zaznacz cały
bool zmienna_bool = 2;
Edit1->Text  = zmienna_bool ? "1 = TRUE" : "0 = FALSE";


itd... tylko 0 daje wynik FALSE, wynik 0 zwróconego przez funkcję Pos może być interpretowany jako FALSe, gdyż w przypadku funkcji Pos oznacza on, że funkcja nie znalazła poszukiwanego znaku. Tak więc dla funkcji Pos tylko wszystkie wartości powyżej zera oznaczają, że coś zostało jednak znalezione, więc TRUE, a wynik 0 i poniżej zera oznacza, ze niczego nie odnaleziono, więc FALSE. Potrzebny jet tutaj warunek, czyli:

Kod: Zaznacz cały
String tekst = "przeszukiwany tekst";
int count = tekst.Pos("tekst");
bool result;

//warunek
if(count > 0) result = true; else result = false;

if(result) Edit1->Text = "true"; else Edit1->Text = "false";


lub tak:
Kod: Zaznacz cały
String tekst = "przeszukiwany tekst";
int count = tekst.Pos("tekst");
bool result;

//warunek
  result = (count > 0) ? true : false;

if(result) Edit1->Text = "true"; else Edit1->Text = "false";


lub bezpośrednio, jeżeli nie potrzebujesz pozycji poszukiwanego znaku:

Kod: Zaznacz cały
String tekst = "przeszukiwany tekst";
bool result = tekst.Pos("tekst");

if(result) Edit1->Text = "true"; else Edit1->Text = "false";


Funkcja Pos nigdy nie zwraca wartości poniżej 0.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana


Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 6 gości