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-16, 03:12   #1
vovven47
Medlem
 
Reg.datum: Jun 2010
Ort: Yxlan, Norrtälje
Inlägg: 1 338
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   #2
korvtiger
Medlem
 
Reg.datum: Jan 2008
Ort: Uppland, Sverige
Inlägg: 2 728
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   #3
vovven47
Medlem
 
Reg.datum: Jun 2010
Ort: Yxlan, Norrtälje
Inlägg: 1 338
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   #4
korvtiger
Medlem
 
Reg.datum: Jan 2008
Ort: Uppland, Sverige
Inlägg: 2 728
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   #5
vovven47
Medlem
 
Reg.datum: Jun 2010
Ort: Yxlan, Norrtälje
Inlägg: 1 338
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
Gammal 2015-03-02, 10:08   #6
vovven47
Medlem
 
Reg.datum: Jun 2010
Ort: Yxlan, Norrtälje
Inlägg: 1 338
Standard

Jo, jag tog och laddade hem den nuvarande officiella tender hytten bara för att konstatera att den röda indikatorn tänds.
Så var det och dax att krypa in i koden:

Gjort nedan ändringar avseende 1:a felet:
Tar nu hänsyn till 2 input parameterar för att kunna beräkna maxCoalMass:

Kod:
    if((maxCoalMass = loco.GetEngineParam("max-coal-mass")) == 0)
	     maxCoalMass = loco.GetEngineParam("max-fire-coal-mass");
Innnan divisionen, läggs för säkerhets skull in ytterligare en koll, för att undvika 0 division:

Kod:
	 if(maxCoalMass > 0)
	       firebox.SetNamedValue("amount-burning-coal", loco.GetEngineParam("coal-mass") / maxCoalMass);
	    else
               firebox.SetNamedValue("amount-burning-coal", loco.GetEngineParam("coal-mass") / 520); // default värde
Kommentar: kanske nåt för Auran att också göra??



2:a felet.
Hämtade hem den nuvarande aktiva ånglokshytten från "nätet" och fann till min förvåning. att jag under nån editerings process tagit bort H:t i whistle_leverH!!!!!!!!!!!!!!!!!!!
Alltså:

Kod:
if (whistle_lever)        	    
     whistle_leverH.SetValue(pbcd.whistle_leverH_val);
Jag har alltså under nån editerings process tagit bort H:t i whistle_leverH. Otroligt och orsaken till andra felet.

Vidare så har jag tydligen utgått från enligt min config fil:
Code copied mainly from PB15 steam cabin script file
(Kommer själv inte ihåg detta!)
vovven47 besöker inte forumet just nu   Svara med citat
Gammal 2015-03-04, 17:45   #7
korvtiger
Medlem
 
Reg.datum: Jan 2008
Ort: Uppland, Sverige
Inlägg: 2 728
Standard

På det första felet så tror jag nästan att du kan byta ut den koden till bara:
maxCoalMass = loco.GetEngineParam("max-fire-coal-mass");

Har kollat runt på nätet och har knappt hittat något om max-coal-mass annat än i CCG där både den och max-fire-coal-mass finns, som jag nämnt tidigare. Så jag tror att max-coal-mass helt enkelt är en felskrivning och smugit sig in och hängt kvar. Nästan samtliga lok som jag har installerade använde max-fire-coal-mass och om man försöker att skapa en engine-config i Content Creator Plus så finns inte ens max-coal-mass som attribut att lägga till. Jag misstänker därför att det är en felskrivning och om du bara ser till att använda max-fire-coal-mass på alla dina steam-engine-configs så skall det inte vara några problem.

Och din upptäckt förklarar ju det andra felet.
__________________
-k-
korvtiger 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 15:04.


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