Wpis z mikrobloga

#programowanie #delphi #pomocy

mam kolejny problem dotyczący programowania w delphi, od razu zaznaczę że jeśli chodzi o programowanie to jestem likiem i tak wiem nie programuje się w delphi. Niestety nie mam w tej chwili jak podesłać kodu, ale może opiszę swój problem. Mam program którym liczy mi charakterystyki i osiągi samolotu (do programu wprowadzam odpowiednie dane geometryczne). Program dla tych danych liczy bez zarzutu wszytko co potrzebuję. Problem pojawia się jak postanowiłem dopisać procedurę która optymalizowałby moje zmienne decyzyjne (czyli wybrała takie dane geometryczne, aby samolot był optymalne względem jakiegoś przeze mnie wybranego kryterium i spełniał ograniczenia). Zmienne te są losowane funkcją random i odpowiednio przemnażane, aby otrzymać wartość pomiędzy min i max wartości jaką podaję ja na początku programu (random losuje tylko w zakresie [0,1]). W momencie uruchomienia procedury przy którejś iteracji program się wysypuję wyrzucając błąd "invalid floating point operation". Czy taki błąd może być tym spowodowany, że wartości min i max zmiennych nie mają narzuconego przez ze mnie typu tzn są przypisawane w ten sposób np. Edit1.Text:='0'; ? bo w gołym programie (bez optymalizacji) miałem każda zmienna przypisaną do edita i każda z tych zmiennych miała określony typ. W moim przypadku wszystkie zmienne są typu real (zaszalałem, pewnie niepotrzebnie, najwyżej potem to zmienie) no i oczywiście do pętli mam zmienne integer.
  • 19
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

mam kolejny problem dotyczący programowania w delphi, od razu zaznaczę że jeśli chodzi o programowanie to jestem likiem i tak wiem nie programuje się w delphi.

Niestety nie mam w tej chwili jak podesłać kodu, ale może opiszę swój problem. Mam program którym liczy mi charakterystyki i osiągi samolotu (do programu wprowadzam odpowiednie dane geometryczne).

Program dla tych danych liczy bez zarzutu wszytko co potrzebuję. Problem pojawia się jak postanowiłem dopisać procedurę
  • Odpowiedz
W momencie uruchomienia procedury przy którejś iteracji program się wysypuję wyrzucając błąd "invalid floating point operation".


@mucha100a: Brzmi tak jakbyś gdzieś w działaniach dzielił cokolwiek przez wartość otrzymaną losowo, a ta wartość akurat była równa zero. Lub nan. Lub inf.
  • Odpowiedz
@KrzaQ2: @japer: ale tak jak napisałem powyżej goły program dobrze wszystko liczy nie wysypuje się i daję wyniki takie jakie powinny być, zmienne które podstawiam mają realne wartości nie ma tam np powierzchni S=0 np. Smin=8, Smax =14 i z tego zakresu random sobie losuje i wstawia wartość która jednak powoduje powyższy błąd
  • Odpowiedz
@KrzaQ2: jest, ale trochę nie rozumiem jak działa, w miejscu w którym się wysypie program jak najdę kursorem na zmienną globalną to widzę jej wartość, ale zmiennych lokalnych już niestety nie
  • Odpowiedz
@KrzaQ2: no nic jak wrócę do domu to popróbuje, dzięki za pomoc, czyli raczej nie jest to wina tego, że moje zmienne nie mają określonego typu tzn mają taki jak ma domyślnie Edit ?
  • Odpowiedz
@mucha100a: spróbuj uruchomić w trybie debug i poustawiać breakpointy (pewnie pokażą się jako kropki obok nr linii kodu)... jak program na nie trafi zapoznaj się z działaniem poeksperymentuj z poleceniami z menu run/debug typu step in/out/next itd... Jak odkryjesz jak to działa - odpluskwianie programu stanie się dużo prostsze ;) Ewentualnie do podglądu zmiennych masz okienko "Watch"
  • Odpowiedz
@mucha100a: w takim razie wypisuj gdzieś wartości swojego iteratora i sprawdź na jakiej się wywali, a potem zaczaruj tak, żeby debugować tylko tą wadliwą... ewentualnie popatrz czy delphi nie pozwala na wyrzucenie wyjątku i przechwycenie go (throw + try...catch) - tak będzie najłatwiej zareogować na błąd ;)
  • Odpowiedz
@mucha100a: Jest jeszcze opcja random

int (czy inny typ) random ( void ){ retutn 9; };

I tak zmieniasz swojego randoma aż wyrzuci Ci ten sam błąd.

Albo otwórz plik tekstowy i zapisuj wartości zmienianej zmiennej dla określonej iteracji czy cały zestaw danych - za każdym razem otwórz plik i po zapisaniu zamknij - będzie to działało wolno ale zobaczysz w zasadzie ostatni poprawny zestaw danych - coś pewnie będzie
  • Odpowiedz
@Analityk: dzięki za podpowiedź, znalazłem miejsce w którym się wysypuje jest to wzór w którym w mianowniku równania jest tangens od jakiejś wartości, jak przypisze na stałe mu jakąś wartość to się nie wysypuje.

Jak pozwolę, żeby zmienne były losowane zdarza się, że program wysypuje się w tym miejscu.

Ale co ciekawe jak próbuje mu podstawić pi/2 to działa, jak przypiszę mu 0 to wyrzuca dividing by zero, a nie
  • Odpowiedz
@KrzaQ2: @Analityk: @ppawel: wielkie dzięki za pomoc, dobrze wiedzieć, że są ludzie którzy chcą poświęcić swój czas i pomóc chyba udało mi się doprowadzić program do końca tak jak pisałem wcześniej błąd leżał w tangensie, żeby się już z tym nie bawić wyrzuciłem tangensa

  • Odpowiedz