[solved] aplikacja Qt GUI - "upływ" danych?
-
Zamiana lini nic nie daje.
Jeśli skasuję linię 38 to już przy próbie pierwszego sortowanie program się wiesza.
Dzięki za pomoc :) -
Zwracanie wskaźników przez funkcję to śliska rzecz, naprawdę ;]
funkcja wyszukaj_poprzedni może zwrócić NULL a Ty sobie beztrosko linijkę dalej wywołujesz:
@poprzedni->next = max->next;@
albo
@poprzedni->next = NULL;@
Wypadaloby w każdym przypadku sprawdzić czy przypadkiem wskaźnik nie jest nullem, a ryzyko crasha się zminimalizuje.
-
Dlaczego zwracanie wskaźników przez funckję to śliska rzecz? Jak robić to inaczej?
Poprawiłem, teraz wygląda to tak:
@Lista * sortuj_rosnaco(Lista * akt_lst, int pole){
Lista * max, *poczatek, *tmp_poczatek, *poprzedni;
int ten_sam;
max = akt_lst;
poczatek = akt_lst;
tmp_poczatek = akt_lst;while(tmp_poczatek->next!=NULL){ max = tmp_poczatek; akt_lst = tmp_poczatek; ten_sam = 1; while (akt_lst!=NULL){ if (porownaj_elementy(max, akt_lst, pole)==1){ max = akt_lst; ten_sam--; } akt_lst = akt_lst->next; } if (ten_sam == 1){ if(tmp_poczatek != poczatek){ tmp_poczatek = tmp_poczatek->next; poprzedni = wyszukaj_poprzedni(poczatek, max); //wyciagnac max if (poprzedni!=NULL){ // tutaj zmiana nr 1 poprzedni->next = max->next; // zalatac dziure max->next = poczatek; // wstawienie na poczatek poczatek = max; // zapisanie nowego poczatku } }else{ tmp_poczatek = tmp_poczatek->next; } }else{ poprzedni = wyszukaj_poprzedni(poczatek, max); //wyciagnac max if (poprzedni!=NULL){ // tutaj zmiana nr 2 poprzedni->next = max->next; // zalatac dziure max->next = poczatek; // wstawienie na poczatek poczatek = max; // zapisanie nowego poczatku } } } // trick dla wstawienia ostatniego na poczatek poprzedni = wyszukaj_poprzedni(poczatek,tmp_poczatek); if (poprzedni!=NULL) {// tutaj zmiana nr 1 poprzedni->next = NULL; tmp_poczatek->next = poczatek; poczatek = tmp_poczatek; } return poczatek;
}@
Niestety program dalej nie działa poprawnie... -
bq. Dlaczego zwracanie wskaźników przez funckję to śliska rzecz? Jak robić to inaczej?
Właśnie dlatego że wszędzie trzeba później sprawdzać poprawność wskaźnika, inaczej to można zwracać referencję do obiektu.
Odapliłem Twój program i jest crash hell, cokolwiek nie kliknę to wywala się apka ;]
Chociażby w tym miejcu:
@ if (el1->nazwa >= el2->nazwa) @Dobrze by było jakbyś zapoznał się ze standardowymi kontenerami np. "QList":http://qt-project.org/doc/qt-4.8/qlist.html, bo Twoja implementacja listy to po pierwsze odkrywanie koła na nowo, a po drugie to zamota ze wskaźnikami powoduje totalny brak stabilności.
-
bq. Odapliłem Twój program i jest crash hell, cokolwiek nie kliknę to wywala się apka ;]
Jeśli nie poda się prawidłowej ścieżki do zdjęć to program się wywala od razu. A dane poprawnie odczytywać będzie chyba tylko z 40D.
bq. Dobrze by było jakbyś zapoznał się ze standardowymi kontenerami np. QList [qt-project.org], bo Twoja implementacja listy to po pierwsze odkrywanie koła na nowo, a po drugie to zamota ze wskaźnikami powoduje totalny brak stabilności.
Chyba wchodzimy na zbyt wysoki poziom. :) Nie ma już czasu na przebudowanie całego projektu, może uda się znaleźć jeszcze błąd. W aplikacji konsolowej wszystko działało.
-
Udało mi się naprawić program. Błąd był zupełnie gdzie indziej, wystarczyło dopisać jedną linijkę.
Mam jeszcze pytanie. Czy da się zrobić i czy dużo jest roboty z tym, aby użytkownik wybierał lokalizację z wykorzystaniem czegoś w rodzaju menadżera windowsa? Tak jak podaję się lokalizację do zainstalowania w programach.
Dzięki za pomoc :)
-
Czy chodzi Ci o wybieranie ścieżki (folderu) lub pliku? Jeśli tak, to "QFileDialog":http://qt-project.org/doc/qt-5.0/qtwidgets/qfiledialog.html.
-
O coś takiego mi chodziło. Jak znajdę chwilę czasu to postaram się dołożyć. Dziękuję serdecznie!
-
Powodzenia. Pamiętaj, aby w temacie dopisać w nazwie "[solved]" na znak rozwiązania problemu - rozumiem, że upływu danych już nie ma. :-)
-
Nie, nie ma. Miałem błąd w module mainwindow. Wywołując funkcję sortującą przekazywałem zawsze ten sam wskaźnik, tak więc stopniowo ginęły dane, które były wcześniej na liście dynamicznej. Dopisanie linijki załatwiło sprawę. Później usunąłem tą i kilka innych linijek, zmieniłem nazwę wskaźnika na inny (prawdłowy) i śmiga aż miło. Dziękuję raz jeszcze. :)