Bye Bye Moore

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

C

Arduinoでsprintfを使い文字列を生成する

Arduinoで文字列を作るときはStringクラスが使えますが 速度を高速化したい、既成のsprintfを利用したC言語プロジェクトを流用したいなどのケースでは 標準でsprintf関数を利用することができます。 実際のところ GPSと加速度を模したデータを一つの文字列と…

【自習メモ】sigaction関数でエラーハンドリング

C

shuzo-kino.hateblo.jp の自習メモの続き。 大元で使われていたsigal関数はすでに古いものらしく、sigaction関数を使えというお達しが。で、そのsigaction関数の定義は以下の通り。 ただし、三番めの引数は非推奨らしく理由がない限りはNULL。 int sigaction…

【自習メモ】ioctl関数

C

#include <sys/ioctl.h> int ioctl(int fd, unsigned long request, ...); 端末とかファイルとかを渡す用途みたいです。 たとえば、以下の例だと…… ioctl(fd_out, I_FLUSH, FLUSHW); 書き込みバッファを綺麗にします。 画像用のもある?? armadillシリーズのカメラまわり</sys/ioctl.h>…

【自習メモ】C標準ライブラリで標準出力/入力を扱うSTDOUT_FILENO/STDIN_FILENOについて

C

実際のところ 例のお手本プログラムから抜粋。 // Write data to file write(fd_out, (const void*)in_array, nBytes); // Write data to stdout as well write(STDOUT_FILENO, (const void*)in_array, nBytes); ここで、write関数の引数はこんな順番なので……

C標準ライブラリtime.hのclock_gettime関数

C

C標準ライブラリtime.hはその名とおり、時間を扱う関数です。 これのclock_gettime関数は内部時刻を呼び出す機能を持ちます。 類似した関数にgettimeofday関数がありますが、これは2008年段階から将来廃止予定に指定されています。 実際のところ clock_getti…

RasPi上にLive Streaming 環境(保存つき)を作る その1:お手本先行プロジェクトをきめる

遠隔でRasPi上にLive Streaming 環境(保存つき)を作る必要ができたので技術調査がてら。まるでメディア系に興味をもたず来たので、色々下調べしたところ 実装も軽く、意図した構成にちかい以下の動画を見つけました。 www.youtube.comこれからしばらく、こ…

bsearch関数

整列済みの配列や構造体をバイナリサーチできる関数です。 ただ、結構使い方が面倒なのでメモ。 今書いてまs

Arduino/C言語環境でスッカスカな配列を作りたい場合……構造体を使った方が軽くなることもある

shuzo-kino.hateblo.jp でも扱った構造体ですが、これをスッカスカな構造体の代わりに使う手があります。 実際のところ typedef struct { uint16_t key; char* value; } data; const data myDataArr[] { {123, "AB"}, {1023, "CD"}, {5011, "FE"} };

Arduinoで辞書型風のデータを使いたい場合、構造体を使う

考えてみりゃ当たり前なのですが……Arduinoで辞書型やハッシュ型風のデータを使いたい場合、 Typedefをつかった構造体を定義すればつかえます。 実際のところ typedef struct { uint8_t lang; char* sound; char* value; } dataDictionary; const dataDiction…

ddコマンドでNULL(0x00)埋めデータをつくる

実際のところ 100バイトのファイルを生成する場合は以下のように。 bsがバイト数、countが繰り返しで、出力を指定するifが0x00を延々と出力する/dev/nullなので 期待した出力が得られます。 dd bs=100 count=1 if=/dev/zero of=file1ためしにhexdumpで見ると…

プリプロセッサ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にて独自のデータ型を作るときに使用する予約語です。 マイコンを跨いだ実装でありがちな取り扱いビット数の差も、これらを用いて吸収できます。 基本型の機能を極力使いたいけど、一部振る舞いだけ変えたいとき、 あるいはアーキテク…

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