win xP SP2下QT中使用gmp库的问题

发布于 2024-10-11 18:21:15 字数 2706 浏览 1 评论 0原文

我在 Windows XP SP2 下的 Qt 项目中使用 GMP 库时遇到问题。

当我运行 Qt 应用程序时,有时可以运行,有时则不能。当应用程序崩溃时,它会显示一条警告,并显示消息“Microsoft Visual C++ 运行时库运行时错误”或挂起几分钟。有时它可以工作(并且没有错误)

以下是一些细节:

我使用 QT 版本 4.3.2(开源) 编译器:mingw32 版本:GNU Make 3.80 GCC:3.4.5(mingw 专用) G++:3.4.5(mingw 专用) GMP 4.3.2 我的CPU类型:x86系列

我已经使用MSYS 1.0.11成功编译了GMP库:

./configure --prefix=/gmp/install --enable-cxx

制作

进行安装

这是我的 Qt pro.file 内容:

..
..
INCLUDEPATH += C:/LIBGMP
LIBS += -LC:/LIBGMP -lgmpxx -lgmp

这是我在 Qt 中使用 GMP 库的应用程序功能的一部分:

QString gmptambah(QString angka1 ,QString angka2,int angkapresisi) const
 {

  mpf_set_default_prec(angkapresisi); 

  mpf_t x,y,z;

  mpf_init (x); 
         mpf_init (y); 
         mpf_init (z);

        QByteArray encodedString1=angka1.toAscii ();
        const char *x1= encodedString1.constData ();

 QByteArray encodedString2=angka2.toAscii ();
        const char *y1= encodedString2.constData ();

  mpf_set_str (x,x1,10);

  mpf_set_str (y,y1,10);

  mpf_add (z,y,x);

  mp_exp_t exponent ;

  mpf_class nilaiz(z);
  nilaiz.set_prec(angkapresisi);

  QString hasil((nilaiz.get_str(exponent, 10, 0)).c_str()); // this is my problem

  long int exp=(exponent);

  if(exp>=0)
  {
   if(hasil.at(0)!='-' && exp==0)
   {
           hasil.insert(0,"0"); exp++;
   }
   else if(hasil.at(0)=='-' && exp==0)
   {
           hasil.insert(1,"0");

    exp=exp+2;
   }
   else if(hasil.at(0)=='-' && exp>=1)
   {           
    exp=exp+1;
   }

   hasil.insert(exp,".");

   hasil.replace(QString(" "), QString("0"));

   QStringList hasiltmp;

   hasiltmp=hasil.split(".");

   if(hasiltmp.size()==1) hasil.append("0");
   else if(hasiltmp.size()==2)
   {
           if(hasiltmp.at(1)=="")hasil.append("0");
   }

  }
  else
  {
          if(hasil.at(0)!='-') for(int i=0;i<qAbs(exp);i++)hasil.insert(0,"0");
   else for(int i=0;i<qAbs(exp);i++)hasil.insert(1,"0");

   if(hasil.at(0)!='-') hasil.insert(0,"0.");
   else hasil.insert(1,"0.");

  }

  mpf_clear (x);
         mpf_clear (y);
         mpf_clear (z);

  x1=0; y1=0;

  return pembulatan(hasil);

 }

跟踪问题后,我发现我的问题位于 nilaiz.get_str(exponent, 10, 0) 函数,

当我删除它时, 它调用了 gmpxx.h 中的 mpf_get_str 函数从我的应用程序(没有调用 nilaiz.get_str(exponent, 10, 0) 函数),应用程序运行良好,没有错误。

但我需要该函数将 mpf_t z 转换为 QString (Qt 中的字符串或 char *)。

为什么会出现这种情况?接下来我应该做什么?或者我在编译 GMP 库时是否遗漏了某些内容,或者在配置 GMP 时是否应该添加 xtra 选项,或者使用该函数时存在错误?

我需要帮助或建议。谢谢你!

最好的

问候

I have a problem using the GMP library in a Qt project under Windows XP SP2.

When I run my Qt application, sometimes it works and sometimes it doesn't. When the application crashes, it display a warning with the message "Microsoft Visual C++ runtime Library run time error" or hangs for a few minutes. Sometimes it works (and there is no error)

Here are some specifics:

i used QT ver 4.3.2 (open source)
compiler: mingw32 ver : GNU Make 3.80
GCC : 3.4.5 (mingw special)
G++ : 3.4.5 (mingw special)
gmp 4.3.2
my cpu type :x86 family

I had compiled the GMP library successfully like this using MSYS 1.0.11:

./configure --prefix=/gmp/install --enable-cxx

make

make install

Here are my Qt pro.file contents :

..
..
INCLUDEPATH += C:/LIBGMP
LIBS += -LC:/LIBGMP -lgmpxx -lgmp

Here is a part of my application function in Qt using GMP library :

QString gmptambah(QString angka1 ,QString angka2,int angkapresisi) const
 {

  mpf_set_default_prec(angkapresisi); 

  mpf_t x,y,z;

  mpf_init (x); 
         mpf_init (y); 
         mpf_init (z);

        QByteArray encodedString1=angka1.toAscii ();
        const char *x1= encodedString1.constData ();

 QByteArray encodedString2=angka2.toAscii ();
        const char *y1= encodedString2.constData ();

  mpf_set_str (x,x1,10);

  mpf_set_str (y,y1,10);

  mpf_add (z,y,x);

  mp_exp_t exponent ;

  mpf_class nilaiz(z);
  nilaiz.set_prec(angkapresisi);

  QString hasil((nilaiz.get_str(exponent, 10, 0)).c_str()); // this is my problem

  long int exp=(exponent);

  if(exp>=0)
  {
   if(hasil.at(0)!='-' && exp==0)
   {
           hasil.insert(0,"0"); exp++;
   }
   else if(hasil.at(0)=='-' && exp==0)
   {
           hasil.insert(1,"0");

    exp=exp+2;
   }
   else if(hasil.at(0)=='-' && exp>=1)
   {           
    exp=exp+1;
   }

   hasil.insert(exp,".");

   hasil.replace(QString(" "), QString("0"));

   QStringList hasiltmp;

   hasiltmp=hasil.split(".");

   if(hasiltmp.size()==1) hasil.append("0");
   else if(hasiltmp.size()==2)
   {
           if(hasiltmp.at(1)=="")hasil.append("0");
   }

  }
  else
  {
          if(hasil.at(0)!='-') for(int i=0;i<qAbs(exp);i++)hasil.insert(0,"0");
   else for(int i=0;i<qAbs(exp);i++)hasil.insert(1,"0");

   if(hasil.at(0)!='-') hasil.insert(0,"0.");
   else hasil.insert(1,"0.");

  }

  mpf_clear (x);
         mpf_clear (y);
         mpf_clear (z);

  x1=0; y1=0;

  return pembulatan(hasil);

 }

After tracing the problem, I found that my problem is located at nilaiz.get_str(exponent, 10, 0) function which called the mpf_get_str function in gmpxx.h

When I remove it from my application (without calling the nilaiz.get_str(exponent, 10, 0) function), the application runs well without errors.

But I need that function to convert mpf_t z to QString (string in Qt or char *).

Why does this happen? What should I do next? Or am I missing something when I compile the GMP library or should I add an xtra option when I configure GMP or there is a bug using that function?

I need help or suggestions. Thank you!

Best regards

aansd

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文