小编Sue*_*Sue的帖子

我可以使用C程序中的C++模板库吗?

我对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)

c c++ templates

10
推荐指数
1
解决办法
371
查看次数

如何在函数内重置静态变量

有没有办法重置函数中声明为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)

c static initialization reset

7
推荐指数
1
解决办法
2万
查看次数

C中线性同余生成器的快速模乘法模数

我正在尝试用Mersenne prime(2 31 -1)作为模数来实现随机数生成器.以下工作代码基于几个相关的帖子:

  1. 如何在C中提取32位无符号整数的特定"n"位?
  2. 快速乘法和减法模数为素数
  3. 快速乘法模2 ^ 16 + 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)

c random primes modular-arithmetic

6
推荐指数
1
解决办法
318
查看次数