velengel++

徒然なるままに.

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くんの記事です。楽しみ。