「C言語ポインタ完全制覇」の第二版が発売されています。古い表紙版は既に持っているのですが、内容も更新されているので、嬉しくて買ってしまいました。
学校に置いて行ったり、友人に渡したり、買いまくってましたw
この本がなかったらC言語を扱うことを諦めていたような気がします。
「OS自作入門」や「CPUの創り方」の影響ももちろん大きかったと思うのですが、この本を読んでいなければC言語をそれなりに扱えるようにはなれなかったと思います。
C言語や電子工作
「C言語ポインタ完全制覇」の第二版が発売されています。古い表紙版は既に持っているのですが、内容も更新されているので、嬉しくて買ってしまいました。
学校に置いて行ったり、友人に渡したり、買いまくってましたw
この本がなかったらC言語を扱うことを諦めていたような気がします。
「OS自作入門」や「CPUの創り方」の影響ももちろん大きかったと思うのですが、この本を読んでいなければC言語をそれなりに扱えるようにはなれなかったと思います。
構造体の宣言と定義
struct Tag { char member1; int member2; };
これは何を意味するか考える。
構造体・共有体指定子中の{...}部分(の存在)は、その翻訳単位内で新しい型の宣言をする。(6.7.2.1p8)
{...}を含む構造体、共有体、列挙型の型指定子は、それぞれの型を宣言する。
{...}の部分は、それらのコンテンツを定義する。
型指定子に識別子が提供された場合、その型指定子はその型のタグとなる識別子も宣言する。(6.7.2.3p6)
(6.7.2.3 Tagsの制約として)ある型は、最大一回だけ定義されたコンテンツ(内容)を持たなければならない(持てる?)(shall have)(6.7.2.3p1)
コンテンツとは、(6.7.2.3p6)から、構造体の持つ要素であると言える。
同じタグを持ち、同じスコープを持つ構造体型、共有体型、列挙型の宣言は、同じ型を宣言する。(6.7.2.3p4)
ある翻訳単位に、ある型のタグや他の宣言があるかどうかにかかわらず、コンテンツの定義のとじカッコ(})が現れるまでは不完全型であり、その直後に完全型となる。(6.7.2.3p4)
識別子は、オブジェクト、関数、構造体や共有体や列挙のメンバ名かタグ、typedef名、ラベル名、マクロ名、マクロ仮引数を、一つ示す(意味する、表す)ことができる。(6.2.1p1)
宣言は識別子の解釈と属性を明示する。(6.7p5)
オブジェクトのストレージの割当を引き起こす、オブジェクトの識別子の宣言は定義である。(6.7p5)
関数の本体を含む識別子の宣言は定義である。(6.7p5)
なお、無名の構造体(タグも識別子も持たない、構造体のコンテンツの定義のみを行う)は文法上構造体などの内部でしかできないと思う(ちゃんと確認はしていない)(6.7.2.1p1)
以上のことから、最初のコード片は、
「新しい構造体型の宣言と、構造体を示す識別子(=タグ)の宣言であり、さらにその識別子が示す構造体型のコンテンツを定義している」
と考える。
C++では少なくとも、宣言のうち定義でないものが明確であり(3.1p2)、一般的な意味での「クラスの定義」とは何であるかはわかりやすい。(9p2)
C++の方が、部分的にはわかりやすい気がします。
Raspberry Pi2にそれなりに重い処理をさせると熱が気になりますが、Webカメラサーバーと無線LANくらいであればヒートシンクをつけてケースに閉じ込めていても大丈夫なようです。
九州でも夏の間一度も停止することなく過ごすことが出来ました。RaspberryPiは意外と熱に強いようです。
ただ、やはりセンサー値で60℃を超えることもあるので、強制空冷を試してみました。
強制空冷と言っても、こんな感じでケースの上に8cmファンを直付しただけです。
ケースも下部に穴が開いているだけのものなので、ケースに直接風を当てることになります。
こんな雑な空冷意味がないだろうと思っていましたが、下のグラフのように10℃近く温度を下げることが出来ました。 空冷恐るべし。
この実験は秋に行ったものなので、夏場では外気温も上がり、もう少し効率は落ちるかもしれません。
ケースを殆ど密閉状態にしていても空冷できることがわかったので、基板がホコリまみれになる心配がなく、 長期的に安定稼働させられそうです。
さすがに常時回転させると気になるくらいの音が出るので、RaspberryPiからCPU温度によって回転数を制御してあげると良さそうです。
gitをしばらく使ってみても、いまいちよくわからないままでした。 なんとなくスッキリしない感じでした。
でも、ふと「ポインタ」という用語を見て 「C言語風に理解できるんじゃないか?」 と考えてみると、少しだけ理解できたような気分になりました。
gitでの | C言語で言うところの |
---|---|
tree,commit,blob,tag等のオブジェクト | 構造体の実体 |
ハッシュ | 構造体へのポインタ値 |
パス("refs/heads/master"など) | 構造体へのポインタへのポインタ値 |
ブランチ、軽量タグ | 構造体へのポインタ(型変数) |
HEAD | 構造体へのポインタへのポインタ(型変数) |
gitによる木、バージョン管理 | 構造体のリンクリスト |
という感じではないでしょうか? なんだか回りくどいような気もしますが…
追記1 : detached HEADの場合は直接コミットを指すようなので、HEADはvoid *型変数と言えるかもしれません。