c - 如何在 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)
在我的程序的其他地方,我将lattice
andsite
结构定义为
typedef struct lattice{
site * R[10*10*10*10];
}lattice;
typedef struct site{
gsl_matrix_complex * link[4];
}site;
但是,当然,它的编写方式我无法将看起来像我的函数指针传递WDoperator
给Lanczos
. 我解决这个问题的想法是只使用一个全局lattice
指针来保存我的模拟结果,而不是将其WDoperator
作为参数传递。然而,在研究 stackoverflow 时,似乎普遍的共识是不使用全局变量,尤其是不使用全局指针。那么,有没有我没有想到的更好的方法呢?有没有办法“抑制”函数的参数,使其适合我的函数指针Lanczos
例行公事会接受吗?如果全局指针是解决这个问题的方法,是否有使用它们的最佳实践,这样我就不会创建内存泄漏怪物?特别是考虑到将存储在晶格中的数据的大小(现在有 40,000 个矩阵,但是一旦我开始工作,我想扩大它的规模,使其大约为 200k 矩阵)。如果之前在这里有类似的问题,我深表歉意,但我已尽力在论坛范围内寻找类似的问题。
解决方案
有没有办法“抑制”函数的参数,使其适合我的 Lanczos 例程将接受的函数指针?
当您不想使用 的附加参数时,您可以使用条件编译语句并为宏常量赋予不同的值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
。
抱歉,如果这不是您想要的,但我认为它可以帮助您。
推荐阅读
- javascript - 如何从函数中删除事件监听器
- javascript - 为什么使用 JavaScript 在我的 PWA 上重复该位置?
- javascript - 使用 eval() - 未捕获的 SyntaxError:pageLoad 处的意外标识符
- vhdl - VHDL 与或反转电路,仿真期间前 5 ns 的输出未确定。内部信号也没有显示在波形上
- c++ - 尝试在 C++ 中实现可变参数 min() 函数
- google-chrome-extension - Chrome 扩展:创建新标签并附加监听器
- sql - 在 SQL Server 存储过程结果中将日期转换为字符串
- numpy - 如何获取不在元组中的 nd.array 元素的索引
- swift - 从 SwiftUI 转到 UIKit 的另一个视图?
- javascript - 如何导入csv文件并在html表上显示数据然后保存在asp .net核心的sql数据库中