Wpis z mikrobloga

zapytałem copilota. nie mam pojęcia czy to własciwa odpowiedź
@mamniciwszystko:

W C++, przypisanie wartości do zmiennej typu bool jest proste. Jednak w Twoim przypadku masz wskaźnik (bool*) zamiast samej zmiennej typu bool. Wskaźnik wskazuje na adres pamięci, a nie przechowuje bezpośrednio wartości logicznej. Dlatego otrzymujesz błąd.

Jeśli chcesz przypisać wartość true do wskaźnika isMainWindowOpen, musisz najpierw utworzyć zmienną typu bool i przypisać jej wartość true. Następnie możesz przypisać adres tej zmiennej
  • Odpowiedz
@mamniciwszystko: bo typy się nie zgadzają. Spróbuj *isMainWindowOpen = true ale licz się z tym że jeśli wcześniej nie zaalokowałeś pamięci dla isMainWindowOpen to program się skompiluje ale w trakcie wykonywania rzuci segmentation fault
  • Odpowiedz
bool mainWindowOpen = true; isMainWindowOpen = &mainWindowOpen;

Wskaźnik co najwyżej wskazuje na zmienną. W sobie może zatem zawierać adres jakiejś komórki pamięci, a nie wartość zmiennej (która jest pod jakimś adresem).
  • Odpowiedz
@mamniciwszystko:
bool* isMainWindowOpen; -> wskaźnik na zmienną typu bool
isMainWindowOpen = true -> zmiana wskaźnika na x a dokładniej to próba zmiana adresu na który wskazuje wskaźnik w pamięci
*isMainWindowOpen = true -> zmiana wartości pod adresem na który wskazuje wskaźnik isMainWindowOpen i to jest coś o co ci chodziło
  • Odpowiedz
ziom, u mnie na wskaźnikach 4/5 grupy odpadło. Pewnie dlatego teraz przerzucają się wszyscy na uczelniach na uvzenie pythona


@j557: ... dokąd zmierzamy..
  • Odpowiedz
@mamniciwszystko: no i dobrze kompilator wywala, bo nie możesz do bool* przypisać bool, tak samo jak do int*, float, czy std::string (upraszczam, wiem że to C++;)).

Typy mają się zgadzać. Jeżeli chcesz trzymać wartość true/false, potrzebujesz bool. Jeżeli chcesz trzymać adres to istniejącej gdzieś zmienne typu bool, potrzebujesz bool*.

Zapytaj chatgpt to dostaniesz zapewne wszystko ładnie wyjaśnione, jeżeli masz block na zrozumieniu wskaźników.
  • Odpowiedz
bool* isMainWindowOpen; -> wskaźnik na zmienną typu bool

isMainWindowOpen = true -> zmiana wskaźnika na x a dokładniej to próba zmiana adresu na który wskazuje wskaźnik w pamięci

*isMainWindowOpen = true -> zmiana wartości pod adresem na który wskazuje wskaźnik isMainWindowOpen i to jest coś o co ci chodziło


@Defined: dopowiem jeszcze, isMainWindowOpen to wskaźnik, w pamięci zajmuje coś w stylu 0xAA5441 albo jakąś inną wartość, Ty mu chcesz tu przypisać wartość true czyli 0x01 co kompilator wychwytuje, oczywiście mógłbyś to zrobić castem (bool*) true i wtedy wskaźnikowi przypisałbyś wartość 0x01 ale program wykrzaczy się bo ten adres dla systemu to w 99% jakaś
  • Odpowiedz
@cordianss: nie, niedozwolone jest samo utworzenie nielegalnego wskaźnika. Przeczytaj dokumentację do reinterpret cast, tam jest zamknięta lista przypadków dozwolonych konwersji i tego przypadku nie ma na tej liście
  • Odpowiedz
@Krolik: Jak rozumiesz to?

An lvalue(until C++11)glvalue(since C++11) expression of type T1 can be converted to reference to another type T2. The result is that of *reinterpret_cast<T2*>(p), where p is a pointer of type “pointer to T1” to the object or function designated by expression. No temporary is created, no copy is made, no constructors or conversion functions are called. The resulting reference can only be accessed safely if it
  • Odpowiedz