2791
Na warsztacie / Odp: Odp: Exe - konwersja na C++
« dnia: 19 Stycznia 2017, 22:10:05 »
Ja tez bylem kiedys mlody i mialem dobre oczy. ;d
Ta sekcja pozwala Ci zobaczyć wszystkie wiadomości wysłane przez tego użytkownika. Zwróć uwagę, że możesz widzieć tylko wiadomości wysłane w działach do których masz aktualnie dostęp.
Tak czy siak jak zaciągniesz zmiany to będzie trzeba poprawić, a w tym co zrobiłeś to chyba się lepiej orientujesz. Z pierwszego rzutu oka to nie wiem po co usuwasz inicjację zmiennych w hamulcach.Inicjacja jest teraz wpisana bezposrednio w definicji zmiennych w naglowku, wiec to, co bylo w konstruktorze to tylko (wolniejszy) duplikat. Trudniej w ten sposob przeoczyc brak inicjalizacji.
Coś zepsułeś w hamulcach, gdyż po narzuceniu twoich zmian z pull-a znowu nie ma ciśnienia w cylindrach hamulcowych po starcie TD a powinno być. Mnie już naprawdę nie chce się tego szukać n-ty raz. Hamulce działają na wersji c3 i tak powinno zostać.Masz na mysli to, co jest wlaczone do twojej wersji, czy to co dodalem u siebie ostatnio? Jesli to pierwsze to nie wiem czy to moja wina, bo akurat hamulcow w tej wersji patcha nie dotykalem :) (dodalem mu tam #pragma once i tyle) Natomiast w niektorych hamulcach bylo wtedy jeszcze pare niezainicjalizowanych zmiennych, wiec byc moze to jest przyczyna tego zachowania. To jest poprawione w uaktualnieniu ktore wrzucilem pozniej, tutaj na 99% inicjalizuje wszystkie zmienne tak, jak by to robil Borland, wiec powinno pomoc, a nie zaszkodzic (chociaz moze tez pomoc w uaktywnieniu bledow ktore sa gdzie indziej, a do tej pory byly maskowane przez brak inicjalizacji)
Kiedyś stojąc w Psim Polu na boku policzyłem mu trójkąty. 72. :) Lowpoly tego mojego będzie nowe, nie ma co robić sobie jaj.O przepraszam, w 2003 to bylo high quality, a nie low poly ;)
tmj, możesz też podrzucić solucję. Chcę mieć pewność, że czegoś nie zwaliłem podczas już lat pracy na dwóch środowiskach i 3 różnych wersjach VS. Jakąś zresztą będzie trzeba wrzucić na git-a.Dolaczam ta, ktorej uzywam, chociaz pewnie trzeba bedzie poprawic sciezke (skonfigurowany jest zeby ciagnac dsound.lib z instalacji directX SDK)
// basic fail conditions:
if( ( CabNo == 0 )
|| ( MainCtrlPosNo <= 0 ) ) {
// nie ma sterowania
return false;
}
if( ( TrainType == dt_ET22 ) && ( ScndCtrlPos != 0 ) ) {
// w ET22 nie da siê krêciæ nastawnikiem przy w³¹czonym boczniku
return false;
}
if( ( TrainType == dt_EZT ) && ( ActiveDir == 0 ) ) {
// w EZT nie da siê za³¹czyæ pozycji bez ustawienia kierunku
return false;
}
bool OK = false;
if (MainCtrlPos < MainCtrlPosNo)
{
switch( EngineType ) {
case None:
case Dumb:
case DieselElectric:
case ElectricInductionMotor:
{
if( CtrlSpeed > 1 ) {
OK = ( IncMainCtrl( 1 )
&& IncMainCtrl( CtrlSpeed - 1 ) ); // a fail will propagate up the recursion chain. should this be || instead?
}
else {
++MainCtrlPos;
OK = true;
}
break;
}
case ElectricSeriesMotor:
{
if( ActiveDir == 0 ) { return false; }
if( CtrlSpeed > 1 ) {
// szybkie przejœcie na bezoporow¹
if( TrainType == dt_ET40 ) {
break; // this means ET40 won't react at all to fast acceleration command. should it issue just IncMainCtrl(1) instead?
}
while( ( RList[ MainCtrlPos ].R > 0.0 )
&& IncMainCtrl( 1 ) ) {
// all work is done in the loop header
;
}
// OK:=true ; {takie chamskie, potem poprawie} <-Ra: kto mia³ to
// poprawiæ i po co?
if( ActiveDir == -1 ) {
while( ( RList[ MainCtrlPos ].Bn > 1 )
&& IncMainCtrl( 1 ) ) {
--MainCtrlPos;
}
}
OK = false; // shouldn't this be part of the loop above?
}
else { // CtrlSpeed == 1
++MainCtrlPos;
OK = true;
if( Imax == ImaxHi ) {
if( RList[ MainCtrlPos ].Bn > 1 ) {
if( true == MaxCurrentSwitch( false )) {
// wylaczanie wysokiego rozruchu
SetFlag( SoundFlag, sound_relay );
}
if( TrainType == dt_ET42 ) {
--MainCtrlPos;
OK = false;
}
}
}
if( ActiveDir == -1 ) {
if( ( TrainType != dt_PseudoDiesel )
&& ( RList[ MainCtrlPos ].Bn > 1 ) ) {
// blokada wejœcia na równoleg³¹ podczas jazdy do ty³u
--MainCtrlPos;
OK = false;
}
}
}
if( ( TrainType == dt_ET42 ) && ( true == DynamicBrakeFlag ) ) {
if( MainCtrlPos > 20 ) {
MainCtrlPos = 20;
OK = false;
}
}
// return OK;
break;
}
case DieselEngine:
{
if( CtrlSpeed > 1 ) {
while( MainCtrlPos < MainCtrlPosNo ) {
IncMainCtrl( 1 );
}
}
else {
++MainCtrlPos;
if( MainCtrlPos > 0 ) { CompressorAllow = true; }
else { CompressorAllow = false; }
}
OK = true;
break;
}
case WheelsDriven:
{
OK = AddPulseForce( CtrlSpeed );
break;
}
} // switch EngineType of
}
else {// MainCtrlPos>=MainCtrlPosNo
if( true == CoupledCtrl ) {
// wspólny wa³ nastawnika jazdy i bocznikowania
if( ScndCtrlPos < ScndCtrlPosNo ) { // 3<3 -> false
++ScndCtrlPos;
OK = true;
}
else {
OK = false;
}
}
}
konkretnie to kawalek if( ActiveDir == -1 ) bo tam jednoczesnie zwieksza ciag o 1 uzywajac wywolanie IncMainCtrl(1) i zaraz w tej samej petli zmniejsza o 1, co wydaje sie troche bez sensu..? Aha, i jeszcze to, ze blok dla CtrSpeed > 1 zawsze zwraca false. Nie powinno to byc ograniczone tylko to pod-bloku ActiveDir == -1, tak jak w pozostalych miejscach?
Kontrola nastawnika jest, jeśli pojazd nie jest et22 lub jest et22 z bocznikiem na pozycji 0.Czyli ujmujac to inaczej, jesli pociag to ET22 z bocznikiem na pozycji innej niz neutralna, to kontroli nie ma? Zmienilem zapis na
if( false == (( TrainType == dt_ET22 ) && ( ScndCtrlPos != 0 )) ) {
...
}
wychodzi na to samo, ale z malym rozumkiem troche latwiej to ogarnac :) if ((TrainType != dt_ET22) ||
((TrainType == dt_ET22) &&
(ScndCtrlPos ==
0))) // w ET22 nie da siê krêciæ nastawnikiem przy w³¹czonym boczniku
Redundant condition: TrainType==dt_ET22. 'TrainType!=dt_ET22 || (TrainType==dt_ET22 && ScndCtrlPos==0)' is equivalent to 'TrainType!=dt_ET22 || ScndCtrlPos==0'
czyli warunek bedzie spelniony zawsze, gdy ScndCTrlPos = 0 albo gdy pociag nie jest typu ET22. Sadzac po komentarzu to nie jest dokladnie to, co autor mial na mysli, ale nie wiem co dokladnie autor mial na mysli, wiec wolalem nie ruszac... ale to prawdopodobnie przyczyna dlaczego sterowanie nie jest calkiem takie, jak powinno byc.
Czyli kwestia tego, że mamy bardzo dużo słów kluczowych definiujących elementy taboru. Wiem, naleciałość z czasów, kiedy jedynym dostępnym edytorem do MaSzyny był zwykły edytor tekstu. A próbował ktoś kompilatora GNU? Może to ograniczenie dotyczy tylko kompilatora ze stajni M$?Inne kompilatory powinny sobie poradzic, standardowo limit to 256 tego typu blokow. Tak czy owak nie ma to juz znaczenia, rozbilem funkcje na pare blokow i chodzi, a w przyszlosci mozna to w ogole zautomatyzowac, np budujac w locie tabele elementow z otrzymanych typow/nazw, zamiast kodowania na sztywno.
(..)
else if (str == AnsiString("mainctrlact:")) // zabek pozycji aktualnej
ggMainCtrlAct.Load(Parser, DynamicObject->mdKabina);
else if (str == AnsiString("scndctrl:")) // bocznik
ggScndCtrl.Load(Parser, DynamicObject->mdKabina);
else if (str == AnsiString("dirkey:")) // klucz kierunku
ggDirKey.Load(Parser, DynamicObject->mdKabina);
(..)
i tak jeszcze ze 100 razy. Tego sie nie da za bardzo wprost przerobic na switch() bo switch musi miec stale wartosci (czyli int albo enum, tak jak mowisz) i nie lyka w takiej sytuacji wyszukiwania przypadku wg stringa. Tzn mozna by sie pewnie bawic z jakas tabela konwersji string->enum i zrobic switch() dla tych konwertowanych wartosci, ale to jest troche pisania bez gwarancji, ze i tak nie wyskoczy mu ten sam limit. To w takiej sytuacji wole to na razie zostawic, a przerobic mozna potem raz a porzadnie.
Ładnie, proszę Cię, całość jest do refaktoringu. Ale po kolei. Ci którzy chcieli pisać wszystko na nowo kończyli smętnie.Nie no bez przesady, ja nie planuje tutaj nic dotykac w samej strukturze. Probuje tylko doprowadzic do kompilacji w VC to, co jest. Na razie sprowadza sie to do parsera, stringow i usuniecia odwolan do pozostalych resztek po Borlandzie. Tylko mowie, ze zostalo tego troche wiecej niz mialem nadzieje, ze bedzie; ale trudno :)
Przy okazji zerknąłem na kod pod kątem kompilacji w VS i jest tam jeszcze troszkę rzeczy do poprawieniaTo jest delikatnie powiedziane :) Zajrzalem tam sobie dzisiaj, i niestety na samym wycieciu parsera sie nie skonczy, sporo tam jeszcze sie paleta ansistringow, borlandowych naglowkow i innych takich. Ale jak juz zaczalem grzebac, to skoncze (chociaz ladnie jeszcze nie bedzie, na to przyjdzie czas pozniej)
Zainicjuj zmienną małą wartością, np, 2.3e-5. Potem dziel ją powoli przez jakieś 50, najlepiej tak żeby kompilator nie mógł sobie tego policzyć przed uruchomieniem programu i tak ze 100 razy. Powiedz jaki jest wynik w C#.visual c++ 2013
double x = 2.3e-5;
for( int i = 0; i < 100; ++i ) {
x /= 50.0;
assert( x == x );
}
przy typie double x = 2.9155963805249270e-175C++ to przeżytek na miarę Internet Explorera! Nie wiem czy nie da się tego zrobić w C++ tak, żeby obliczenia i ich wyniki były jasne dla osoby, która rozumie samą matematykę w nich użytą. Jeśli tak, to będzie trzeba tak to przerobić. Jeśli nie, to chyba warto pomyśleć o języku, w którym 2+2 zawsze jest 4, a idiotyczne i niebezpieczne konwersje typów będą odrzucane przez kompilator.Idiotyczne i niebezpieczne konwersje typow zawsze generuja ostrzezenia. Jak ktos chce, to moze sobie wlaczyc zasade, ze ostrzezenie = blad, i kompilacja nie pojdzie. Tyle, ze w kodzie maszyny ostrzezen jest pewnie tyle, ze usuwanie ich potrwaloby do przyszlej wiosny. Takich rzeczy trzeba pilnowac i usuwac je na biezaco, inaczej to sie szybko nawarstwia.
v1 = w1 * sqrt(1 - beta); // niejawna zmiana predkosci wskutek zderzenia
v2 = w2 * sqrt(1 - beta);
Nie ma tu zadnego zabezpieczenia przed sytuacja gdzie beta > 1 i nie zdziwilbym sie, gdyby wyszlo ze wywolanie z CollisionDetect() produkuje takie wlasnie wartosci od czasu do czasu, takie rzeczy jak Couplers[CouplerN].Connected->Couplers[Couplers[CouplerN].ConnectedNr].beta az prosza sie o klopot, i omylkowe czytanie danych z miejsc, gdzie zadnych danych nie ma :)