3

Windowsでmingwでgcc 4.6.1を使用しています。

私は最近、%afloat を浮動小数点 16 進数表記で正確に表現するためのフォーマット指定子について学びました (どうやら C99 で)。

何らかの理由で、フロートをこの方法で問題なく印刷できますが、スキャンに問題があります。

の両方のインスタンスを置き換える%a%f、私のコードは浮動小数点数の印刷とスキャンをうまく処理します。

従来の Unix システム (gcc 4.2.1) で実行した場合、コードは問題なく動作するようです。

float と double で考えられるすべてのバリエーションを試しました。flag を追加し-std=c99てみましたが、数値リテラルを double または float として扱うかどうかが変わるように見えましたが、問題は解決しませんでした。

他の誰かがこの問題を再現できるかどうか、およびそれを修正するために私ができることを 2 つ知りたいです。

#include <stdio.h>
int main(){
    char buffer[1000];
    sprintf(buffer, "%la", 21.3930);

    double x = 0;
    printf("\n");
    printf(buffer);

    if(!sscanf(buffer, "%la", &x))
        printf("\nscan failed.");
    printf("\n%la", x);

    return 0;
}

出力は次のとおりです。

0x1.5649bap+4
scan failed.
0x0.000000p+0

助けていただければ幸いです。

4

1 に答える 1

3

MinGWはmsvcrt.dll、Cランタイムサポートの大部分を使用しています。 msvcrt.dll通常、C99機能はサポートされていません。

C99 I / O指定子を独自にサポートするMinGWのバージョンがいくつかありますが、どのバージョンがどのC99機能をサポートしているかについての適切な情報を収集していません。

詳細については、以下を参照してください。

更新MinGW(バージョン4.6.1)のTDM-64ディストリビューションはscanf()、次のようなプレフィックス名を持つ関数ファミリーのC99指定子をサポートしているようです。

__mingw_sscanf()
__mingw_scanf()

4.6.1より新しいバージョンでサポートが改善されている可能性があります(少なくともバージョン4.6.1の時点では、これらの機能はTDMディストリビューションの32ビットバージョンにはないようです。TDM-64は32ビットバイナリと64ビットバイナリを構築できます)。

単純なマクロのセットを使用して、通常の名前をこれらの関数に「リダイレクト」できます。

出力例:

C:\temp>gcc --version
gcc (tdm64-1) 4.6.1

C:\temp>gcc -m32 -std=gnu99 -o test test.c

C:\temp>test

0xa.b24dd2f1a9fcp+1
0xa.b24dd2f1a9fcp+1
于 2013-01-23T07:17:51.937 に答える