トップページ⇒tech
1001コメント308KB

C言語なら俺に聞け(入門篇) Part 4

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/11/09(木) 00:31:01
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 3
http://pc8.2ch.net/test/read.cgi/tech/1160682950/

過去スレ
Part 1 http://pc8.2ch.net/test/read.cgi/tech/1146700389/
Part 2 http://pc8.2ch.net/test/read.cgi/tech/1153818463/


関連スレ
くだすれC言語(初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1153542424/

【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
http://pc8.2ch.net/test/read.cgi/tech/1159613789/
0404デフォルトの名無しさん2006/11/18(土) 12:55:15
>>403 「正常に動作」の定義は?
0405デフォルトの名無しさん2006/11/18(土) 13:07:43
初心者です。
関数で「*strcpy」とかについている「*」の意味ってなんですか?
ポインタ?
0406デフォルトの名無しさん2006/11/18(土) 13:10:35
>>405
ポインタ。
0407デフォルトの名無しさん2006/11/18(土) 13:13:28
>>403
{を行末に付けるの止めれ。ブロックが見にくい
scanfに&が無い
scanfだと50文字以上入力されてもわからない
for (; owari >= 2 ; owari-- ) → for (; owari >1 ; owari-- )
逐次ソート結果出力はイラネ。
0408デフォルトの名無しさん2006/11/18(土) 13:15:08
[ ]は自由の牢獄
* は希望の光
両者は同じであり、異なる。
0409デフォルトの名無しさん2006/11/18(土) 13:17:28
>>407 本当にお疲れ様でした。
>{を行末に付けるの止めれ。ブロックが見にくい
フリーフォーマット(感想はチラシの裏に)
>scanfに&が無い
配列なのに必要?
>逐次ソート結果出力はイラネ。
「正常に動作」の定義は?
0410デフォルトの名無しさん2006/11/18(土) 13:17:46
あとforの後にスペース入れるのも止めれ。読みづらい。
0411デフォルトの名無しさん2006/11/18(土) 13:18:54
>>403 個人差があるとは思うけどレビューってことで
変数名の変更(変数間の関係が分かりやすいように)
moji → mojiretu
owari → mojiretu_len

標準関数を使う
mojiretu_len=strlen(mojiretu);

ループ用変数は別に用意する(文字列の長さを示す変数を変更しない)
04124052006/11/18(土) 13:19:47
なんか理解しました。
0413もんた2006/11/18(土) 14:41:30
キーボードからの入力で、EXITと入力すると
プログラムが終了するようにはどうしたらできますか?
0414デフォルトの名無しさん2006/11/18(土) 14:46:23
>>413
if (strcmp(str, "EXIT") == 0) exit(0);
0415もんた2006/11/18(土) 14:50:36
>>414

宣言は何がいりますか?
0416デフォルトの名無しさん2006/11/18(土) 14:51:26
>>415
exitで終わらせたいコードを載せたほうが早いよ。
0417もんた2006/11/18(土) 14:54:16
while (scanf("%s", s) == 1) {

for (i = x = y =n_y= 0; s[i]; i++){
printf("%s\n", s);

if (!(p = strchr(r, s[i]))) {

break ; }
この部分でfscanでEXITが入ると終了したいんですが。
0418もんた2006/11/18(土) 15:00:58
すいませんscanfでEXITが入ると終了したいんですが
0419デフォルトの名無しさん2006/11/18(土) 15:02:04
>>417
while (scanf("%s", s) == 1) { 
if (strcmp(s, "EXIT") == 0) exit(0); 

scanf()の次の行に入れればいいかな。

ファイルの先頭あたりに、
#include <stdlib.h>
#include <string.h>
という行がなかったら追加する。

0420もんた2006/11/18(土) 15:10:12
できました。ありがとうございます。

if (!(p = strchr(r, s[i]))) {
の行で、
コンパイラに、おそらく不正な代入関数(main)とでるのですが。
何か分かりますか?
0421デフォルトの名無しさん2006/11/18(土) 15:12:39
>>420
p = strchr(r, s[i])
これが代入になってるため
コンパイラは本本当は == 何じゃね?と勘違いしてメッセージをだす
むしすればおk
0422デフォルトの名無しさん2006/11/18(土) 15:14:21
それで警告出るなら、二行に分けて書くしかないかな?

p = strchr(r, s[i]);
if (!p) { 

コンパイラのオプションを調べて、その警告をでなくするか。
0423もんた2006/11/18(土) 15:15:10
>>421
わかりました。ありがとうございました。
04244212006/11/18(土) 15:40:49
>>423
if ( (p = strchr(r, s[i])) == 0 ) {
でもいい
0425デフォルトの名無しさん2006/11/18(土) 15:42:35
>>424
代入をカッコでくくって、!してる式でも警告がでるなら、それでも出るんじゃないの?
0426デフォルトの名無しさん2006/11/18(土) 15:59:31
>>425
いや ( (p = strchr(r, s[i])) == 0 ) はたぶんだが式中に比較演算子があるのでコンパイラは「比較している」と認識する
(!(p = strchr(r, s[i])) だと代入演算と論理演算しかないため式中で比較していないと認識するのではないかと思う
0427デフォルトの名無しさん2006/11/18(土) 18:17:10
#include<stdio.h>
#define MAX100
#define PRIME0
#define NOT_PRIME1

int main(void)
{
int number[MAX+1];
int i,j;


for(i = 1; i <= MAX; i = i + 1)
number[i] = PRIME;


number[1] = NOT_PRIME;
for(i = 2; i <= MAX; i = i + 1) {
if(number[i] == PRIME) {
for(j = 2 * i; j <= MAX; j = j + 1)
number[j] = NOT_PRIME;
}
}


for(i = 1; i <= MAX; i = i + 1)
if(number[i] == PRIME)
printf("%d\n",i);

return(0);
}

100までの素数検索プログラムなんですけど実行結果が変です。どこかおかしいところありますか?
0428デフォルトの名無しさん2006/11/18(土) 18:20:16
>>427
defineがおかしくね?
04294282006/11/18(土) 18:22:43
>>427
と思ったらそれだけじゃなったな
0430デフォルトの名無しさん2006/11/18(土) 18:28:46
for(j = 2 * i; j <= MAX; j = j + i)
ここがおかしかった自己解決
どうもすいませんでした
0431デフォルトの名無しさん2006/11/18(土) 19:51:46
なんでこれ aとbの中身を交換できないの〜?

#include <stdio.h>
main()
{
char a='A',b='B',*ap,*bp;
printf("%c %c\n\n",a,b);
ap = &a;
bp = &b;
a = *bp;
b = *ap;
printf("%c %c",a,b);
}

$ ./pointer.exe
A B

B B

ってなる・・・どうすればいいのでしょう?アドレスを習ったばかりでアドレスを使って交換
する方法を考えています。
0432デフォルトの名無しさん2006/11/18(土) 19:55:11
>>431
頭を柔らかくして考えてみな
a = *bp;このときaのアドレスにbpの中身つまり'B'が代入された
そしてb = *ap;この時ののapはaのアドレスを示している
aのアドレスに入っているのは'B'
もうOKか?
0433デフォルトの名無しさん2006/11/18(土) 20:09:11
>>432
おおお!ななななななるほど!

普通の変数wkみたいには行かないってことかぁ・・・

もっとよく考えて見ます。ありがとう御座います。
0434デフォルトの名無しさん2006/11/18(土) 20:23:07
>>433
普通の変数でも同じ。

char a='A',b='B';
a=b;
b=a;

だと交換できないよ。
0435デフォルトの名無しさん2006/11/18(土) 22:01:12
常識ちぇきに考えちぇ変数二ちゅじゃ交換できないだろ
0436デフォルトの名無しさん2006/11/18(土) 22:10:56
warning: comparison between pointer and integer
こんなエラーが出たんですけど、わけわかりません・・・
0437デフォルトの名無しさん2006/11/18(土) 22:13:24
>>436
ポインタとintを比較してますよ。
0438デフォルトの名無しさん2006/11/18(土) 22:27:09
>>437
いいえ。ポインタと整数を比較しているんです。
0439デフォルトの名無しさん2006/11/18(土) 22:34:15
ポインタと整数を比較・・・
かぁ〜もうめんどくせ〜
違う方法でやるか・・・
0440デフォルトの名無しさん2006/11/18(土) 22:52:05
>>439
何を比較したいの?
キャストすれば?
0441デフォルトの名無しさん2006/11/18(土) 23:43:51
警告なら行番号くらいでてるだろ
その行くらい晒せばいいんじゃね
0442デフォルトの名無しさん2006/11/19(日) 00:56:47
初めまして。プログラムの勉強をしようと思い「14歳から始めるわくわくゲームプログラミング」という本を買いました。
P74に書いてあるサンプルプログラムを本の通り書いたのですが

エラー E2293 C:\MyC\dxtest\dxtest.cpp 9: ) が必要(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) )
と表示されてしまいます。
---------------------------------------------------------------------
#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC)

{changewindowmode(true);

if(dxlib_Init() ==-1) return(-1);

int drawbox(0,0,120,120,6553,true);

int waitkey();

int DxLib_end();

return(0);}
-------------------------------------------------------------------
どこをどう直せばいいですか?
スレ違いでしたらごめんなさい。
0443デフォルトの名無しさん2006/11/19(日) 01:10:11
どこから突っ込むべきか迷ったから、修正版を先にあげるぞ。
///////ここから
#include "DxLib.h" 

int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC) 
{ChangeWindowMode(true); 
if(DxLib_Init() ==-1) return(-1); 

DrawBox(25,25,120,120,6553,true); 
WaitKey(); 
DxLib_End(); 
return  0;}
///ここまで
0444デフォルトの名無しさん2006/11/19(日) 01:14:00
>>443
ありがとうございます。
無事動きましたが一体どこが悪かったんでしょうか?
C言語のコマンドは大文字・小文字で全く違う意味になると考えればいいですか?
04454432006/11/19(日) 01:20:39
まず、一つ目は大文字と小文字は区別されるってこと。
changewindowmode と ChangeWindowModeは別物扱い。
他にも幾つか間違ってるが、自分で確認してくれ。

それと、2つ目int drawbox(0,0,120,120,6553,true);   int waitkey();   int DxLib_end();
のintは付かない。 
詳しく説明するとめんどいから、軽くするが、 int WiINAPI WinMain() {}
ってのは、関数を作ってる。感覚。
逸れに対して、ただの DxLib_Init() ってのはどっかに作った関数を呼び出してる感覚。
DrawBox()とWaitKey()とDxLib_End()はここでは作るわけじゃく呼び出してるので、 intなどが付かない。
04464432006/11/19(日) 01:33:48
こんなので、関数のイメージをつかんでみるといいかもしれん。
//ここから
#include "DxLib.h" 
void muro(int a)
{DrawString( 250 , a*32 , "これはmuro()関数内の処理" , 38453 );
}
int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC) 
{ChangeWindowMode(true); 
if(DxLib_Init() ==-1) return(-1); 
muro(2);
WaitKey();
DrawBox(25,25,120,120,6553,true); 
DrawString( 250 , 240 - 32 , "WinMain()関数内の処理" , 56453 );
WaitKey();
muro(3);
WaitKey();
DxLib_End(); 
return  0;}
//ここまで
muro()関数を作って、それをDxLib_End()やWaitKey()
そしてDrawBox()と同じように呼び出している。
のがつかめれば上出来。
muro()のカッコ内が変わると、表示される位置がズレルのも注目。
0447デフォルトの名無しさん2006/11/19(日) 01:50:14
370ページの入門書終わらしたのですが、イメージしか
掴めませんでした、不向きでしょうか?
0448デフォルトの名無しさん2006/11/19(日) 02:08:00
プログラムを書いている途中
printf("%*s%s\n",horse_pos[r],"",horse[r]);
とあったのですが、,horse_pos[r],"",horse[r]);
の部分の,""の意味が分かりません
どなたか教えていただけませんか?
0449デフォルトの名無しさん2006/11/19(日) 03:18:17
printf("%*s%s\n",horse_pos[r],"あいうえお",horse[r]);

だったら分かるんか?
0450デフォルトの名無しさん2006/11/19(日) 04:09:06
>>447
イメージが掴めたならその内なんとかなるよ。
あとは、コードを読んで分析理解して、
コードを書いて試行錯誤していけばいい。
0451デフォルトの名無しさん2006/11/19(日) 04:51:39
>>450
そういわれると、嬉しいです。
中には掴めない方もいるでしょうか?
0452デフォルトの名無しさん2006/11/19(日) 06:35:52
入門書は著者自身が誤解しているとしか思えない本が多いので、
間違ったイメージであることも多い。
自分で書いて適当な場所で他人にレビューしてもらうことを勧める

最初は けなされると思うが。
0453static2006/11/19(日) 07:27:22
初めまして。書籍を参考にしながら独自コードに直している間につまづきました。
static修飾子について質問させてください。

static修飾子をつけた同じクラスのメンバにアクセスさせると、
コンパイル時にリンクエラーになります。
参考にした書籍にはそのように載っているので、何か条件があるのだと思いますがわかりません。
何から疑っていったら良いでしょうか。
具体的には、下記のようなコードの場合にエラーになります。

class CWindow {
public:
  HWND RegistWindow(char* wndName, char* wndTitle, int posXX, int posYY);
protected:
  static LRESULT CALLBACK _WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
  static CWindow* m_static;
};

LRESULT CALLBACK CWindow::_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
  CWindow* p = m_static;  // こいつがいけないらしい
}

HWND CWindow::RegistWindow(char* wndName, char* wndTitle, int posXX, int posYY) {
  m_static = this;  // これもいけないらしい
}
0454デフォルトの名無しさん2006/11/19(日) 08:06:29
ここはCスレ。C++の話題はスレ違い。

【初心者歓迎】C/C++室 Ver.32【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1160893851/
0455πr^22006/11/19(日) 11:16:01
char * str[] = {"String1","String2"}
などとなっているchar[]のポインタをリターンする関数はどう宣言すればいいのでしょうか。
0456デフォルトの名無しさん2006/11/19(日) 11:18:02
char ** foo()
{
static const char * const static_strings[] = {"string1", "string2",};
return static_strings;
}
0457πr^22006/11/19(日) 11:40:13
>>456
char ** foo();

int main(){
char **str = foo();
}

char ** foo()
{
static const char * const static_strings[] = {"string1", "string2",};
return static_strings;
}

をコンパイルすると、
エラー E2034 strtest.cpp 10: 'const char * const *' 型は 'char * *' 型に変換できない(関数 foo() )
というエラーがでました
0458デフォルトの名無しさん2006/11/19(日) 11:52:54
あーいけね。
const char * const * foo() // 以下略
0459πr^22006/11/19(日) 13:06:06
>>458
const char * const foo()でできました!
ところで、char* str[];とし、str[]の配列の数を決めるときはどのようにするのでしょうか。
char *str[] = new char*[20];としても、
'char * *' 型は 'char *[]' 型に変換できない
とエラーがでてきてしまいます。
0460デフォルトの名無しさん2006/11/19(日) 13:10:33
>>459
数を別に渡すしかない。
0461デフォルトの名無しさん2006/11/19(日) 13:43:59
#include<stdio.h>
#include<math.h>
int main(void){
int a,b,c;
double kotae;
printf("aの値は入力:");
scanf("%d",&a);
printf("bの値は入力:");
scanf("%d",&b);
printf("cの値は入力:");
scanf("%d",&c);
kotae=sqrt(b*b-4*a*c);
printf("%f",&kotae);
return 0;
}


何を入力しても答えが0になってしまいます
ボスケテください
0462デフォルトの名無しさん2006/11/19(日) 13:56:27
>>461
#include<stdio.h>
#include<math.h>
int main(void){
int a,b,c;
double kotae;
printf("aの値は入力:");
scanf("%d",&a);
printf("bの値は入力:");
scanf("%d",&b);
printf("cの値は入力:");
scanf("%d",&c);
kotae=sqrt(b*b-4*a*c);
printf("%f",kotae);
return 0;
}
0463デフォルトの名無しさん2006/11/19(日) 14:00:54
>>462
実行してみたのですが、答えがNaNと表示されました・・・
0464デフォルトの名無しさん2006/11/19(日) 14:01:24
printf("%f",&kotae);
       ↑
04654632006/11/19(日) 14:03:29
あっと、ごめんなさい勘違いでした
計算されてました
でも、答えがマイナスになる場合だとNaNとでるのですが、
マイナスの答えまできっちり表示させる方法ってありますか?
0466デフォルトの名無しさん2006/11/19(日) 14:05:50
そもそもマイナスの平方根なんてないだろ・・・
0467デフォルトの名無しさん2006/11/19(日) 14:09:29
kotaeなんて変数つくらなくても printf("%f",sqrt(b*b-4*a*c)); でいいよ
ていうか>>461は(b*b-4*a*c)のところの計算の順序はこれでいいの?
0468デフォルトの名無しさん2006/11/19(日) 14:10:20
http://mixi.jp/view_bbs.pl?id=12516056&comment_count=150
晒し
04694612006/11/19(日) 14:10:37
>>466
言われてみるとそうでした・・・orz

>>462
>>464
>>466
どうもありがとうございました助かりました
0470デフォルトの名無しさん2006/11/19(日) 14:11:41
>>461のソースでもエラーが出るのがVC2005だから困る
正直キャストが面倒くさい
04714612006/11/19(日) 14:14:03
すみません、更新せずに書いてしまいました

>>467
なるほど、そういうやり方あったんですね、気づきませんでしたorz

式はあってると思います・・・・・思います・・・
0472デフォルトの名無しさん2006/11/19(日) 14:19:54
>>469
おいおい、
虚数を扱えるライブラリを紹介しろとか
そういうのじゃないのか。
0473static2006/11/19(日) 14:41:52
>>454
失礼しました。
0474デフォルトの名無しさん2006/11/19(日) 14:57:53
数学の話ができるおまいらに嫉妬
04754482006/11/19(日) 15:22:47
>>449
超亀レス申し訳ありません
つまり、前の文字列と後ろの文字列の間のスペースということですか?
これを無くして書くことはできないのでしょうか?
0476デフォルトの名無しさん2006/11/19(日) 15:27:15
>>475
>448のprintf()なら、これと等価だろ。
printf("%s\n",horse_pos[r] + strlen(horse[r]),horse[r]);
要は、文字列をずらすために空白文字で調整したいのだろうから。
04774482006/11/19(日) 15:40:08
>>476
それでデバッグしてみると文字列の最後にク■↑と表示したい文字列の後ろに出てしまいます
エラーは起きていないようですが
0478デフォルトの名無しさん2006/11/19(日) 16:47:09
入力された五つの数値の最大と最小を表示する。この処理を、配列とポインタ変数を使用して作成。

使用配列とポインタ変数
int suchi[5];
int *saidai,*saisyou;

ポインタ変数とかポインタとかよく分かんないorz
このプログラムはどう書けばいいのでしょうか?
0479デフォルトの名無しさん2006/11/19(日) 16:52:26
>>478
C/C++の宿題を片付けます 76代目
http://pc8.2ch.net/test/read.cgi/tech/1162771475/
04804482006/11/19(日) 16:57:14
>>476
printf("%s\n",horse_pos[r] + strlen(horse[r]),horse[r]);
て%s%sじゃなくていいんですか?
0481デフォルトの名無しさん2006/11/19(日) 16:58:22
%*sだな。
04824482006/11/19(日) 17:02:52
>>481
ありがとうございます、変な文字も出ず解決しました
0483デフォルトの名無しさん2006/11/20(月) 00:58:40
>>461らへん
sqrt()する数値をabs(b*b-4*a*c)
にして、
abs(b*b-4*a*c)!=b*b-4*a*c
だったらb*b-4*a*cは負の数になってるので、
答えの最後に「i」を表示すれば一応ソレらしきものにはなるのでは
0484デフォルトの名無しさん2006/11/20(月) 01:23:27
便乗質問ですみませんが
#include <stdio.h>
int main(void){
printf("%*s","hogehoge",10);/*10は適当な数値*/
return 0;
}
はどこか構文間違えていますか?
コンパイルは通るのですが、不正終了してしまいます
三行目printf("%*s","hoge","piyo",10);にすれば実行は出来ますが
数千個分の改行とスペースが出力されるだけです
環境はWinXP VC++Toolkit2003です
%10sのようなフィールド幅指定は問題ありませんでした
0485デフォルトの名無しさん2006/11/20(月) 02:16:49
printf("%*s", 10, "hogehoge");
04864842006/11/20(月) 02:25:02
orz
すみません、初歩的なミス過ぎますね・・・
夜更けにどうもありがとうございました
0487デフォルトの名無しさん2006/11/20(月) 05:21:50
for(;; p_turn = !p_turn){

とはどう言う意味でしょうか?

あと
for(;;)と言うのも参考書に載っていますが
意味がわかりませんので
これら二つの、ご助言を宜しくお願い致します。

こちらのスレで質問するのが正しいと思いました
マルチではありません。
0488デフォルトの名無しさん2006/11/20(月) 06:23:54
ttp://pc8.2ch.net/test/read.cgi/tech/1160897843/52

質問を撤回してない
マルチ氏ね
0489デフォルトの名無しさん2006/11/20(月) 06:46:08
http://pc8.2ch.net/test/read.cgi/tech/1160897843/52-
0490デフォルトの名無しさん2006/11/20(月) 15:31:07
3次元配列をポインタで動的メモリ割り当てするのってこれであってる?

#include<stdio.h>
#include<stdlib.h>
main()
{
int i,j;
int ***z;
z = (int ***)malloc( 3 * sizeof(int **));
z[0] = (int **)malloc( 4 * sizeof(int *));
z[0][0] = (int *)malloc( 3 * 4 * 5 * sizeof(int));

for(i=0;i<3;i++){
z[i] = z[0] + i * 4;
}
for(i=0;i<3;i++){
for(j=0;j<4;j++){
z[i][j] = z[0][0] + i * 5;
}
}

free(z);
return 0;
}
0491デフォルトの名無しさん2006/11/20(月) 15:33:48
>>490
free(z)だけでは足りない。

free(z[0][0]);
free(z[0]);
free(z);
0492デフォルトの名無しさん2006/11/20(月) 19:06:41
循環定義を含むプログラムを正しくコンパイルするにはどうすればいいですか?
以下のようなコードを書いたところ、コンパイル時に
error: dereferencing pointer to incomplete type
というエラーが出てしまいます。


typedef struct sa *sa_p; // 先に sa のポインタだけ定義

typedef struct {
  sa_p a2;
} sb, *sb_p;

typedef struct { // sa の本体を定義
  sb_p b;
} sa;

int main() {
  sa_p a = (sa_p)malloc(sizeof(sa));
  a->b->a2 = a; // compile error
  return 0;
}
0493デフォルトの名無しさん2006/11/20(月) 19:30:58
それ循環のせいじゃないし。
コンパイルが通らないのは当然かつそれでは実行時も落ちるだろう。
>typedef struct { // sa の本体を定義
>  sb_p b;
>} sa;
ここで無名構造体をtypedefしたsaと本来のstruct saが別物になってる。
でもって
>  a->b->a2 = a; // compile error
ここでおそらく落ちる。ちゃんと
a->b = (sb_p)malloc(sizeof(sb));
とやってからにしろ。
0494デフォルトの名無しさん2006/11/20(月) 21:45:35
携帯電話のiアプリは起動するとほとんどのがjavaで作ってるみたいなのですが
Cでも作ることはできるのでしょうか?
0495デフォルトの名無しさん2006/11/20(月) 21:49:35
>>494
クロスコンパイラ持ってれば出来るんじゃね?
0496デフォルトの名無しさん2006/11/20(月) 22:26:22
ちょいと質問させてくださいな。
やっぱりプロトタイプ宣言はすべきなのですか?

これは、一番上にmain関数をもって行けば早い話であって、
関数を変えた時にプロトタイプ宣言を変え忘れて、
コンパイラが通らないと言う事も起きたりするので
別に必要ないんじゃ無いかと思ったりしてるからです。
0497デフォルトの名無しさん2006/11/20(月) 22:34:33
別にしなくていいよ。
そのうちソースとヘッダを分けることを覚えたら、自然と気にならなくなるだろうし。
0498デフォルトの名無しさん2006/11/21(火) 00:58:36
コンソールで動く、簡単なシューティングゲームを作りたいのですが、
リアルタイムにキー操作を取るにはどうすればいいんでしょうか。

scanfなどでは入力待ち状態になってしまいますし・・
0499デフォルトの名無しさん2006/11/21(火) 01:00:05
環境依存だけど
kbhit
getch
で調べてみれば?
0500デフォルトの名無しさん2006/11/21(火) 01:04:06
>>498
正直、Windowsで作ってるなら、ライブラリを使ったGUI方がはるかに楽だよ。
コンソールは面倒。
たぶん、Win以外もライブラリ使用のほうがらくだと思う。
0501デフォルトの名無しさん2006/11/21(火) 01:08:13
問題はライブラリの使い方を覚えるのが面倒だという可能性があること。
それを乗り越えれば、楽だろうけど。
0502デフォルトの名無しさん2006/11/21(火) 01:10:34
>>498 サンプルコード
#include<stdio.h>
#include<conio.h>

intmain(void){
intmoji='-';

while(1){
if(kbhit())moji=getch();
printf("\r%c [%3d]", moji, moji);
}
return 0;
}
0503デフォルトの名無しさん2006/11/21(火) 01:12:45
上の方でも出てる、DxLibなんかは、かなり簡単。
2chからリンクするのは気が引けるが
初心者からそこそこの上級者までお勧めできる。
(ただ、なんでもかんでもintが活躍するので、少し危険性も高いが)
■ このスレッドは過去ログ倉庫に格納されています