Svenska 3D-Tåg - Forum  
 

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.

Gå tillbaka   Svenska 3D-Tåg - Forum > N3V Trainz > Trainz - Downloads

Svara
 
Ämnesverktyg Visningsalternativ
Gammal 2015-02-10, 14:35   #1
goran
Medlem
 
Reg.datum: Dec 2002
Ort: , , .
Inlägg: 109
Standard Sstuck dump ånglok G5

Har laddat ner vovven47:s fina ånglok men har tyvärr lite problem med flera av den..
Tex G5 - får blinkande rödlampa när loket backas med följande text:

SJCabin: Thread Exception: ER_Divide By Zero, line 412, file sjtendersteamcabin.gse(1417)

SJCabin: Thread Exception: ER_null Reference, line 263, file sjtendersteamcabin.gse(1)

Klickar man på "more"-knappen kommer följande text:

Stuck dump: kuid2:448495:50510:1 "SJ Tender lok_interiör"
funktion:§void@SJCabin::Update 0, line -1.

Loket går att köra men rödlampan visar väl att det är något som inte är som det ska......
Går det att åtgärda? tacksam för lite "råd och dåd"
Jag kör Trainz 2010....

Goran
goran besöker inte forumet just nu  
Svara med citat
Gammal 2015-02-11, 02:06   #2
vovven47
Medlem
 
Reg.datum: Jun 2010
Ort: Yxlan, Norrtälje
Inlägg: 1 295
Standard

Citat:
Ursprungligen postat av goran Visa inlägg
Har laddat ner vovven47:s fina ånglok men har tyvärr lite problem med flera av den..
Tex G5 - får blinkande rödlampa när loket backas med följande text:

SJCabin: Thread Exception: ER_Divide By Zero, line 412, file sjtendersteamcabin.gse(1417)

SJCabin: Thread Exception: ER_null Reference, line 263, file sjtendersteamcabin.gse(1)

Klickar man på "more"-knappen kommer följande text:

Stuck dump: kuid2:448495:50510:1 "SJ Tender lok_interiör"
funktion:§void@SJCabin::Update 0, line -1.

Loket går att köra men rödlampan visar väl att det är något som inte är som det ska......
Går det att åtgärda? tacksam för lite "råd och dåd"
Jag kör Trainz 2010....

Goran
Jodå, jag är medveten om detta och gjorde lite efterforskningar för en tid sedan.
Felet gäller även TS12. Vad gäller TS9 så vet jag inte.
Fann ut att även andra ånglokshytter skapade av andra personer fick samma symptom,
så jag drog slutsatsen att problemet ligger i Aurans mjukvara!

Symptomet i mina ånglokshytter är att visaren för ångtryck slutar arbeta, men övriga
funktionaliteter fungerar.


MEN:
Den röda fel indikatorn går EJ att släcka!

Tänkte så småningom lägga in lite nya funktionaliteter i ånglokshytten för S1 och då
tänkte jag samtidigt lägga ned lite mer kräm även på problemet "divide by zero", som tyder
på en divisions problem, vilket jag överhuvudtaget inte använder i mitt hytt skript.
Tyvärr så visar loggen för lite info.......

Så det är bara att åka vidare......och stå ut med röda indikatorn nere i hörnet.
vovven47 besöker inte forumet just nu   Svara med citat
Gammal 2015-02-11, 14:10   #3
goran
Medlem
 
Reg.datum: Dec 2002
Ort: , , .
Inlägg: 109
Standard Stuck dump ånglok G5

Hej Vovven47!
Tack för svaret - då är det "bara å åk" - trodde rödlampan sinkade simulatorn på nåt sätt....

Ett STORT tack för det fina jobbet ni alla gör som tar fram material som vi "vanliga" inte kan bygga MEN får tillgång till!!!!!!

Goran
goran besöker inte forumet just nu   Svara med citat
Gammal 2015-02-11, 23:49   #4
korvtiger
Medlem
 
Reg.datum: Jan 2008
Ort: Uppland, Sverige
Inlägg: 2 716
Standard

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-
korvtiger besöker inte forumet just nu   Svara med citat
Gammal 2015-02-12, 02:27   #5
vovven47
Medlem
 
Reg.datum: Jun 2010
Ort: Yxlan, Norrtälje
Inlägg: 1 295
Standard

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" !
vovven47 besöker inte forumet just nu   Svara med citat
Gammal 2015-02-12, 17:32   #6
korvtiger
Medlem
 
Reg.datum: Jan 2008
Ort: Uppland, Sverige
Inlägg: 2 716
Standard

