我对C++的了解有限.据我所知,只要C接口可用,就可以从C调用C++库.是否可以.hpp从C库中调用文件中定义的C++模板库?例如,这个精彩的表达评估库.
可能是学习C++的时候了!好.这是第一次尝试:
#ifndef EXPRTK_C_H_
#define EXPRTK_C_H_
#include "exprtk.hpp"
//Header
#ifdef __cplusplus
extern "C" {
#endif
typedef exprtk::symbol_table<double> symbol_table_t;
typedef exprtk::expression<double> expression_t;
typedef exprtk::parser<double> parser_t;
void add_variable_(symbol_table_t st, char* name, double *value);
void register_symbol_table_(expression_t ex, symbol_table_t st);
void compile_(parser_t parser, char *expression_string, expression_t ex);
double evaluate_(expression_t ex);
#ifdef __cplusplus
}
#endif
#endif /* EXPRTK_C_H_ */
#include "exprtk.hpp"
#include "exprtk_c.hpp"
Run Code Online (Sandbox Code Playgroud)
这是.cpp文件.trig_function()是真实的例子,用于main().接下来是我尝试包装这些功能.错误消息是解析器.
exprtk.hpp:16962:7: error: ‘exprtk::parser<T>::parser(const exprtk::parser<T>&) [with T = double]’ is private
exprtk_simple_example_01.cpp:85:83: error: within …Run Code Online (Sandbox Code Playgroud) 有没有办法重置函数中声明为static的变量?目标是确保不使用来自不相关调用的延迟值调用该函数.例如,我在矩阵的列上有一个函数opearting.
int foo(matrix *A, int colnum, int rownum){
static int whichColumn;
static int *v; //vector of length A->nrows
if (column != whichColumn){
memset(v,0,size);
whichColumn = which;
}
//do other things
}
Run Code Online (Sandbox Code Playgroud)
该函数被调用n次,每列一次.这是"重新设置"静态变量的正确方法吗?是否有其他一般的万无一失的重置静态变量的方法?例如,我想确保如果使用可能具有不同维度的新矩阵进行调用,则向量v被调整大小并归零等.似乎最简单的方法是使用NULL指针调用该函数:
int foo(matrix *A, int colnum, int rownum){
static int whichColumn;
static int *v; //vector of length A->nrows
if (A == NULL){
FREE(v);
whichColumn = 0;
}
//do other things
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试用Mersenne prime(2 31 -1)作为模数来实现随机数生成器.以下工作代码基于几个相关的帖子:
然而,
它不起作用uint32_t hi, lo;,这意味着我不理解问题的签名与未签名方面.
基于上面的#2,我期待答案是(hi + lo).这意味着,我不明白为什么需要以下声明.
if (x1 > r)
x1 += r + 2;
Run Code Online (Sandbox Code Playgroud)
有人可以澄清我的困惑的来源吗?
代码本身可以改进吗?
发电机应该避免0或2 31 -1作为种子吗?
如何为一个素数(2 p -k)改变代码?
#include <inttypes.h>
// x1 = a*x0 (mod 2^31-1)
int32_t lgc_m(int32_t a, int32_t x)
{
printf("x %"PRId32"\n", x);
if (x == 2147483647){
printf("x1 %"PRId64"\n", 0);
return (0);
}
uint64_t c, r = 1;
c = (uint64_t)a * (uint64_t)x;
if (c < 2147483647){
printf("x1 …Run Code Online (Sandbox Code Playgroud)