セキュリティキャンプ2016の応募用紙
セキュキャン何故か受かりました。クソ雑魚なので当日に向けて精進します。
締め切り前の土日で急いで書いたので日本語がおかしいところがあるかもしれないですが、せっかくなので無知を晒したいと思います。応募用紙と簡単に問題を解いた感想を書いておきます。
来年以降応募する人の参考に少しでもなれば幸いです。
続きを読むC言語の関数の引数の評価順序
あらすじ
( ^o^)<ショートコーディング楽しい!
( ^o^)<よーしprintfの引数の中でポインタの参照とインクリメント同時にやっちゃおう!
(;^o^)<あれ…期待した通りに動作しないぞ…
( ˘⊖˘) 。o(待てよ、引数の評価順序ってどうなってるんだ)
|C/C++|┗(☋` )┓三
( ◠‿◠ )☛未定義だ
▂▅▇█▓▒░('ω')░▒▓█▇▅▂うわあああああああああああ
C言語の関数の引数の評価順序に見事に引っかかった。
C言語では関数の引数の評価順序は未定義で処理系によって異なるらしい。
そこで、ちょっと気になったので手元で使えるGCCとVisualStudioで検証してみることにした。
検証コード
#include <stdio.h> int a; int func(int arg){ a=arg; return arg; } int main(void){ printf("%d %d\n",func(1),func(2)); printf("a:%d",a); return 0; }
関数funcに渡された引数を変数aに入れてから引数をそのまま返します。
その後2行目に変数aを出力します。
出力された変数aが1だったら右→左の順、2だったら左→右の順になります。
実行結果
GCC6.1.1場合
1 2 a:1
VisualStudio2015場合
1 2 a:1
どちらともaの値は1になっており引数の評価は右→左の順で行われている様です。
まとめのようなもの
結果はどちらとも右から左だったので普通は右から左に評価されてくのでしょうか。
どちらにしろ未定義とのことなので使わないほうがいいんですが、知っておくと何か役に立つのかもしれないですね。
あとは左から右に評価されてく処理系とかあったりするのか気になります。
その辺も含めて又の機会にもうちょっと詳しいところを調べてみたいと思いました。
参考
引数として関数を渡したときの実行順序 - mooz deceives you
BohYoh.com-C/C++ FAQ 関数に渡される実引数の評価順序はどうなっていますか。
↑javaの場合は左から右に統一されているんですね。
引数の評価順序 - Togetterまとめ
↑(x=3)+(x+4)の様な部分式の場合も同じようなことになるみたいです。
P.S.
今日外を歩いてたら鳥の糞が直撃しました
すごくつらいです
運賃表示器を買った
お久しぶりです。
だいぶ前に某鉄道イベントで運賃表示器を購入してしまいました。
#イシノマキセブンティーンアイス pic.twitter.com/E4s78JBwc1
— あきー (@akkkix) 2015年10月4日
制御方法が分からずしばらく放置していたのですが、久しぶりに動かしてみようと思ったので色々書こうと思います。
ハードウェアに関する知識は皆無にほぼ等しいので間違っている点等があるかもしれませんがお許しください。
正攻法的に運賃表示器の入力線を使う→挫折
この運賃表示器はどうやらレシップという会社の製品のようですがgoogle先生に聞いてもはっきりとした答えが出てこない。
調べ方が悪いのかもしれませんがこの手のものは情報が出て来辛いと思ったのでここであっさりと諦めました。
(ここまで去年)
(ここから今年)
久しぶりに運賃表示器を眺めてたらすすのようなもので隠れている型番のシールを見つけた。早速検索してみるも情報がない。
諦めてから結構月日が流れ気づいたら三月になってた。再び動かしてみようと言う気持ちになり、情報収集をしてみる。
そういえばこれ由利高原鉄道のやつだったよなぁ思い、適当に調べてみた。
運賃表示器の在りし日の姿がみつかる
由利高原鉄道YR-1500形
こことか
この動画の00:58らへんとか
この動画の00:36らへんとか
上部のマトリクスLED、赤緑の2色だったんですね。ずっとオレンジの単色だと思ってました。
マトリクスLEDの部分だけでもうごかせないか
運賃表示器の情報を収集してるときに見つけた動画を思い出した。
京急ファミリー鉄道フェスタ2014で購入した2100形の車内LEDをArduinoで制御してみました。 制御方法が不明なためLEDモジュール自体を制御しています。
なるほど、制御方法分からないしいっそのことマトリクスLED単体で動かしてみるのもありかもしれない。
早速マトリクスLEDを取り外してみた。
マトリクスLEDだけ外してみた pic.twitter.com/V6la1XUF30
— あきー (@akkkix) 2016年2月28日
CNとINとOUTの3個ポートがあるけど一体どうなってるんだ pic.twitter.com/cDWVPzmNFr
— あきー (@akkkix) 2016年2月28日
わからん。
とりあえずgoogle先生に聞いたらマトリクスLEDの制御にはダイナミック制御と言うものがあるらしい。
んで制御にはシフトレジスタが使われるとのこと。確かにマトリクスLEDの基板にはシフトレジスタ(TB62706)が使われていた。
入力端子に何を入れるか分からないとどうしようもないのでまたgoogle先生に聞いてみた。
基板の解析
なるほど、基板の解析ってそんなに難しくない?とりあえずやってみよう。
マトリクスLED基板の解析をしてまスゥゥゥゥ… pic.twitter.com/rW3NxJAtwv
— あきー (@akkkix) 2016年3月2日
ドライバ基板(?)とマトリクスLEDの本体を外して
どこに何入れるか大体分かった pic.twitter.com/v453NqYMEA
— あきー (@akkkix) 2016年3月3日
ICの役割を調べてひたすらパターンを追いました。かなり地道な作業でしたがとりあえずなんとかなった。
行の指定に3-8デコーダー(74HC238A)、一列の点灯パターンの指定に16ビットシフトレジスタ(TB62706)が使われているっぽい。
ここまで分かれば後は簡単でそれぞれのICの挙動を調べてarduino等で制御するだけ。
適当にプログラムかいて動かしてみた。
出発時期表示シリーズ pic.twitter.com/RRuvQciY4Q
— あきー (@akkkix) 2016年3月6日
動いた!!
多分続きます。
C言語でピラミッドを作る
C言語のfor文でビラミッド型にアスタリスクを出力するプログラム。
学校の授業でハマる人が多かったので、アスタリスクと空白の数について簡単に解説してみる。
コード
実行結果
解説
まずはピラミッドを構成しているアスタリスクの数について考えます。
行数と関連付けて考えることが大事そうです。
アスタリスクの数は1行目は1個、2行目は3個、3行目は5個...となっています。
つまり奇数ですね。
奇数は「n×2-1」で表すことができるので、
アスタリスクの数=行数×2-1
となります。
これをコードにすると9行目から11行目の様になります。
次に空白の数を考えます。
空白の数もアスタリスクの数と同じように行数と関連付けて考えると、
空白の数=全体の行数-行数
となっていることがわかります。
これをコードにすると6行目から8行目の様になります。
以上です。
/*
上のコードのどこかを変えると逆三角形になったり、何行出力するか変えられたりできるよ。わかった人はやってみてね。
*/