抱歉这个菜鸟问题,但是比如说,我已经有一个用 C++ 编写的 Excel 加载项,它接受一个数字并返回数字的平方(比如 inputNum 和 outputNum,其中 outputNum = inputNum^2),现在我会需要修改函数,使得输入是一个 1xn 向量,输出是一个大小相同且数字平方的向量,我需要修改什么才能让它工作?例如,我是否需要将输入更改为指针,因为 C++ 不直接将向量作为本机类型(与原始 square 函数中的 double 不同)。
谢谢!
该std::transform
函数是执行此操作的好方法:
#include <vector>
#include <algorithm>
#include <iostream>
double processElement(double e) {
return e * e;
}
std::vector<double> processAllElements(const std::vector<double>& in) {
// The output vector must be constructed to be the same size as the input.
std::vector<double> out(in.size(), 0);
// Process each element in the input vector into the output vector.
// (input is unchanged)
std::transform(in.begin(), in.end(), out.begin(), &processElement);
return out;
}
int main() {
std::vector<double> in;
in.push_back(1);
in.push_back(2);
std::vector<double> out = processAllElements(in);
std::cout << out[0] << "," << out[1];
}
如果您正在处理指向值缓冲区的原始指针,您仍然可以使用std::transform
int main() {
const int n = 3;
double in[] = {1,2,3};
double out[n];
std::transform(in, in+n, out, &processElement);
std::cout << out[0] << "," << out[1];
}
但是,如果您的向量大小在编译时未知,则最好使用 std::vector 为您管理内存。
“我已经有一个用 C++ 编写的 Excel 插件,它接受一个数字并返回数字的平方”
所以假设你有功能:
int processElement(int e) {
...
}
“现在我需要修改函数,使输入是 1xn 向量,输出是相同大小的向量”
要使用它,std::vector<int>
您可以包装此功能:
void processVector(std::vector<int>& v) {
for (int i = 0; i < v.size(); ++i)
v[i] = processElement(v[i]);
}
请注意,要修改某些内容,您不需要按值将其传递给函数并返回它。您可以通过引用传递它。
我不确定,但你可能不得不走 Oper 路线。(无论如何,这就是我们为几乎所有事情所做的事情。)基本上,您必须下载 Excel XLL SDK (http://www.microsoft.com/en-us/download/details.aspx?id=20199
for Excel 2010 ,但很多都与旧版本兼容——你可能已经在某个地方有了这个,因为你肯定已经调用了xlfRegister
)。
在其中,您会找到一个包含文件XLCALL.h
(或类似的东西——我不在办公室,我没有所有的信息),它定义了一个结构XLOper
或XLOper12
(第一个带有char*
for 字符串,第二个带有wchar_t*
),并且一些
#define
指定其中的内容。您必须将您的函数声明为获取指向该结构的指针并返回它。(P
或Q
,取决于您是要使用char
还是
wchar_t
字符串。)然后您必须解析输入:它是一个表(查看 struct member xltype
),如果是,对于每个单元格,它是一个数字。同样,您必须使用您的数据创建一个 XLOper,并返回一个指向它的指针。
http://msdn.microsoft.com/en-us/library/office/bb687883%28v=office.14%29.aspx上有很多文档 。它并不完美,但它应该涵盖大多数常见情况。(对于很多事情来说,它比你能找到的要好。)
FWIW:你的函数的签名是;
XLOper* myFunction( XLOper* tableIn );
我在网上找不到 的副本XLCALL.h
,而且我没有记住所有的宏,所以我不能过多介绍,但大致来说,你必须从测试是否
tableIn->xltype
指定数组开始或不; 根据要求,您将返回错误或将其视为 1x1 数组(如果没有)。如果它是一个数组,tableIn->var.array
将包含行数和列数,以及指向实际数据的指针(这将是 rows*columns 的一维数组XLOper
)。对于数组的每个元素,验证它是否为数字(再次测试xltype
),并从字段中提取数字数据var.num
。