我编写了一个从excel接收矩阵的xll函数,将其修改为返回它:
__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)
如果我是从excel中获取一个5 * 5矩阵,那么在调试中我看到它有19行和20列,发生了什么!?
是否可能因为当我收到LPXLOPER12 arrayin
时,它表示excel范围,比5 * 5矩阵更复杂。如何访问它包含的5 * 5矩阵呢?
答案 0 :(得分:0)
Q
注册输入参数。您需要正确声明返回变量:
// initialize the return variable
xlArray.val.array.rows = rows;
xlArray.val.array.columns = cols;
xlArray.xltype = xltypeMulti | xlbitDLLFree;
答案 1 :(得分:0)
我用ujsgeyrr1f0d0d0r0h1h0j0j_juj代码制作了一个来测试我的应用程序。我认为这很有用。我也使用了其他参考文献中的代码。
__declspec(dllexport) LPXLOPER12 WINAPI Array_In_Out(LPXLOPER12 ExMatriz)
{
static XLOPER12 xlMatriz; // variável de retorno
try
{
int rows = ExMatriz->val.array.rows;
int cols = ExMatriz->val.array.columns;
xlMatriz.xltype = xltypeMulti | xlbitDLLFree;
xlMatriz.val.array.rows = rows;
xlMatriz.val.array.columns = cols;
// ======= VERIFICACAO DOS DADOS DE ENTRADA ==============
if (ExMatriz->xltype != xltypeRef &&
ExMatriz->xltype != xltypeSRef &&
ExMatriz->xltype != xltypeMulti)
{
xlMatriz.xltype = xltypeErr;
xlMatriz.val.err = xlerrValue;
return (LPXLOPER12)&xlMatriz;
}
static XLOPER12 MatrizMulti, tempTypeMulti;
LPXLOPER12 Matrizptr;
tempTypeMulti.xltype = xltypeInt;
tempTypeMulti.val.w = xltypeMulti;
if (xlretUncalced ==
Excel12(xlCoerce, (LPXLOPER12)&MatrizMulti, 2, (LPXLOPER12)ExMatriz,
(LPXLOPER12)&tempTypeMulti))
{
return 0;
}
Matrizptr = MatrizMulti.val.array.lparray;
// verify that the entire ExMatriz are nums
for (int r = 0; r < rows; r++)
{
for (int c = 0; c < cols; c++)
{
if ((Matrizptr + ((r* cols) + c))->xltype != xltypeNum) // verifica se os valores são numericos
{
if (Matrizptr->xltype == xltypeErr)
{
xlMatriz.xltype = xltypeErr;
xlMatriz.val.err = Matrizptr->val.err;
return (LPXLOPER12)&xlMatriz;
}
else
{
xlMatriz.xltype = xltypeErr;
xlMatriz.val.err = xlerrValue;
return (LPXLOPER12)&xlMatriz;
}
}
}
}
xlMatriz.val.array.lparray = reinterpret_cast<LPXLOPER12>(::new XLOPER12[rows * cols]); //new XLOPER12[rows*cols];
for (int r = 0; r < rows; r++)
{
for (int c = 0; c < cols; c++)
{
xlMatriz.val.array.lparray + ((r* cols) + c);
ExMatriz->val.array.lparray + ((r* cols) + c);
xlMatriz.val.num = ExMatriz->val.num; // coloca os valores de entrada na variável de saída !!!
}
}
return static_cast<LPXLOPER12>(&xlMatriz);
//return (LPXLOPER12)&xlMatriz;
}
catch (std::exception& e)
{
xlMatriz.xltype = xltypeErr;
xlMatriz.val.err = xlerrNA;
return (LPXLOPER12)&xlMatriz;
}
}