Skip to content

Commit

Permalink
Always set useDefault to false when calling SGPropertyNode::tie()
Browse files Browse the repository at this point in the history
See issue #363: setting `useDefault` to true is equivalent to have uninitialized variables.
  • Loading branch information
bcoconni committed Apr 30, 2021
1 parent 9a01cea commit b477f63
Show file tree
Hide file tree
Showing 12 changed files with 95 additions and 152 deletions.
10 changes: 5 additions & 5 deletions src/FGFDMExec.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -155,17 +155,17 @@ FGFDMExec::FGFDMExec(FGPropertyManager* root, unsigned int* fdmctr)

Constructing = true;
typedef int (FGFDMExec::*iPMF)(void) const;
instance->Tie("simulation/do_simple_trim", this, (iPMF)0, &FGFDMExec::DoTrim, false);
instance->Tie("simulation/reset", this, (iPMF)0, &FGFDMExec::ResetToInitialConditions, false);
instance->Tie("simulation/do_simple_trim", this, (iPMF)0, &FGFDMExec::DoTrim);
instance->Tie("simulation/reset", this, (iPMF)0, &FGFDMExec::ResetToInitialConditions);
instance->Tie("simulation/disperse", this, &FGFDMExec::GetDisperse);
instance->Tie("simulation/randomseed", this, (iPMF)&FGFDMExec::SRand, &FGFDMExec::SRand, false);
instance->Tie("simulation/randomseed", this, (iPMF)&FGFDMExec::SRand, &FGFDMExec::SRand);
instance->Tie("simulation/terminate", (int *)&Terminate);
instance->Tie("simulation/pause", (int *)&holding);
instance->Tie("simulation/sim-time-sec", this, &FGFDMExec::GetSimTime);
instance->Tie("simulation/dt", this, &FGFDMExec::GetDeltaT);
instance->Tie("simulation/jsbsim-debug", this, &FGFDMExec::GetDebugLevel, &FGFDMExec::SetDebugLevel);
instance->Tie("simulation/frame", (int *)&Frame, false);
instance->Tie("simulation/trim-completed", (int *)&trim_completed, false);
instance->Tie("simulation/frame", (int *)&Frame);
instance->Tie("simulation/trim-completed", (int *)&trim_completed);
instance->Tie("forces/hold-down", this, &FGFDMExec::GetHoldDown, &FGFDMExec::SetHoldDown);

