![]() |
Om det här är ditt första besök, se till att gå till vår FAQ (finns även länk till FAQ i navigeringsmenyn ovan). Du kan behöva att registrera dig innan du kan posta (finns även en länk till registrering i navigeringsmenyn ovan). För att titta på inlägg, välj det forum som du vill besöka från de som är listade nedan. |
|
Registrera | Members Area | FAQ | Medlemslista | Community-ware/Modell-shop | Sök | Dagens inlägg | Markera forum som lästa |
![]() |
|
Ämnesverktyg | Visningsalternativ |
|
![]() |
#1 |
Medlem
Reg.datum: Jan 2008
Ort: Uppland, Sverige
Inlägg: 2 728
|
![]()
Båda felen uppstår i dina script, så då måste du ju kunna backtracea dem? Vad finns på och i närheten av raderna 412 och 263 till att börja med? Om du lägger upp hela funktionen SJCabin::Update, samt den där det andra felet uppstår så kan jag titta och se om jag hittar något.
Med tanke på att det är ångtrycksmätaren som slutar att fungera, dividerar du inte några tal med varandra eller skickar in något tal för att uppdatera visaren i hytten? Annars så kan ju själva felen komma från Aurans underliggande kod där man får ett Division by zero exception som man inte hanterar som skickas upp till din nivå och när du inte tar hand om det så kraschar ditt script. Men troligtvis är det du som råkar skicka in en nolla någonstans som Aurans script försöker att dela med. Null pointern är nog lättare att fixa, bara att kolla på raden som kraschade och klura på om någon av pekarna som avrefereras där kan vara null.
__________________
-k- |
![]() |
![]() |
![]() |
#2 |
Medlem
Reg.datum: Jun 2010
Ort: Yxlan, Norrtälje
Inlägg: 1 338
|
![]()
Korvtiger:
Som jag nämnde har jag inte lagt ned så mycket tid på detta, eftersom även andras ånglokshytter kraschar med "divide by zero" => därav min slutsats. MEN: Jag tog mig lite tid nu innan jag sticker iväg med en snabbtitt i koden och rad 412 (Fet stil): if (firebox) { firebox.SetNamedValue("amount-burning-coal", loco.GetEngineParam("coal-mass") / maxCoalMass); if(fire_plates) { firebox.SetNamedValue("door-open", fire_plates.GetValue()); } firebox.SetNamedValue("fire-life", loco.GetEngineParam("fire-temperature") / maxFireTemperature); firebox.SetNamedValue("steam-piston-cycle", loco.GetEngineParam("steam-piston-cycle")); } Mycket riktigt så är det en division och värdet max CoalMass hämtas från maxCoalMass = loco.GetEngineParam("max-coal-mass"); Borde kolla att värdet max-coal-mass är skiljt från 0..........innan jag anropar ovan fetstilta metod! Men: Detta är Aurans egen kod som jag "knyckt" ! |
![]() |
![]() |
![]() |
#3 |
Medlem
Reg.datum: Jan 2008
Ort: Uppland, Sverige
Inlägg: 2 728
|
![]()
(Är inte så jätteinläst på Trainz programkod vad det gäller hur hytter, lok och engines hänger ihop, så du får ursäkta eventuella förvirringar)
Är det här kod som uppdaterar Coal: xxx% som syns i HUDen (alltså bränslemängden på rosten)? Borde inte detta redan skötas av Aurans underliggande kod? När och hur anropas denna kodsnutt? Uppstår felet alltid, eller bara under vissa förutsättningar? Har kört ganska mycket med ånglok i Trainz (TS2010) själv och jag har aldrig upplevt samma fel! Hämtas värdet på maxCoalMass bara en gång när loket initialiseras (alltså att det är en konstant)? Om det är en konstant och det verkar som att den misslyckas med att hämtas ibland med GetEngineParam() så skulle du ju kunna göra en fullösning och definiera detta värde i string-table i configen och parsa det till en float därifrån, eventuellt hämta ut det själv ur engineconfigen (vilket blir mer dynamiskt) genom att slå upp engineconfigens kuid och hämta värdet därur. (Använd [code] -taggar när du citerar programkod här på forumet, så fungerar indenteringen som den ska! ![]()
__________________
-k- Senast redigerad av korvtiger den 2015-02-12 klockan 17:34. |
![]() |
![]() |
![]() |
#4 |
Medlem
Reg.datum: Jun 2010
Ort: Yxlan, Norrtälje
Inlägg: 1 338
|
![]()
Coal xxx % sköts av Aurans bas programvara. Liksom hastighet,vatten och ångtryck.
Ångtrycket och hastigheten kan du läsa av, vilket jag gör. Jag gjorde snabbtest igår kväll och lade in ett villkor: Om "Max-coal-mass" av nån konstig anledning blir 0, vilket bara läses in på ETT ställe, så ersätt detta värde fr.o.m. nu med ett DEFAULT värde. Fungerar. MEN: Då dumpade istället "max-Fire-Temperature". Se några rader längre ned i koden. MÄRK: Dessa 2 variabler är satta i mina engine konfig filer med värde större än 0! Nåväl, nu fungerar det, men roten till det onda är inte löst! Tycker faktiskt att Auran borde ha lagt in spärren med 0 check. Aurans kod kan studeras i skript biblioteket under defaultsteamcabin.gs för eventuell hugad. Ovan ändringar kommer att läggas in i de 3 olika ånglokshytterna, liksom att förarens manometer kommer att visa trycket i ÅNGLÅDAN och inte pannans tryck, som eldaren har till uppgift att läsa av på sin sida. Dessutom kommer lite fler nya funktioner för S1-ans hytt......generator och luftpump funktioner..... |
![]() |
![]() |
![]() |
#5 |
Medlem
Reg.datum: Jan 2008
Ort: Uppland, Sverige
Inlägg: 2 728
|
![]()
Men får du samma fel alla gånger du använder loket, eller bara vissa och gäller felet på samtliga lok som använder denna kod?
Om det händer varje gång så bör du kontrollera att "max-coal-mass" är korrekt stavat där du hämtar ut värdet med getEngineParam(). Kollade i Content Creators Guide för TC3 och där i listan över attribut i engine-configen så finns bara en "max-fire-coal-mass", men på nästa sida i listan över beskrivningar av attributen så finns både "max-fire-coal-mass" och "max-coal-mass", med och beskrivningarna för dem låter ganska likadana. Frågan är om max-coal-mass är obsolete och ersatt av max-fire-coal-mass? Kolla vad det heter i din engine-config. Sedan var det det andra felet, null reference på rad 263, hur ser koden däromkring ut?
__________________
-k- |
![]() |
![]() |
![]() |
#6 |
Medlem
Reg.datum: Jun 2010
Ort: Yxlan, Norrtälje
Inlägg: 1 338
|
![]()
Andra felet och utdrag från koden:
public float whistle_leverH_val; CabinControl whistle_leverH; whistle_leverH = GetNamedControl("whistle_leverH"); //if (whistle_leverH) // whistle_leverH.SetValue(pbcd.whistle_leverH_val); // if (whistle_leverH) // cd.whistle_leverH_val = whistle_leverH.GetValue(); FEL!!!!! Det är alltså farligt att kopiera rakt upp och ned annans kod utan att kolla. MÄRK: 1. Jag har alltså ingen funktion för whistle_leverH i hytten(Config filen), så whistle_leverH värdet borde blitt NULL. 2. Alternativet är ju att låta lokföraren och eldaren få olika signal ljud! Nu har jag emellertid kommenterat bort ovan checker och det fungerar. Summa summarum: 1. Vad jag alltså gjort är att konstatera att om man korrigerar koden så funkar "allt". 2. Detta är inte slutliga lösningen utan bara "en komma runt" eller "ful" lösning. 3. Hytterna ligger på min to-do lista långt ner och då tänkte jag gå till botten med det hela! 4. Dumpen uppstod inte jämnt i den ursprungliga lösningen => Innebär en genomgång av SAMTLIGA engine config filer (Första felet) |
![]() |
![]() |
![]() |
#7 |
Medlem
Reg.datum: Jan 2008
Ort: Uppland, Sverige
Inlägg: 2 728
|
![]()
Ja? Om du inte har någon whistle_leverH så returnerar ju GetNamedControl() null och när du försöker avreferera null så får du null reference exception, precis det som händer! Varför ligger den koden i sådana fall kvar om du inte har någon whistle lever till loken överhuvudtaget?
Varför skulle lokförare och eldare få olika signalljud (vissla)? Man kan väl bara definiera ett ljud i configen? Whistle_levern är ju bara en spak i hytten som man aktiverar samma vissla med, eller? Men detta fel måste ju uppstå alla gånger du kör loket? Lika så det förra!
__________________
-k- |
![]() |
![]() |
![]() |
Ämnesverktyg | |
Visningsalternativ | |
|
|