The matrix argument of LinearInterp2D() was required to be an array of pointers to columns. It could have been different; it might have required:
Optional flags are available for reading matrices into these layouts.
Matrix Data Flag | Layout Flag | Description |
---|---|---|
Pointers | Columns | Array of pointers to columns |
Pointers | Rows | Array of pointers to rows |
Values | Columns | Continuous array of values, arranged with columns together |
Values | Rows | Continuous array of values, arranged with rows together |
As it happens, Pointers/Columns is the default layout combination, which is why we didn't have to do any extra work in the Wizard to get the right layout for LinearInterp2D(). If we need a different layout, we need to do a little more work in the wizard.
To demonstrate the use of a different matrix layout, we are going to add a function which returns the location of the maximum value within a two-dimensional array. Add the simple function shown below to the end of Tutorial1.cpp:
#include <algorithm> // Find location of maximum value in adValues // adValues must be a continuous array, with columns held together int FindMax(int cCols, int cRows, double *adValues, int* pnMaxCol, int* pnMaxRow) { std::vector<double>::iterator itMax; double* pdEnd = adValues + (cRows * cCols); // Use STL algorithm to find offset of max value itMax = std::max_element(adValues, pdEnd); if (itMax == pdEnd) return 0; // Translate offset to coords *pnMaxRow = (itMax - adValues) % cRows; *pnMaxCol = (itMax - adValues) / cRows; return 1; }
As you can see, this function takes advantage of the STL max_element algorithm to do all the hard work. The important things to note, as far as our add-in function is concerned, are:
Next, we'll use the XLL+ Function Wizard to apply these layout rules.