Constructing = false;
Expand Down
123 changes: 41 additions & 82 deletions src/initialization/FGInitialCondition.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1450,80 +1450,61 @@ void FGInitialCondition::bind(FGPropertyManager* PropertyManager)
{
PropertyManager->Tie("ic/vc-kts", this,
&FGInitialCondition::GetVcalibratedKtsIC,
&FGInitialCondition::SetVcalibratedKtsIC,
true);
&FGInitialCondition::SetVcalibratedKtsIC);
PropertyManager->Tie("ic/ve-kts", this,
&FGInitialCondition::GetVequivalentKtsIC,
&FGInitialCondition::SetVequivalentKtsIC,
true);
&FGInitialCondition::SetVequivalentKtsIC);
PropertyManager->Tie("ic/vg-kts", this,
&FGInitialCondition::GetVgroundKtsIC,
&FGInitialCondition::SetVgroundKtsIC,
true);
&FGInitialCondition::SetVgroundKtsIC);
PropertyManager->Tie("ic/vt-kts", this,
&FGInitialCondition::GetVtrueKtsIC,
&FGInitialCondition::SetVtrueKtsIC,
true);
&FGInitialCondition::SetVtrueKtsIC);
PropertyManager->Tie("ic/mach", this,
&FGInitialCondition::GetMachIC,
&FGInitialCondition::SetMachIC,
true);
&FGInitialCondition::SetMachIC);
PropertyManager->Tie("ic/roc-fpm", this,
&FGInitialCondition::GetClimbRateFpmIC,
&FGInitialCondition::SetClimbRateFpmIC,
true);
&FGInitialCondition::SetClimbRateFpmIC);
PropertyManager->Tie("ic/gamma-deg", this,
&FGInitialCondition::GetFlightPathAngleDegIC,
&FGInitialCondition::SetFlightPathAngleDegIC,
true);
&FGInitialCondition::SetFlightPathAngleDegIC);
PropertyManager->Tie("ic/alpha-deg", this,
&FGInitialCondition::GetAlphaDegIC,
&FGInitialCondition::SetAlphaDegIC,
true);
&FGInitialCondition::SetAlphaDegIC);
PropertyManager->Tie("ic/beta-deg", this,
&FGInitialCondition::GetBetaDegIC,
&FGInitialCondition::SetBetaDegIC,
true);
&FGInitialCondition::SetBetaDegIC);
PropertyManager->Tie("ic/theta-deg", this,
&FGInitialCondition::GetThetaDegIC,
&FGInitialCondition::SetThetaDegIC,
true);
&FGInitialCondition::SetThetaDegIC);
PropertyManager->Tie("ic/phi-deg", this,
&FGInitialCondition::GetPhiDegIC,
&FGInitialCondition::SetPhiDegIC,
true);
&FGInitialCondition::SetPhiDegIC);
PropertyManager->Tie("ic/psi-true-deg", this,
&FGInitialCondition::GetPsiDegIC,
&FGInitialCondition::SetPsiDegIC,
true);
&FGInitialCondition::SetPsiDegIC);
PropertyManager->Tie("ic/lat-gc-deg", this,
&FGInitialCondition::GetLatitudeDegIC,
&FGInitialCondition::SetLatitudeDegIC,
true);
&FGInitialCondition::SetLatitudeDegIC);
PropertyManager->Tie("ic/long-gc-deg", this,
&FGInitialCondition::GetLongitudeDegIC,
&FGInitialCondition::SetLongitudeDegIC,
true);
&FGInitialCondition::SetLongitudeDegIC);
PropertyManager->Tie("ic/h-sl-ft", this,
&FGInitialCondition::GetAltitudeASLFtIC,
&FGInitialCondition::SetAltitudeASLFtIC,
true);
&FGInitialCondition::SetAltitudeASLFtIC);
PropertyManager->Tie("ic/h-agl-ft", this,
&FGInitialCondition::GetAltitudeAGLFtIC,
&FGInitialCondition::SetAltitudeAGLFtIC,
true);
&FGInitialCondition::SetAltitudeAGLFtIC);
PropertyManager->Tie("ic/terrain-elevation-ft", this,
&FGInitialCondition::GetTerrainElevationFtIC,
&FGInitialCondition::SetTerrainElevationFtIC,
true);
&FGInitialCondition::SetTerrainElevationFtIC);
PropertyManager->Tie("ic/vg-fps", this,
&FGInitialCondition::GetVgroundFpsIC,
&FGInitialCondition::SetVgroundFpsIC,
true);
&FGInitialCondition::SetVgroundFpsIC);
PropertyManager->Tie("ic/vt-fps", this,
&FGInitialCondition::GetVtrueFpsIC,
&FGInitialCondition::SetVtrueFpsIC,
true);
&FGInitialCondition::SetVtrueFpsIC);
PropertyManager->Tie("ic/vw-bx-fps", this,
&FGInitialCondition::GetWindUFpsIC);
PropertyManager->Tie("ic/vw-by-fps", this,
Expand All @@ -1540,96 +1521,74 @@ void FGInitialCondition::bind(FGPropertyManager* PropertyManager)
&FGInitialCondition::GetWindFpsIC);
PropertyManager->Tie("ic/vw-dir-deg", this,
&FGInitialCondition::GetWindDirDegIC,
&FGInitialCondition::SetWindDirDegIC,
true);
&FGInitialCondition::SetWindDirDegIC);

