1

PardisoSolver.h のような通常の C++ クラスがあります。

#ifndef PARDISOSOLVER_H_
#define PARDISOSOLVER_H_

class PardisoSolver {
public:
    /* Initializes a new Solver with the given matrix in CSR */
    PardisoSolver(
            int* ia,
            int* ja,
            double* a,
            int n,
            int nja);
    virtual ~PardisoSolver();
    void setMatrixType(int mtype);
    void pardisoSymFactorize();

private:
    static int get_nproc(void);
    void handle_error(int ierror, int line);

    int* ia;        // row indices
    int* ja;        // column pointer
    double* a;      // non zero values
    int n_eq;       // size of matrix
    int nja;        // number of non zero elements

    bool factorized;

    /* PARDISO SETTINGS */
    void *pt[64];
    int maxfct;
    int mnum;
    int mtype;
    int perm;
    int nrhs;
    int iparm[64];
    int msglvl;
    int error;
    double   dparm[64];

    double dzero;
    int izero;

};

#endif /* PARDISOSOLVER_H_ */

一方、実装は PardisoSolver.cpp にあります。ここでは、クラスの実装と一緒に C 関数の宣言を追加しています。

extern "C" void pardiso     (void   *, int    *,   int *, int *,    int *, int *,
              double *, int    *,    int *, int *,   int *, int *,
                 int *, double *, double *, int *, double *);

今、その関数を次のように呼び出そうとすると

pardiso (pt, &maxfct, &mnum, &mtype, &phase,
       &n_eq, a, ia, ja, &izero, &nrhs,
       iparm, &msglvl, &dzero, &dzero, &error,  dparm);

コンパイルエラーが発生します

PardisoSolver.cpp:94: undefined reference to `pardiso'

呼び出しは 94 行目にあります。C 関数を間違った場所で宣言しましたか? 私が得たように、クラスのメンバーになることはできないため、これを呼び出す方法にする必要があります。助けてくれてありがとう。

4

1 に答える 1

0

これらすべては、プログラムの設計を改善する必要があることを示唆しています。まず、「モジュール」 (クラス + その他のもの) へのインターフェイスは 1 つだけにする必要があります。意味をなさない「クラス、そしていくつか」を持つべきではありません。クラスの機能に関連するすべての関数は、そのクラスに含める必要があります。関係のないものはすべて、プログラムの別の部分に移動する必要があります。

それを正したら、プログラミング言語を明確にする必要があります。これは C または C++ ですか? Cの呼び出し元を持つC ++ですか?後者のようです。もしそうなら、どうにかして 2 つの言語を分離する必要があります。一例として、Windows では、C から呼び出すことができるインターフェイスを使用して、C++ クラスを DLL に配置できます。

最後に、17 個のポインターをパラメーターとして取る関数を使用することが理にかなっているのかどうかを検討する必要があります。これらのパラメータはまったく関連していませんか? 構造体/クラスにグループ化できますか? あるいは、これは単に不必要に複雑なモンスター関数であり、いくつかの異なる関数に分割される可能性があります。

于 2012-11-23T10:28:26.857 に答える