unsigned long v;
(略)
v = (unsigned long)va_arg(args, long);
switch (*p) {
case 's':
outs_sci0((char*)v, c);
break;
case 'c':
outc_sci0((char)v, c);
break;
case 'd': case 'o': case 'x':
outn_sci0(*p, v, c);
}
を
char *vp;
int vi;
char vc;
(略)
switch (*p) {
case 's':
vp = (char *)va_arg(args, char *);
outs_sci0(vp, c);
break;
case 'c':
vc = (char)va_arg(args, char);
outc_sci0(vc, c);
break;
case 'd': case 'o': case 'x':
vi = (int)va_arg(args, int);
outn_sci0(*p, vi, c);
}
にせんといかんよ。
何故なら
mprint_test_sci0("test value %d %d %x %x \n\r",1,1,1,1);
ってやると、可変引数の「1,1,1,1」は「16ビットのintが4つ渡される」から。
なお、%d、%o、%xは、今はint(16ビット幅。0~65535)までしか出力できないから
char *vp;
int vi;
long vl;
char vc;
bool lf;
(略)
if (*p == '%') {
lf = false;
p++;
if ((*p >= '1') && (*p <= '9')) {
c = *p++ - '0';
while ((*p >= '0') && (*p <= '9')) c = c * 10 + (*p++ - '0');
}
else if (*p == 'l') {
p++;
lf = true;
}
else
c = -1;
switch (*p) {
case 's':
vp = (char *)va_arg(args, char *);
outs_sci0(vp, c);
break;
case 'c':
vc = (char)va_arg(args, char);
outc_sci0(vc, c);
break;
case 'd': case 'o': case 'x':
if (lf) {
vl = (long)va_arg(args, long);
outn_sci0(*p, vl, c);
} else {
vi = (int)va_arg(args, int);
outn_sci0(*p, vi, c);
}
}
とか、新たに「longバージョンの%ld、%lo、%lx」とか作って、呼び出す際に
mprint_test_sci0("test value %d %ld %x %lx \n\r",1,1L,1,1L);
とやって「可変引数に渡した数字はlongであることを明記」してやれば、long型も使える筈。
なお、この改造は「デバッグしてない」ので、バグっているかもしれない。
プログラムを直さないで、今のまま使うなら
mprint_test_sci0("test value %d %d %x %x \n\r",1L,1L,1L,1L);
とか
mprint_test_sci0("test value %d %d %x %x \n\r",(long)a,(long)b,(long)(a + 4),(long)(a + b));
とかって感じで「数値の引数は必ずlongで渡す」ってやれば良い。
お礼
回答頂きありがとうございます。 詳細なサンプルコード頂き大変助かります。 コードを参考にさせて頂き、修正しました。 https://github.com/KenjiMaehara/ios_apply_test/blob/20150720_test/H8S2368_console/console/console.c 次のように"mprint_test_sci0"での出力結果で数値が出るようになりました。 (コード例) mprint_test_sci0("test test3: %d %d %d %x \n\r",1,1,1,1); mprint_test_sci0("test test4: %d %d %d %x \n\r",1,2,3,4); mprint_test_sci0("test test5:"); for(k=0;k<16;k++) { mprint_test_sci0("%d,",k); } mprint_test_sci0("\n\r"); mprint_test_sci0("test test6:"); for(k=0;k<16;k++) { mprint_test_sci0("%x,",k); } mprint_test_sci0("\n\r"); (出力結果) test test3: 1 1 1 1 test test4: 1 2 3 4 test test5:0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, test test6:0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,