PropertyManager->Tie("ic/roc-fps", this,
&FGInitialCondition::GetClimbRateFpsIC,
&FGInitialCondition::SetClimbRateFpsIC,
true);
&FGInitialCondition::SetClimbRateFpsIC);
PropertyManager->Tie("ic/u-fps", this,
&FGInitialCondition::GetUBodyFpsIC,
&FGInitialCondition::SetUBodyFpsIC,
true);
&FGInitialCondition::SetUBodyFpsIC);
PropertyManager->Tie("ic/v-fps", this,
&FGInitialCondition::GetVBodyFpsIC,
&FGInitialCondition::SetVBodyFpsIC,
true);
&FGInitialCondition::SetVBodyFpsIC);
PropertyManager->Tie("ic/w-fps", this,
&FGInitialCondition::GetWBodyFpsIC,
&FGInitialCondition::SetWBodyFpsIC,
true);
&FGInitialCondition::SetWBodyFpsIC);
PropertyManager->Tie("ic/vn-fps", this,
&FGInitialCondition::GetVNorthFpsIC,
&FGInitialCondition::SetVNorthFpsIC,
true);
&FGInitialCondition::SetVNorthFpsIC);
PropertyManager->Tie("ic/ve-fps", this,
&FGInitialCondition::GetVEastFpsIC,
&FGInitialCondition::SetVEastFpsIC,
true);
&FGInitialCondition::SetVEastFpsIC);
PropertyManager->Tie("ic/vd-fps", this,
&FGInitialCondition::GetVDownFpsIC,
&FGInitialCondition::SetVDownFpsIC,
true);
&FGInitialCondition::SetVDownFpsIC);
PropertyManager->Tie("ic/gamma-rad", this,
&FGInitialCondition::GetFlightPathAngleRadIC,
&FGInitialCondition::SetFlightPathAngleRadIC,
true);
&FGInitialCondition::SetFlightPathAngleRadIC);
PropertyManager->Tie("ic/alpha-rad", this,
&FGInitialCondition::GetAlphaRadIC,
&FGInitialCondition::SetAlphaRadIC,
true);
&FGInitialCondition::SetAlphaRadIC);
PropertyManager->Tie("ic/theta-rad", this,
&FGInitialCondition::GetThetaRadIC,
&FGInitialCondition::SetThetaRadIC,
true);
&FGInitialCondition::SetThetaRadIC);
PropertyManager->Tie("ic/beta-rad", this,
&FGInitialCondition::GetBetaRadIC,
&FGInitialCondition::SetBetaRadIC,
true);
&FGInitialCondition::SetBetaRadIC);
PropertyManager->Tie("ic/phi-rad", this,
&FGInitialCondition::GetPhiRadIC,
&FGInitialCondition::SetPhiRadIC,
true);
&FGInitialCondition::SetPhiRadIC);
PropertyManager->Tie("ic/psi-true-rad", this,
&FGInitialCondition::GetPsiRadIC,
&FGInitialCondition::SetPsiRadIC,
true);
&FGInitialCondition::SetPsiRadIC);
PropertyManager->Tie("ic/lat-gc-rad", this,
&FGInitialCondition::GetLatitudeRadIC,
&FGInitialCondition::SetLatitudeRadIC,
true);
&FGInitialCondition::SetLatitudeRadIC);
PropertyManager->Tie("ic/long-gc-rad", this,
&FGInitialCondition::GetLongitudeRadIC,
&FGInitialCondition::SetLongitudeRadIC,
true);
&FGInitialCondition::SetLongitudeRadIC);
PropertyManager->Tie("ic/p-rad_sec", this,
&FGInitialCondition::GetPRadpsIC,
&FGInitialCondition::SetPRadpsIC,
true);
&FGInitialCondition::SetPRadpsIC);
PropertyManager->Tie("ic/q-rad_sec", this,
&FGInitialCondition::GetQRadpsIC,
&FGInitialCondition::SetQRadpsIC,
true);
&FGInitialCondition::SetQRadpsIC);
PropertyManager->Tie("ic/r-rad_sec", this,
&FGInitialCondition::GetRRadpsIC,
&FGInitialCondition::SetRRadpsIC,
true);
&FGInitialCondition::SetRRadpsIC);
PropertyManager->Tie("ic/lat-geod-rad", this,
&FGInitialCondition::GetGeodLatitudeRadIC,
&FGInitialCondition::SetGeodLatitudeRadIC,
true);
&FGInitialCondition::SetGeodLatitudeRadIC);
PropertyManager->Tie("ic/lat-geod-deg", this,
&FGInitialCondition::GetGeodLatitudeDegIC,
&FGInitialCondition::SetGeodLatitudeDegIC,
true);
&FGInitialCondition::SetGeodLatitudeDegIC);
PropertyManager->Tie("ic/geod-alt-ft", &position,
&FGLocation::GetGeodAltitude);

