未解決の外部シンボル_mainが 関数"int_cdecl invoke_main(void)"(? invoke_main@@YAHXZ)で参照されました
-------2月17日----------------------------------------
今日、引き続きファイルの操作をしてました
そうするとVisual Studio(以下VS)で
LNK2019
未解決の外部シンボル_mainが
関数"int_cdecl invoke_main(void)"(?
invoke_main@@YAHXZ)で参照されました。
LNK1120
1件の未解決の外部参照
という2つのエラーが出てきました。
ファイルを取り扱っていたので「外部に何か」つまりファイル操作だと思いエラーコードを検索してみました
出てきた記事は
http://dixq.net/forum/viewtopic.php?f=3&t=16967
質問ツールで誰かのサイトとかではないので信頼の点で怒られそうですが
解決したようですし自分で書き込むのも信頼に欠けるので引用させてもらいました
他にもいくつか見てみた結果、要するに
---------------------------------------------------------
Win32プロジェクトでプロジェクトの作成をやらず
Win32コンソールアプリケーションでやればできました!!!!
---------------------------------------------------------
というものがほとんどでした。
が
自分の場合はそれをしても解決しなかったのでTwitterに聞いてみると
-----------------------------------
「main関数のスペルを間違ってました」
「mian」としていました…
-----------------------------------
ファイル関連の作業中に外部に問題があると言われてとても焦りましたが
自分のスペルミスだったんですね…
VSではprintf()とかの綴りを間違えると
C3861
'[綴りを間違えた関数]':識別子が見つかりませんでした
などとエラーが出るので安心していました…
ファイルの前にもっと早くこの間違いをしていればファイルが原因だと思うことはなく
すぐに問題も解決できていたんですが経験が足りなかったです。
以下教えてもらった過程
こんなエラーが出ました…
— りーま(独習C 9章) (@strimuer213p) 2017年2月16日
いろいろ見てみましたが
「新しいWin32コンソールアプリケーション」
と
「新しいWin32アプリケーション」
を間違えていたと多くありますが…
コンソールアプリケーションで何度かやってもダメです… pic.twitter.com/SxdaqJNb51
@strimuer213p スペルを見直そう
— 白山風露 (@kazatsuyu) 2017年2月16日
@kazatsuyu
— りーま(独習C 9章) (@strimuer213p) 2017年2月16日
うわ…main()がmian()になってますね…
これスペルエラーとして検知されないんですか…(VSの温室育ち)
今スマホの写真でパーと見て気づいたので明日パソコンで直してやってみます…
ありがとうございます!
main関数の綴り間違いはVSはエラー出してくれないんですね…
— りーま(独習C 9章) (@strimuer213p) 2017年2月17日
スペルミスは大抵下に赤い波線が出てきて教えてくれるもんだと安心してました…
@strimuer213p 定義のスペルミスをしても別の定義があると見做すだけです。`mian`関数を定義したかったのかもしれないじゃないですか
— 白山風露 (@kazatsuyu) 2017年2月17日
@strimuer213p スペルミスを指摘してくれるエディタもありますが、IntelliSenseは基本的に型チェックをしてくれるだけなので
— 白山風露 (@kazatsuyu) 2017年2月17日
@kazatsuyu
— りーま(独習C 9章) (@strimuer213p) 2017年2月17日
知らなかったので今すこし、調べてみました
"Microsoftの自動補完機能システムの名称"
VSもMicrosoft製だからですか
VSをやっと慣れて来てまだまだ使わせてもらう事になりそうなので仲良く暮らして行こうと思います…
独習C9.3-1
独習Cの進捗状況
とりあえずコマンドライン引数が使えるようになったのでやっと独習Cが進めます
-------2月16日----------------------------------------
strcmp(文字列1,文字列2)
<string.h>
2つの文字列を比較する
「文字列1」「文字列2」が同じ時に0を返す
putchar()
<stdio.h>
画面に1文字だけを出力します
出力エラーが出た場合EOFを返す
printf()で%c指定子を使って1文字出力するなら、実行速度と効率の点で
putchar()を使う方が有利
printf()は非常に多くの機能を持つ柔軟な関数ですがその分、putchar()の呼び出しに比べてオーバーヘッドが大きい
feof(FILE *ストリーム)
ストリームに結び付けられているファイルの終わりに達していれば
0以外の値を返し、そうでなければ0を返す
ferror(FILE *ストリーム)
ストリームに結び付けられているファイルに関してエラーが起こっていれば
0以外の値を返し、そうでなければ0を返す
次の関数はファイルの終わりまで読み取りエラー検査を追加したもの
FILE *fp;
・
・
・
while(!feof(fp)){
ch=fgetc(fp);
if(ferror(fp)){
printf("ファイルエラー\n");
break;
}
}
補足
本参考書はferror()は省略することがあるが実際はきちんとエラー検出をすべき
/*ferror()ってなんかちょっと曖昧な感じがしますね*/
コマンドライン引数
ここ3週間ほどずっとVisual Studio(以下VS) を利用したC言語でコマンドライン引数を使ったファイルの開き方が分かりませんでした…
ここあさんに教えてもらいました
解説してもらったブログ
↓
https://koron0902.ddns.net/index.php/2017/02/15/cmd-arg-vs/
ここにやり方が書いてあります
本当にありがとうございます
苦戦した理由の一番大きな勘違いは
・argc,argvがそのパソコン上では全てのプログラムで同一なものと思ってた事
今回苦戦した理由は4つあります
1.テキストファイルの意味がわかってなかった
テキストファイルは何かのファイルとだけ思っていた
2.コマンドライン引数がわかってなかった
引数なのでどこからか別の所からやってくる、そういうイメージがありましたが
main関数の外側が一体何なのか…
3.そもそもファイルの開き方がわかってなかった
ファイルをコマンドライン引数で開くと始めにargc,argvが出てくるが
それに謎の疑問を抱いてしまった
4.VSのフォルダ分けがわかっていなかった
ソースプログラムと同じフォルダに入れる、という記述を見てやってみようと
思ったのですがVSのprojectファイルが複雑で混乱した
苦戦した理由の解決策
1.テキストファイルの意味がわかってなかった
テキストファイルとは文字データだけのファイルの事であり
「.txt」の拡張子を持つ物
Wordは行間の幅など「書式設定」を含んでいるので文字だけのデータでありません
2.コマンドライン引数がわかってなかった
コマンドライン引数は自分で設定するものではなくコンピュータが勝手に
作ってくれるものだと勝手に思っていたので解釈が進みませんでした…
さらにargc,argvがそのパソコン上では全てのプログラムで同一なものと
思ってことも原因にあります。
ここあさんに教えてもらい自分でいくつかプログラムを実行しようとした
ときプログラムごとにコマンドライン引数の中身のファイルが違ったので
気づきました…
3.そもそもファイルの開き方がわかってなかった
ファイルをコマンドライン引数で開くと始めにargc,argvが出てくるが
それに謎の疑問を抱いてしまった
↑
これはどうやらコマンドライン引数を使ってファイルを開いたとき
すべてのプログラムで現れます
4.VSのフォルダ分けがわかっていなかった
ソースプログラムと同じフォルダに入れる、という記述を見てやってみようと
思ったのですがVSのprojectファイルが複雑で混乱した
↑
これもあれますが
カレントディレクトリ、パスなどの言葉を忘れていたのも原因にあります
VSの拡張子「.vcxproj」について勉強すると少しわかります
/*一応なぜコマンドラインの話になったかということと失敗した経緯*/
まず始まりは僕が使っている参考書「独習C」9章はファイルの取り扱いの章でした。コマンドライン引数については7章でチラッと出てきてVSの仕様をいろいろ調べたんですがあまり見たことない形式(main関数に引数がついているプログラム)だったし検索してもピンポイントにVSの記事が見つからず放っておいた(今思うと検索ワードがまずかった)のです。
すると9章でほぼすべてのプログラムがコマンドライン引数を使用してファイルを開いていたのでVSでどうにかする方法を探していました。
まず、写経して半角英数字で書かれたテキストファイルを開いてAが何文字含まれているか数えろというと所で既にわかりませんでした。
テキストファイルをただ「何かのファイル」とだけ思っていてそのファイルをどこに作るのかプログラムの中なのか外なのか、外だとしたらどこに作れば良いのかパソコンの中ならどこでもよいのか
テキストファイルがまずなんなのかを気にする前にいろいろな疑問が出てきてかつコマンドライン引数がわからないという状況で
・動画の説明を見ているときになぜメモ帳を開いたのかわからない
・他の人の参考記事を見てファイルを開くプログラムを実行したときにコマンドプロンプトの初めにargv,argvが出てくるのがそういうものだと認識できずずっと悩んでいた
などと今思うと本当に何やってるかわからない事をしていて、
・コマンドライン引数について調べるためmain関数がどのように処理されるのかやパソコンの内部、カーネルやOSやシェルの分野の話を勉強し始める
・さらに物理メモリやハードディスクとしてのCPUの内部構造を勉強し始める
など違う方向ですべてを理解しようとしたのでかなり遠回りなことをしてしまいました…(いろいろわかったことが増えたので結果的には良かったです)
まとめ
ブログの書き方がわからなかったので読みにくいかもしれません。
本当に何をやってるかわかりませんがとりあえずVSでコマンドライン引数が使えるようになりました。
いろいろ語ったようですがこれでようやくファイル操作、コマンドライン引数が使えるスタート地点に立てたのでこれから何ができるか、どこまでできるかなどを学んでいきます
いろいろ遠回りしてすこしは予習もできたのでこの3週間を無駄にはしません
日々気になっていたプログラムの事-1
おそらくこれから突発的に何度か不定期あるシリーズです
https://twitter.com/strimuer213p/status/823854746498789376
↑
すべての始まりのツイートです
今から書くことはこのツイートのリプライから指摘をいただいた物を自分なりに調べてみました
除去する
//んですね…
が現在関連付けられている(現在の位置にある)ディレクトリの事である。windowsでは作
業フォルダともよばれることがある。
(integral promotion)
要だから場合を問わず一気にintを使うのは現実の複雑さから逃げるということだけ恥であり役
に立たない
//痛いですね…
独C9.2-2
ここあさんにVSのコマンドラインの使い方教えてもらいました!
-------1月24日----------------------------------------
最重要
/*分からない関数などのネット検索*/
独C9.2-1
独習Cの進捗状況