Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

C

プリプロセッサifで入り組んだ内容を記述

実際のところ ifdefと違い、if-else構文に落とし込む事ができます。 やれる事の幅が広がりますね。 #if defined(CREDIT) credit(); #elif defined(DEBIT) debit(); #else printerror(); #endif 参考もと docs.microsoft.com e-words.jp

ifdefの使い方

//#define DEBUG_MODE //... #ifdef DEBUG_MODE Serial.print("Set Patlite: 0x"); Serial.println(state, HEX); #endif defineをコメントアウトしたままだと、ifdef~endifの部分は読み飛ばされます。 参考元 stackoverflow.com docs.microsoft.com

fflushで出力用バッファを吐き出させる

C

fflushはC言語用標準ライブラリstdio.hにある関数の一つです。 出力のバッファにたまったモノを吐き出させます。 必ずしも文字列であるとは限らずバイナリだったりする事もあるので注意。 実際のところ #include <stdio.h> #define HIGH 1 #define DI1 27 #define BUF</stdio.h>…

wiringPiの時間系関数群

wiringPiの時間系関数群には小面倒なことを片付けてくれるやつが入っています。 実際のところ unsigned int millis (void) wiringPiを起動してからの秒数を返してくれます。 データ型の上限で49日ほどが最大ですが void delay (unsigned int howLong) Arduin…

WiringPiでRasPiのインターフェイスをC言語経由で扱う

WiringPiというライブラリを使うと、RasPiのインターフェイスをC言語経由で扱うことができます。 Pythonとかで扱うケースは結構みますけど、 ある程度突っ込んだことをするケースとかでは何やかんやでC言語はアテになります。 実際のところ 導入 $ cd #YOURD…

Valgrindのメモリリークエラー

C

Valgrindでは以下のメモリ問題を検知できます4.2.1. Illegal read / Illegal write errors 4.2.2. Use of uninitialised values 4.2.3. Use of uninitialised or unaddressable values in system calls 4.2.4. Illegal frees 4.2.5. When a heap block is fr…

bitSet/bitClear関数で特定のビットをHigh/Lowする

実際のところ Xという変数のA番目ビットをHighにするbitSet関数、 Aは最下位(右端)ビットを0としてA番目です。 bitSet(X, A); LowにするのはbitClear関数。 bitClear(X, A); 参考もと www.arduino.cc www.arduino.cc

Valgrindをつかってメモリ破壊してないかチェックする

実際のところ まずは公式チュートリアル通りの以下のスクリプトをやってみましょう。 (コメントは日本語してみました) #include <stdlib.h> void f(void) { int* x = malloc(10 * sizeof(int)); x[10] = 0; // 問題その1: ヒープ領域ぶっちぎってる } // 問題その2: </stdlib.h>…

enum変数

C

いまかいてます

Arduinoの割り込み許可/禁止関数(interrupts/noInterrupts)はそれぞれのボード固有の命令の読み替えをしてくれている

割り込み許可はinterrupts関数、割り込み禁止はnoInterrrupts関数。 というわけで……余計な最適化を阻止したいなら 割り込み禁止と許可の関数でサンドイッチ。 noInterrupts(); //割り込み禁止 // ...ここに割り込み禁止な内容を interrupts(); //用が済んだ…

getopt関数のつかいかた

C

実際のところ #include <unistd.h> #include <stdlib.h> #include <stdio.h> int main(int argc, char *argv[]) { int flags, opt; int nsecs, tfnd; nsecs = 0; tfnd = 0; flags = 0; /* ":" は引数必須のオプション*/ while ((opt = getopt(argc, argv, "nt:")) != -1) { switch (opt) {</stdio.h></stdlib.h></unistd.h>…

scanfで入力文字を制限する

C

実際のところ そんなもん%xでやれば良さそうですが。 #include <stdio.h> int makeTitle(char str[]) { printf("\n\n###%s###\n\n", str); return 0; } int main() { char string[10]; makeTitle("a~f以外は無視するよ"); scanf("%10[abcdef]", string); printf(">> %</stdio.h>…

Cのポインタでは*(hoge +3)とhoge[3]と3[hoge]は同じ結果になる

C

$ cat sample.c #include <stdio.h> int makeTitle(char str[]) { printf("\n\n###%s###\n\n", str); return 0; } int main() { char string[] = "Hello, world"; makeTitle("文字列"); printf("%s\n",string); printf("%s\n",(string + 7)); makeTitle("文字"); prin</stdio.h>…

【読書メモ】Head First C

Head First C ―頭とからだで覚えるCの基本作者: David Griffiths,Dawn Griffiths,中田秀基,木下哲也出版社/メーカー: オライリージャパン発売日: 2013/04/03メディア: 大型本この商品を含むブログ (5件) を見る有名なHead FirstシリーズにC言語版があると知…

【読書メモ】C/C++逆引き大全

現場ですぐに使える! C/C++逆引き大全 560の極意作者: 増田智明出版社/メーカー: 秀和システム発売日: 2018/03/27メディア: 単行本この商品を含むブログを見る名前の通り、まんまのC言語、またはC++言語の逆引きリファレンス集です。 初心者一歩あと*1になっ…

【自習メモ】typedefとusing

