• 締切済み

1Byte→Hex文字列変換がうまく行かない。

PICマイコン用にCを勉強中です。 1Byte→Hex文字列変換関数を作ろうとしています。 メモリを出来るだけ使いたくないのでコンパイル後のメモリを極少なくするようにしたいと思い以下のようなコードを書きましたが、うまくいきません。 void ByteToHex(unsigned short b, char *p) {   unsigned short t;   t = b >> 4   *p = t + (t < 10 ? 0x30 : 0x41);   t = b & 0x0f;   *(p+1) = t + (t < 10 ? 0x30 : 0x41);   *(p+2) = 0; } (p+2):ポインタのアドレスは加減算できるんかな?? ちなみに使っているコンパイラは"mikroC"です。

みんなの回答

noname#15691
noname#15691
回答No.4

#1,#2,#3の方の指摘を全て修正すれば動作するので、他の方法を紹介します。 void ByteToHex(unsigned short b, char *p) { static char *ch = "0123456789ABCDEF"; p[0] = ch[0x0f & b>>4]; p[1] = ch[0x0f & b]; p[2] = '\0'; } メモリの消費量はコンパイルしてみないとわかりません。 なぜなら、  見た目が短い = メモリの消費量が少ない ではないからでです。 複雑な演算式をごちゃごちゃ書いた方が案外大きくなります。 >> (p+2):ポインタのアドレスは加減算できるんかな?? 全く問題ありません。

pajapajama
質問者

お礼

ポインタを使う方法や配列を使う方法などみなさんのアドバイスとても参考になりました。 ありがとうございました。

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.3

セミコロン抜けのほかに、   t < 10 ? 0x30 : 0x41 の0x41は (0x41 - 10) でないとマズくないですか。

回答No.2

t = b >> 4 にセミコロンがないけど? 後、どのようにうまくいかないかを書いた方がいいです。 「(p+2):ポインタのアドレスは加減算」は可能ですが、 やらない方がいいですよ。

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1

void ByteToHex(unsigned char b, char *p) {   int t;   t = (b >> 4) & 0x0f;   *p++ = t + (t < 10 ? 0x30 : 0x41);   t = b & 0x0f;   *p++ = t + (t < 10 ? 0x30 : 0x41);   *p = '\0'; }

関連するQ&A