OSC2016 Hiroshimaの記録
11/25 サロンカーあかつき
翌日LTやるというのに、深夜の広島駅で撮り鉄しました。
なぜLTの準備をやらなかったのかコレガワカラナイ。
3時間くらい場所取りして寒い中待機してたので体力がかなり削れました。
サロンカーあかつきの前には広電の撮影にも逝ってたので完全にヤバイ。
この日は最終電車で帰宅し、26日の午前2時に寝ました。
11/26 前日イベント・学生LT大会
イベントは午後なので午前は暇なのですが、午前中に「トワイライトエクスプレス 瑞風の試運転」と「工8380レ」を撮りに行ってしまったので、LTの準備はできませんでした(仕方ない)。
こんなことやってるから会場には若干遅れて到着してしまいましたが、自分の発表は後だったのでまだよかったですね。
当日は香川大学工学部の学生がかなり多かったですね。
SLPというサークルの活動として広島まで来ているようで、僕としては
サークル活動の悦びを知りあがって!お前ら許さんぞ!
サークル活動の悦びを知りあがって自分たちばっかし、俺にもさせろよ!グギィィィ!
って感じでした。
自分の発表ですが、ぶっつけ本番でしたので、トラブルだらけで死にました。
こういうこともあろうかとPC2台持ち込み余裕でした。
頭のCPU使用率100%なので、細かなことに気を配れず、「次は頑張ろう」という感じです。
それにも関わらず、ネタ自体は捨て身覚悟の自虐ネタなので、なかなか皆様の印象に残ってしまっていたようです!
大学の先生にバレたらヤバイ。
でもせっかくなので、発表ネタの詳細をじっくり解説していきます。
発表ネタの解説
フィルムの日付
写真用フィルムは使用期限があり、それの日付です。
拡張子「.cpp」
C言語のソースファイルを「.cpp」にするのは即刻中止せよ!というネタです。
実際に僕が通っている大学では「.c」の代わりに「.cpp」で保存・コンパイルを行っています。100%実話です。
ここでは「.c」を「.cpp」にするとどのような実害が発生するのか解説していきます。
数学関数のオーバーロード
これはおそらく古いVisual C++限定で発生する問題です。
<cmath>
ではなく<math.h>
をインクルードしたのに、引数にdouble
を取る関数にint
など、double
やfloat
に暗黙的にキャストされる型の変数を入れるとエラーになるというものです。
ちなみに新しいVisual C++では発生しません。
1 2 3 4 5 6 7 8 |
#include <math.h> int main(void) { sqrt(100); return 0; } |
1 |
error C2668: 'sqrt' : オーバーロード関数の呼び出しを解決することができません。 |
これはC言語の標準ライブラリのヘッダをincludeでしているのに、C++の標準ライブラリのヘッダをincludeしてしまっているので発生します。
実際に<math.h>
を見ると、関数がオーバーロードされています。
int
はfloat
でもdouble
でもlong double
でも暗黙的なキャストができうるのでエラーになります。
このエラーは1番出現率が高いです。
C言語にはない「オーバーロード」という単語がエラーメッセージに現れるので混乱してしまい、授業が遅延してしまいます。
出現率・実害共に申し分ありません。
解決方法は
- 古いVisual C++を使わない
- 明示的にキャストする
- 正しい拡張子(.c)に修正する
のどれかです。
型チェック
C言語はvoid*
から各種ポインタに暗黙的にキャストできますが、C++ではエラーになります。
malloc
関数を使うと100%このエラーが問題になりますが、授業では一切触れないのでスルーされています。
1 2 3 4 5 6 7 8 |
#include <stdlib.h> int main(void) { int *ptr = malloc(sizeof(int) * 10); free(ptr); return 0; } |
解決方法は
- 明示的にキャストする
- 正しい拡張子(.c)に修正する
のどれかです。
戻り値の型
C89(ANSI C)では戻り値の型を省略すると、暗黙的に戻り値の型がint
になります。
C++では戻り値の型は省略できないのでエラーになります。
ちなみに、C99やC11でもエラーになるので、どちらかというと省略してしまう方が悪いです。
1 2 3 4 |
main(void) { return 0; } |
大学では古い授業の資料が使いまわされており、その資料で出現します。
コードをそのまま写すとエラーになり、学生を混乱に陥れます。
書いた本人ですら分からないマジックナンバー
例えばじゃんけんで
- グーを1
- チョキを2
- パーを3
として表現してプログラムを書いた時に、1がグーなのかチョキなのかパーなのか分からなくなってしまうことです。
1という数字を見てグーだということが分かるわけないし、プログラムが複雑になったり、種類が増えると頭で覚えることが困難になります。
可読性も下がってしまい、授業の資料みたいに何年も使いまわすとなると大変です。
こんなことになるなら、enum
を使うべきだし、それができなくても#define
で定数を宣言することは授業でやったので、それを駆使するようにすればマシになっていたはずです。
strcat関数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#include <string.h> #include <stdio.h> int main(void) { int a = 1; int b = 2; int c = a + b; char str1[10]; char str2[10]; char str3[10]; char str4[] = "+"; char str5[] = "="; char str6[334] = ""; sprintf(str1, "%d", a); sprintf(str2, "%d", b); sprintf(str3, "%d", c); strcat(str6, str1); strcat(str6, str4); strcat(str6, str2); strcat(str6, str5); strcat(str6, str3); printf("%sn", str6); return 0; } |
こんな感じでstrcat
関数でちまちま文字列を連結するコードです。
ちなみにsprintf
関数なら1行で文字列を連結できます。
sprintf
関数は出てきていますが、あくまで「整数を文字列に変換する関数」として出てきています。
なお教わった学生が真似してしまっている模様。
C99が使えるならsnprintf
のほうがいいです。
乱数生成
1秒間に何回もシード値として現在時刻を入れていたので、プログラムの起動時に1回だけにしました。
乱数生成エンジンもstd::mt19937
にしたし、std::uniform_int_distribution
も使ったので、元のプログラムより乱数の質がずっと上がりました。
rand() % n
とか論外ですからね。
11/26 前日祭
無限に🍺と🍣を補給しました。
しかも同じ世代の学生と技術系の会話をして通じるとか最高かよ。
その上に学生無料とかここは天国か?
11/27 OSC 広島
岡オカD-03編成の幡生入場回送があったので撮影してから参戦。
ちまちま撮影する体力が無かったのでパノラマ撮影してみました。
部屋の明るさにムラがあるので結構キツイ。
こういう勉強会の発表って、大学での公演と違って、レポート書きながら聞くことを強制されないのがいいんですよね。
面白い発表だと聞き入って、聞きながら書けないし、書いてると話を聞けないし・・・。
入出力が同時にできない僕みたいな人にとっては最高ですね。
集中力持たない人でも、おしゃべりに時間を費やすことが許されるのもポイント。
3時間連続で話聞かなくてもいいんです。
11/27 懇親会
無限に🍺を補給しました。
うまいもの食いながら会話ができるとか最高か?
11/27 二次会
無限に焼酎を補給しました。
ちなみに終電逃してしまいそうになりました。結構アルコールを摂取したつもりだったんですが、普通に全力ダッシュできるもんなんですね。
11/28 サロンカーあかつき
深夜に撮影。
寝たのは午前3時を過ぎてから。
睡眠時間は3時間半です。
死にました。
まとめ
- 撮り鉄をやめろ
- LTの準備はちゃんとやれ
- バックアップは重要
- サークル活動に嫉妬した
- 技術系の話が通じる喜び
- 無限に飲食した
- フィルムカメラは学生には通じないけど、大人には通じる
普段は水しか飲まないので飲酒に関して知識が皆無なのがちょっと辛い。
同情するなら金をくれ。