牛、豚、鶏、どれか一つ食べられなくなるとしたら?

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"です。

A 回答 (4件)

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';
}
    • good
    • 0

#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):ポインタのアドレスは加減算できるんかな??

全く問題ありません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/07/31 23:42

セミコロン抜けのほかに、



  t < 10 ? 0x30 : 0x41

の0x41は (0x41 - 10) でないとマズくないですか。
    • good
    • 0

t = b >> 4


にセミコロンがないけど?

後、どのようにうまくいかないかを書いた方がいいです。

「(p+2):ポインタのアドレスは加減算」は可能ですが、
やらない方がいいですよ。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!