PropertyManager->Tie("ic/targetNlf", this,
&FGInitialCondition::GetTargetNlfIC,
&FGInitialCondition::SetTargetNlfIC,
true);
&FGInitialCondition::SetTargetNlfIC);
}

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Expand Down
2 changes: 1 addition & 1 deletion src/input_output/FGOutputType.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ void FGOutputType::SetIdx(unsigned int idx)
{
string outputProp = CreateIndexedPropertyName("simulation/output", idx);

PropertyManager->Tie(outputProp + "/log_rate_hz", this, &FGOutputType::GetRateHz, &FGOutputType::SetRateHz, false);
PropertyManager->Tie(outputProp + "/log_rate_hz", this, &FGOutputType::GetRateHz, &FGOutputType::SetRateHz);
PropertyManager->Tie(outputProp + "/enabled", &enabled);
OutputIdx = idx;
}
Expand Down
36 changes: 10 additions & 26 deletions src/input_output/FGPropertyManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -432,20 +432,17 @@ class FGPropertyManager
*
* @param name The property name to tie (full path).
* @param pointer A pointer to the variable.
* @param useDefault true if any existing property value should be
* copied to the variable; false if the variable should not
* be modified; defaults to true.
*/
template <typename T> void
Tie (const std::string &name, T *pointer, bool useDefault = true)
Tie (const std::string &name, T *pointer)
{
SGPropertyNode* property = root->getNode(name.c_str(), true);
if (!property) {
cerr << "Could not get or create property " << name << endl;
return;
}

if (!property->tie(SGRawValuePointer<T>(pointer), useDefault))
if (!property->tie(SGRawValuePointer<T>(pointer), false))
cerr << "Failed to tie property " << name << " to a pointer" << endl;
else {
tied_properties.push_back(property);
Expand All @@ -465,22 +462,18 @@ class FGPropertyManager
* @param name The property name to tie (full path).
* @param getter The getter function, or 0 if the value is unreadable.
* @param setter The setter function, or 0 if the value is unmodifiable.
* @param useDefault true if the setter should be invoked with any existing
* property value should be; false if the old value should be
* discarded; defaults to true.
*/

template <typename T> void
Tie (const std::string &name, T (*getter)(), void (*setter)(T) = nullptr,
bool useDefault = true)
Tie (const std::string &name, T (*getter)(), void (*setter)(T) = nullptr)
{
SGPropertyNode* property = root->getNode(name.c_str(), true);
if (!property) {
std::cerr << "Could not get or create property " << name << std::endl;
return;
}

if (!property->tie(SGRawValueFunctions<T>(getter, setter), useDefault))
if (!property->tie(SGRawValueFunctions<T>(getter, setter), false))
std::cerr << "Failed to tie property " << name << " to functions"
<< std::endl;
else {
Expand All @@ -505,13 +498,10 @@ class FGPropertyManager
* setter functions.
* @param getter The getter function, or 0 if the value is unreadable.
* @param setter The setter function, or 0 if the value is unmodifiable.
* @param useDefault true if the setter should be invoked with any existing
* property value should there be one; false if the old value should
* be discarded; defaults to true.
*/
template <typename T> void
Tie (const std::string &name, int index, T (*getter)(int),
void (*setter)(int, T) = nullptr, bool useDefault = true)
void (*setter)(int, T) = nullptr)
{
SGPropertyNode* property = root->getNode(name.c_str(), true);
if (!property) {
Expand All @@ -520,7 +510,7 @@ class FGPropertyManager
}

if (!property->tie(SGRawValueFunctionsIndexed<T>(index, getter, setter),
useDefault))
false))
std::cerr << "Failed to tie property " << name << " to indexed functions"
<< std::endl;
else {
Expand All @@ -546,21 +536,18 @@ class FGPropertyManager
* unreadable.
* @param setter The object's setter method, or 0 if the value is
* unmodifiable.
* @param useDefault true if the setter should be invoked with any existing
* property value should there be one; false if the old value should
* be discarded; defaults to true.
*/
template <class T, class V> void
Tie (const std::string &name, T * obj, V (T::*getter)() const,
void (T::*setter)(V) = nullptr, bool useDefault = true)
void (T::*setter)(V) = nullptr)
{
SGPropertyNode* property = root->getNode(name.c_str(), true);
if (!property) {
std::cerr << "Could not get or create property " << name << std::endl;
return;
}

if (!property->tie(SGRawValueMethods<T,V>(*obj, getter, setter), useDefault))
if (!property->tie(SGRawValueMethods<T,V>(*obj, getter, setter), false))
std::cerr << "Failed to tie property " << name << " to object methods"
<< std::endl;
else {
Expand All @@ -586,13 +573,10 @@ class FGPropertyManager
* setter methods.
* @param getter The getter method, or 0 if the value is unreadable.
* @param setter The setter method, or 0 if the value is unmodifiable.
* @param useDefault true if the setter should be invoked with any existing
* property value should there be one; false if the old value should
* be discarded; defaults to true.
*/
template <class T, class V> void
Tie (const std::string &name, T * obj, int index, V (T::*getter)(int) const,
void (T::*setter)(int, V) = nullptr, bool useDefault = true)
void (T::*setter)(int, V) = nullptr)
{
SGPropertyNode* property = root->getNode(name.c_str(), true);
if (!property) {
Expand All @@ -601,7 +585,7 @@ class FGPropertyManager
}

if (!property->tie(SGRawValueMethodsIndexed<T,V>(*obj, index, getter, setter),
useDefault))
false))
std::cerr << "Failed to tie property " << name
<< " to indexed object methods" << std::endl;
else {
Expand Down
4 changes: 2 additions & 2 deletions src/models/FGAerodynamics.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -585,8 +585,8 @@ void FGAerodynamics::bind(void)
PropertyManager->Tie("forces/lod-norm", this, &FGAerodynamics::GetLoD);
PropertyManager->Tie("aero/cl-squared", this, &FGAerodynamics::GetClSquared);
PropertyManager->Tie("aero/qbar-area", &qbar_area);
PropertyManager->Tie("aero/alpha-max-rad", this, &FGAerodynamics::GetAlphaCLMax, &FGAerodynamics::SetAlphaCLMax, true);
PropertyManager->Tie("aero/alpha-min-rad", this, &FGAerodynamics::GetAlphaCLMin, &FGAerodynamics::SetAlphaCLMin, true);
PropertyManager->Tie("aero/alpha-max-rad", this, &FGAerodynamics::GetAlphaCLMax, &FGAerodynamics::SetAlphaCLMax);
PropertyManager->Tie("aero/alpha-min-rad", this, &FGAerodynamics::GetAlphaCLMin, &FGAerodynamics::SetAlphaCLMin);
PropertyManager->Tie("aero/bi2vel", this, &FGAerodynamics::GetBI2Vel);
PropertyManager->Tie("aero/ci2vel", this, &FGAerodynamics::GetCI2Vel);
PropertyManager->Tie("aero/alpha-wing-rad", this, &FGAerodynamics::GetAlphaW);
Expand Down
Loading

0 comments on commit b477f63

Please sign in to comment.