留年戦記

留年と工学と人間関係と毎日戦っている人のブログです. 今年は留年回避済み.プロマネのお勉強中.留学試みたりTOEICの得点向上を試みたり.普通に学校の勉強を頑張ったり工学(プログラミングも回路も)について学んでみたり.時々レーザーカッターのパラメータを記事にしてます.

gccで型が競合と言われるエラーの対処法(と,予約語の解説)

floatとdoubleの記事書こうと遊んでいたらさんざんエラーに悩まされたあこさんです.

リアルに今も悩んでます(;'∀')

 

というわけで,今回は一番自分の中で悪いほうにヒットしたエラーと,「え!?ここでエラー起こしてたの!?」というところを書こうと思います.

後者についてはネタとしてちょろっと書くだけなので期待はしないでくださいね~~.

 

1,何も悪くない(はず)なのにコンパイルが通らない.

f:id:aconote:20161117201521p:plain

これ,実はコンパイルが通りません.

「え!?」と思われる方いらっしゃいますよね…(;´д`)トホホ

私,これの類似エラーで今日30分ほど悩まされました(;'∀')

 

とりあえずコンパイルに通したときの結果です.

(環境はwin10でgcc(mingw)を使用しています)

f:id:aconote:20161117201640p:plain

なんか色々怒られていますね….

とりあえず分かることはmain文の中でエラーを吐いています.

で,エラー内容がauto()がいけない….

「んー」という感じですよね.

 

2,実はこれなら動く

f:id:aconote:20161117202028p:plain

実はこっちなら動くんです.

関数名をauto→auとしただけです.

 

もうそろそろ分かった方,いらっしゃいますよね?

(というかタイトルに書いてあるので大体察していますよね?)

 

答えは,予約語です.

まさか,プログラミングを初めて早2年…(正確にはもっと長いのですが)まさか初歩的なこんなエラーで頭を抱える日が来ると思いませんでした….

私が起こしたときは「方程式」の意味である「equiation」です.

因みに,ubuntugccで同じことをすると,日本語であれば

「エラー:"  *****  "と型が競合しています」

みたいなのに続いて

「前の" ***** "の宣言はここです」

と吐き出されます.

※ここでいう***は任意文字です.(便宜上こう書いてるだけです.本来ここには問題の関数が来ます.今回でいうところのautoとか)

 

3,予約語ってなに?

ここでプログラミングやったことのない方は「予約語?」ってなってますよね.

これは,言語毎に存在するんですが(大体みんな一緒),「本来であれば関数名となるための条件を満たしている文字列が関数名などとして使用不可である特殊文字列」のことを指します.

(ちょっと自分で言ってて意味わからなくなったので分かった方はすごいと思います)

要は,forやif,elseとかwhile,caseとか,制御文などの文字列です.

あと,printf()とか,atoi()とか,既に作られて定義されてしまっている関数名です.

これらを使われてしまうと,コンピューターはどの関数を指しているのかわからなくなってしまいます.

(いつも,main文だけに見えて,実はインクルード(#include <stdio.h>とか)によって見えない関数がいっぱいあるのです)

これらの文字列を予約語といい,定義出来ないようになっているのです.

 

4,おまけ

ここからは別エラーについてのおまけです.

(おまけというよりあまりに笑っちゃったので書いてるだけ)

 

i = gain[0] + (1/5)*(voltage[0]+register[0]);

 

みたいな文があったとするじゃないですか?

(便宜上適当な変数名でやってるので気にしないでください)

これ,コンパイル通るくせに,思った動作しないんですよ.

(いや,当然なんですけど…(´・ω・`)

問題の箇所はここです.

(1/5)*

この分数表現はできないのです.

コンピュータには分からないのです.

「も~~~~~」って感じですよね(´;ω;`)

 

エラー処理って面倒ですよね….

最悪プログラムを組むのの何十倍って時間がかかってしまう….

そんなわけでまた,笑えるエラー見つけたらここに忘備録件誰かの助けになればと思い書いていこうと思います.

ではでは.