カスタム 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 が返されるのかを調べる必要があります。