Wpis z mikrobloga

Zetknąłem się z ciekawym problemem. Otóż QString potrafi wywalić program, kiedy nie ma deklaracji zmiennej w pliku nagłówkowym. Co ciekawe przy std::string problem nie występuje. Więc jeśli wam wali segfaulta dodajcie deklarację do nagłówkowego lub zmieńcie na string. Kompilator nie ma zastrzeżeń, ale program idzie w krzaki.

#programowanie #qt #c++
  • 17
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@Rasteris: Ale co masz na myśli przez deklarację w nagłówku? Deklarację globalnej zmiennej? Pola w klasie?

Coś mi się wydaje, że problemem jest coś zupełnie innego, niż Ci się wydaje.
  • Odpowiedz
@Rasteris: przypadek.

a jak tworzysz zmienną globalną w headerze, to tak naprawdę tworzysz N inicjalizacji tych zmiennych globalnych w każdym .cpp gdzie ten header "dotrze"(nawet przez inne headery) i linker przypadkowo akurat wybiera taką kolejność inicjalizacji, że to działa. ale na innym kompilatorze/linkerze/komputerze może to się inaczej wybrać
  • Odpowiedz
@Rasteris: Weź to jakoś odizoluj tak, by się dało to zreprodukować, bo na tą chwilę bym powiedział że "I cannot reproduce the issue"/"u mnie działa".
Daj minimalną implementację MainWindow (czy też QMainWindow), która reprodukuje problem.
Inaczej to sobie możemy zgadywać.
  • Odpowiedz
@MamCieNaHita: właśnie czytam o tym problemie z kolejnością inicjalizacji i obejścia są mało ciekawe. Tworzę kilka obiektów na całe życie programu. W mainwindow pozostaje tylko w zasadzie inicjalizacja obiektów, obsługa przycisków i wyświetlania. Cała logika w klasach. Gdzieś te obiekty muszę utworzyć.
  • Odpowiedz
właśnie czytam o tym problemie z kolejnością inicjalizacji i obejścia są mało ciekawe.


@Rasteris: obejście jest bardzo proste. twórz obiekty jako membery, a nie jako globalne, mówię ci to od początku.
  • Odpowiedz
@Rasteris: Kilka podstawowych kwestii, które powinieneś zrozumieć:

1) Plik nagłówkowy i plik modułu (cpp) to z perspektywy kompilatora jedno i to samo. Ten podział jest dla nas - ludzi, aby łatwiej sobie kod organizować.

2) Kompilator, gdy kompiluje plik mainwindow.cpp, to tak na prawdę idzie linia po linii i jak znajdzie #include to w tym miejscu wstawi zawartość pliku include'owanego i skompiluje jak każdy inny kod. Zamiast #include mógłbyś równie dobrze wstawić
  • Odpowiedz