外出自粛中でも楽しく過ごす!QAまとめ>>

やっとC言語を少し使えるようになってきました。そこで質問なのですが、画面に絵(玉など)を表示するにはどうしたらいいのでしょうか。あと、それの動かしかたなどを教えていただけないでしょうか。インターネットで探してみると、
#include <graph.h>

main()
{
gl_openwin(-1, -1, 640, 480, 0);
getchar();
gl_closewin();
}
というソースがあったのですが、実行すると、ノーサーチファイルなどというエラーが出てきます。使っているコンパイラはLSI C-86 試食版です。コンパイラによって使えたり使えなかったりするヘッダファイルがあったりするのでしょうか。教えて下さい。

このQ&Aに関連する最新のQ&A

A 回答 (6件)

★mantis777 さんへ。


・C 言語は始めたばかりでしたよね。
 Windows 環境で画面(ウインドウ)に絵(図形)を描くには C 言語を熟知した上で
 Windows の GUI(グラフィカル・ユーザ・インターフェイス)によるプログラミングを
 行います。この GUI はコマンドライン(CUI)タイプとは全く別の概念が必要です。
 つまりはウインドウ・メッセージ(WM_XXXX)を元に各イベントに対応する処理を
 記述していきます。これがマルチタスク処理のプログラムです。
・以前に簡単なじゃんけんゲームを紹介しましたがその中でゲーム・ループしていますよね。
 Windows の GUI では単純なループを組むのは禁止です。唯一メッセージ・ループが
 組める程度です。とにかく GUI のウインドウに絵(図形)を描画するには C 言語を
 始めたばかりの人にとっては簡単にプログラミングできるものではありません。
 理由としてはポインタ、構造体、共用体などでデータを受け取ったり、渡したりを
 基本として Win32 API という関数が使われます。C 標準関数とはまた別の関数群です。

描画の仕組み:
・簡単に GUI での図形の描画方法を紹介します。
 (1)WM_PAINT メッセージに以下の処理を記述。
 (2)ウインドウハンドルから描画するデバイスコンテキストのハンドルを取得。
 (3)描画用の Win32 API 関数を使って図形(点、線、円、長方形など)を描画。
 (4)描画の終了を実行。
 (5)WM_PAINT メッセージを処理したので 0 をリターンする。
 上記の方法を C ソースで記述すると
 case WM_PAINT:
 {
  // 描画の開始処理
  HDC hDC = BeginPaint( hWnd, &ps );
  // 図形の描画処理(点、線、円、長方形)
  SetPixelV( hDC, 100, 100, RGB(255,0,0) ); // (100,100)地点に赤い点を描画
  // 描画の終了処理
  EndPaint( hWnd, &ps );
  return 0; // リターン
 }
 このような感じになります。
 ここで BeginPaint()、EndPaint() や SetPixelV() という関数が Win32 API の関数です。
 この関数群を利用してウインドウ(画面)に図形を描画するのが基本です。

その他:
・まずは C 言語のポインタ、構造体、共用体などを完璧に理解してから Windows の
 プログラミングを行って下さい。この基本がないと Win32 API の関数群を使えません。
 ちなみに Windows プログラミングのお勉強サイトを紹介します。
 (1)http://www.geocities.jp/ky_webid/win32c/index.html→『Win32API(C言語)編』
 (2)http://wisdom.sakura.ne.jp/system/winapi/→『Win32 API入門』
 (3)http://www.kumei.ne.jp/c_lang/→『猫でもわかるプログラミング』
 ※(3)は『Windows SDK編 第1部』~『Windows SDK編 第4部』を読みます。
 まずは上記のサイトを読みあさって下さい。
 (1)のサイトでは『第9章』~『第24章』までが描画に関わるページのようです。
 ここを読む前に『第0章』~『第8章』を読んだ方が良いでしょう。
 ここに書かれている内容がそこそこ理解できたならばまたアドバイスします。
・以上。(2)で紹介されている本は分かりやすいです。購入する際は本屋でチェック。

参考URL:http://www.geocities.jp/ky_webid/win32c/index.html
    • good
    • 0
この回答へのお礼

ありがとうございます。画像処理にはGUIが必要で、ポインタ、構造体、共用体をマスターしていることが条件なんですね。紹介してくださったサイトでマスターしてきます。

お礼日時:2007/09/10 20:45

高校の電気科ですか?


