2

初心者の質問で申し訳ありませんが、たとえば、単一の数値を取り、数値の 2 乗を返す C++ で記述された Excel アドインが既にあるとします (inputNum と outputNum で、outputNum = inputNum^2 とします)。入力が 1xn ベクトルで、出力が同じサイズのベクトルで、数値の 2 乗になるように関数を変更する必要があります。それを機能させるには、何を変更する必要がありますか? たとえば、入力をポインターに変更する必要があるとします。これは、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

よくわかりませんが、おそらくオペラ ルートに行かなければならないでしょう。基本的に、Excel XLL SDK ( http://www.microsoft.com/en-us/download/details.aspx?id=20199 for Excel 2010 ) をダウンロードする必要があります。 、しかし多くは古いバージョンと互換性があります—あなたは確かに を呼び出したので、おそらくこれはすでにどこかにあるでしょうxlfRegister)。その中に、構造体or (最初はfor 文字列、2 番目は)を定義
するインクルード ファイルXLCALL.h(またはそのようなもの — 私はすべての情報を持っているオフィスにいません) があります。その中に何が入っているか を特定するものもあります。この構造体へのポインターを取り、それを返すように関数を宣言する必要があります。(またはXLOperXLOper12char*wchar_t*#definePQcharを使用するか 、文字列に対して使用するかによって異なり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 は、行数と列数、および実際のデータへのポインターが含まれます (行*列の 1 次元配列になりますXLOper)。配列の各要素について、それが数値であることを確認し (再度テストしますxltype)、フィールドから数値データを抽出しますvar.num

于 2013-09-21T15:42:34.923 に答える
2

「C++ で記述された Excel アドインが既にあり、単一の数値を取り、その数値の 2 乗を返します」

それでは、関数があるとしましょう:

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 に答える