(Ä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.
korvtiger besöker inte forumet just nu   Svara med citat
Gammal 2015-02-13, 02:45   #7
vovven47
Medlem
 
Reg.datum: Jun 2010
Ort: Yxlan, Norrtälje
Inlägg: 1 295
Standard

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.....
vovven47 besöker inte forumet just nu   Svara med citat
Gammal 2015-02-13, 17:29   #8
korvtiger
Medlem
 
Reg.datum: Jan 2008
Ort: Uppland, Sverige
Inlägg: 2 716
Standard

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-
korvtiger besöker inte forumet just nu   Svara med citat
Gammal 2015-02-14, 03:52   #9
vovven47
Medlem
 
Reg.datum: Jun 2010
Ort: Yxlan, Norrtälje
Inlägg: 1 295
Standard

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)
vovven47 besöker inte forumet just nu   Svara med citat
Gammal 2015-02-15, 18:38   #10
korvtiger
Medlem
 
Reg.datum: Jan 2008
Ort: Uppland, Sverige
Inlägg: 2 716
Standard

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-
korvtiger besöker inte forumet just nu   Svara med citat
Gammal 2015-02-16, 03:12   #11
vovven47
Medlem
 
Reg.datum: Jun 2010
Ort: Yxlan, Norrtälje
Inlägg: 1 295
Standard

Citat:
Ursprungligen postat av korvtiger Visa inlägg
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?

Förstår inte vad du menar!
If satsen kollar om det finns ett kontroll objekt inlagt i Config filen. Om inte skippa
efterföljande sats.
Varför skall man annars ha en if sats på det stället ?
Och som jag skrev:
Det är farligt att kopiera rakt upp och ned annans kod utan att kolla även om det är
uppåt 1000 rader kod.






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?

Det är en väldigt enkel sak att lägga in 2 vissel toner. Varför har detta annars lagts in?




Men detta fel måste ju uppstå alla gånger du kör loket? Lika så det förra!

Ja du, om du kör antingen TS2010 eller TS12 så blir det ideligen RÖTT även från andra objekt.
Dock ingen ursäkt och som jag skrivit så skulle detta rättas till då jag startar
upp nästa hytt version.

Se svar ovan.............
vovven47 besöker inte forumet just nu   Svara med citat
Gammal 2015-02-16, 19:02   #12
korvtiger
Medlem
 
Reg.datum: Jan 2008
Ort: Uppland, Sverige
Inlägg: 2 716
Standard

Förresten, är detta ett generiskt script (alltså ett som används av flera olika loktyper?) Vad jag menar är att om du har ett lok som inte har en whisle_leverH så kan man ju lika gärna plocka bort allt som har med den att göra och spara lite CPU på det, men om det är ett generisk script så kan det ju komma att användas i framtiden, så då kanske du vill ha den koden kvar.

Sedan så har jag tänkt lite till och har kommit fram till detta:
* Du har ingen whistle_leverH i configen, rätt?
* Alltså borde whisle_leverH vara null efter GetNamedControl().
* if(whisle_leverH) verkar vara någon ful C-liknande null-check. (i C är NULL definierad som 0 och 0 är ekvivalent med false, därav att man kan göra så) Det borde innebära att kodraden som null-referensen inträffar på bara körs om whisle_leverH inte är null. Alltså kan whistle_leverH inte vara null!
* Om whistle_leverH hade varit null, så hade dessutom du fått samma null-reference exception på referensen i satsen ovan, whistle_leverH.SetValue(pbcd.whistle_leverH_val), vilket inte är fallet.

Alltså måste detta innebära att whisle_leverH inte är null. Detta i sin tur innebär att det måste vara pekaren cd som är null. Vad är cd av för typ?

Citat:
Ursprungligen postat av vovven47 Visa inlägg
Det är en väldigt enkel sak att lägga in 2 vissel toner. Varför har detta annars lagts in?
För att man har två spakar som kan användas för att aktivera visslan, kanske? De måste ha två unika namn. Vad H står för vet jag dock inte.
__________________
-k-
korvtiger besöker inte forumet just nu   Svara med citat
Gammal 2015-02-17, 02:49   #13
vovven47
Medlem
 
Reg.datum: Jun 2010
Ort: Yxlan, Norrtälje
Inlägg: 1 295
Standard

Citat:
Ursprungligen postat av korvtiger Visa inlägg
Förresten, är detta ett generiskt script (alltså ett som används av flera olika loktyper?) Vad jag menar är att om du har ett lok som inte har en whisle_leverH så kan man ju lika gärna plocka bort allt som har med den att göra och spara lite CPU på det, men om det är ett generisk script så kan det ju komma att användas i framtiden, så då kanske du vill ha den koden kvar.
Kommer att plockas bort!

Sedan så har jag tänkt lite till och har kommit fram till detta:
* Du har ingen whistle_leverH i configen, rätt?
Riktigt!
* Alltså borde whisle_leverH vara null efter GetNamedControl().
Riktigt!
* if(whisle_leverH) verkar vara någon ful C-liknande null-check. (i C är NULL definierad som 0 och 0 är ekvivalent med false, därav att man kan göra så) Det borde innebära att kodraden som null-referensen inträffar på bara körs om whisle_leverH inte är null. Alltså kan whistle_leverH inte vara null!
?????
Kommer att kolla när den tiden kommer

OBS!!!!:
Aurans alla kontroller i defaultcabin.gs bygger på denna metod.

Bara ett litet utdrag från Aurans egen kod:

