sprintfでの書式制御におけるフィールド幅指定について

RX631CPUを使ってソフト開発しています.環境はCS+で、コンパイラはCC-RXで、V-2.08およびおV-3.04に切り替えて確認しています.

sprintfの書式で、納得できないコードが生成されています.下記のコメント欄は生成された文字列です.(メモリ情報を確認)

int iTest = 0x01AB; // = 427, &xSys.Buf = 0x00002680

sprintf((char *)&xSys.Buf[0x10], "<%X>", iTest); // 0x2690 "<1AB>\0"
sprintf((char *)&xSys.Buf[0x18], "<%4X>", iTest); // 0x2698 "<%4X>\0"
sprintf((char *)&xSys.Buf[0x20], "<%04X>", iTest); // 0x26a0 "<%4X>\0"
sprintf((char *)&xSys.Buf[0x28], "<%*X>", 4, iTest); // 0x26a8 "< 1AB>\0"
sprintf((char *)&xSys.Buf[0x30], "<%0*X>", 4, iTest); // 0x26b0 "<01AB>\0"
sprintf((char *)&xSys.Buf[0x38], "(%d)", iTest); // 0x26b8 "(427)\0"
sprintf((char *)&xSys.Buf[0x40], "(%4d)", iTest); // 0x26c0 "(%4d)\0"
sprintf((char *)&xSys.Buf[0x48], "(%04d)", iTest); // 0x26c8 "(%4d)\0"
sprintf((char *)&xSys.Buf[0x50], "(%*d)", 4, iTest); // 0x26d0 "( 427)\0"
sprintf((char *)&xSys.Buf[0x58], "(%0*d)", 4, iTest); // 0x26d8 "(0427)\0"
sprintf((char *)&xSys.Buf[0x60], "(%+4d)", iTest); // 0x26e0 "(%4d)\0"
sprintf((char *)&xSys.Buf[0x68], "(%+04d)", iTest); // 0x26e8 "(%4d)\0"
sprintf((char *)&xSys.Buf[0x70], "(%+*d)", 4, iTest); // 0x26f0 "(+427)\0"
sprintf((char *)&xSys.Buf[0x78], "(%+0*d)", 4, iTest); // 0x26f8 "(+427)\0"


CS+ V7.00.00 [13 Jun 2018] [メモリ情報]
2022年7月14日 10:32:17
デバッグ・ツール : RX E1(Serial)
プロジェクト名 : AX162V30
+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +a +b +c +d +e +f ASCII
00002690 | 3C 31 41 42 3E 00 00 00 3C 25 34 58 3E 00 00 00 | <1AB>...<%4X>...
000026a0 | 3C 25 34 58 3E 00 00 00 3C 20 31 41 42 3E 00 00 | <%4X>...< 1AB>..
000026b0 | 3C 30 31 41 42 3E 00 00 28 34 32 37 29 00 00 00 | <01AB>..(427)...
000026c0 | 28 25 34 *** 29 00 00 00 28 25 34 *** 29 00 00 00 | (%4d)...(%4d)...
000026d0 | 28 20 34 32 37 29 00 00 28 30 34 32 37 29 00 00 | ( 427)..(0427)..
000026e0 | 28 25 34 *** 29 00 00 00 28 25 34 *** 29 00 00 00 | (%4d)...(%4d)...
000026f0 | 28 2B 34 32 37 29 00 00 28 2B 34 32 37 29 00 00 | (+427)..(+427)..
00002700 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................

上記の様に、書式にフィールド幅指定を入れると、正常に文字列が生成されないのですが、どうしてなのでしょうか?

’*’により、フィールド幅指定を変数で与えると正常に出力します.

  • メタボテニスさん、こんにちは。
    こちらで確認した限りでは、下図の通り正常に変換されているようです。
    確認環境はRXシミュレータ、コンパイラのバージョンはV3.04です。
    何が違うのかまでは分かっていません。ソースはアップされていたものに
    struct {
    char Buf[200];
    } xSys;
    を追加したのみです。
  • 普通はそうですよね.今までこんなことは無かったのですが、CC-RXの何らかの設定で、このようになっているとは思われるのですが、思い当たるところはありませんか?

  • 2つ疑った事があるのですが、どちらも関係なかったようです。

    1つはライブラリジェネレータの機能縮小版オプションです。浮動小数点以外に文字幅指定も機能縮小するのかとも思ったのですが、関係ありませんでした。

    もう1つはstdio.hのインクルード忘れですが、こちらも忘れると全てが動かなくなりました。従いまして、関係ないようです。

    ちなみにNGのパターンはどれも変換そのものを行っていませんから、そこから謎が解けるような気もするのですが、今のところ小生には思い当たる節がありません。まさかまさかですが、文字幅指定の4が全角とか?

    そんなことはないですよね。何かわかりましたら、ご報告します。