良いとこC言語の基本ぐらいだと思います。どちらかと言うと、WindowsアプリよりもマイコンでC言語を使ってハード制御って方向の勉強になりそうな気がします。情報処理科とかなら、まだアプリの方向を勉強するとは思いますが。
どちらにしろ高校の授業で行うレベルは実用で何かを作れるレベルには足らないレベルです。クラブ活動するか、独学で勉強しないと話になりません。
ゲーム業界で就職しているプログラマは独学でレベルを上げた人が多いですね。ゲーム専門学校で習うレベルでもゲーム会社にとっては話しにならないレベルですから。

ゲームプログラマまたは、Windowsアプリのプログラマを目指したいんでしょうか?
    • good
    • 0
この回答へのお礼

ありがとうございます。三年間でC言語の基本だけで専門学校でもゲーム会社にとって話にならないのですか。独学で勉強しなければいけないんですね。目標はゲームプログラマです。がんばります。

お礼日時:2007/09/11 18:25

グラフィックを利用するゲームとなるとハードルが突然高くなります。

覚悟は良いですか?
私としてのお勧めはいきなりDirectXに行ったほうが回り道しなくて良いんじゃないかと思います。その分、覚えることは沢山あります。
DirectXは、Windowsゲームの標準と言っても良いグラフィックAPIで多数の市販ゲームやXboxのゲームや個人で作るゲームまで幅広く使われています。WindowsAPIで描画するよりも高速な描画が可能で多機能です。

まず、コンパイラの環境を変更してください。DirectXを使うのに必要なコンパイラは無料で使える「Visual C++ 2005 Express Edition 日本語版」が一番導入が簡単です。まぁ、それでも大変なんですけどね。

で、DirectXを使うといいましたが敷居が高いと思うので少し敷居の低いDXライブラリから始めてみてはどうでしょうか?
DXライブラリというのを使うと直接DirectXを使うよりも簡単にゲームを作成することが可能です。実際にはDirectXを使っているのですがDXライブラリが面倒なところを隠してくれます。

DXライブラリ。
http://homepage2.nifty.com/natupaji/DxLib/
Visual C++ 2005 Express EditionでDXライブラリを使う準備。
http://homepage2.nifty.com/natupaji/DxLib/dxuse_ …
DXライブラリを使ったゲームの作り方。
http://l.huu.cc/g/
    • good
    • 0
この回答へのお礼

ありがとうございます。Visual C++ 2005 Express Edition 日本語版は持っているのであとはDXライブラリですね。あと、高校の電気科ではどこまで勉強するのでしょうか。

お礼日時:2007/09/10 20:54

> LSI C-86 試食版


DOSファンクションコールを使えばVGAにアクセスできますよ。
でも、
16ビットアプリでしか使えないし、
アセンブラとハードウェアの知識が要るし、
いまとなっては資料を入手するのも一苦労(というか入手不可?)だけど。
    • good
    • 0
この回答へのお礼

ありがとうございます。LSI C-86 試食版は資料がないほど古いコンパイラなのですか。新しいコンパイラに変えたほうがいいのでしょうか。

お礼日時:2007/09/10 20:50

Cにおいてグラフィック関数やライブラリは標準な物ではありません。


環境依存です。
グラフィック関数を持っているコンパイラもあればないコンパイラもありますし
コンパイラごとに誰かが作った標準ではない関数もある可能性があります。
    • good
    • 0
この回答へのお礼

ありがとうございます。グラフィック関数とライブラリを手に入れればいいんですね。

お礼日時:2007/09/10 20:28

グラフィック画面の操作はC言語の言語仕様には含まれていません。


グラフィックスを扱う為のAPI(WindowsであればWin32APIとかDirectXとかOpenGLとか)を使用する必要があります。

gl_openwin(-1, -1, 640, 480, 0);
はStudy C http://www.vector.co.jp/soft/win95/prog/se087583 …
が持っている独自のグラフィック操作関数のようです。
Study C以外では使えないと思います。

なお、LSI C-86 試食版ではWindowsリソースにアクセス出来ませんのでグラフィックスは扱えません。
    • good
    • 0
この回答へのお礼

ありがとうございます。C言語で画像は扱えないんですね。あと、Study C は使えないみたいです(使っているのはXPなので)。APIというものはどういうものなのでしょうか。

お礼日時:2007/09/10 20:25

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qmain関数終了時のreturnの意味は?

質問の題名通り、main関数終了時のreturnの意味が知りたいです。いつもは参考書に書いてある通り、return 0とやっていたのですが、参考書のサンプルプログラムでreturn 1というのがでてきた為、少し混乱しました。
参考書に説明が載っていないのでmain関数内でのreturnの意味をご教授願いたいです。よろしくお願いいたします。

Aベストアンサー

# 4です。

まず、0を返そうが、1を返そうが、そのプログラム自体の内部的な動作は通常変わりません。
戻り値で動作が変わる可能性があるのは「そのプログラムを呼び出したプログラム側」です。

