Я закодировал функцию xll, получающую матрицу из excel, изменяя ее и возвращая:
__declspec(dllexport) LPXLOPER12 WINAPI ZZZZUpdateArray1(LPXLOPER12 arrayin)
{
if (arrayin->xltype == xltypeMulti | xlbitDLLFree)
{
double ScaleFactor = 2.0;
int rows = arrayin->val.array.rows;
int cols = arrayin->val.array.columns;
static XLOPER12 xlArray;
xlArray.val.array.lparray = reinterpret_cast<LPXLOPER12>(::new XLOPER12[rows * cols] /*::malloc(rows * cols * sizeof(XLOPER12))*/);
for (int r = 0; r<rows; r++)
{
for (int c = 0; c<cols; c++)
{
if ((arrayin->val.array.lparray + ((r* cols) + c))->xltype == xltypeNum)
{
XLOPER12* var = xlArray.val.array.lparray + ((r* cols) + c);
var->xltype = xltypeNum;
var->val.num = ScaleFactor*(arrayin->val.array.lparray + ((r* cols) + c))->val.num ;
}
}
}
return static_cast<LPXLOPER12>(&xlArray);
}
return arrayin;
}
но он падает на
if ((arrayin->val.array.lparray + ((r* cols) + c))->xltype == xltypeNum)
Если я, например, беру матрицу 5 * 5 из Excel, при отладке я вижу, что она имеет 19 строк и 20 столбцов, что произошло!?
Возможно, это потому, что когда я получаю LPXLOPER12 arrayin
, он представляет собой диапазон Excel, намного более сложный, чем матрица 5 * 5. Как тогда получить доступ к матрице 5 * 5, которую она содержит?
if (arrayin->xltype == xltypeMulti | xlbitDLLFree)
всегда оценивается какtrue
. Наверняка не то, что вы хотите. Ваш компилятор, вероятно, предупредил вас об этом. Кроме того, использование распределителя стандартной библиотеки C++ (operator new
), безусловно, не соответствует ожиданиям Excel. - person IInspectable   schedule 13.04.2017if (arrayin->xltype == xltypeMulti | xlbitDLLFree)
было просто проверить, чтоarrayin
действительно представляет собой двумерный массив. - person Olorin   schedule 14.04.2017true
. Какой бы ни была цель, код не достигает ее. - person IInspectable   schedule 14.04.2017