如何在 C 语言中不带参数地将大数据集传递给函数

How to Pass a Large Data Set to a Function Without an Argument in C

我正在尝试创建一个通用的 Lanczos 算法,它接受一个运算符(函数指针)并在 C 中从该运算符打印一定数量的特征值。我正在使用 GNU 科学库来处理向量和矩阵.具体来说,所讨论的运算符接受一些输入向量并通过引用输出一个向量。所以,我希望 Lanczos 方法的函数原型至少看起来像

void Lanczos( void (*operator) (gsl_vector_complex *,gsl_vector_complex *) , int k    );

其中 k 是我要打印的特征值的数量。问题是,我立即对寻找特征值感兴趣的相关运算符需要使用我在之前模拟中生成的大量外部数据。具体来说,我感兴趣的运算符可以原型化为

void WDoperator(gsl_vector_complex * input, gsl_vector_complex * output, lattice * L)

在我的程序的其他地方,我将 latticesite 结构定义为

typedef struct lattice{
  site * R[10*10*10*10];
}lattice;
typedef struct site{
  gsl_matrix_complex * link[4];
}site;

但是当然,按照它的编写方式,我无法将看起来像我的 WDoperator 的函数指针传递给 Lanczos。我解决这个问题的想法是只使用一个全局 lattice 指针来保存我的模拟结果,而不是将其作为参数传递给 WDoperator。然而,在研究 Whosebug 时,似乎普遍的共识是不使用全局变量,尤其是不使用全局指针。那么,有没有我没有想到的更好的方法呢?有没有办法 "suppress" 函数的参数使其适合我的 Lanczos 例程将接受的函数指针?如果全局指针是解决这个问题的方法,是否有使用它们的最佳实践,这样我就不会创建内存泄漏怪物?特别是考虑到将存储在晶格中的数据的大小(现在有 40,000 个矩阵,但一旦我开始使用它,我想将其放大,因此它大约为 200k 矩阵)。如果之前在这里有过类似的问题,我深表歉意,但我已尽力在论坛范围内寻找类似的问题。

Is there a way to "suppress" the argument of a function so it fits into a function pointer that my Lanczos routine will accept?

你可以f.e。当您不想使用 lattice * L:

的附加参数时,使用条件编译语句并为宏常量赋予不同的值
#define CD 1

void WDoperator(gsl_vector_complex * input, gsl_vector_complex * output
#if CD 1
, lattice * L
#endif
);

void Lanczos( void (*operator) (int *,double *) 
#if CD 1
, lattice* L
#endif 
) int k);

在使用指向 lattice.

的指针的每个函数和算法内部的定义中,您必须将相同的内容应用于参数列表

抱歉,如果这不是您要找的,但我认为它可以帮助您。

一种普遍接受的机制是提供一个匿名上下文参数,该参数通过以下方式传递:

void Lanczos( void (*operator) (gsl_vector_complex *,gsl_vector_complex *) , int k, void *ctx)
void WDoperator(gsl_vector_complex * input, gsl_vector_complex * output, void * ctx) {
   Lattice *L = ctx;

...

如果你想对错误检查更严格一点,你可以想出类似的东西:

struct L_ctx {
    int type;
    void *arg;
};
enum {
    L_NoType,
    L_Lattice,
    L_ComplexLattice,
    ...
};

然后检查是否传入了适当的类型。不太容易出错,但与像 Golang 这样的体面的类型系统不匹配。