Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

C

パイプ経由で出力をうけとる時、単純に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で導入完…

C言語の構造体を参照する方法について

C

今回は、今まで適当に扱っていた構造体に対するメモです。 間違った箇所があったら、コメントを頂けると幸いです。 typedef struct { char addr; char dataLength; } wap_pcb_t; static wap_pcb_t pcb; 関数内部やら、グローバル変数やらにアクセスする場合…

テストフレームワークのほうのUnityでC言語でもTDDを試す

C TDD

奥さん、僕ぁC言語でもTDDしたいんですよ! ……というわけで、Rubyで実現する素敵なC言語TDD環境、Unityです。 3Dゲームを作るアレではなく、TDD用テストフレームワークです。 UnityはRubyistにはお馴染みのRackを使っています。 Ruby&Rack環境が方は先に導入…

構造体と多重配列を使うと、コマンド入力形式の実行ファイルもキレイに書けます

C

よくあるコマンド入力型の実行ファイルをCで作る場合のTipsです。 何も考えず取り掛かると、string.hの各種関数に頼ったり……果ては if (str[0] == 'h' && str[1] == 'l' && .... ) { hello(argc, argv[]); } ... などと、混沌としたコードになりかねません。…

volatileの使い道 コンパイラを黙らせる

volatileはお節介焼きのコンパイラにぶぶ漬けをお出しする修飾子です。*1たとえば、以下のような処理をしたいとします 書き込み先:0x12345678 (外部インタフェイスへのアドレス) 書き込むもの:(順番に)0x31,0x32,0x33 //ASCIIの'1','2','3' この内容ならポ…