1

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

これは、GMP ライブラリを使用した Qt のアプリケーション関数の一部です。

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)関数を呼び出したmpf_get_str関数にあることがわかりましたgmpxx.h

アプリケーションから (関数を呼び出さずにnilaiz.get_str(exponent, 10, 0)) 削除すると、アプリケーションはエラーなしで正常に動作します。

mpf_t zしかし、その関数をQString(Qt の文字列または)に変換する必要がありますchar *

なぜこれが起こるのですか?次に何をすべきですか?または、GMP ライブラリをコンパイルするときに何か不足していますか、または GMP を構成するときに xtra オプションを追加する必要がありますか、またはその機能を使用するバグがありますか?

助けや提案が必要です。ありがとうございました!

よろしくお願いします

aansd

4

0 に答える 0