X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FFDM%2FJSBSim%2FFGTable.cpp;h=3f81558936d3e020562eeb27e0b0aaf3b753ca6c;hb=adcb4fc30ec52bcdab526edd2ebcd6cfdfd49b0b;hp=db880264b38a149b0943188d4698043cb8474441;hpb=c74c2f224f04a735fd53817aeb142e5613fda84c;p=flightgear.git diff --git a/src/FDM/JSBSim/FGTable.cpp b/src/FDM/JSBSim/FGTable.cpp index db880264b..3f8155893 100644 --- a/src/FDM/JSBSim/FGTable.cpp +++ b/src/FDM/JSBSim/FGTable.cpp @@ -55,13 +55,21 @@ using namespace std; FGTable::FGTable(int NRows, int NCols) : nRows(NRows), nCols(NCols) { - Type = tt2D; - colCounter = 1; - rowCounter = 0; + if (NCols > 1) { + Type = tt2D; + colCounter = 1; + rowCounter = 0; + } else if (NCols == 1) { + Type = tt1D; + colCounter = 0; + rowCounter = 1; + } else { + cerr << "FGTable cannot accept 'Rows=0'" << endl; + } Data = Allocate(); - if (debug_lvl & 2) cout << "Instantiated: FGTable" << endl; + Debug(0); } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -73,16 +81,16 @@ FGTable::FGTable(int NRows) : nRows(NRows), nCols(1) rowCounter = 1; Data = Allocate(); - if (debug_lvl & 2) cout << "Instantiated: FGTable" << endl; + Debug(0); } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -float** FGTable::Allocate(void) +double** FGTable::Allocate(void) { - Data = new float*[nRows+1]; + Data = new double*[nRows+1]; for (int r=0; r<=nRows; r++) { - Data[r] = new float[nCols+1]; + Data[r] = new double[nCols+1]; for (int c=0; c<=nCols; c++) { Data[r][c] = 0.0; } @@ -96,18 +104,19 @@ FGTable::~FGTable() { for (int r=0; r<=nRows; r++) if (Data[r]) delete[] Data[r]; if (Data) delete[] Data; - if (debug_lvl & 2) cout << "Destroyed: FGTable" << endl; + Debug(1); } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -float FGTable::GetValue(float key) +double FGTable::GetValue(double key) { - float Factor, Value, Span; + double Factor, Value, Span; int r; for (r=1; r<=nRows; r++) if (Data[r][0] >= key) break; - r = r < 2 ? 2 : (r > nRows ? nRows : r); + r = Clamp(2, r, nRows); + key = Clamp(Data[1][0], key, Data[nRows][0]); // make sure denominator below does not go to zero. @@ -126,16 +135,18 @@ float FGTable::GetValue(float key) //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -float FGTable::GetValue(float rowKey, float colKey) +double FGTable::GetValue(double rowKey, double colKey) { - float rFactor, cFactor, col1temp, col2temp, Value; + double rFactor, cFactor, col1temp, col2temp, Value; int r, c; for (r=1;r<=nRows;r++) if (Data[r][0] >= rowKey) break; - for (c=1;c<=nCols;c++) if (Data[0][c] >= colKey) break; + r = Clamp(2, r, nRows); + rowKey = Clamp(Data[1][0], rowKey, Data[nRows][0]); - c = c < 2 ? 2 : (c > nCols ? nCols : c); - r = r < 2 ? 2 : (r > nRows ? nRows : r); + for (c=1;c<=nCols;c++) if (Data[0][c] >= colKey) break; + c = Clamp(2, c, nCols); + colKey = Clamp(Data[0][1], colKey, Data[0][nCols]); rFactor = (rowKey - Data[r-1][0]) / (Data[r][0] - Data[r-1][0]); cFactor = (colKey - Data[0][c-1]) / (Data[0][c] - Data[0][c-1]); @@ -196,14 +207,6 @@ FGTable& FGTable::operator<<(const int n) //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -FGTable& FGTable::operator<<(const float n) -{ - *this << (double)n; - return *this; -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - void FGTable::Print(void) { int startRow; @@ -211,7 +214,12 @@ void FGTable::Print(void) if (Type == tt1D) startRow = 1; else startRow = 0; - cout.setf(ios::fixed); // set up output stream +#if defined (sgi) && !defined(__GNUC__) + unsigned long flags = cout.setf(ios::fixed); +#else + ios::fmtflags flags = cout.setf(ios::fixed); // set up output stream +#endif + cout.precision(4); for (int r=startRow; r<=nRows; r++) { @@ -225,14 +233,54 @@ void FGTable::Print(void) } cout << endl; } - cout.setf(0, ios::floatfield); // reset + cout.setf(flags); // reset } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -void FGTable::Debug(void) +// The bitmasked value choices are as follows: +// unset: In this case (the default) JSBSim would only print +// out the normally expected messages, essentially echoing +// the config files as they are read. If the environment +// variable is not set, debug_lvl is set to 1 internally +// 0: This requests JSBSim not to output any messages +// whatsoever. +// 1: This value explicity requests the normal JSBSim +// startup messages +// 2: This value asks for a message to be printed out when +// a class is instantiated +// 4: When this value is set, a message is displayed when a +// FGModel object executes its Run() method +// 8: When this value is set, various runtime state variables +// are printed out periodically +// 16: When set various parameters are sanity checked and +// a message is printed out when they go out of bounds + +void FGTable::Debug(int from) { - //TODO: Add your source code here + if (debug_lvl <= 0) return; + + if (debug_lvl & 1) { // Standard console startup message output + if (from == 0) { // Constructor + + } + } + if (debug_lvl & 2 ) { // Instantiation/Destruction notification + if (from == 0) cout << "Instantiated: FGTable" << endl; + if (from == 1) cout << "Destroyed: FGTable" << endl; + } + if (debug_lvl & 4 ) { // Run() method entry print for FGModel-derived objects + } + if (debug_lvl & 8 ) { // Runtime state variables + } + if (debug_lvl & 16) { // Sanity checking + } + if (debug_lvl & 64) { + if (from == 0) { // Constructor + cout << IdSrc << endl; + cout << IdHdr << endl; + } + } } +