C
ググったときのメモとか
【C言語】ポインタが分からない人のためのポインタ講座。
Visual Studio独特のこととか多い
Visual C++ サンプルコード | 即戦力ソース集
時間取得関係
time
localtime_s, asctime_s 覚書(Visual Studio 2013)
文字列から整数の取得
atoiよりもstrtolのほうがエラー処理しっかりしている
strtol 文字列をlong値に変換(エラー検出、基数指定あり)
INT06-C. 文字列トークンを整数に変換するには strtol() 系の関数を使う
weak
GCCの属性の一種
weakがついていない同名の関数があるとそちらが優先される.
weakシンボル
リンクされているライブラリによってプログラムの動作を変える
指示付き初期化子
designated initializer
構造体のメンバ変数を初期化する際に,メンバ変数の前にドット(.)をつける.
代入の際にメンバ変数が一緒に見れるので分かりやすい.
C99で定義.C++20でも定義されたが,振る舞いがいくつか異なる点があることに注意しよう.
C++ではメンバ変数の宣言順序に代入しないとコンパイルエラーになる.
関数内で宣言した変数はreturnしてはいけない
関数内で積まれたスタックがリターン時に開放されてしまう.確かに定義されていた変数も開放されてしまう.
意識したことなかったけど言われてみればそうか
関数内で宣言した配列変数をreturnしてはいけない
組み込み
Embedded C Coding Standard
Qfplib
ARM Cortex-M0にチューニングされた浮動小数点ライブラリ,非常に小容量(1kbyte以下)
GPLバージョン2ライセンス.
コンパイラ依存マクロ
__CC_ARM # ARMコンパイラ __ICCARM__ #IAR EWARMコンパイラ __GNUC__ # GCC
What do the __CC_ARM, __ICCARM__, __GNUC__ and __TASKING__ macros mean?
C言語で定義済みマクロによるコンパイラ及びOS判定
アラインメントの抑止
__packed __attribute__((__packed__))
構造体でアラインによる詰め物が働かないようにする.
stm32の場合DMAで転送するデータの開始アドレスは4Byte協会にする必要がある.
どうやらUSBライブラリ周りはアラインメント処理が入らないようにしている.
これは送信するデータの区切り,扱いによって安全性,速度どれを優先するかによって変わるということか?
MISRA-C
もとは自動車業界で品質を高めるために書かれたコーディング規約
組み込みにフォーカスしたものが書かれているが,時代によって少し微妙な部分もある.
MISRA-C:2012 ルール一覧
浮動小数点出力
%f
が使えるようにアレコレする
gccならリンカに-u_printf
オプションを追加する.
組み込み用途ならxprintfもおすすめ,2020年末に浮動小数点出力にも対応した.
ターミナルソフトなどでASCIIとして表示するなら,整数部と小数分けて,小数部も整数として表示するという手法もある.
以下の方法を使えば%f
を使う必要はないけど余剰は使うの処理がめちゃくちゃ軽くできるかと言われるとどうだろう.
ここは完全に実装するアーキテクチャに依存するかな
float fdata = 12.34; int data1; //整数部 int data2; //小数部 data1 = fdata; //小数点以下は切り捨てられるので12が入る. data2 = (ftada * 100) % 100; /* 12.34 * 100 = 1234 1234 % 100 = 34 //余剰 data2には34が入る. */ printf("%2d.%d\n", data1, data2)
めも
a = b[i++];
動作の順番
aにb[i]を代入
iにi+1したものを代入
Tips
printfはデフォルトで2進数を表示できないので,独自に実装してやるほうがよい
【C言語】2進数 8進数 16進数 形式で出力する方法【printf】