Visa ett inlägg
Gammal 2015-02-17, 02:49   #13
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