C

【C言語】バイトオーダ変換プログラム

バイトオーダ変換プログラム 概要 ビッグエンディアン ⇔ リトルエンディアンの変換処理。 コード #include <stdio.h> /* 4バイトデータをビッグエンディアンに変換する */ #define ULONG_L2B(a) \ (unsigned long) \ ( \ ((unsigned long)(*((unsigned char *)a )) ) </stdio.h>…

【C言語】実行環境のバイトオーダを確認するプログラム

バイトオーダを確認するプログラム。 概要 バイトオーダを確認するプログラム。以下の結果になる。 リトルエンディアンの場合 78 56 34 12 ビッグエンディアンの場合 12 34 56 78 コード #include <stdio.h> void check_byte_order(int i) { unsigned char *p = (unsi</stdio.h>…

【C言語】素材集 - sleepによる一定周期でのread実行

テーマ select, epoll, poll を使わずに、sleep による一定周期でのデバイスファイル読み出し。 クライアントから送信されたデータを1秒間に5バイトずつ読み出しをしている。 読み出しサイズの合計が sizeof(buf) に達したら終了する。 コード #include <stdio.h> #in</stdio.h>…

【C言語】素材集 - マルチスレッド用シングルトン管理処理

テーマ マルチスレッド用シングルトン管理をするプログラム。 Getter と Setter をそれぞれ XXXX_get、XXXX_set として公開関数で用意し、本体は static 関数として xxxx_access としている。 補足 ・自モジュールのみで使うことを想定しているので、ユーザ…

【C言語】素材集 - 変数表示可能な API がサポートされていない環境で変数を出力するためのデバッグ用マクロ

テーマ 変数表示可能な API がサポートされていない環境で、変数を出力するためのデバッグ用マクロ。 また、syslog が無い場合にもログファイルに書き出せるようにする。 例 [23:57:53][d.cpp:46] this is a main(). [23:57:53][d.cpp:47] this is a main() …

【C言語】素材集 - エラー判定式のマクロ化

テーマ if や switch-case によるエラー分岐判定をするマクロを実装する。 これによりコードの可読性向上につなげる。 テーマ 例 コード 条件分岐マクロ ASSERTマクロ使用前 ASSERTマクロ使用後 (その1) ASSERTマクロ使用後 (その2) VERIFYマクロ使用前 VERI…

【C言語】素材集 - 可変長引数の操作

テーマ 可変長引数を受け取り、vsnprintf 関数を使ってログ出力可能なフォーマットにする。 例 実行すると、次のように main 関数の引数の個数と実行プログラム名を表示する。 [Lv(1:WARN)] (argc, argv[0], mesg) = (1, ./a, hoge) [int main(int, char**)]…

【C言語】素材集 - アライメント調整をする

テーマ アライメント調整 例 ・ALIGN_64(80)とすると、64 の倍数に調整された 128 を求めるプログラム コード 下記マクロを使用する。 ALIGN_4(n) といった小さい値のアライメント調整は、アドレスが 4 の倍数で無い場合の検出に使うことがある。 // アライ…

【C言語】素材集 - 浮動小数を16進数に変換する

テーマ 浮動小数を16進数に変換する 例 ・0.750 を 0x3f400000 として表示させる コード 浮動小数点の演算は正数値で計算してはいけない点に注意。 f3 = f1 - f2; のように小数点として算出しておくこと。 #include <stdio.h> int main() float f1 = 0.750; float f2 </stdio.h>…

【C言語】素材集 - %f による少数点の表示が出来ない環境でも小数点以下を表示する

テーマ printf の %f によって double, float の値表示が出来ない環境でも、%d が使って小数点以下を表示する。 例 ・123456 ÷ 409600 の値表示(0.3014)とパーセント率表示(30.14)をする コード 100、1000、10000で割った各値を取得し、それらを %d 形式で s…

【C言語】素材集 - 文字列の一致判定処理

テーマ strncmp と strlen を使った文字列の完全一致判定処理。 例 以下のように判定する。 ・"abc" と "abcd" なら「不一致」 ・"abc" と "abc" なら「一致」 コード マクロ STRCMP が文字列一致の判定をする処理。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h></stdbool.h></string.h></stdlib.h></stdio.h>…

C言語の素材集

C言語の処理で、改めて実装するのが面倒なプログラムの覚書である。 条件分岐系 エラー判定式のマクロ化 文字列操作系 文字列データを16進数に変換し、変換後のデータ長を求める 文字列の一致判定処理 可変長引数の操作 正数値操作系 アライメント調整をする…

【C言語】素材集 - 文字列データを16進数に変換し、変換後のデータ長を求める

テーマ 文字列データを16進数に変換し、変換後のデータ長を求める 例 "0391c75c9cbf" → 0x3 0x91 0xc7 0x5c 0x9c 0xbf コード #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { const char * p = "0391c75c9cbf1b68a3e19c269216677"; unsigned char * dest = NUL</string.h></stdlib.h></stdio.h>…