fire_plates = GetNamedControl("fire_plates");
left_window = GetNamedControl("left_window");
right_window = GetNamedControl("right_window");
left_sliding_window = GetNamedControl("left_sliding_window");
right_sliding_window = GetNamedControl("right_sliding_window");
seat0 = GetNamedControl("seat0");
seat1 = GetNamedControl("seat1");
sanding_lever = GetNamedControl("sanding_lever");
whistle_lever = GetNamedControl("whistle_lever");
blowdown_lever = GetNamedControl("blowdown_lever");


if(fire_plates)
fire_plates.SetValue(pbcd.fire_plates_val);
if(left_window)
left_window.SetValue(pbcd.left_window_val);
if(right_window)
right_window.SetValue(pbcd.right_window_val);
if(left_sliding_window)
left_sliding_window.SetValue(pbcd.left_sliding_win dow_val);
if(right_sliding_window)
right_sliding_window.SetValue(pbcd.right_sliding_w indow_val);
if(seat0)
seat0.SetValue(pbcd.seat0_val);
if(seat1)
seat1.SetValue(pbcd.seat1_val);
if(sanding_lever)
sanding_lever.SetValue(pbcd.sanding_lever_val);
if(whistle_lever)
whistle_lever.SetValue(pbcd.whistle_lever_val);
if(regulator_lever)
regulator_lever.SetValue(pbcd.regulator_lever_val) ;
if(blowdown_lever)
blowdown_lever.SetValue(pbcd.blowdown_lever_val);


* Om whistle_leverH hade varit null, så hade dessutom du fått samma null-reference exception på referensen i satsen ovan, whistle_leverH.SetValue(pbcd.whistle_leverH_val), vilket inte är fallet.
Kommer att kollas!

Alltså måste detta innebära att whisle_leverH inte är null. Detta i sin tur innebär att det måste vara pekaren cd som är null. Vad är cd av för typ?

Från Aurans defaultcabin.gs:

DefaultSteamCabinData cd = cast<DefaultSteamCabinData>(loco.GetCabinData());
if (cd)
UpdateCabinFromSavedData(cd);
else
{
cd = CreateCabinSavedData();
loco.SetCabinData(cd);
}

maxCoalMass = loco.GetEngineParam("max-coal-mass");
maxFireTemperature = loco.GetEngineParam("max-fire-temperature");


För att man har två spakar som kan användas för att aktivera visslan, kanske?
Riktigt!
De måste ha två unika namn. Vad H står för vet jag dock inte.
Inte jag heller!

Se svaren ovan.........
vovven47 besöker inte forumet just nu   Svara med citat
Gammal 2015-02-18, 18:42   #14
korvtiger
Medlem
 
Reg.datum: Jan 2008
Ort: Uppland, Sverige
Inlägg: 2 716
Thumbs up

Jo, men då måste det vara null-checks, vilket är helt korrekt att använda där då det är en generisk scriptfil som ska kunna användas även på lok som inte har de olika delarna (fire_plates, left_window ... etc.. ).

Kod:
DefaultSteamCabinData cd = cast<DefaultSteamCabinData>(loco.GetCabinData());
if (cd)
    UpdateCabinFromSavedData(cd);
else
{
   cd = CreateCabinSavedData();
   loco.SetCabinData(cd);
}
Men då är någonting väldigt skumt. Om denna koden är den som ditt script använder, så kan inte cd vara null! För först försöker man hämta sparad CabinData och om den visar sig vara null (= det finns ingen sparad data) så skapas en ny sådan och kopplas till loket.
Det enda misstaget som jag kan tänka på såhär, utan att få se hela koden är om din kod ärver denna kod från klassen DefaultCabin(ev. via DefaultStreamCabin) och override:ar den metoden som koden oven ligger i. Är så fallet? Kolla då att du anropar superklassens metod överst i den overridade metoden, annars så körs inte den koden, vilket skulle förklara att cd är null, då den aldrig initialiseras. Vill minnas att anrop till superklasses metod heter inherited(); i Trainz scriptspråk, eventuellt inherited.methodName().

Får du samma scriptfel på Aurans ånglok? För själv har jag aldrig upplevt liknande fel på Aurans lok. (kör TS2010 44088)
__________________
-k-
korvtiger besöker inte forumet just nu   Svara med citat
Gammal 2015-02-19, 02:25   #15
vovven47
Medlem
 
Reg.datum: Jun 2010
Ort: Yxlan, Norrtälje
Inlägg: 1 295
Standard

Korvtiger:
Då du verkar så insatt i kodningen så LOVAR jag att gå till botten vad som är felet!

Jodå, även andra ånglok har fått RÖD felindikation med andra hytter, men jag noterade bara detta. Kom ej ihåg vad för ånglok........
vovven47 besöker inte forumet just nu   Svara med citat
Svara


Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av
Forumhopp



Alla tider är GMT +2. Klockan är nu 13:04.


Powered by vBulletin® Version 3.7.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
© Svenska 3D-Tåg 2001-2009