例えば、make から呼び出された場合にそのプログラムが0以外が返したら、makeは「そのプログラムは失敗した」と考えて、処理を中断したりします。(続けて欲しいなら「成功」を返す、こういうために使います)
コマンドラインからあなたが手で入力したのなら、何も起きないかもしれません。

1を伝えられたOSが何をするかは環境(OS)によります。
gccは、Windows版もLinux版も各UNIX版もあるようなコンパイラですから、その版によって違う可能性があります。
ちなみに、手元の Minimalist GNU for Windows では 1 は EXIT_FAILURE でした=つまり前述のような失敗。
別のOS上のgccでは別の値にポートされている可能性も否定はできません。

C言語が保証しているのは、EXIT_SUCCESSを返したとき、その環境では成功と判断してくれるだろう値を返すことと、EXIT_FAILUREのときは失敗と判断してくれるだろう値を返すことだけです。
0は通常EXIT_SUCCESSですが、1はEXIT_FAILURE とは限りません(現実的には 0 と 1 が大半だと思いますが、EXIT_FAILUREが-1とかでも違反ではないです)。
但し、実際に判断できるかはOSにもよりますし、呼び出したプロセスがどう判断するかにもよります。

なお、Windows や Linux, その他私の知っている UNIX では、1を返されたからといって必ず何かが行われるということはありません。
前述のように、別のプログラム等から呼び出された場合に、そのプログラムが失敗と判断して何か処理を行う可能性はありますが、これらはあくまで呼び出し元のプログラムによります。
ITRON等の組込みOSでは、main が値を返す事は通常ありません。

憶測ですが、参考書のサンプルで return 1;となっているのは、例えば argv が求めているものと違うとか、fopen に失敗したとか、そういうケースではありませんか。
そういう異常処理が発生した場合に、もしも呼び出したプログラムがいたらそれを伝えられるように、EXIT_SUCCESS (0)以外の値を返すのは慣習です。
具体的にどんな値を返すかは、プログラムの設計次第になってしまいますが、1や-1を返したり、失敗原因ごとに決めた値を返したりします。
汎用性を重視するならEXIT_FAILURE等もありますが、知名度もやや低いですし、0以外なら何でもいいという認識の人も多いように思いますので、サンプルは単に1を返しているのではないかと。

# 4です。

まず、0を返そうが、1を返そうが、そのプログラム自体の内部的な動作は通常変わりません。
戻り値で動作が変わる可能性があるのは「そのプログラムを呼び出したプログラム側」です。

例えば、make から呼び出された場合にそのプログラムが0以外が返したら、makeは「そのプログラムは失敗した」と考えて、処理を中断したりします。(続けて欲しいなら「成功」を返す、こういうために使います)
コマンドラインからあなたが手で入力したのなら、何も起きないかもしれません。

1を伝えられたOSが...続きを読む

QEnterキーを押されたら次の処理に移るという事をしたい。

コンソールアプリケーション上で文字列を表示させた後、ユーザーがエンターキーを押したら次の文字列を表示するという仕様にしたいのですが、エンターキーだけ入力待ちにするっていうのはどのように書けばいいんでしょうか?

Aベストアンサー

#include <stdio.h>

int main(void)
{
char *str[] = {"abc", "def", "ghi", "jkl"};
int i;

for(i = 0; i < 4; i ++){
while(getchar() != '\n') ;
puts(str[i]);
}
return 0;
}

QC++にて、塗りつぶされた円を描くプログラムを描くにはどうすればいいで

C++にて、塗りつぶされた円を描くプログラムを描くにはどうすればいいでしょう?

Aベストアンサー

中心x0,y0、半径rの円を塗りつぶすには、いろいろと方法があると思います。
・ベタな方法
全座標(x,y)について、 (x-x0)*(x-x0)+(y-y0)*(y-y0) を計算、 <= r*r なら円の中なので色を付ける。
実際には、円に外接する正方形よりだけ確認すればよいで 、 x0-r<=x<=x0+r,y0-r<=y<=y0+rの範囲を調べる。

・y0-r<=y<=y0+r のyについて、dy = y - y0 とする。
dx=x-x0 とすると、r,dx,dyからなる直角三角形ができるので、値のわかっているr,dyからdxが求まる。
左右の座標がそれぞれ x0-dx,y と x0+dx,yになるので、その間に色を付ける。

・(塗りつぶさない)円をかくアルゴリズムをつかって、円を書く
→囲まれた領域を塗りつぶす方法(ペイントアルゴリズムと言われたりする)を使って、円の中を塗る。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング