对于noob问题很抱歉,但是比方说,我已经有一个用C ++编写的Excel加载项,它接受一个数字并返回数字的平方(比如inputNum和outputNum,其中outputNum = inputNum ^ 2)和现在我需要修改函数,使得输入是一个1xn向量,输出是一个相同大小的向量,数字平方,为了让它工作,我需要修改什么?比如说,我是否需要将输入更改为指针,因为C ++不会将矢量直接作为本机类型(与原始方形函数中的double不同)。
谢谢!
答案 0 :(得分:3)
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为你管理内存。
答案 1 :(得分:2)
“我已经有一个用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]);
}
请注意,要修改某些内容,您不需要将其传递给按值运行并返回它。您可以通过引用传递它。
答案 2 :(得分:2)
我不确定,但你可能不得不走Oper路线。
(这就是我们几乎所有事情都做的事情。)基本上,
你必须下载Excel XLL SDK
(http://www.microsoft.com/en-us/download/details.aspx?id=20199
对于Excel 2010,但很多与旧版本兼容
版本 - 你可能已经有了这个,因为
你当然叫xlfRegister
)
在其中,您将找到包含文件XLCALL.h
(或类似的内容)
那 - 我不在我所有的办公室
信息),它定义了一个结构XLOper
或XLOper12
(
首先是char*
表示字符串,第二个表示wchar_t*
),还有一些
#define
指定其中的内容。你必须申报你的
函数作为获取指向此结构的指针,并返回它。
(P
或Q
,具体取决于您是要使用char
还是wchar_t
xltype
表示字符串。)然后你必须解析
输入:它是一个表(看结构成员XLOper* myFunction( XLOper* tableIn );
),如果
所以,对于每个细胞,它是一个数字。同样,你必须这样做
使用您的数据创建一个XLOper,并返回指向它的指针。
有很多文档 http://msdn.microsoft.com/en-us/library/office/bb687883%28v=office.14%29.aspx。 它并不完美,但它应涵盖大多数常见情况。 (这比你在许多事情上找到的要好。)
FWIW:你的功能的签名是;
XLCALL.h
我找不到tableIn->xltype
的在线副本,但我没有
记住的宏,所以我不能过多的细节,
但粗略地说,你必须从测试是否开始
tableIn->var.array
指定数组与否;取决于
要求,您将返回错误或将其视为一个错误
1x1数组,如果没有。如果是数组,XLOper
将包含行数和列数,以及指向的指针
实际数据(将是行*列的单个维度
数组xltype
)。对于数组的每个元素,请验证
它是数字(再次,测试var.num
),并提取
字段{{1}}中的数字数据。