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

所有这些都表明您的程序设计需要改进。首先,您的“模块”(类+其他东西)应该只有一个接口。你不应该有“一个类,然后是一些”,这没有任何意义。所有与类功能相关的功能都应包含在该类中。所有不相关的,都应该移到程序的另一部分。

一旦理顺了这一点,就需要澄清编程语言。这是 C 还是 C++?是带有 C 调用者的 C++ 吗?似乎是后者。如果是这样,您需要以某种方式将两种语言分开。举个例子:在 Windows 中,您可以将 C++ 类放在一个 DLL 中,并带有一个可以从 C 调用的接口。

最后,您应该考虑让函数以 17 个指针作为参数是否有意义。这些参数根本不相关吗?它们可以分组在结构/类中吗?或者这可能只是一个不必要的复杂怪物功能,可以分成几个不同的功能。

于 2012-11-23T10:28:26.857 回答