cプログラムされた写真で変数を連結するには?
-
06-07-2019 - |
質問
ハイテックCで16f84a picをプログラミングして、hd44780 lcdを駆動します。これまでのところ、lcdを初期化し、個々の文字と文字列をlcdに書き込むことができます。今、私はこのようなことをする必要があります:
var = 250;
lcd_write_string
(" MyVarの値:" + var);
そのため、lcdには" MyVar has value:250"
まず、varと文字列をどのように連結すればよいですか? 次に、変数varには8ビットの2進数(10進数で0〜255)が含まれます。 var = 23の場合; 8ビット数を2に分割して、asciiの2と3を表し、lcdで表示する必要があります。これどうやってするの? 2桁の数字をすべて分割してlcdに表示するには、ベース10の変換またはifツリーを実行する必要があるようです。これを回避する簡単な方法はありますか?
ありがとう!
解決
なぜ printf("%d&quot ;, var)
を使用しないのですか?
var = 250;
char *static_msg = "MyVar has value:";
char msg[sizeof(static_msg) + 4];
sprintf(msg, "%s %d", static_msg, var);
lcd_write_string(msg);
他のヒント
ツールセットに標準Cライブラリが含まれていない場合、またはこれを自分で行う方法を理解したい場合は、次のアプローチを使用します。
LCDが表示できる数の文字のバッファを宣言します。固定文字列をそのバッファーの先頭に書き込みます。変数の文字数を決定します(ここでは省略している数学がありますが、それは合理的な演習だと思います)。その長さと固定文字列の長さを使用して、バッファのどこに数字の桁が入るかを調べます。前と同じ数学的構造を使用して、そのスペースに数字を1つずつ書き込みます。式 '0' + digit
で10進数の文字値を把握できるC言語のトリック(標準で必要)があります。うまくいけば、それがどのように機能するかがわかるでしょう。最後に、 lcd_write_string
関数が期待するバッファを終了し、バッファで呼び出します。
他の回答者が示したように、これは基本的に標準ライブラリの printf
ファミリーの関数のごく一部を実装しています。実稼働コードでライブラリを使用できる場合(および使用する必要がある場合)でも、実装を理解することは価値があると思います。
これは漠然と宿題の匂いがするので、まだ詳しく説明していません。特定の点で助けが必要な場合は、質問の更新を探します。
Cコンパイラに標準Cライブラリ関数が付属している場合、 sprintf
は、文字列を生成するために、 printf
と同様に使用できます。
sprintf
を使用して、( char *
として)フォーマットされた文字列を生成できます。これはおそらく lcd_write_string
関数に送信できます。
sprintf()の問題は、sprintf()を呼び出す前に割り当てる必要があるバイト数がわからないことです。私は通常、代わりに次のksprintf()を使用します。
typedef struct __kstring_t {
size_t l, m;
char *s;
} kstring_t;
int ksprintf(kstring_t *s, const char *fmt, ...)
{
va_list ap;
int l;
va_start(ap, fmt);
l = vsnprintf(s->s + s->l, s->m - s->l, fmt, ap); // not working with glibc 2.0
va_end(ap);
if (l + 1 > s->m - s->l) {
s->m = s->l + l + 2;
kroundup32(s->m);
s->s = (char*)realloc(s->s, s->m);
va_start(ap, fmt);
l = vsnprintf(s->s + s->l, s->m - s->l, fmt, ap);
}
va_end(ap);
s->l += l;
return l;
}
それを使用するには:
kstring_t *str = calloc(1, sizeof(kstring_t));
ksprintf(str, "%s, %d\n", aString, aInteger);
ksprintf(str, "a second line: %s\n", aString2);
free(str->s); free(s);
vsnprintfは文字列のバイト数を返さないため、ksprintf()はglibc 2.0では機能しません。割り当てのメモリを繰り返し2倍にする必要があります。 Linux manページ" man snprintf"例も示します。システムでは、vsnprintf()の動作を確認する必要があります。vsnprintf()はC90ではなくC99です。
これを行う別の方法は、lcd_write_stringを関数ポインターとして使用してこれを行うことです。
printf(lcd_write_string,"MyVar has value: %d",var)
lcd_write_stringが次のように宣言されている場合、これはCCS Pic Cコンパイラで正しく動作します
void lcd_write_string (char c);