typedefやusingはc/cppにて独自のデータ型を作るときに使用する予約語です。 後者の方が新しい記法らしい。また、マイコンを跨いだ実装でありがちな取り扱いビット数の差も、これらを用いて吸収できるとか。 参考もと typedef は C++11 ではオワコン [typede…

write関数で所定の長さのデータを書き込む

C

エラー対策もブン投げた最小構成は以下のような感じ。 ただし、ファイルはちゃんと閉じましょう。 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> int main(void) { int fd; char buf[256] = "1,2,3\n4,5,6\n7,8,9\n"; ssize_t ret; fd = open("./data.log", O_CR</unistd.h></fcntl.h></sys/stat.h></sys/types.h>…

stdoutはファイルポインタとして渡せる

C

いままでC言語やってきて今更知ったのですが……stdoutはファイルポインタの型をもつため ファイルポインタを引数にもつ関数に渡す事ができます。いままで、なんとなく使ってました……。 getc(stdout); とか fputs("hello, world.", stdout); stdin、stdout、st…

パイプ経由で出力をうけとる時、単純にscanf使えばいい

考えてみりゃ当たり前だったのですが……パイプ経由で出力をうけとる時、単純にscanf使えばいいです。 実際のところ #include <stdio.h> int main() { char str[1][0x100] = { "" }; scanf("%s", str[0]); printf("%s is good!\n", str[0]); return 0; } $ echo 'hoge' </stdio.h>…

文字列を複数持たせる場合

#include <stdio.h> int main() { //多次元配列 char str[2][0x10] = { "", "yeah!" }; //ポインタ変数の配列 char *str2[2] = { "", "yeah!!" }; printf("%p,%p\n", &str[0], &str[1]); printf("%p,%p\n", &str2[0], &str2[1]); return 0; } 多次元配列が宣言通りの</stdio.h>…

avr-libにはrint()がなく、lrint()はある

arduinoのavr系実装ではavr-libが使われています。 実際のところ rint()は浮動小数点をまるめ込んで整数にしてくれる奴です。 いくつか派生関数があるのですが、avr-libにはlong型を返すlrint関数しかありません。 'rint' is not declare in this scope とか…

【読書メモ】美しいCプログラミング見本帖

美しいCプログラミング見本帖―ポインタ手習い指南作者: 柏原正三出版社/メーカー: 翔泳社発売日: 2004/04メディア: 単行本購入: 2人 クリック: 44回この商品を含むブログ (9件) を見る発行は2004年と結構前です。 最新鋭のC11などには対応してない可能性…

メモリをケチってchar型でカウンターを作ると

arduinoで動作チェックも兼ねたカウンターを作っておりました。 ここ数年、型を意識しないですむ言語ばかり扱っていたためか、久々にやらかしたのでメモ。 マイナスになる可能性がないカウンターなら、最初から符号なしにしましょう。 実際のところ char cnt…

JSON-RPCが便利そう

RPC=>遠隔制御。 JSON-RPCは、そのJSON版。JSONらしいシンプルな記法で、遠隔操作を実現します。 ダウンローダのAria2ですとか、BItcoin、あとはopenElecみたいなエンタメサーバの制御に使われています。RESTなAPIと違い、受け手がHTTPを解釈できなくとも…

C言語的構文のfor文において、変数宣言部では複数の変数を設定する事が可能

C言語的構文のfor文において、変数宣言部では複数の変数を設定する事が可能です。 まことに恥ずかしい話ではありますが、プログラミングで飯喰って5年は経つのに最近はじめて知りました。 実際のところ for文の宣言部に書くことで(コンパイラなりVMの実装に…

オンラインREPL「http://repl.it/」が魔界技術すぎて辛い

ちょっとJavaScriptで遊びたいなーと検索をかけたところ…… オンラインREPL「http://repl.it/」を発見しました 使えるものの一例 JavaScript以外にも、色んな言語が実装されています。 一通り遊んでみた範囲では、軽い動作検証程度であれば十分用は成すようで…

manコマンドでC標準関数を調べる

コマンドの意味を知る時に使う、manコマンド。 実は...同名のC言語ライブラリ関数を調べる事ができます。 例えば、printf(3)とかです。何もやらなければ $ man printf | head -n 6 PRINTF(1) BSD General Commands Manual PRINTF(1) NAME printf -- formatte…

プリプロセッサを使って少し違うロジックを使い分ける

C

OSSプロジェクトでは良く見かけるifdef 自前のコードだと余り使わない子ですが、使い所はあります。種類によって一行だけ違うコードがある場合、ifdefやif defineを使うと楽にいけます。 パターン1:ifdef 対象コード #include <stdio.h> int main() { printf("yes\n</stdio.h>…

<自習用リンク>C言語によるデザインパターン(逐次追記)

C

デザインパターンとは... GoFというタツジン級エンジニア集団が提唱した、イケてる実装スタイル集の事を指します。 類似の問題があれば、これを適用するとスマートに書けるというスグレモノ。 そもそもデザインパターンとは みんな大好き結城先生によるデザ…

C言語にもREPL(Read Eval Print Loop)があるだ...ぜッ!

C

REPL(Read Eval Print Loop)は対話的開発環境なんて言われるアレです。 Rubyで行けばirbに相当します。 Lispから来た考え方のようで、星人本でも一章を割いて解説しています。今回おっ魂消たのは、これ動的言語のみの特権ではなかったという事です。 本題:C…