以下が自分で作ったコードです。さすがにAPIは見ました。bmp
ファイル用ですが画像が加工されていたり、するとよめないです。(要はあっていないコードです)。本題ですが、授業ではプログラミンの授業を受けたことがなく、独学でした。そのため、他の人とコードとかけはなれています。他の人のコードをみてもよくわかりません。とにかく人並みにソースコードが書きたいです。人のコードに合わせないと作業できずに困ると思います。人並みにソースコードを書く効率的な手段があったぜひお願いしまます。
c
1 2void LoadGLTextures(const char* filename, int width,int height) { 3// Load Texture 4const char *PATH=&filename[0]; 5 6FILE* fb=fopen(PATH,"rb"); //間違えてないか自身で判断ください。責任は負 7//いかねます 8 9fseek(fb,0L,SEEK_SET); 10unsigned long file1 = ftell(fb); 11 12 13fseek(fb, 0L, SEEK_END); 14 15unsigned long file2= ftell(fb); 16 17unsigned long filesize=file2-file1; 18 19unsigned char *image=new unsigned char[filesize]; 20 21fseek(fb,0L,SEEK_SET); 22 23fread(image,sizeof(unsigned char),filesize,fb); //zenbu no hairetu 24 25unsigned char MappingData[filesize-54]; //786486-54 26 27 28for(unsigned int i=0;i< (filesize-54) ;++i) //間違えてないか自身で判断ください。責任は負 29//いかねます 30 31{ MappingData[i]=image[(filesize)-i]; 32} 33 34glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 35 //scale linearly when image bigger than texture 36 37glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 38 39glTexImage2D(GL_TEXTURE_2D, 0, 3,width,height,0,GL_RGB,GL_UNSIGNED_BYTE,&MappingData[0]); 40fclose(fb); 41delete [] image; 42image=NULL; 43};
これだけの設定では動きませんが。
失礼ながら、ご質問の主旨が分かりづらいです。ご提示のOpenGLのC言語プログラムコードが質問者さんが思うに「人並みではない」感じがするので、動いていない問題の指摘も含めて添削してほしい、と言うことでしょうか。それとも、全般的に「人並みな普通のプログラムコードを書くにはどうしたらよいのか。」と言うご質問で、ご提示のコードは「私はつい、こんなコードを書いてしまいます。人並みな感じがしません。」とのサンプル例示のおつもりでしょうか。
何をしたくて書いたプログラムなのかが書いてない限り、書かれたプログラムが正です。
「人並み」ってなんでしょうか。
基準が明確でない限り、雲をつかむような話では?
どこがどのようにかけ離れていると考えますか?
また、よくわからなかったコードはどれですか?
ともあれ、インデントちゃんとつけるとこからでは。
空白の開け方や名前の付け方がバラバラだったり、第一引数の使い方に少し疑問を感じるぐらいですかね...
あと、コメントは日本語も入力の出来るのですが、あえてローマ字を使う意味とはという指摘ぐらいです。
質問の回答になってるかわかりませんが、ロジックが直線的なコードしか書けないのです。他の人のコードを見ると、for文して変数をたしてまたfor文してってコードだったりするようですが、自分はそういうコードが書けないのです。(一応これは、webfront(.obj)で使っているコードですがくそコードといわれました。
> 一応これは、webfront(.obj)で使っているコード
この時点でもう分かりません。webfrontって何でしょうか。私が知らないだけなら結構ですが。
ソースレビューをするなら、まず疑問に思うのが「54」って何ですか?
その定義値の意味が分かりません。
空欄の開け方はタブで4つ程って書いてありますがよくわからないです。ローマ字なのは、日本語の表記を設定していなかったからと、APIは拾い物でその時紛れ込んでしまったんだと思います。
54からカラーパレットだからです。
webfrront(.obj)はbrenderの出力形式で、構造が一番簡単なファイルです
頂点/textute/法線の順にデータが格納されていて、xファイルとにていますxァイルのほうが情報数が多いですが
問題は主に大学生が書いたコードが読めないということですが、違和感ないなら平気かな。
↑「読めないけど違和感ない」 ってどーゆーことですか?
「違和感ないなら平気かな」
人並みにコード書けなくても問題ないかも、って思ってるってこと?
# ちゃんと語ろう。
「他人である大学生が書いたコードを質問者さんが読めない」のか、それとも「質問者さんが書いたコードを他人である大学生が読めない(なぜならば、人並みのコードではないと自認しているから)」のが問題なのか、更に、違和感の有無をご提示のコードについて言っているのか、そうではないのか、もう分かりません。(少なくとも私では回答は難しいようです。失礼いたしました)
大学生の時に、ソースコードを書いていなかったのが原因か、たまに上がってくる大学生のコードが本当に読めないんです。
違和感がないはコメントから引用しました。まわりが違和感を感じないなら、いまの直線的に書いていく方針で勉強を進めていこうとおもいました
>「他人である大学生が書いたコードを質問者さんが読めない」のか
こちらです。
で、「人並み」の明確な定義はまだですか?
それとも大学生の書いたコードくらいって、なめてかかってるのですか?
コード内に if とか for とか出てくると何やってんのかわからんくなる、と?
ならば要はスキル不足なんじゃなくて?
まずプログラミング言語云々は捨てて、日本語の読解力を上げるところからやり直さないとダメじゃないのかなあ……
言語を読み解くにも読解力が必要で、根本的にそれが足りてない(だからおそらくサンプルコードに関する解説文もろくに読解できてない)ように解釈します。
自分は木構造あたりで解けませんでした。なので木構造あたりを人並みにしてもいいですか
ですが、いま上がってる乱数を生成してのスレッドも見ても何をしていいかわからない始末でした。
スキル不足かもしれないです。
質問者さんはどういう立場の人なのでしょうか?
先生?会社に属していてインターンの面等を見ているとか?
コードの書き方に違和感はバリバリにあります。が、ロジックは無いに等しいので、ロジック面だけ言えばだれが書いても似たようなものになるでしょう。だから、このコードでは質問者さんが何を一番問題と感じているのかわからないということです。
>stdio さん 入力が Windows の bmp ファイルだと仮定すると、54(BITMAPFILEHEADER 14バイト+BITMAPINFOHEADER 40バイト)で正しいんだけど、今の(Windows 95以降の)ビットマップファイルだと構造違いますしねえ。
本来なら正しく FILEHEADER から順に解釈しなきゃダメですし、そもそも入力がビットマップファイルであることをチェックすらしていないから、ダメダメですな。
就活中みたいな感じです。
日本語の読解力が足りない>これっぽい。
あえてひとつ挙げさせていただきますと、少々思い込みが強いようにお見受けします。今、本コメント欄で話題にしているのは質問文中に挙げたことですが、「木構造あたりで解けない~それを人並みにしてもよいか?」とは、突然すぎます。更に、「今上がっている乱数を~」のくだりも、少なくとも私は「今?え?どこに上がってるの?何の話?」と混乱しています。今その瞬間、質問者さんが唐突に話している話題を、全ての閲覧者が即時に追従できるわけではありません。質問文冒頭、「以下が自分で作ったコードです。さすがにAPIは見ました」とありますが、きっとAPIリファレンスのことなのでしょう。ですが、単語通りに読むと、「APIは見ました」では話が通じません。あるいは本当にAPIを見た、だけだったのでしょうか。単語、文についてもう少し丁寧に向き合った方が良いように思います。
おっと、ロジックにも問題があったようですね。正しく動かないものならそこを直さないと。
>なので木構造あたりを人並みにしてもいいですか
自分で決めてください。
で、今回提示されたコードはその基準とどの程度関係するんでしょう?
関係しないのなら無意味です。
つーか、分からないところが明確ならそこを中心に攻めれば良い話で、やりたいことをやってる場合じゃないでしょうね。
既に大量に入れられてる指摘に対応しきれなくなってキャパオーバーなって、終了です。
得るものはないです。
APIリファレンスを見ても、見ても読めないときが多く、本当にAPIを見ました。APIリファレンスって言葉自体を知りませんでした。
> 本当にAPIを見ました
完全に第三者が書いたAPI、つまりは関数の呼び出しコードを眺めていて、正しい答えや意味がご自身の頭に涌いてくるものでしょうか。経験に裏打ちされていない根拠のない答えが涌いてきたら、それは単なる「思い込み」です。
はいbmpファイルは2の乗数になってるbmpファイルをいれるようですが、何か忘れましたが、4の倍数になっていなきゃいけないとか、paddingが関係しているのかもしれないです。一行ずつ読むべきだったかもしれないので、最初からやり直しだと思います。たしかにbmpファイルをいれて動くテクスチャもあるのですが、動くものと、動かないものの違いがわかりません。
今回提示されたコードはその基準とどの程度関係するんでしょう?
関係しないのなら無意味です
エレガントっぽいコードが書けるように努力していたんですが、トリッキーなコードも学習したほうがいいのかと、どちらがいいんです。?
それなりに熟練した技術者が、ざっとコードを眺めて「あれ、何か変だぞ?」とおかしな部分を見つけることは良くありますが、それは経験と知識に裏打ちされた技術であって、貴方のは単なる思い込みです。
※逆に stdio さんが突っ込んだように、「なぜ54なの?」に気づくのが熟練の技術者です
今回の場合、質問者である貴方に読解力が足りてないだけでなく、コードを書いた大学生?も、読解力が足りてないのですが(ろくに仕様を確認せずに組んでるように見える)。
なお、
> bmpファイルをいれて動くテクスチャもあるのですが、動くものと、動かないものの違いがわかりません。
Windows Bitmapファイルは歴史が長いこともあり、色数、透明度(アルファブレンド)、パレットの有無(昔はパレットで間接的に色指定していたが、現在では直接的にRGB値を示すことがほとんどです)など、フォーマットは多岐に渡ります。動くBMPファイルと動かないそれのフォーマットを比べると、ヒントが得られると思います。
>>エレガントっぽいコードが書けるように努力していた
ここがすでに間違いです。結果的にエレガンテなコードはできますが、そもそも何を作るのかもまともに理解できてない状態では、コードを書く以前の話です。
ああ、ちょっとコメントでの主題を混乱させてしまいましたね。失礼しました。私のは忘れてください。以降は控えます。
bmpファイルは前に書いたように構造が複雑で、FILEHEADER を読み取って INFOHEADER のサイズから種類を特定し、INFOHEADER の内容を読み取った上でさらに圧縮やら何やらを考慮して読み取らねばなりません。それらを読むには API リファレンスもですがファイル構造のドキュメントを読むことが「必須」であり、それをしたくなければライブラリを使って読むなりなんなりしましょう。
それらが「必要である」ことを読み取れていない時点で、読解力がない、といっているのです。
一応引いたりすることもありますが *ポインタにはアドレスをいれるとしてgeom?に入るコードが意味不明だったりします。今回は、glPush(),glPop();のブロックにあらかじめglenableTexture(glTexture); glTexcoord2f();glTexcood2f()...glDisable(glTexture);としてあって通ってしまったので、軽くぐぐることしかしませんでした。それだけじゃうごきませんが。
「エレガントっぽいコード」「トリッキーなコード」も
「人並みに書ける」と同じです。
プログラムは感覚や感性ではなく書いた通りに動くので、「動くように書く」ことが大前提ですし、結果「要件通りの動作をさせる」ことがプログラマーの命題です。
ぐちゃっとしたところで、極論バグなく要件満たす動きになっていれば良いのです。
その大前提ができているかどうかです。
意味不明なコードだとしても、読み取っているデータの構造なり何なりからその意味が読み取れるはずです。
※構造解釈間違っていて誤っている場合はあるにせよ
なのにその構造なりなんなりをきちんと調べもせずに「意味不明」と言っている時点で、ダメだと言うことがわかりませんか?
プログラムとはコンピュータにやらせたいことを事細かに書き記した手順書です。その手順書が「よく分からないけどとりあえず並べてみた」でしかないなら、そりゃまともに動くはずがありませんね。
bmpファイルは前に書いたように構造が複雑で、FILEHEADER を読み取って INFOHEADER のサイズから種類を特定し、INFOHEADER の内容を読み取った上でさらに圧縮やら何やらを考慮して読み取らねばなりません。それらを読むには API リファレンスもですがファイル構造のドキュメントを読むことが「必須」であり、それをしたくなければライブラリを使って読むなりなんなりしましょう
>そういう理由で動くものと動かないものがあることがわかりました。ただ私の沸点が以上に低いので、リファレンス中に落ちる
「エレガントっぽいコード」「トリッキーなコード」も
「人並みに書ける」と同じです。
プログラムは感覚や感性ではなく書いた通りに動くので、「動くように書く」ことが大前提ですし、結果「要件通りの動作をさせる」ことがプログラマーの命題です。
>ぐちゃっとしたところで、極論バグなく要件満たす動きになっていれば良>いのです。
>その大前提ができているかどうかです。
一人で書いてる分にはいいんだろうけど、っていわれたので、気になっていたので、今回質問しました。
言い換えましょうか。
貴方のやってることは、「日本語がほとんどできないアメリカ人が、俳句や短歌で賞賛されるような名文を(日本語で)ひねろうとしている」くらい、とんちんかんなことなのです。
まず名文云々置いといて俳句や短歌や日本語そのものを勉強しろ、と普通ならそのアメリカ人に言いますよね。
...えと気を悪くされたらごめんなさいなんだけど、
言葉を操る/文章を紡ぐのが苦手だったりします?
よく分からないけどとりあえず並べてみた」でしかないなら、そりゃまともに動くはずがありませんね
よく分からないけどとりあえず並べてみたをする場合が多いです。カラーパレッド移しただけでした。
時間をすこしいただければ、できると思います。伝えたいことが頭に浮かぶのでそれを伝えちゃう感じです。一般人には注意されたことはないです。何も浮かばなくて困ることはあります。
自分で説明できない・責任とれないコードはコピペでも使わないこと。以上。
インフォテックサーブ株式会社のCプログラミングって本を読んで型とかは補完しました。API以外は、いちおう自分で書きました。間違ってはいるので、コピペはしないほうがいいですが。
「自分で説明できない・責任とれないコード」と書いています。
コピペはもちろん「何かしらんけど動いてるから良し」はNGという話です。
@txtyさん
すみません、ちょっとコメントの行く末が気になったもので。epistemeさんの[2020/07/07 11:43]のコメント問いかけは「苦手か・苦手ではないか」というものだったはずなのですが、それに対して「できる・できない」の答えは実は少し外れているのですが、その違いは分かりますか?(読んだ方が忖度すればかろうじて通じますが)
わかります。主観的には、苦手と感じています。
そか。いやコードも言葉もなんかピントの外れたよな印象を受けたので。
# あるいは浮かんだコード/言葉がそのまま外に出てくるというか
結果なにがわからんのか伝わらん、と。
https://teratail.com/questions/274888
tacsheavenさん
解説、ありがとうございました^^;
bmpの拡張子判定は以前に、fopenの第一引数は確か、const char * 型だったはずなので、filenameをそのまま代入するのが良いと思います。
私なら、拡張子判定を行った後に、filenameを直接fopenの第一引数に入れちゃいます。
わかりました。まあ、でも変数を用意して、ポインタの値を変数に代入すれば、値を変えずに使えるっていう浅い知恵でした。この場合、const char*型なので変数と呼ぶかわかりませんが。アドバイスと的外れだったらすいません。ちょっと用事があるので落ちます。あと回答締め切ります。たくさん回答いただきありがとうございました。
いえ、まだ回答には移っていません。問題点がこの質問だけではわからないので、それを把握するための質疑応答です。そろそろ回答に移っても良いころ合いかとは思いますが、実際問題解決策があるのかは疑問です。
私見ですが、問題は C 言語に関するプログラミングではなく、リファレンスが読めない、そしてロジックを表現できないことだと思います。
これはプログラミングの適性自体が少ないことを表しているので、人並みの物を作るためには本人が相当努力して字を読み、略さず丁寧に表現する必要があるのではないでしょうか。要するに、近道はありません。他人の数倍努力すればできます。
そしてこの問題は teratail ではオフトピックになります。ここでは簡単な説明しかできず、訓練の場を与えることはできません。もっと頻繁に長時間指導できる人が必要なのではないかと思います。
>>stdio さん 拡張子だけだと偽装可能なので、本来はファイルの先頭2バイトがマジックワードなんでそれが一致すること、ファイルサイズとヘッダ上にあるサイズが一致すること、とかで「正しく作られたビットマップファイルかどうか」調べるのが筋ですね、蛇足ですが。
ひとつめのアドバイスとして、日本語及び漢字の勉強を勧めます。
別の質問で「認証突破試みる」が読めないというコメントをされてましたが、これは日常レベルの漢字です。日本語で書かれた書籍やサイトで勉強されている以上は、大抵の漢字を正しく読める事や正しく言葉を理解出来る事が必要です。正しい理解無しに次のステップには進めません。
ふたつめのアドバイスはteratailなど、人に質問できる環境の場合に限りますが、知ったかぶらない事、見栄を張らない事、分からないのに曖昧な言葉で誤魔化そうとしない事です。分からない事を分からないと伝える事で教えてもらえる確率が上がります。質問者が真摯な姿勢である事が前提ですが、幸いな事にteratail回答者の中には聞けば追加で教えてくれる人が多数います。
>>正しい理解なしに次のステップに進めない。
丁寧語がうまく使えないなど言葉に何らかの偏りがあるのかもしれません。日常会話でつかうぐらいには言葉を覚えようと思いました。
すいませんが、コメントはつかないと思いますがあと一回、フレームワーク系のスレッドをあげるかもしれません。
丁寧語が使える使えないの話してましたっけ。
回答もいただいていますし、一定の結論を得たのであれば、質問を閉じましょう。
>m.ts10806さん 話していません。使えないのも問題ですが、的がずれてることや、言葉を的確につかえるようにするって話をしていたんだと思いなおしました。
>dodox86さん 閉じ方がわかりません。今から、helpを見にいきますが、閉じる方法について教えてもらえないでしょうか。
Chironian さんの回答で解決したと思うならベストアンサーをつけてください。自分なりの別の解決法がみつかったなら自分で回答してそれをベストアンサーにしてください。解決していないなら質問を編集して情報を整理し、さらに回答を募ってください。
> 質問者が5分前に「まだ回答を求めています」と言っています。
現状、迷走しています。回答を募るなら、どうなれば解決なのか着地点を見つけてください。
「人並み」をどの程度と見るかで目標も変わってくると思いますが、技術レベルを上げる以外にも、使用するツールを変えるという方法もあります。適切なツールの補助を得ればインデントくらいは改善します。
>@txtyさん
ここで私が言う「質問を閉じる」とは、自分の投稿した質問に対して適切と判断した回答にBA(ベストアンサー)をあげて、質問を終了させることです。もし、自分の意に沿わない、あるいは解決に直接結びつかない回答であった場合、自己回答として原因、解決策を自分で投稿し、終了させます。自己回答だとしてもそれに至るに参考になった回答には感謝の意を表した方が良いと思います。(一般に考えられる常識の範疇で、です。私の個人的意見ですけど)
更なる回答を引き続き待つのであればそれはそれでよいと思いますが、あまり放置すると閲覧者、回答者の心象は当然悪くなるので、その点は考えておいた方が良いです。
ああ、すれ違いました。Zuishinさん、フォローをいただき、どうもありがとうございます。
わかりました。たくさんの良い意見があり、どれをbestanswerにすればいいのか分からないので、たくさんの意見ありがとうございましたと感謝の意だけをあらわしてそれで、トピックを閉じることにします。
この欄のコメントのことなら、回答ではないのでベストアンサーの対象にはなりません。現在回答しているのは Chironian さんだけです。
多くの意見を参考にして自分なりの方向性がまとまったなら、そのレポートを回答してベストアンサーにしてください。
回答2件
あなたの回答
tips
プレビュー