如何在 c 中打印 libpari 版本?

How to print libpari version in c?

我想从 c 程序打印 libpari 库的版本

#include <gmp.h>
#include <mpfr.h>
#include <mpc.h>
#include<pari/pari.h> 
int main(void){  
  
  gmp_printf ("MPFR library: %-12s\nMPFR header:  %s (based on %d.%d.%d)\n",
          mpfr_get_version (), MPFR_VERSION_STRING, MPFR_VERSION_MAJOR,
          MPFR_VERSION_MINOR, MPFR_VERSION_PATCHLEVEL);
  
  gmp_printf (" GMP-%s \n ", gmp_version );
  
  mpfr_printf(" MPC-%s \nMPFR-%s \n GMP-%s \n", MPC_VERSION_STRING, mpfr_version, gmp_version );
  
  gmp_printf("pari_version = %s\n",  GENtostr(pari_version())); //  paricfg_version_code);
  

return 0;

程序编译但是

gcc g.c -lpari -lmpc -lmpfr -lgmp -Wall
a@zalman:~/Dokumenty/gmp$ ./a.out
MPFR library: 4.1.0       
MPFR header:  4.1.0 (based on 4.1.0)
 GMP-6.2.1 
  MPC-1.2.0 
MPFR-4.1.0 
 GMP-6.2.1 
Memory protection violation

我也试过了

pari_printf("pari_version = %Ps\n",  GENtostr(pari_version())); //  paricfg_version_code);
  pari_flush();

我用谷歌搜索并搜索了手册。我该怎么做?


 #include<stdio.h>
#include <gmp.h>
#include <mpfr.h>
#include <mpc.h>
#include<pari/pari.h> 
int main(void){  
  
  gmp_printf ("MPFR library: %-12s\nMPFR header:  %s (based on %d.%d.%d)\n",
          mpfr_get_version (), MPFR_VERSION_STRING, MPFR_VERSION_MAJOR,
          MPFR_VERSION_MINOR, MPFR_VERSION_PATCHLEVEL);
  
  gmp_printf (" GMP-%s \n ", gmp_version );
  
  mpfr_printf(" MPC-%s \nMPFR-%s \n GMP-%s \n", MPC_VERSION_STRING, mpfr_version, gmp_version );
  
  printf("paricfg_version_code = %ld\n",   paricfg_version_code);
  

return 0;
}

结果是

MPFR library: 4.1.0       
MPFR header:  4.1.0 (based on 4.1.0)
 GMP-6.2.1 
  MPC-1.2.0 
MPFR-4.1.0 
 GMP-6.2.1 
paricfg_version_code = 134401
  1. 您在第一次尝试时遇到内存保护冲突的原因是因为您的程序缺少 pari_init() 调用;函数 pari_version() 需要 pari 堆栈来创建它的 return 值...

它应该在您的主程序中工作,即实际使用 pari 库并首先包含 pari_init() 的主程序。您可能希望将结果打印为

    GEN v = pari_version(), M = gel(v,1), m = gel(v,2), p = gel(v,3);
    printf("pari-%ld.%ld.%ld", itos(M), itos(m), itos(p));

(M,m,p分别代表主版本号,次版本号,补丁级别)

  1. 出于同样的原因,第二次尝试使用 pari_printf() 无法工作,还因为您不应该使用 GENtostr(),因为它会转换 GEN char* 并且 %Ps 构造需要一个 GEN 参数。

  2. 如果您真的希望它在没有 pari 堆栈的情况下工作,您可以通过“解码”版本代码来调整答案中的解决方案,如下所示

    const ulong mask = (1<<PARI_VERSION_SHIFT)-1;
    ulong n = paricfg_version_code, M, m, p;
    p = n & mask; n >>= PARI_VERSION_SHIFT;
    m = n & mask; n >>= PARI_VERSION_SHIFT;
    M = n;    
    printf("pari-%lu.%lu.%lu", M, m, p);