FP12 |
The FP12 data type is used for two-dimensional floating point arrays.
If you want to do high-performance numerical computation in Excel, you will need to use the FP12 data type. It is a two dimensional array of double precision floating point numbers defined by Microsoft as follows.
typedef struct _FP12
{
int rows;
int columns;
double array[1]; /* Actually, array[rows][columns] */
} FP12;This class provides a wrapper around the vanilla struct modeled after std::vector from the C++ standard library.
xll::FP a; assert (a.is_empty()); assert (a.size() == 0); xll::FP b(2, 3); assert (b.rows() == 2 && b.columns() == 3); b[3] = 4; // 1-d index assert (b(1, 0) == 4); // 2-d index b.reshape(3,2); assert (b.rows() == 3 && b.columns() == 2); assert (b[3] == 4); assert (b(1, 1) == 4); std::sort(b.begin(), b.end()); // STL friendly
Of course Excel knows nothing about the C++ class so when you get an array passed in from Excel you should declare it as either _FP12 or ::FP12, but not xll::FP. Likewise when you return this data type.
Here is an example of calling std::unique from the C++ standard library.
AddIn xai_array_unique(
Function(XLL_FP, L"?xll_array_unique", L"ARRAY.UNIQUE")
.Arg(XLL_FP, L"Array", L"is an array of numbers.")
.Category(L"STL")
.FunctionHelp(L"Remove consecutive duplicates from Array.")
);
_FP12* WINAPI
xll_array_unique(const _FP12* pa)
{
#pragma XLLEXPORT
static xll::FP12 a; // static so a.get() exists after return
a = *pa; // copy to a
double* pe = std::unique(a.begin(), a.end());
a.reshape(pe - a.begin(), 1);
return a.get(); // pointer to underlying FP12 data type
}