2

抱歉这个菜鸟问题,但是比如说,我已经有一个用 C++ 编写的 Excel 加载项,它接受一个数字并返回数字的平方(比如 inputNum 和 outputNum,其中 outputNum = inputNum^2),现在我会需要修改函数,使得输入是一个 1xn 向量,输出是一个大小相同且数字平方的向量,我需要修改什么才能让它工作?例如,我是否需要将输入更改为指针,因为 C++ 不直接将向量作为本机类型(与原始 square 函数中的 double 不同)。

谢谢!

4

3 回答 3

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 为您管理内存。

于 2013-09-21T15:00:41.547 回答
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]);
}

请注意,要修改某些内容,您不需要按值将其传递给函数并返回它。您可以通过引用传递它。

于 2013-09-21T14:35:54.737 回答
2

我不确定,但你可能不得不走 Oper 路线。(无论如何,这就是我们为几乎所有事情所做的事情。)基本上,您必须下载 Excel XLL SDK (http://www.microsoft.com/en-us/download/details.aspx?id=20199 for Excel 2010 ,但很多都与旧版本兼容——你可能已经在某个地方有了这个,因为你肯定已经调用了xlfRegister)。
在其中,您会找到一个包含文件XLCALL.h(或类似的东西——我不在办公室,我没有所有的信息),它定义了一个结构XLOperXLOper12(第一个带有char*for 字符串,第二个带有wchar_t*),并且一些 #define指定其中的内容。您必须将您的函数声明为获取指向该结构的指针并返回它。(PQ,取决于您是要使用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

于 2013-09-21T15:42:34.923 回答