Cプロ入門~CプロでボランティアTAをして出会ってきた諸々とそれへのツッコミ 10選
この記事はみす 52nd Advent Calendar 2017 - Adventar一日目の記事です。
風邪でアドベントカレンダーかけなくてつら。
某なんとか大学なんとか学部では一年生が必修でC言語をやらされます。そこで必然的に経験者は教える運命にあるのですが。そうでもしないと暇で死ぬので。最近はそうでもなくなってきたんですけどね。というわけでエラーやエラー未満の何か、それに対するコメントを言っていきたいと思います。
1. 初期化してない事案
int maxvolume; //初期化しないと更新もクソもないよね char name[10]; //noname
2. bus error : 10
typedef struct { //ry } Movie; int cmpname(const void* p1, const void* p2){ Movie* s1 = *((Movie*)p1); //何で構造体の中にポインタを入れてんだよ!! //ry }
3. n回宣言(n>1)
//in global int A[10]; int hoge(){ int A[10]; //hogeの中ではAはこいつになるよ!終わったら消えるよ! //ry } int main(){ int A[10]; //globalなAよりmainの中ではこっちが優先されるんだよ!てかもう上書きされると思っていい。 }
ぼく「なんでこんなことしたの?」
* 「なんかエラーが出たから。」
ぼく「そうですか…」
int i; for(int i=0;i<10;++i){ //これならiは初期化だけでいいんだよ! // }
4. read fileできない
Q1. ディレクトリにdata.txt入れた?
A1. No. → 入れろや!!
Yes. → Q2へ。
Q2. ファイル名合ってる?
A2. No. → 正そうね。
Yes. → Q3へ。
Q3. そもそもコンパイルした?
A3. No. → しような。
Yes. → じゃあ書き方見直そうか。
5. なぜそんなところにセミコロンを入れた
for(int i=0;i<N;++i);{ //そんなことをしたらそれはただの文とスコープだ! // }
6. 大文字小文字、単数形複数形
#define N 20 typedef struct { //ry } Movie; int main(){ movie m; //エラー! 大文字と 小文字の区別も できないの!? Movie movies[N]; for(int i=0;i<N;++i){ printf("%s\n",movies.name); //エラー!複数形ですよ!配列の中身の型がMovieなんです。 } }
関連:#defineで宣言したら記号定数となるので、配列の要素数として指定できるけどintとかでやっちゃだめだよ!定数だからってconstつければいいとかいう話じゃない。
7. セグメントエラー
添え字を見直してください。 配列は要素数を十分に取りましょう。
8. 謎構文
while(1){ if(l<r){ // } }
while(l<r)でいいやつ。 ゲームじゃないんだから。
if(a<b){ if(a<c){ // } }
&&とか||とか論理演算子ってあったでしょ。
9. 用意しただけ
int binsearch(){ //ry } int main(){ // }
そりゃmainの中で書かなかったら関数動かないでしょ!
今それあなたがやってること、数学の答案で「f(x)=なんとか とおく。」って書いただけだよ!使わなきゃ。
10. scanf printf
char c; scanf("%c\n",&c); //うまくよみこめないね!ちゃんと&つけてるのにね!ところでその\nは何かな? printf("%d", c); //そう!文字は内部では整数で管理されているんだよ!それを学ぶためにあえてやったんだよね!えらい!
以上です。お楽しみいただけたなら幸いです。
明日はmomokくんの記事です。楽しみ。