2

カスタム printf 関数を作成しようとしています。

void debug_print(const char *fmt, ...)
{
    const char *p;
    va_list argp;
    int i;
    double f;
    char *s;
    char fmtbuf[80];

    va_start(argp, fmt);

    for(p = fmt; *p != '\0'; p++)
    {
        if(*p != '%')
        {
            uart_putchar(*p);
            continue;
        }

        switch(*++p)
        {
            case 'c':
                        ...
            break;

            case 'f':
            f = va_arg(argp, float); // ??????
            s = dtostrf(f, 10, 6, fmtbuf);
            uart_puts(s);
            break;

...
// then in the main part of the program
debug_print("%f", 123.456);

プログラムが f = va_arg(argp, float) になると、その行から戻ることはありません。f = va_arg(argp, double) に変更すると、0 が返されます。

デバイス (ATMega328P) と Atmel Studio 6 シミュレータの両方で試しましたが、同じ結果でした。

リンカーのオプションと関係があるように聞こえますか?

アップデート:

va_arg(argp, double)ここで、なぜ0 が返されるのかを調べる必要があります。

4

1 に答える 1

3

可変引数リストで aを渡すと、コンパイラによってfloat暗黙的に a に昇格されます。そのため、可変引数リストから取得するdoubleために使用する必要があります。va_arg(argp, double)

引数を として取得しようとするとfloat

type実際の次の引数の型と互換性がありません (デフォルトの引数の昇格に従って昇格されます) [および] 動作は未定義です

(標準 §7.16.1.1、va_argマクロ。§6.2.7 に基づき、互換性がfloatありdoubleません。)

于 2012-11-29T13:53:09.397 に答える