このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

連絡的

いいこと言うなー

http://kaede.to/~canada/doc/issues-of-this-year

また過去エントリーへの参照

「プログラマの常識」ってなによ? - 檜山正幸のキマイラ飼育記 (はてなBlog) 「常識」というよりは「理解の基盤」と「説明の方法」 - 檜山正幸のキマイラ飼育記 (はてなBlog)

説教的

上が新しい。 概括的な理解と細部への拘り - 檜山正幸のキマイラ飼育記 (はてなBlog) ペラペラの表層、シッカリした内実 - 檜山正幸のキマイラ飼育記 (はてなBlog) なかなか分からない、という能力 - 檜山正幸のキマイラ飼育記 (はてなBlog)

OS機能を直接使ってみる

システムコールwriteを使って、stdout(のファイルハンドル)に整数を10進表記で出力する関数 putn(int) を書きましょう(戻り値はどうでもいい)。printfもそのようにして作られている。

あー、そうか、自転車と同じなのか

長男に自転車の練習をさせていた時のことを思い出した。 補助輪を使うかどうか悩んだ 補助輪は止めたけど、ひたすらバランスを取る練習 あぶないので付きっきり ブレーキ、信号、左右確認などはずっと後 PCゲームで交通ルールは学んだ(が、たぶん身に付いて…

ラップアラウンド現象

/* wrap-around.c */ #include <stdio.h> /* この動作をなにがあっても一生忘れないように、 * 1日数回実行して、通算千回ほどは眺めること。 */ main() { signed char sc = 100; unsigned char uc = 100; int i; for (i = 0; i < 200; i++) { printf("%03d:%4d %4d\n</stdio.h>…

思いついた遊び小物

10桁×10行のテキストファイルに、空白文字と星印('*')で描いたアスキーアートを、13バイトのファイルにエンコード/デコードするプログラムを書け。

サルになる

名前が長めなのは、既存コマンドと名前がかち合わないように。順不同。すべてフィルターコマンド compact-text find-word word replace-chars chars1 chars2 replace-word word1 word2 fold-text width format-col width split-to-words unique-word count-l…

今日の説教と予定

座学、畳水練は止めよう わかんなかったら実験、探索 少ない知識でも、組み合わせて推論すれば、たいていのことは分かる。 組み合わせ方や推論の能力が真の問題かもしれないが、、、 考えない習慣/やってみない習慣を直す(矯正する/強制する)ようにしよ…

「おまじない」と言われても納得しない感性

Kuwataさん、いいこというよな → http://return0.dyndns.org/log/2009/02/05#s_1 char c = -1; int i = -1; unsigned char u = 0xFF;なんていうドウッテコトナイ代入を見て、どう理解するかだよな。ほんとにリアルにイメージしてるか、と。ところで、符号拡…

オモチャの圧縮実験

最大一致スライディング辞書方式によるアスキーテキストの圧縮をしてみる。一致検査をする最大バイト数とファイルの最大サイズを適当に決定する。 欠点:7ビットテキストにしか適用できない 欠点:ファイルの最大サイズが制限される いい点:1パスで済む い…

手と目を使え、体を動かせ、考え込む前にやってみれ

標準のライブラリ関数の使い方とか、あるいはライブラリ関数じゃ不足/不適切で自前の関数で置き換える事とか、メモリ管理の難しさとか、ともかく経験しないとナニもはじまらないし、前に進めるわけもない。僕は根性主義は大嫌いだが(「アンチ根性 ミニリン…

grepに似たプログラム

適当な名前(strfindとか)で、ファイルから文字列を探し、発見したらその行を表示するプログラムを作れ。 $ strfind # これはエラー $ strfind abc # abcを標準入力から探す $ strfind abc file.txt # abcをfile.txtから探す $ strfind abc file1.txt file2…

ファイルの16進ダンプ

最初の頃の課題:装飾はなくていいので、とにかく16進でダンプ。素直に無駄なく、必要なことだけをストレートに書く。そして、次のようなしきたりは守る。 引数なしならstdin(標準入力)、これは絶対ってわけでもない。 エラーメッセージはstderrに! これ…

例外もどき:マズイことが起きたことを伝える方法

正常な戻り値とはなり得ない値をエラー値とする。fopen()のNULL、getchar()のEOFとか。 正常な戻り値のなかで何か選んで「エラーかもしれない値」とする。それとは別に大域変数を使う。errno方式。 引数に、結果を返すべき変数(バッファ)へのポインターを…

文字列を数値に

そろそろ、次の課題の解答例を挙げておこう。 符号なし('+', '-'が付かない)十進整数を表現する文字列を数値(コンピュータが通常は整数と認識するであろうデータ)に変換する関数 素直に無駄なく、直球勝負で書けばこんな感じだろう。 /* 符号なし整数のa…

構造体の前に少し

次のような言葉はよく耳(目)にするだろう。 スタック スタックフレーム ヒープ スレッド プロセス で、あらためて「これはなに?」 nm, strip, od とか使え。 自作asciiを色々改善しろ。 自作ダンプも色々改善しろ。 データとそれに対する操作は: 値(ビ…

配列

先入観、思いこみ、つまらない(事実とは異なる)推測は徹底的に捨てよう! 余計なことは考えない。ただひたすら、メモリ状況の(事実に即した)絵を描くのみ。 内部の状態(メモリレイアウト)と出力の意味を説明せよ。 #include char a0[] = {'a', 'b', 'c…

主に配列

課題の確認: コマンドラインからの符号なし整数をビット表示 ファイルの16進ダンプ asciiコマンド 新規:画像ファイルを読んで、縦横“サイズ”などを表示 ファイルの扱いやエラー処理の常識を自習 履歴はとっておけ! バカな自分を振り返れば、進歩した自分…

ASCIIコマンド

自前でasciiコマンドを作る。縦列にするカラム型のレイアウトはめんどうだから、横に見ていく形でよい。0から127の値に対して、16進表記と対応するASCII文字を並べた3行で1セット。行の長さは見やすいように適宜調整。

メモリブロック

どこ?=場所=先頭アドレス どのくらい?=サイズ なに?=中身 メモリセルとは区別する。メモリセクション/セグメントともちょっと別。xがメモリブロックを指すなら、 どこ → &x どのくらい → sizeof(x) なに → 例えば次の関数 #include void dumpmem(uns…

備忘

JavaとCのあいだには文化問題があると思う。 異なる文化は同列に議論も理解もできない。 欧米やアフリカの人に、「粒餡(tsubuan)」や「鰹だし(katsuodashi)」の意味を説明するには? 郷に入りては郷に従え。 欠点も含めて特徴。メリットデメリットはもの…

配列

配列はけっこう難しい。配列データの概念は全然難しくないけど、ソースコード上の配列名がなんであるかが分かりにくい。ポインタ変数というわけでもない。一方で、ポインタ変数は構文上は配列名と同じように機能する。「配列名=ポインタ変数」は間違いだが…

構造体もけっこう意外だったりして

#include struct person { unsigned short age; char *name; } ichiro = {23, "SUZUKI Ichiro"};struct person2 { unsigned short age; char name[20]; } jiro = {20, "SUZUKI Jiro"};main() { printf("sizeof(ichiro) = %d\n", sizeof(ichiro)); printf("si…

配列は意外なところもある

#include int a[] = {1, 2, 3}; char b[] = {1, 2, 3};main() { printf("a = %x, &a = %x, sizeof(a) = %d\n", a, &a, sizeof(a)); printf("a[0] = %x, &a[0] = %x, sizeof(a[0]) = %d\n", a[0], &a[0], sizeof(a[0])); printf("b = %x, &b = %x, sizeof(b) …

再帰の秘密を覗いてみる

#include int x = 1; int i = 1;void rec(int c) { int i = 0; printf("(c = %d) &x = %p, &c = %p, &i = %p\n", c, &x, &c, &i); if (c rec(c - 1); }main() { int c = 5; printf("(main ) &x = %p, &c = %p, &i = %p\n", &x, &c, &i); rec(c); }

言い忘れている

不等号比較でも符号が関係するな。 やっぱり関係しないな。 ニブル、MSBとLSB、桁位置と桁数 符号ビットという言葉はある。 3本指で8、片手で32、両手で1K (1024)、両手両足で1M (1024*1024) 型とサイズの一覧表 http://d.hatena.ne.jp/m-hiyama-memo/200809…

大きな戻り値

構造体は値としてやり取りできる(コンパイラがやってくれる) 呼ぶ側にバッファを準備してもらう。サイズも渡すのが吉。 呼ばれた側にある静的バッファを使う。マルチスレッドで無理がある。 呼ばれた側で動的メモリを確保して返す。free忘れで問題も起きる…

エラーの通知

エラーは起きないと仮定 正常値と異常値を戻り値で 大域変数にエラー情報 エラー変数を出力引数に 戻り値を出力引数に 構造的データを使う 例:num ::= [0-9]* (8桁まで) エラーはBAD_CHARとTOO_LONG。

いろいろなアドレス

int g[] = {1, 2};main(int argc) { int i = 1; int j = 2; char *pc = (char *)g; start: printf("g = %p\n", g); printf("&g[0] = %p\n", &g[0]); printf("&g[1] = %p\n", &g[1]); printf("g + 1 = %p\n", g + 1); printf("g + 2 = %p\n", g + 2); printf(…