Bye Bye Moore

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

C

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>…

【読書メモ】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…

WITHINでブレる値も扱う(Unity系TDDツール)

TDD C

組込み機器といえば、センサーですね。 温度センサーで水温測ったり、加速度で転倒検知したり。 ところが、こういうモノは値ブレブレで一意に定まりません。 ここで活躍するのがWITHIN構文です。 TEST_ASSERT_INT_WITHIN(delta, expected, actual); これは、…

【Unity系TDD】TEST_ASSERT_EQUALは便利でもなるだけ使わない。

C TDD

TEST_ASSERT_EQUALはINT型の計算結果を返します。 公式ドキュメントによればTEST_ASSERT_EQUAL_INTと同じ意味合いらしいです。 ……というわけで #define END_FLAG 0b11111111 int8_t result = END_FLAG; というコードに対して TEST_ASSERT_EQUAL(END_FLAG, re…

mrubyで書いたコードをC言語内で読み出す方法

mrubyで書いたコードをC言語内で読み出す方法です。 今回はまんま参考もと様と同じ内容ですが…… mrubyコードをC言語に埋め込む 今回導入するコードは以下の通り C言語のコード ソース1。mrb_funcallで実行開始です。 3番目が呼び出す関数名、4番目が引数…

strtokでchar配列を切り分ける

C

strtokはchar配列を特定のcharにて切り分ける関数です。 安全版のstrtok_rもあります。感じとしてはRubyのsplitメソッドみたいです。 が、ちょいと癖があります。 Ruby風に言えば破壊的メソッドです。*1 挙動 初回 最初に対象となるchar配列と切り分け文字を…

CeedlingでUnityを更に便利にする(その3)

C TDD

今回はCeedlingのコマンドに関してです。 とりあえずは、全部テストの rake test:allとビルド内容をクリアする rake cleanさえ使えれば大丈夫です。 それに加えて以下のコマンドを使えると更に捗ります。 verbosity rake verbosity[0] test:allといった感じ…

CeedlingでUnityを更に便利にする(その1)

C TDD

以前の記事で紹介したTDDフレームワークUnityですが、 それの強化発展版としてCeedlingというものがあります。 Sinatraにとってのpadrinoみたいなものですね。 前提 Ruby / Rack が動作する環境 gcc系のC/C++コンパイラ 手順 $ gem install ceedlingで導入完…