C言語何でも質問掲示板


アンケートにご協力下さい → >> アンケートフォーム <<

規約と使い方

 
   (かなり初心者です)   
     ・[14254] 管理人 
   当たり判定   
     ・[14097] 管理人 
     ・[14107] シー 
     ・[14124] そそ 
     ・[14132] yamahara 
     ・[14133] はね 
     ・[14135] 管理人 
     ・[14139] にゃっき 
     ・[14140] やそ 
     ・[14150] taku.net 
     ・[14159] 管理人 
     ・[14209] そそ 
     ・[14213] KIJ 
     ・[14222] にゃっき 
     ・[14223] 管理人 
     ・[14251] やそ 
   マップのワープ方法( ....   
     ・[14250] 管理人 
   ゲームプログラミング ....   
     ・[14230] tkmakwins15 
     ・[14232] クロカモ 
     ・[14246] 管理人 
   ステージの作り方。   
     ・[14099] 管理人 
     ・[14101] やそ 
     ・[14102] 管理人 
     ・[14119] クロカモ 
     ・[14134] 管理人 
     ・[14138] クロカモ 
     ・[14142] 管理人 
     ・[14151] tkmakwins15 
     ・[14243] 管理人 
   配列文字型の初期化に ....   
     ・[14191] 管理人 
     ・[14192] 組木紙織 
     ・[14193] たかぎ 
     ・[14194] kazuoni 
     ・[14195] kazuoni 
     ・[14197] box 
     ・[14198] 管理人 
     ・[14201] たかぎ 
     ・[14203] kazuoni 
     ・[14205] 組木紙織 
     ・[14208] kazuoni 
     ・[14211] hoge 
     ・[14219] kazuoni 
     ・[14228] 管理人 
   34章のメイン関数を ....   
     ・[14189] 組木紙織 
     ・[14226] <kor 
     ・[14227] 管理人 
   市販のゲーム機で・・ ....   
     ・[14204] YuO 
     ・[14206] たかぎ 
     ・[14207] Justy 
     ・[14214] GPGA 
     ・[14215] バグ 
   文字列から全ての単語 ....   
     ・[14178] tkmakwins15 
     ・[14180]   
     ・[14183] フリオ 
     ・[14184] Justy 
     ・[14185] たかぎ 
     ・[14212] ワグナス 
   新しく敵がでるたびに ....   
   スコア   
     ・[14148] GPGA 
     ・[14152] L 
     ・[14157] 管理人 
     ・[14179] L 
     ・[14186] GPGA 
     ・[14196] L 
   はじめまして   
     ・[14175] 管理人 
     ・[14181] バグ 
     ・[14182] ・ 
   とんでもなく初歩的な ....   
     ・[14146] 管理人 
     ・[14149] 歩兵 
     ・[14156] 管理人 
     ・[14158] 歩兵 
     ・[14160] 管理人 
     ・[14161] 歩兵 
     ・[14163] 管理人 
     ・[14166] 歩兵 
   乱数について   
   利用は初めてなんです ....   
     ・[14154] 組木紙織 
   他のエディタで使用中   
     ・[13991] へろり 
     ・[13992] りょうちん 
     ・[14001] 雷 
     ・[14091] りょうちん 
     ・[14092] 雷 
     ・[14122] りょうちん 
     ・[14128] 雷 
     ・[14144] りょうちん 
   C言語関係ないかもしれ ....   
     ・[13960] tkmakwins15 
     ・[13966] バグ 
     ・[13979] 雷 
     ・[13987] 管理人 
     ・[14143] <kor 
   プロセスメモリについ ....   
     ・[14114] たかぎ 
     ・[14116] ポポロ 
     ・[14118] たかぎ 
     ・[14120] ポポロ 
     ・[14125] たかぎ 
     ・[14126] へろり 
     ・[14127] ポポロ 
     ・[14137] へろり 
     ・[14141] ポポロ 
   再領布について   
     ・[14100] 管理人 
     ・[14123] へろへろ 
     ・[14136] 管理人 
     ・[140871203508041] へろへろ 
   教えてください   
     ・[14115] ポポロ 
     ・[14117] たかぎ 
     ・[14121] 煎餅 
     ・[14129] 雷 
     ・[14131] 煎餅 
   敵の体力について   
     ・[14031] しりうす〜 
     ・[14032] box 
     ・[14033] Mist 
     ・[14042] やそ 
     ・[14044] しりうす〜 
     ・[14045] しりうす〜 
     ・[14049] パソピ 
     ・[14105] 管理人 
     ・[14130] パソピ 
   構造体について   
     ・[14039] box 
     ・[14043] toyo 
     ・[14046] やそ 
     ・[14047] box 
     ・[14054] tkmakwins15 
     ・[14055] やそ 
     ・[14061] けるびん 
     ・[14064] PK 
     ・[14104] 管理人 
   無題   
     ・[14098] 管理人 
   質問です。   
     ・[14076] バグ 
     ・[14078] kanna 
     ・[14079] やそ 
     ・[14080] kanna 
     ・[14081] バグ 
     ・[14082] kanna 
     ・[14094] やそ 
     ・[14095] バグ 
   10進数を2進数に変換さ ....   
     ・[14090] 組木紙織 
   for文を用いたループに ....   
     ・[14065] PK 
     ・[14072] Cげんが〜 
   アプリケーションエラ ....   
     ・[14050] 雷 
     ・[14053] 雪中 蓮 
     ・[14057] tkmakwins15 
     ・[14059] Justy 
     ・[14063] 雪中 蓮 
   シューティングゲーム ....   
     ・[13717] はね 
     ・[13723] ф魔理沙ф 
     ・[13732] はね 
     ・[13735] ф魔理沙ф 
     ・[13739] ф魔理沙ф 
     ・[13740] はね 
     ・[13741] はね 
     ・[13742] ф魔理沙ф 
     ・[13743] はね 
     ・[13745] ф魔理沙ф 
     ・[13746] はね 
     ・[13747] ф魔理沙ф 
     ・[13748] ф魔理沙ф 
     ・[13749] はね 
     ・[13750] ф魔理沙ф 
     ・[13763] 管理人 
     ・[13796] ф魔理沙ф 
     ・[13797] 管理人 
     ・[13881] シー 
     ・[13882] バグ 
     ・[14058] シー 
   カレンダーについて   
     ・[13756] カル 
     ・[13758] やそ 
     ・[13760] 管理人 
     ・[13766] カル 
     ・[13767] 管理人 
     ・[13771] 管理人 
     ・[13772] やそ 
     ・[13773] 管理人 
     ・[13775] カル 
     ・[13777] 管理人 
     ・[13784] カル 
     ・[13786] カル 
     ・[13787] box 
     ・[13788] 管理人 
     ・[13793] カル 
     ・[13795] 管理人 
     ・[13800] やそ 
     ・[13806] カル 
     ・[13826] カル 
     ・[13840] 管理人 
     ・[13854] カル 
     ・[13857] カル 
     ・[13863] 通りすがり 
     ・[13885] やそ 
     ・[13901] box 
     ・[14036] カル 
   fscanf関数について   
     ・[14019] yoko 
     ・[14020] yoko 
     ・[14021] yoko 
     ・[14022] yoko 
     ・[14024] 雷 
     ・[14025] Justy 
     ・[14027] box 
     ・[14028] たかぎ 
     ・[14029] yoko 
   宿題が分かりません。 ....   
     ・[13995] バグ 
     ・[13996] たかぎ 
     ・[13997] バグ 
     ・[13998] ねこ 
     ・[13999] バグ 
     ・[14002] 通りすがりの者 
     ・[14004] ねこ 
     ・[14023] フリオ 
   皆さん、またよろしく ....   
     ・[14011] 雷 
     ・[14016] ねこ 
   よろしくお願いします ....   
     ・[14010] 雷 
     ・[14012] ねこ 
     ・[14013] 雷 
     ・[14015] ねこ 
   文字の出力で   
     ・[13934] 組木紙織 
     ・[13935] たかぎ 
     ・[14014] elf 
   C++のクラスの使い方に ....   
     ・[13939] 組木紙織 
     ・[13940] 組木紙織 
     ・[13945] Justy 
     ・[13976] 雷 
     ・[13985] 組木紙織 
     ・[13989] yamahara 
     ・[14000] 雷 
     ・[14003] Justy 
     ・[14009] 雷 
   文字点滅中の入力   
     ・[13839] 管理人 
     ・[13864] オークヒイロ 
     ・[13876] 管理人 
     ・[14006] オークヒイロ 
   c言語 2進数ローテー ....   
     ・[13942] box 
     ・[13944] 組木紙織 
     ・[13951] たかぎ 
     ・[13954] フリオ 
     ・[13961] tkmakwins15 
     ・[13962] たかぎ 
     ・[13967] tkmakwins15 
     ・[13990] tsurukamepanda 
   ヘッダファイル   
     ・[13972] box 
     ・[13974] tkmakwins15 
     ・[13975] chunezu 
     ・[13977] 雷 
     ・[13978] box 
     ・[13980] chunezu 
     ・[13981] box 
     ・[13982] tkmakwins15 
     ・[13983] tkmakwins15 
     ・[13986] 管理人 

Name: ロミ  ..ぴよぴよ(232ポイント)   Date: 2008/02/13(水) 11:20   No:14252       
Title: (かなり初心者です)    
さきほど投稿したのですがくわしく書かなかったのでもう一度投稿します。

現在2DでRPGを作っています。 
質問なんですが、マップを作り建物を作ったのですが、どのような関数で次のステージ(プロジェクト)に 進めるようになるのでしょうか?

もうひとつ質問なんですが、2つ以上の関数を同時に使う方法について教えてください。(1つのプロジェクト内で)

よろしくお願いします。


2倍のポイントを手に入れた! 194ポイント を手に入れた。


Name: 管理人 [URL]  ..伝説のハッカー(519,962ポイント)   Date: 2008/02/13(水) 12:34   No:14254     
Title: Re:(かなり初心者です)    
2つの関数を同時に使うにはマルチスレッドを使うことになりますが、本当にそれはマルチスレッドを使わないと実現しないですか?
例えば、計算と描画を同時に行いたいのなら


while(1){
画面初期化();
敵計算();
自機計算();
描画();
裏画面反映();
}

このように繰り返せば出来ます。
マルチスレッドについては猫でもわかるC言語に書いてあります。

ステージ変更は別に関数でするものでは無いと思います。
先ほども同じ事を書きましたが、

もし大きさ固定の二次元のマップを想像していらっしゃるのでしたら、

int map[エリア数][画面縦マス数][画面横マス数];

でマップを作り、エリア番号を「エリア数」に応じて作ればいいのではないでしょうか。


316ポイント を手に入れた。



Name: シー  ..ぴよぴよ(101ポイント)   Date: 2008/02/06(水) 12:23   No:14069       
Title: 当たり判定    
突然なんですが、今『シューティングの館」の「シューティング」を作っているのですが、当たり判定のことで質問です。
今、自分への当たり判定を作っているのですが、複雑すぎて自分でもわからなくなってしまいました。
皆さんなら、どういう風に当たり判定を作りますか??もしよろしければ、ソースを見せてほしいのですが??


4ポイント を手に入れた。


Name: 管理人 [URL]  ..伝説のハッカー(509,868ポイント)   Date: 2008/02/07(木) 12:41   No:14097     
Title: Re:当たり判定    
特に複雑なことはないですよ。
表示している弾と自機との距離を全て計算すればいいだけです。
どのように情報を用意されているかわかりませんが、
ベクターとか使わずに、普通に固定の配列で用意しているなら、
以下のようにしてはいかがでしょうか。



#define 弾MAX 1000
#define ショットMAX 100

typedev struct{
int flag,あたり範囲;
double x,y;
}弾情報_t;

typedef struct{
int flag;
弾情報_t 弾情報[弾MAX];
}ショット情報_t;

ショット情報_t ショット情報[ショットMAX];

このように、1000種類の弾情報を保持できるショット情報が100個あったとしましょう。

for(i=0;i<ショットMAX;i++){
if(弾情報[i].flag!=0){
for(n=0;n<弾MAX;n++){
if(ショット情報[i].弾情報[n].flag==1){
x=ショット情報[i].弾情報[n].x-キャラの座標.x;
y=ショット情報[i].弾情報[n].y-キャラの座標.y;
range=sqrt(x*x+y*y);
if(range<自機範囲+ショット情報[i].あたり範囲){
//ココ
}
}
}
}
}



//ココに入ればあたりです。


390ポイント を落としてしまった。

Name: シー  ..ぴよぴよ(132ポイント)   Date: 2008/02/07(木) 16:00   No:14107 解決!     
Title: Re:当たり判定    
管理人さま、解答ありがとうございます。
このソースを参考に自分のソースを直してみたいと思います。


31ポイント を手に入れた。

Name: そそ  ..ぴよぴよ(427ポイント)   Date: 2008/02/08(金) 06:21   No:14124     
Title: Re:当たり判定    
どうも、まだプログラミング始めたばかりで、このサイトにはいつもお世話になってます。今、自分も自機の当り判定作ってるんですけど、エラーが出てしまいます。どこが間違ってるのかどうしても分からないので、是非教えてもらいたいです。ソースは

--------------------------------GlobalVariable.h------------------------------------
/* 定義 */
#define PLAYER_MAX_SHOT1 11
#define PLAYER_MAX_SHOT2 15

#define PLAYER_X_SIZE 128.0
#define PLAYER_Y_SIZE 48.0


#define ENEMY_TOTAL_NUM 100
#define ENEMY_TOTAL_SHOT_NUM 400
#define ENEMY_SHOT_XSIZE 16
#define ENEMY_SHOT_YSIZE 8


#define MONSTER1_X_SIZE 140.0
#define MONSTER1_Y_SIZE 128.0
-----------------------------------------------------------------------------------

------------------------player.cpp-------------------------------------------------
void PlayerHantei(){
//int p_x=PLAYER_X_SIZE;
//int p_y=PLAYER_Y_SIZE;

for(int i=0;i<ENEMY_TOTAL_SHOT_NUM;i++){//ショットの全列分
//for(int j=0;j<EnemyShot[j];j++){//1列全弾分

if(EnemyShot[i].flag==1)
{
if( EnemyShot[i].x+ENEMY_SHOT_XSIZE >Player.x &&
EnemyShot[i].x > Player.x+PLAYER_X_SIZE &&
EnemyShot[i].y+ENEMY_SHOT_YSIZE >Player.y &&
EnemyShot[i].y >Player.y+PLAYER_Y_SIZE)
{
Player.flag=0;
EnemyShot[i].flag=0;
}

}
}
}
-----------------------------------------------------------------------------------------

こんな感じです。お願いします


427ポイント を手に入れた。

Name: yamahara [URL]  ..ぴよぴよ(228ポイント)   Date: 2008/02/08(金) 18:14   No:14132     
Title: Re:当たり判定    
>そそさん
円×円なら、管理人さんの


>range=sqrt(x*x+y*y);
>if(range<自機範囲+ショット情報[i].あたり範囲){
> //ココ
>}


この計算方法でいいはずです。

SIZEになっているので、もしかしたら、矩形でしょうか?
矩形×矩形の場合、

>if( EnemyShot[i].x+ENEMY_SHOT_XSIZE >Player.x &&
>EnemyShot[i].x > Player.x+PLAYER_X_SIZE &&
>EnemyShot[i].y+ENEMY_SHOT_YSIZE >Player.y &&
>EnemyShot[i].y >Player.y+PLAYER_Y_SIZE)

この条件よりも、もうちょっと複雑で、
各点が、お互いの四角の中に入っているという判定が必要です。

ttp://www.c3.club.kyutech.ac.jp/gamewiki/index.php?%C5%F6%A4%BF%A4%EA%C8%BD%C4%EA

ここに、求め方が書いてありますが、一応、サンプル書いてみたので添付します。


196ポイント を手に入れた。

Name: はね  ..初心者(5,689ポイント)   Date: 2008/02/09(土) 02:36   No:14133     
Title: Re:当たり判定    
横から突然すいません。

1つだけ、提案があります。
今はsqrt関数で距離を取っていますが、sqrtだと呼び出すのに結構時間がかかるので
ゲームではsqrtは使わない方が良いです。
と言ってもそんなに変わらないのですが^^;

ちなみに、
自機のx座標をx0
敵のx座標をx1

自機のy座標をy0
敵のy座標をy1

自機の半径をr0
敵の半径をr1
とした場合、

if( (x0-x1)*(x0-x1)+(y0-y1)*(y0-y1) <= (r0+r1)*(r0+r1) )
で同じことができます。


2倍のポイントを手に入れた! 84ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(513,400ポイント)   Date: 2008/02/09(土) 05:27   No:14135     
Title: Re:当たり判定    

おぉ、かなり違いますね。
時々sqrtが遅い話は聞きますが、どれ位違うのか知らなかったので、
気になってどれ位早さが違うか実験してみました。

・sqrtを用いて1億回計算
・ 2乗を用いて1億回計算

それぞれ5回ずつ測定した結果です。

実行結果

sqrtで計算中・・・
3.972秒
3.988秒
3.972秒
3.972秒
3.987秒
2乗で計算中・・・
0.622秒
0.606秒
0.622秒
0.622秒
0.622秒

 
1億回でこれだけ時間がかかるなら、10万回計算すると、もう処理落ちの原因になりますね。
スペックが低いPCだともっとかもしれません。

一応計測に使ったプログラムはこちらです。(zは最適化による省略を防ぐ為に入れました)

#include <stdio.h>
#include <math.h>
#include <time.h>

int main(){
int i,n;
double x=1.2,y=2.3,z;
clock_t t;
z=0;
printf("sqrtで計算中・・・\n");
for(n=0;n<5;n++){
t=clock();
for(i=0;i<100000000;i++){
if(1.9<sqrt(x*x+y*y)){
z+=1;
}
}
printf("%.3f秒 z=%f\n",(clock()-t)/(double)CLOCKS_PER_SEC,z);
}
z=0;
printf("2乗で計算中・・・\n");
for(n=0;n<5;n++){
t=clock();
for(i=0;i<100000000;i++){
if(1.9*1.9<x*x+y*y){
z+=1;
}
}
printf("%.3f秒 z=%f\n",(clock()-t)/(double)CLOCKS_PER_SEC,z);
}

return 0;
}

 


499ポイント を手に入れた。

Name: にゃっき  ..ぴよぴよ(25ポイント)   Date: 2008/02/09(土) 13:13   No:14139     
Title: Re:当たり判定    
こちらのサイトにあるシューティングゲームについて。
シューティングで自機の当たり判定で苦戦しています。
管理人さんが作る予定の自機当たり判定のソースを見せてもらうことは可能ですか?


25ポイント を手に入れた。

Name: やそ  ..上級者(22,566ポイント)   Date: 2008/02/09(土) 14:05   No:14140     
Title: Re:当たり判定    
にゃっきさんへ
管理人さんがよほどのMでもないかぎり不可能です。
まず管理人さん自身、課題提出が終わったとはいえ、シューティングの作成で忙しいでしょうし、
就職活動だってあるでしょう。
友達とだって遊んでもらいたいでしょうし(笑)
このHPのリニューアルだって考えておられるようですし。
というかすでに当たり判定については既出の話題がありますし、
シューティングの館で詳しく解説されてます。
それを理解できないうちはあまりアレンジしないほうがいいでしょう。

「当たり判定に苦戦しているから、管理人さんの作ったヤツ頂戴よ」???
・・・それはイチバン嫌われる行為だと言うことをまず自覚してください。

ここは質問掲示板です。
たとえ悪意が無くても、「自分じゃ分からないから誰か作ってそれを見せてくださいよ」
っていうのは
「作るの面倒くさいから誰かに作ってもらってコピペすれば楽ジャン」
といっていることとほぼ同義に受け取られてしまいます。
なによりそれでは自分で作ったプログラムではなくなります。
自分で組んだプログラムのどこが分からなくて、どこでバグって、どんなエラーが出たのか。
本来はどういうことをしたかったのか。
まず質問者の側から情報提供をしなければ、答えてくれる人はほとんどいないと思います。
(管理人さんは優しいからな〜。手とり○とり答えちゃうのかなぁ?)



343ポイント を手に入れた。

Name: taku.net  ..かけだし(2,092ポイント)   Date: 2008/02/10(日) 11:03   No:14150     
Title: Re:当たり判定    
にゃっきさん以前のレスを参考にすればよいと思うのですが・・・
どうしても管理人さんのコードが見たいなら管理人さんが既に公開されている
四聖龍神録のコードを解読すればいいと思います。
それが理解できなければここで見せてもらっても実装は不可能だと思いますので・・・


128ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(514,325ポイント)   Date: 2008/02/10(日) 19:39   No:14159     
Title: Re:当たり判定    
すみません、今時間がないので、あまり詳しくかけないのですが、
当たり判定は四角で考えると難しいので、最初は全部円にしてみてはどうでしょうか?
というのも、23度回転したりしたときなど、四角形も回転させなければならず、判定がなかなか難しいと思うので。

円での当たり判定のプログラムはゲームプログラミングの館で紹介していますので、参考にしてください。
http://dixq.net/g/#s11

私のプログラムをお見せしてもいいのですが、ほかの処理がたくさん書いてあるので、よけいにみにくいと思います。
というのも、ボスがせりふを言っている時には玉が当たらないとか、カウンタがスコア表示中なら当たらないとか、
あたったときが「食らいボム中か」の判定も呼んだり、
あたったかどうかだけの判定じゃなく、ほかにも処理がたくさん書いてあるので余計わかりにくいと思います。

>やそさん

ここは初心者さんをターゲットにした掲示板ですし、気軽に何でも話をしてほしいので、まぁそこまでお怒りにならず^^;
確かに熟練者からみると、初心者の投稿には直してほしいところがたくさんあると思うのですが、
私自身、昔散々言われて嫌になった記憶があるので、なるべくここではそういう事が少なくなればな・・・と思っています。
ただしそれを許していると何でもありな投稿が増えてしまう事になり、ある程度のラインを引く必要はあると思いますが、なるべくいろんな初心者が救われるような掲示板を目指していますm(_ _)m


509ポイント を手に入れた。

Name: そそ  ..ぴよぴよ(604ポイント)   Date: 2008/02/11(月) 23:42   No:14209     
Title: Re:当たり判定    
はねさん、やまはらさん返答ありがとうございます。上に書いておいたプログラムを実行すると、コンパイルの途中で
              if( EnemyShot[i].x+ENEMY_SHOT_XSIZE >Player.x &&
                EnemyShot[i].x > Player.x+PLAYER_X_SIZE &&
→               EnemyShot[i].y+ENEMY_SHOT_YSIZE >Player.y &&
                EnemyShot[i].y >Player.y+PLAYER_Y_SIZE)

見たいな感じになって中断されてしまうんですが、これも、「各点が、お互いの四角の中に入っているという判定」がないせいですか?何度も質問すいません。


177ポイント を手に入れた。

Name: KIJ  ..ぴよぴよ(969ポイント)   Date: 2008/02/12(火) 03:35   No:14213     
Title: Re:当たり判定    
はじめまして。自分も今当り判定のプログラム作ってます。一応組んでみたんですが、敵の判定が左上画面に自機が移動したら敵の弾が消えるようになってます。ここから色々変えてみたんですけど、どうしても自機の範囲に入って玉が消えるようになりません。是非アドバイスいただきたいと思い、投稿しました。宜しくお願いします。ソースは
-------------------------------GlobalVariable.h-------------------------------------------
#define PLAYER_MAX_SHOT1 11
#define PLAYER_MAX_SHOT2 15

#define PLAYER_X_SIZE 128.0
#define PLAYER_Y_SIZE 48.0


#define ENEMY_TOTAL_NUM 100
#define ENEMY_TOTAL_SHOT_NUM 400
#define ENEMY_SHOT_XSIZE 16
#define ENEMY_SHOT_YSIZE 8
#define ENEMY_MAX_SHOT1 1000
#define ENEMY_MAX_SHOT2 100


typedef struct{
double x,y;
int status,counter,range,flag,size;
} BODY_player_t;

BODY_player_t Player;


//敵
typedef struct{
double x,y,range;
int flag,counter,hp,pattern;
} BODY_enemy_t;

BODY_enemy_t enemy[ENEMY_TOTAL_NUM];//[100]


//ショット
typedef struct{
double x,y;
int flag,range;
} SHOT_t;

SHOT_t PlayerShot[PLAYER_MAX_SHOT1][PLAYER_MAX_SHOT2];//[11][15]




typedef struct{
int flag;
double x,y,angle,disp_angle,speed;
} ENEMY_SHOTS_t;

//敵ショット
typedef struct{
int flag,pattern,counter,img,range;
double x,y,mem_ex,mem_ey,mem_px,mem_py,Enx[60],Eny[60];//[200];
ENEMY_SHOTS_t EnemyShots[ENEMY_TOTAL_SHOT_NUM];//[200];
} ENEMY_SHOT_t;

ENEMY_SHOT_t EnemyShot[ENEMY_TOTAL_NUM];//[100];

-----------------------------------player.cpp-------------------------------------

for(int i=0;i<ENEMY_MAX_SHOT2;i++){
if(EnemyShot[i].flag!=0){
for(int n=0;n<ENEMY_MAX_SHOT1;n++){
if(EnemyShot[i].flag==1){
double x,y;
int range;
Player.range=(PLAYER_X_SIZE-60)/2.0f*Player.size;
x=EnemyShot[i].EnemyShots[n].x-Player.x;
y=EnemyShot[i].EnemyShots[n].y-Player.y;
range=sqrt(x*x+y*y);
int P_x=PLAYER_X_SIZE;
int P_y=PLAYER_Y_SIZE;
if(range<P_x+P_y+EnemyShot[i].y){
//ココ
EnemyShot[i].flag=0;
}
}
}
}
}
}


969ポイント を手に入れた。

Name: にゃっき  ..ぴよぴよ(153ポイント)   Date: 2008/02/12(火) 15:38   No:14222     
Title: Re:当たり判定    
やそさん、管理人さん、悪気は無かったんですが、お気を悪くされたみたいですいませんでした。反省してます。
ご迷惑をおかけしてしまった償いに、もう質問するのをやめます。本当にすみませんでした。


2倍のポイントを手に入れた! 128ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(514,424ポイント)   Date: 2008/02/12(火) 15:42   No:14223     
Title: Re:当たり判定    
>にゃっきさん
いえいえ、人のコードを見たいというのはいいことだと思いますよ。
いつも我流では自分の知識の範囲内でしか進歩しませんが、人のコードを読んで刺激を受けることは大事だと思います。
いつでも気軽にまたご質問下さい・・。


106ポイント を手に入れた。

Name: やそ  ..上級者(23,066ポイント)   Date: 2008/02/13(水) 11:18   No:14251     
Title: Re:当たり判定    
管理人様及び掲示板利用の皆様へ

ここ数日風邪で寝込んでいた為返答が出来ずもうしわけありませんでした。

にゃっき様へ
私の投稿にご気分を害されたようで誠に申し訳ありません。
にゃっきさんに対して怒っているなんてことは全く無いです。m(_ _)m
管理人様もいわれているとおりここは初心者を対象にした質問掲示板なので、逆に私のほうが言いすぎな部分が多々あると思います。
これからも気軽に掲示板を覗いて、興味のある話題に参加、投稿していただければありがたく思います。
初心者さんらの傾向として、

 1.問題が分からない(問題文の
 2.問題を解くための手法(使うべき命令とその用法)が分からない
 3.処理の流れを組み立てられない
 4.質問の仕方が分からず自分の意図がうまく伝えられない
 5.そもそも規約を読まずに投稿する人が多い

といったことが多く見受けられます。
特に最近多いのが、課題の丸投げです。
もう、1の問題が分からないのレベルを越え、考えることを辞めてしまっているようです(・・;)
そうなると、閲覧している側も苦笑するしか有りません。
その中で興味が持てる話題であれば、暇があるときに考えたりすることもあることはありますが。
このサイトでは丸投げも許容しておられますが、質問者の書き方で得られる回答は大きく違います。
規約に則り、自分の環境(OS、コンパイラなど)や自分のレベル(最近習った命令文やポインタの理解度など)を明らかにしてじっと待つ^^
回答者はなんら義務を負うものでは有りませんが、優しい方が多いので、問い方次第では結構回答が得られでしょう。

>管理人様
お騒がせしてしまってすみません。
そうですね。ちょっと書き方も悪いし、権限も逸脱した書き込みだったと反省しています。
そろそろ、初心者に多い質問を集めたFAQなんかが有ってもいいかもしれませんね。
(って勝手に提案を管理人さんに丸投げ〜(^o^))




500ポイント を手に入れた。



Name: ロミ  ..ぴよぴよ(38ポイント)   Date: 2008/02/13(水) 10:32   No:14247       
Title: マップのワープ方法(ファイルの読み込みについて)    
現在ゲームを作っているのですが建物の中に入って次のマップ(別の・・・.cppなどのプログラム  ロードの仕方)に移動するにはどのようにすればよいんでしょうか? 内容がよくわからなくてすみません・・・

38ポイント を手に入れた。


Name: 管理人 [URL]  ..伝説のハッカー(519,646ポイント)   Date: 2008/02/13(水) 10:43   No:14250     
Title: Re:マップのワープ方法(ファイルの読み込みについて)    
まず、アクションなのかRPGなのか、2Dなのか3Dなのか移動が1次元なのか2次元なのか3次元なのかで全然違うと思うので、
その辺もう少し詳しく書いてもらえないでしょうか。
もし大きさ固定の二次元のマップを想像していらっしゃるのでしたら、

int map[エリア数][画面縦マス数][画面横マス数];

でマップを作り、エリア番号を「エリア数」に応じて作ればいいのではないでしょうか。


163ポイント を手に入れた。



Name: 管理人 [URL]  ..伝説のハッカー(515,408ポイント)   Date: 2008/02/12(火) 18:31   No:14229       
Title: ゲームプログラミングの館のミス掲載について    
ゲームプログラミングの館の導入時に、
画像が正常に認識されなかった場合の対策の為に作ったこちらのページですが、
とんでもないリンクミスをしていました。

http://dixq.net/g/trouble.html

「画像の保存場所が違う場合、ファイル名が違う場合など、読み込みエラーが発生している場合は以下のように
表示されます。」

と、あり、その下にミス時の実行結果サンプルが示されるはずなんですが、違う画像がリンクされているようでした。
結構前から更新していないので、ずっとこのミスのままだったと思うのですが、困惑なさったかた、申し訳ありません。

現在HPが修正できないので、もうしばらくお待ち下さい。

なお、「以下のように表示されます」で表示されている画像はもちろん表示されません。
もし表示されたら何だか怖いですが(汗

ゲームプログラミングの館のトップページの画像ファイル名とかぶってしまったため、おかしくなってしまったようです。


220ポイント を手に入れた。


Name: tkmakwins15 [URL]  ..熟練のプログラマー(56,714ポイント)   Date: 2008/02/12(火) 19:29   No:14230     
Title: Re:ゲームプログラミングの館のミス掲載について    
2日後に発表を控え、かなり緊張しております。管理人さんもいい春が迎えられますよう、がんばってください。

管理人さんはこのごろインターネットが何か普通にできていないようですが、何かありましたか?

>なお、「以下のように表示されます」で表示されている画像はもちろん表示されません。
>もし表示されたら何だか怖いですが(汗

もし表示されたら大変ですね。


110ポイント を手に入れた。

Name: クロカモ  ..入門者(3,869ポイント)   Date: 2008/02/12(火) 21:04   No:14232     
Title: Re:ゲームプログラミングの館のミス掲載について    
 奇遇な事もあるものです…自分も発表を二日後に控えてる身です。

 しかし、管理人さんはどこのプロバイダと契約しているのですかね?ちょっとそんな所に疑問を抱いたりしている今日この頃です。

 csvデータを使用した敵の出現方法を試みているのですが…なんとかなるかなぁ?と楽観視しているクロカモはプログラマーとして失格なのか…まぁいいか頑張ろう。

>もし表示されたら何だか怖いですが(汗

 夏の風物詩にはちょっと早いですね


164ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(518,286ポイント)   Date: 2008/02/13(水) 10:11   No:14246     
Title: Re:ゲームプログラミングの館のミス掲載について    
最近また雑談のない掲示板になりつつあるので・・。
気軽に話の出来る雑談版を立てますので、よければそちらご利用下さい。
>tkさん
>クロカモさん
お返事はそちらに書きますね。


83ポイント を手に入れた。



Name: クロカモ  ..ぴよぴよ(442ポイント)   Date: 2008/02/06(水) 23:37   No:14088       
Title: ステージの作り方。    
 どうもお初にお目にかかります。
 しばらく前からここにあるシューティングゲームの館を拝見して自分なりにプログラムを組んでいるクロカモという者なのですが管理人さんもしくはシューティングゲームの作成に詳しい方に質問があります。

 それというのも自分なりに少しずつシューティングゲームを作って来たのですが大きな壁にぶちあたってしまいました。

 ステージの作り方です。
 管理人さんのサンプルソースだと敵の出現パターンや出現のタイミングはcase文による記述で書かれていたのですがあの方法で四聖龍神録(体験版)も作ったのでしょか?それとも他になにかしらの方法があるのでしょうか?是非教えてください。

 最近管理人さんは試験やらなにやらで大変多忙とは存じますがなにとぞよろしくお願いします。
 また、他の皆さんも『こうやったら良いのではないか?』といったような事がありましたらMAILの方でもいいのでどうか教えてください。
 よろしくお願いします。


2倍のポイントを手に入れた! 428ポイント を手に入れた。


Name: 管理人 [URL]  ..伝説のハッカー(509,029ポイント)   Date: 2008/02/07(木) 13:38   No:14099     
Title: Re:ステージの作り方。    
回答はメールの方がいいのでしょうか??
一応両方にお書きしますが、よければ掲示板の方にご返答下さい。

>管理人さんのサンプルソースだと敵の出現パターンや出現のタイミングはcase文による記述で書かれていたのですがあの方法で四聖龍神録(体験版)も作ったのでしょか?

はい、全く違います・・・。
というか、全体のソースコード丸ごと違います(汗

というのも、作った当時、あのシューティングの館は、ここまで多くの人に見ていただけると思っておらず、
また、小さなミニゲームを想定していたのと、知り合いが「効率いいプログラムより、見慣れた書き方で書いてほしい」と言っていたのを受けて、
最適な書き方より、とにかく難しくないコードで書こうとして出来たものです。
なので、本来の効率的なかき方とは全然違うのです。

そのせいで、色々な人から質問が来てしまい、私のせいで、いろんな人を混乱させてしまったようです・・;
シューティングの館は近々削除予定です。
龍神録が完成したらシューティングの館をもっときちんとしたコードに書き直す予定です。

敵は数百〜数千も出てくるので、case文で書いているととんでもないことになりますし、拡張性も汎用性もありませんし、
修正も困難ですよね。
私は、一般的にどのようにするかは存じませんし、シューティングプログラムの本などを読んだこともありません。
私が我流でやっている方法ですが、エクセルでデータを書いています。
例えば私が作っているゲームのステージ2では、添付ファイルのようになっています。
ファイルを添付したので、よければご覧下さい。
(添付は下の投稿にやり直しました。)

私は、敵1体にこれだけ情報を持たせています。
カウンタ 移動パターン 敵の種類 x座標 y座標 スピード 発射時間 弾幕種類 弾の色 体力 アイテム1 2 3 4 5 6 弾種類 待機時間
csvのエクセルデータはカンマで区切られているため、簡単にデータがとり出せます。
一番上の行をノンスクロールにして、xlsデータファイルから読み込めば一番いいのでしょうが、読み込み方がよくわからなかったので・・cvsにしました。
すらっすのある行は読み飛ばします。


ところで、ステージの作り方ですが、
基本的に全て多次元配列で作っています。
例えば、関数ポインタなどで、
49番の弾幕
void bullet49();
を呼び出すとき、bulletという関数ポインタを使って呼び出すなら

・配列に関数のアドレスが最初から順番に入っていること
・boss.bullet_kndはボスの弾幕の番号が入っていること
を想定


bullet[boss.bullet_knd]();

このようにかけますよね。しかしこれでは、どの面の弾幕かわからない・・。
そこで、ステージはもう一つ上の配列に入れて、

bullet[stage][boss.bullet_knd]();

とすればいいです。しかし、これでは難易度の区別が出来ない・・そこで

bullet[level][stage][boss.bullet_knd]();

このようにしてやれば、どうでしょうか。
ゲームのレベルが4種類、ステージが6種類、弾幕の種類が20種類あるなら

void (*boss[4][6][20])(void) ;

で用意してやればいいはずです。


方法は沢山あるでしょうし、別にこれでなくてもいいはずです。
ゲームのステージごとに、データをとってきてもいいでしょうし、
レベルごとにとってきてもいいでしょう。
そうすれば一次元配列でいいでしょうし、
データは全て外部にしておいた方が汎用性が高いでしょう。
プログラムはもっぱらシステムだけ。
どのような振る舞いをするかは全て外部データに依存する。としたほうが綺麗かもしれません。

色々書きましたが、ご参考程度に。


923ポイント を落としてしまった。

Name: やそ  ..上級者(22,199ポイント)   Date: 2008/02/07(木) 14:35   No:14101     
Title: Re:ステージの作り方。    
管理人さん、お疲れ様です。

>最適な書き方より、とにかく難しくないコードで書こうとして出来たものです。
>なので、本来の効率的なかき方とは全然違うのです。

>そのせいで、色々な人から質問が来てしまい、私のせいで、いろんな人を混乱させてしまったようです・・;
>シューティングの館は近々削除予定です。

とありますが、コレはコレで十分役立っています。
リニューアルした後も、旧館として残して欲しいです^^

あまり効率に傾きすぎると、(私を含めた)初心者はロジックを追うのが大変なのですよ((((((^_^;)


143ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(509,591ポイント)   Date: 2008/02/07(木) 14:51   No:14102     
Title: Re:ステージの作り方。    


う〜ん、掲示板が下手に高機能なせいで、csvファイルがエクセルデータだと認識されて勝手にxlsファイルに変更されてしまいます;
.txtファイルにしてアップロードしましたので、ダウンロードした後で、拡張子を.csvに変更してお開き下さい。

>とありますが、コレはコレで十分役立っています。

ありがとうございます。そういっていただけると幸いです。
ただ・・本腰いれて製作されていらっしゃる方から、「これ以上拡張するのが困難になってきた。どうしたらいのでしょう」という相談が
メールで多々寄せられるのでここまで作っていらっしゃるのに、今更「全面的に変えてください」とも言いづらく
非常にもったいないので・・。

>リニューアルした後も、旧館として残して欲しいです^^

そうですね。
そういえばこんなショウモナイ館もあったな・・といういい思い出になるかも・・。

現在のFLASH映像は非常にカクカクしているので、全部とり直そうと思っています。
しかし、いまだにflvファイルの自動再生の仕方がわからないので、ActionScriptを勉強しなければ・・と思っています。
将来的にはRPGの館、サウンドノベルの館、格闘の館、パズルの館・・・など等一通りのゲームの館で埋め尽くせたらなと思っていますが、はたしていつになることやら^^;

一つの館をどこまで作るかなんですよねぇ・・。ミニゲームみたいなものならサクサク作っていけるでしょうが、
龍神録が出来るまで・・みたいな館だと、あのペースでは「第200章」とかまで必要になるかもしれませんし、そうすると中々・・。


515ポイント を手に入れた。

Name: クロカモ  ..入門者(2,620ポイント)   Date: 2008/02/07(木) 21:34   No:14119     
Title: Re:ステージの作り方。    
 返答ありがとうございます。

 そして、自分の返答が遅くて申し訳ないです。

 なるほど、やっぱり四聖龍神録(体験版)のプログラムとシューティング館のソースコードは根本的に違いましたか。

 えっとステージの作り方は管理人さんの場合csvデータを読み込んでそこに書いてある記述どおりに敵を表示させているのですか…なるほど確かにこれならcase文での記述と違って敵を新しく追加表示させる時に楽ですね。

 いや、やっぱり自分一人で延々と悩んでたのですが一発で解決とまではまだ行ってませんが先が見えてきました。

 csvデータファイルの読み込みに必要な関数はやっぱりDXライブラリの中に入っている『FileRead_open』関数を使うのですかね?

 読み込んだファイルをどう処理して敵の持っている情報と合致させるかっていうのが自分には良くわかりません。

 質問ばっかりで申し訳ないのですがそこを教えていただけると幸いです。

 あと、管理人さんの場合xlsファイルでそれを書いているとの事でしたがtxtファイルで書くよりxlsファイルで書いておいた方が便利なのですかね?
 自分には一々区分けされていないtxtファイルの方が文章全体を見渡せて分かりやすいと思ってしまうのですが。

 なんだか生意気な事言っているように思われた方本当に申し訳ないです。

>そのせいで、色々な人から質問が来てしまい、私のせいで、いろんな人を混乱させてしまったようです・・;
>シューティングの館は近々削除予定です。

 他の方の事までは分かりませんが混乱してるのは自分の勉強不足です。
 自分もシューティングの館は存続して頂いた方が嬉しいです自分で言うのもなんですがこのシューティングの館を拝見させて頂いてかC++の理解力が上がりましたから初心者にはむしろ最適なLVかと。
 未完成の方が逆に質問意欲や自分で考える力もつくかもしれませんし。

>龍神録が完成したらシューティングの館をもっときちんとしたコードに書き直す予定です。

 首を長くして待ってます!と言いますか切望してますw
 
>龍神録が出来るまで・・みたいな館だと、あのペースでは「第200章」とかまで必要になるかもしれませんし、そうすると中々・・。

 200章ですか流石に長いですね自分勝手な意見で申し訳ないのですが竜神録のソースコードを是非とも拝見してみたいです。
 知的好奇心が凄いそそられます。多分今の自分の理解力だとコード全体の半分も理解できないとは思いますがそれはそれで一日中でもソースコードとにらめっこするとっても楽しい時間になりそうですしw

 これはクロカモ自信の解釈なのですが管理人さんが書いた弾幕のソースコードって凄く綺麗なんですよねあれは見てるだけで楽しいっす計算方法もクロカモが考えてもなかなか思いつかないようなものが盛り沢山ですし。

 竜神録のステージ1のボスが使用するスペルカード付きの弾幕なんてどういったコードなのか考えながら避けて何度死んでしまった事かw

 管理人さんのプロフィールで紹介されていた東方ですが凄いですね…東方をお作りになったZUNさんはやはり天才なのですかね…自分とは住んでる世界がまったく違うんじゃないかと思ってしまうほどです。

 長々とすみません…なんだか『質問』なのか『雑談』なのか分からなくなってしまいましたがこれからもよろしくお願いします。


2倍のポイントを手に入れた! 2,178ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(512,901ポイント)   Date: 2008/02/09(土) 05:11   No:14134     
Title: Re:ステージの作り方。    
今ネット料金未払いで解約されてしまったので、家からネットに繋がらず、お返事遅くなってすみません(_ _|||)
これだけネットを使ってると1ヶ月ネットが使えないだけでホントに不便で仕方ないです・・・。

txtファイルでもいいんですが、エクセルだと、パターンのあるデータが作りやすいと思ったんですよ。
例えば、シーン1で、
10
20
30
40
50
60
70
80
100
なんて、等間隔で出現するとき、データ作るときに、いちいち上記のように手打ちしないといけないじゃないですか。
でも、エクセルなら、
10
20
だけ書いてピーーと引っ張ったら100まで自動で作れますよね。
しかも、
「あ、シーン3とシーン4の間に他のシーンを入れないといけなかった」とかってとき、
txtファイルだと全部の出現カウンタの時間をずらさないといけませんけど、エクセルデータなら、「前のカウンタ+X」としておけば、全自動で計算しなおしてくれるので、かなり便利です。
上に書いた10個位なら「手打ちで直せばいいじゃん」と思うかもしれませんが、それが数百、数千という数になってくると、結構ありがたくなるんですよね。
そして、xlsデータはスクロール固定行って作れるので、
「あれ、この行に書いてるデータ何のデータだっけ?」と思っても、列の上にデータの種類が表示されるので、わかりやすいんです。
・・とまぁ色々理由があってエクセルデータを使っています。
世間でどういう方法が主流なのかわかりませんが、とりあえず私はこうする・・というだけですので、クロカモさんの好きな方法でやっていただいたらいいと思いますよ。

取り込む方法は簡単です。
fopen関数でファイルを開き、fpのデータからカンマで区切られている文字列データを取ってきます。
文字列データをatoiで数値データに変換して、敵出現データに格納する。
それだけです。

後は現在のカウンタが出現カウンタと同じになった時、格納した敵の種類を出現させればいいということです。

ちなみに、うちのサイトには全くC++の書き方がしてありません。純粋なCです。
(宣言を途中でやったり、C++のコンパイラじゃないと通らない記述はありますが)

>竜神録のステージ1のボスが使用するスペルカード付きの弾幕なんてどういったコードなのか考えながら避けて何度死んでしまった事かw

結構複雑なコードを想像されていらっしゃるのかもしれませんが、
ここまで沢山作らないといけなくなると「プログラム的作成ツールモドキ」みたいなものを作ってからじゃないと中々管理しにくいので、それで作っていますからコード自体は簡単です。
(私の場合は作成モジュールとでもいいますか・・)
本格RPGとかを作るときだって、プログラマー達はきっとマップ作成ツールやいろんなツールを事前に作ってから作成を開始すると思います(知りませんが(汗)

小さなゲームを作るときは、そんなツールを作る方が面倒ですが、少し大きくなってくると作成ツールモドキを作ってから作る方が簡単になりますので。

龍神録の場合、そんな立派なものじゃなく、単に変数に値を代入したらその通り動いてくれるだけです。
変数に値を代入するだけで、その通りの動きをしてくれるようにプログラムを作っておけば、弾幕を作るとき、変数に値を代入するだけでよくなります。
・・・と文字で言ってもわかりにくいので、プログラムの一部をお見せするとこんな感じです。

261番目のボスの弾幕が、角度等間隔で30種類の方向に飛んでいく弾幕だったとします。
400カウントに1回発射します。
vxとvyはspdとangleから自動で計算されます。



#define TM261 400
void BossShotBulletNormal261(int n){
int i,t=boss_shot[n].cnt%TM261;
double base_angle=bossatan2();//敵と自機の角度を計算して返す関数
if(t==0){
for(i=0;i<30;i++){
if((k=serch(n))!=-1){
boss_shot[n].bullet[k].col = 6; //弾の色
boss_shot[n].bullet[k].x = enemy[shot[n].num].x;//初期弾x座標
boss_shot[n].bullet[k].y = enemy[shot[n].num].y;//初期弾y座標
boss_shot[n].bullet[k].angle = base_angle+PI2/30*i; //発射角度
boss_shot[n].bullet[k].knd = 1; //弾の種類
boss_shot[n].bullet[k].flag = 1; //弾の表示フラグ
boss_shot[n].bullet[k].cnt = 0; //カウンタ
boss_shot[n].bullet[k].graze = 1; //グレイズをいくつまでカウントするか
boss_shot[n].bullet[k].spd = 3; //弾の発射スピード
boss_shot[n].bullet[k].pattern= 0; //弾の起動パターン
boss_shot[n].bullet[k].state = 0; //弾のステータス
boss_shot[n].bullet[k].vx = 0; //弾の速度x成分
boss_shot[n].bullet[k].vy = 0; //弾の速度y成分
boss_shot[n].bullet[k].ax = 0; //弾の加速度x成分
boss_shot[n].bullet[k].ay = 0; //弾の加速度y成分
}
}
sound_se_flag[17]=1; //17番の音を鳴らすフラグを立てる
}
}


 
このように弾幕データをいれるだけでその弾幕になります。
またまた果たしてこんなコードでいいのかどうか疑問です…、あくまで我流だと言うことをお忘れなく・・。
私の書くコードは無駄に長いので読んでると長期休暇すらなくなってしまうでしょう^^;
今の時点で・・6万行位かな?と思います。(ファイル分割してるので行数はわかりませんが)

>自分とは住んでる世界がまったく違うんじゃないかと思ってしまうほどです

多分半年後にもう一度ご覧になったら何でそんなことを言っていたんだろうとお思いになると思いますよ^^;
というのも、私がC言語を勉強しだしてまだ2年弱なので。まだまだ全くの初心者です。
まず私がこのような質問サイトを作れるような人間じゃないのですが、Cについて、雑談交じりに気軽に話せる掲示板無いな〜と思って作った何とも適当なサイトです(_ _|||)
元々意見交流や雑談目的で作った掲示板ですので、雑談でもお構いなくどうぞ〜♪


2,355ポイント を手に入れた。

Name: クロカモ  ..入門者(3,705ポイント)   Date: 2008/02/09(土) 11:47   No:14138     
Title: Re:ステージの作り方。    
 ネット環境に一回どっぷりと浸かってしまったらたとえ1ヶ月でもそこから離れるのは凄い面倒といいますか苦痛といいますかなんとも言葉に出来ないような状況ですね。

 自分も今ネット出来なくなってしまったら苦労しそうです。

 なるほど、エクセルには計算機能が付属してますしそれを利用しない手はないですよねぇ。

>fopen関数でファイルを開き、fpのデータからカンマで区切られている文字列データを取ってきます。
>文字列データをatoiで数値データに変換して、敵出現データに格納する。
>後は現在のカウンタが出現カウンタと同じになった時、格納した敵の種類を出現させればいいということです。

 むむむ…難しい一番最初斜め読みで文章を読んで思わず頭の中に浮かんだ言葉が『そーなのかー』でした。
 ルーミアと一緒に自分の思考まで真っ黒になりそうです。
 いまいち理解できない自分がいます…色々試してみようと思いますがこの部分の説明をもっと詳しくしていただけると幸いです。
 具体的なソースもあれば是非。すみませんなんか図々しくなってしまって。

>ここまで沢山作らないといけなくなると「プログラム的作成ツールモドキ」みたいなものを作ってからじゃな>いと中々管理しにくいので、それで作っていますからコード自体は簡単です。
>(私の場合は作成モジュールとでもいいますか・・)

 ゲームを一つ作るのにそのゲームの一要素を作るのを助けるツールをまた別に作るなんて…まさにプロの仕事ですね。
 さらには、モジュールまで作ってしまうなんて…まったくもって凄すぎです。

>261番目のボスの弾幕が、角度等間隔で30種類の方向に飛んでいく弾幕だったとします。
>400カウントに1回発射します。

 さて、どれくらいの密度の弾幕なのか具体的な数字を知って弾幕を避けるとこれまた具体的な数字で自分の実力が分かりそうですねw
 角度等間隔で25種類500カウントづつでの弾幕なら80%以上の確立で避けられるとかw

>今の時点で・・6万行位かな?と思います。(ファイル分割してるので行数はわかりませんが)

 ( ゜д゜)ポカーン…すみません馬鹿にしてんじゃないんです驚きすぎて言葉が…そかぁ、やっぱりあれぐらい高いクオリティのシューティングだと平気でそれぐらいいくんですね。

>多分半年後にもう一度ご覧になったら何でそんなことを言っていたんだろうとお思いになると思いますよ^^;
>というのも、私がC言語を勉強しだしてまだ2年弱なので。まだまだ全くの初心者です。

 半年後には本当に言えるようになるといいなぁ…そして2年弱でここまで凄いLVに到達した管理人さんの凄さにまたまた脱帽。

>元々意見交流や雑談目的で作った掲示板ですので、雑談でもお構いなくどうぞ〜♪

 うぃ、雑談、質問、意見交流など色々と使わせていただきます。


1,085ポイント を手に入れた。

Name: 管理人  ..伝説のハッカー(513,559ポイント)   Date: 2008/02/09(土) 17:48   No:14142     
Title: Re:ステージの作り方。    
現在携帯からなので、コードが書けませんが
fopenで開き
fgetcで一文字ずつ配列に格納します。カンマか改行ならそこに終端記号を書いて終了し、
atoiで数値に変換して代入します。代入しおわったらまた同じ事をEOFになるまで繰り返したらいいだけです。


83ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..熟練のプログラマー(56,572ポイント)   Date: 2008/02/10(日) 12:52   No:14151     
Title: Re:ステージの作り方。    
もう2日はパソコンしてない状態です。やっと入試終わったー

で、本題ですが、CSVの読み込みに使える関数として、strtokがあります。どうせならfgetcでちまちまやるよりもfgetsで読み込んでしまいましょう。

#include<stdio.h>
#include<string.h>

int main(void){
FILE *file;
int data;
char string[1000],*p;
file=fopen("data.csv","r");
if(file==NULL)return -1;
while(fgets(string,sizeof(string),file)!=NULL){
while((p=strtok(string,",\n"))!=NULL){
data=atoi(p);
printf("%d%%",data);
}
putc('\n');
}
fclose(file);
return 0;
}

CSVの内容を%で区切って表示するプログラムです。でも意味なさそうです。


203ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(517,454ポイント)   Date: 2008/02/13(水) 09:45   No:14243     
Title: Re:ステージの作り方。    

↑.xlsファイルを.csvファイルに拡張子をかえて、
プロジェクトのあるフォルダに保存して実行してください。

こちらにサンプルを書いておきます。
csvファイルから情報を読み込み、ベクターに登録し、
敵をその情報に従って動かすプログラムのサンプルです。

若干15分で作ったようなプログラムなので、間違ってる可能性ありますが・・。


#include "DxLib.h"
#include <vector>
#include <math.h>
using namespace std;

#define PI 3.1415926

struct order_t{
int count;
double x,y,spd;
};
vector< order_t > vOrder;

struct enemy_t{
int flag;
double x,y,spd,angle;
};
vector< enemy_t > vEnemy;

int count;
char Key[256];

//出現情報をロード
#define STR_MAX 64
int order_load(){
FILE *fp;
int str,flag,i,t;
char st[STR_MAX];
struct order_t order;

if((fp = fopen("dat.csv", "r")) == NULL )//ファイルを開く
return -1;

flag = t = 0;

while(flag==0){
for(i=0;i<STR_MAX-1;i++){
str=fgetc(fp);
if(str==EOF){//ファイルの終端EOF(-1)なら
flag=1;//終了フラグ
t=-1;//格納しない
break;
}
else{
st[i]=str;
if(st[i]==',' || st[i]=='\n'){
st[i]='\0';
break;
}
}
}
switch(t){//ファイルに書いてある順番に格納
case 0:
order.count=atoi(st);//int変換
break;
case 1:
order.x=atoi(st);
break;
case 2:
order.y=atoi(st);
break;
case 3:
order.spd=atof(st);//double変換
break;
default:
break;
}
t++;
if(t>3){//1行分読み込み終わったら
vOrder.push_back(order);//ベクターの最後に追加
t=0;
}
}
fclose(fp);
return 0;
}

//敵を出現させる
void enter_enemy(){
unsigned int i;
struct enemy_t Enemy;
for(i=0;i<vOrder.size();i++){
if(vOrder[i].count==count){
Enemy.flag =1;
Enemy.x =vOrder[i].x;
Enemy.y =vOrder[i].y;
Enemy.spd =vOrder[i].spd;
Enemy.angle =PI/2;
vEnemy.push_back(Enemy);
}
}
}

//敵の座標を計算
void calc_enemy_point(){
unsigned int i;
for(i=0;i<vEnemy.size();i++){
if(vEnemy[i].flag==1){//表示中の敵がいたら
vEnemy[i].x+=cos(vEnemy[i].angle)*vEnemy[i].spd;
vEnemy[i].y+=sin(vEnemy[i].angle)*vEnemy[i].spd;
if(vEnemy[i].y>480)//画面外になったら
vEnemy[i].flag=0;
}
}
}

//敵を描画
void graph_enemy(){
unsigned int i;
for(i=0;i<vEnemy.size();i++){
if(vEnemy[i].flag==1){//表示中の敵がいたら
DrawCircle( (int)vEnemy[i].x, (int)vEnemy[i].y, 10, 0xffffff, TRUE );//白い円で描画
}
}
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK ||
DxLib_Init() == -1 ) return -1; //初期化処理
SetDrawScreen( DX_SCREEN_BACK );

order_load();//敵の出現情報をロード

while(!ProcessMessage() && !ClearDrawScreen() &&
!GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
enter_enemy(); //敵を登録
calc_enemy_point();//敵の座標を計算
graph_enemy(); //敵を描画

ScreenFlip();
count++;
}

DxLib_End();
return 0;
}


2倍のポイントを手に入れた! 2,046ポイント を手に入れた。



Name: kazaoni  ..ぴよぴよ(32ポイント)   Date: 2008/02/11(月) 18:40   No:14187       
Title: 配列文字型の初期化について    
たびたびすみません。質問です。

配列の初期化についてなんですが、たとえば10×10個の配列にあらかじめaと入れておきたい場合、

for(k=0;k<=9;k++)
{
for(l=0;l<=9;l++)
{
hairetsu[k][l]='a';
}
}
とやるしかないのでしょうか?


32ポイント を手に入れた。


Name: 管理人 [URL]  ..伝説のハッカー(514,268ポイント)   Date: 2008/02/11(月) 19:55   No:14191     
Title: Re:配列文字型の初期化について    
memset関数を使ってください。

http://www9.plala.or.jp/sgwr-t/lib/memset.html


26ポイント を手に入れた。

Name: 組木紙織  ..プログラマー(35,332ポイント)   Date: 2008/02/11(月) 20:04   No:14192     
Title: Re:配列文字型の初期化について    
こんな方法もあります。

char a[2][2] ={
{'a','a'},
{'a','a'}
       };


39ポイント を手に入れた。

Name: たかぎ [URL]  ..プログラマー(29,531ポイント)   Date: 2008/02/11(月) 20:19   No:14193     
Title: Re:配列文字型の初期化について    
GCCだと
char array[10][10] =

{
[0 ... 9] = { [0 ... 9] = 'a' }
};


といった初期かも可能です。


39ポイント を手に入れた。

Name: kazuoni  ..ぴよぴよ(371ポイント)   Date: 2008/02/11(月) 20:20   No:14194     
Title: Re:配列文字型の初期化について    
> memset関数を使ってください。

main(void)
{
char hairetsu[10][10];
int i,j,k,l,m,n;
memset(hairetsu, '*', 100);
printf("%s",hairetsu);

}
こんな感じでしょうか?(初期化したのを出力してみました。)出力結果は確かに100個「*」がありましたが、その後に文字化けがあるのですが・・・??大丈夫なんでしょうか?



78ポイント を手に入れた。

Name: kazuoni  ..ぴよぴよ(480ポイント)   Date: 2008/02/11(月) 20:29   No:14195     
Title: Re:配列文字型の初期化について    
> こんな方法もあります。
>

> char a[2][2] ={
> {'a','a'},
> {'a','a'}
>        };
>

組木紙織さん
ご回答ありがとうございます。それは自分も考えたのですが・・・・80×80だとかなり記述が面倒だと判断しました。

たかぎさん
ご回答ありがとうございます。visual c++では対応してないんですよね?lnuxでは対応してるんでしょうか?(初歩的な質問で申し訳ありません。。)


109ポイント を手に入れた。

Name: box  ..ハッカー(106,852ポイント)   Date: 2008/02/11(月) 20:51   No:14197     
Title: Re:配列文字型の初期化について    

> memset(hairetsu, '*', 100);

で、hairetsu[]は正しく初期化できています。
それよりも、hairetsu[]の内容を

> printf("%s",hairetsu);

で出力することに問題があります。
この記述では、hairetsu[]の先頭アドレスから始まって
たまたま'\0'が見つかるまで、のべつまくなしに(仮にhairetsuの領域を超えても)
出力しようとします。


129ポイント を手に入れた。

Name: 管理人  ..伝説のハッカー(514,318ポイント)   Date: 2008/02/11(月) 20:57   No:14198     
Title: Re:配列文字型の初期化について    
携帯から書いているので詳しく書けませんが、
文字列として扱うなら最後に終端記号をいれる必要があります。
文字列や終端記号というキーワードで調べてみてください。


50ポイント を手に入れた。

Name: たかぎ [URL]  ..プログラマー(29,606ポイント)   Date: 2008/02/11(月) 21:59   No:14201     
Title: Re:配列文字型の初期化について    
> lnuxでは対応してるんでしょうか?

Linux でしょうか?(揚げ足を取る気はないのですが、念のため)
Linux の場合、GCCを使うのであれば、
char array[10][10] =

{
[0 ... 9] = { [0 ... 9] = 'a' }
};


と書けます。


75ポイント を手に入れた。

Name: kazuoni  ..ぴよぴよ(610ポイント)   Date: 2008/02/11(月) 22:37   No:14203     
Title: Re:配列文字型の初期化について    

> それよりも、hairetsu[]の内容を
>
> > printf("%s",hairetsu);
>
> で出力することに問題があります。
> この記述では、hairetsu[]の先頭アドレスから始まって
> たまたま'\0'が見つかるまで、のべつまくなしに(仮にhairetsuの領域を超えても)
> 出力しようとします。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>

main(void)

{
char hairetsu[10][10];
int m,n;
memset(hairetsu, '*', 100);
for(m=0;m<=9;m++)
{
for(n=0;n<=9;n++)
{
printf("%s",hairetsu[m][n]);
}
}
return 0;
}
これではだめでしょうか・・・??




130ポイント を手に入れた。

Name: 組木紙織  ..プログラマー(35,481ポイント)   Date: 2008/02/11(月) 22:47   No:14205     
Title: Re:配列文字型の初期化について    
結論から言うとだめです。
なぜなら%sは"文字列"を指定しているので"文字"を指定するのは"%c"を使わないといけないです。

ということですが、
一番気になるのは、なぜhairetsu[10][10]の全ての要素を'a'で初期化
する必要があるのか?ということです。

その理由が分かれば別の視点からのコメントもあるかもしれません。


94ポイント を手に入れた。

Name: kazuoni  ..ぴよぴよ(781ポイント)   Date: 2008/02/11(月) 23:31   No:14208     
Title: Re:配列文字型の初期化について    
> 結論から言うとだめです。
> なぜなら%sは"文字列"を指定しているので"文字"を指定するのは"%c"を使わないといけないです。
>
本当にありがとうございます!やっとできました。。


> 一番気になるのは、なぜhairetsu[10][10]の全ての要素を'a'で初期化
> する必要があるのか?ということです。
>

実はグラフの出力を考えていて、それを配列でやろうかと考えていて。。ランダムに原点からx軸y軸に1ずつ進んでいくんです。(もちろんすべての象限を考えます。)そのとき通った格子点のグラフ表示なんです。
自分が考えたのは、ある一定の数の縦と横を二次元配列で枠を造り、あらかじめある文字(空白がいれれたら最高なんですが・・・)を代入しておきます。ランダムで出た格子点にあたる配列の箱に別の文字を代入します。あとはそのまま配列をすべて表示させたらうまいことグラフが出るのではないのかなぁってな感じなんですが。。あ、そんな馬鹿でかいものは作りません。リナックスのターミナルの画面が横144字だったんで、原点から72の縦横を考えることにしてます。




171ポイント を手に入れた。

Name: hoge  ..かけだし(1,819ポイント)   Date: 2008/02/12(火) 02:12   No:14211     
Title: Re:配列文字型の初期化について    
GCCだとこうも書けます。

char array[10][10] = {
[0 ... 9][0 ... 9] = 'a'
};




56ポイント を手に入れた。

Name: kazuoni  ..ぴよぴよ(836ポイント)   Date: 2008/02/12(火) 12:39   No:14219 解決!     
Title: Re:配列文字型の初期化について    
回答していただいたみなさん、本当にご丁寧にありがとうございました。文字列の初期化は解決しました。
本当にありがとうございました。


55ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(515,188ポイント)   Date: 2008/02/12(火) 18:14   No:14228     
Title: Re:配列文字型の初期化について    
%sを用いれば\0がみつかるまでの表示を行ってくれますから


#include<stdio.h>
#include<string.h>

int main(){
char hairetsu[10][10];
int i;
memset(hairetsu, '*', 100);
for(i=0;i<10;i++)
hairetsu[i][9]='\0';
for(i=0;i<10;i++)
printf("%s\n",hairetsu[i]);
return 0;
}

 
これなら%sで表示できます。
%sで表示するときは引数は配列の先頭アドレスでなければなりません。


31ポイント を手に入れた。



Name: <kor  ..かけだし(1,647ポイント)   Date: 2008/02/11(月) 18:47   No:14188       
Title: 34章のメイン関数をアレンジしたのですが…    
ゲームプログラミングの館の34章、メイン関数の書き方をアレンジしてムービー&ミュージックプレイヤーを作ろうと思ってとりあえず単純に[オープニング⇒リスト⇒再生⇒終了]という感じなものを作ろうと思いソースを書いてみたのですが、
『構文エラー : ')' が、識別子 'function_status' の前に必要です』
という感じのエラーが出てできません。このソースのどこがいけないのでしょうか?どうかよろしくお願いします。
↓main.cpp↓
#include "DxLib.h"

int function_status=0,White;
char KeyBuf[ 256 ] ;

void Opening(){
DrawString(400,300,"迷宮再生録(Zを押してください)",White);
if(KeyBuf[KEY_INPUT_Z]==1)
function_status=1;
}

void Menu(){
DrawString(400,300,"PLAY→sweets time(Xを押してください)",White);
if(KeyBuf[KEY_INPUT_X]==1
function_status=2;
}

void Play(){
PlayMovie( "img/test.wmv" , 1 , DX_MOVIEPLAYTYPE_BCANCEL ) ;
if(KeyBuf[KEY_INPUT_C]==1
function_status=3;
}

void Ending(){
DrawString(100,260,"エンディング画面 (bをプッシュ)",White);
if(KeyBuf[KEY_INPUT_B]==1)
function_status=4;
}




int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; //ウィンドウモードに変更
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了

White = GetColor( 255 , 255 , 255 ) ; //色の取得

SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先を裏画面に設定

while( 1 ){
ClearDrawScreen(); // 裏画面のデータを全て削除
GetHitKeyStateAll( KeyBuf ) ; // すべてのキーの状態を得る

switch(function_status){
case 0:
Opening();
break;
case 1:
Menu();
break;
case 2:
Play();
break;
case 3:
Ending();
break;
default:
DxLib_End() ; // DXライブラリ使用の終了処理
return 0;
break;
}

if( ProcessMessage() == -1 ) break ; //エラーが起きたら終了

ScreenFlip() ; // 裏画面データを表画面へ反映
}

DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}


1,328ポイント を手に入れた。


Name: 組木紙織  ..プログラマー(35,167ポイント)   Date: 2008/02/11(月) 19:10   No:14189     
Title: Re:34章のメイン関数をアレンジしたのですが…    
>if(KeyBuf[KEY_INPUT_X]==1
>function_status=2;
>}

ここのところですか?

if(KeyBuf[KEY_INPUT_X]==1 )//ここの終わりの括弧を忘れています。
function_status=2;
}


74ポイント を手に入れた。

Name: <kor  ..かけだし(1,677ポイント)   Date: 2008/02/12(火) 18:06   No:14226 解決!     
Title: Re:34章のメイン関数をアレンジしたのですが…    
あっ本当だ…
ありがとうございます。無事実行できました。
うっかりものですいません<(_ _)>


30ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(515,157ポイント)   Date: 2008/02/12(火) 18:11   No:14227     
Title: Re:34章のメイン関数をアレンジしたのですが…    
コンパイラはわかりませんが、VSとかでしたら
「構文エラー : ')' が、識別子 'function_status' の前に必要です」
というエラーメッセージをダブルクリックしたらその行が確認できると思います。
コマンドプロンプトでもエラーが起きた行数が書いてあるのではないでしょうか。


54ポイント を手に入れた。



Name: こうへい  ..ぴよぴよ(190ポイント)   Date: 2008/02/11(月) 21:48   No:14200       
Title: 市販のゲーム機で・・・    
ゲームプログラミングの館を参考にして
RPGを作りたいのですが
市販のゲーム機で動かすには、どうすればいいですか?
PSPとかPS2とかDSとかです。
開発環境(100万円位)を買わなくても、作れると聞いたのですが・・・

よろしくお願いします。


124ポイント を手に入れた。


Name: YuO  ..上級者(17,960ポイント)   Date: 2008/02/11(月) 22:37   No:14204     
Title: Re:市販のゲーム機で・・・    
ホビーユーザー向けに開発環境を提供しているのは,Microsoftだけだと思います。
他に,サードパーティ製の開発環境がある場合もありますが,ハードウェア提供会社が正式に認めたものではないと思います。
http://www.microsoft.com/japan/msdn/xna/


87ポイント を手に入れた。

Name: たかぎ [URL]  ..プログラマー(29,720ポイント)   Date: 2008/02/11(月) 23:02   No:14206     
Title: Re:市販のゲーム機で・・・    
海賊製品の作り方を指南するわけにはいきませんので...

正攻法からすれば、SCEなり任天堂なりに問い合わせるのが一番です。
アンダーグラウンドな方法を知りたいのであれば、自分で調べて、自分の責任で行ってください。


2倍のポイントを手に入れた! 114ポイント を手に入れた。

Name: Justy  ..ハッカー(173,979ポイント)   Date: 2008/02/11(月) 23:04   No:14207     
Title: Re:市販のゲーム機で・・・    
 PS2のは開発環境、というか Linuxがソニーから販売されていましたね、昔。
 開発者が使うマニュアルとほぼ同じものが提供されていました。

 Linux上で、MESA(OpenGL)か、GSパケットを直接生成するか、のどちらかで
画面に描画できるようになっていました。

Linux (for PlayStation 2) Release 1.0 Official Home Page
http://www.ps2linux.com/


144ポイント を落としてしまった。

Name: GPGA  ..熟練のプログラマー(42,249ポイント)   Date: 2008/02/12(火) 08:04   No:14214     
Title: Re:市販のゲーム機で・・・    
XBOX360でしたら年間9800円でXNAクリエイターズクラブに加入すれば
XNA Game Studio Expressで作成することができます。


28ポイント を手に入れた。

Name: バグ  ..比類無きプログラマー(74,780ポイント)   Date: 2008/02/12(火) 08:43   No:14215     
Title: Re:市販のゲーム機で・・・    
変り種としては…

http://www.artdink.co.jp/japanese/title/bs/

http://ja.wikipedia.org/wiki/GAME_BASIC_for_SEGASATURN

http://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%83%9F%E3%83%AA%E3%83%BC%E3%83%99%E3%83%BC%E3%82%B7%E3%83%83%E3%82%AF


こんなのもあります。入手は困難かもしれませんけど…(^_^;)


90ポイント を手に入れた。



Name: ワグナス  ..ぴよぴよ(324ポイント)   Date: 2008/02/11(月) 06:26   No:14177       
Title: 文字列から全ての単語を取得    
char型の配列(の配列)に入っている文字列から全ての単語を取り出す方法について考えております。

#include <stdio.h>

int main(void){
char str[4][64] = {
"This is a pen",
"I am student",
"What is it",
"May I help you",
};
char ary[30][16];
return 0;
}

このように str に文字列が入っているとき、C言語で単語を ary に格納することはできるのでしょうか?(配列の大きさは適当です)
string風に書くと、
ary[0] = "This";
ary[1] = "is";
ary[2] = "a";
ary[3] = "pen";
ary[4] = "I";
ary[5] = "am";
...
のようになることが理想なのですが、スマートな方法はあるのでしょうか?
sscanfでできないかと思ったのですが、istrstreamのように読み込み位置(シーク位置)を記憶できないのでよい方法が思いつきませんでした。

これについて何かよい方法があればご教示頂きたく思います。
宜しくお願いします。


324ポイント を手に入れた。


Name: tkmakwins15 [URL]  ..熟練のプログラマー(56,604ポイント)   Date: 2008/02/11(月) 06:40   No:14178     
Title: Re:文字列から全ての単語を取得    
strtok関数を使うとか。ぐらいしか思いつきません。

2倍のポイントを手に入れた! 32ポイント を手に入れた。

Name:    ..ぴよぴよ(332ポイント)   Date: 2008/02/11(月) 07:54   No:14180     
Title: Re:文字列から全ての単語を取得    

#include <stdio.h>
#include <string.h>

int main(void){
char str[4][64] = {
"This is a pen",
"I am student",
"What is it",
"May I help you",
};
char ary[30][16];
char *token, *dlm = " ";
int i, j;

for (i = j = 0; i < sizeof(str) / sizeof(str[0]); i++) {
token = strtok(str[i], dlm);
while (token) {
strcpy(ary[j++], token);
token = strtok(NULL, dlm);
}
}

for (i = 0; i < j; i++)
printf("%s\n", ary[i]);
return 0;
}



199ポイント を手に入れた。

Name: フリオ  ..上級者(21,783ポイント)   Date: 2008/02/11(月) 09:55   No:14183     
Title: Re:文字列から全ての単語を取得    
 
 スマートかどうか解りませんが、こんな方法はどうでしょう。


#include <stdio.h>
#include <string.h>

int main(void)
{
char str[4][64] = {
"This is a pen",
"I am student",
"What is it",
"May I help you",
};
char ary[30][16];
int i, j, k;

for(j = i = 0; i < 4; i ++){
k = 0;
ary[j][0] = '\0';
do{
sscanf(&str[i][k], "%s", ary[j]);
k += strlen(ary[j]);
j ++;
}while(str[i][k ++]);
}
for(i = 0; i < j; i ++) puts(ary[i]);
return 0;
}


255ポイント を手に入れた。

Name: Justy  ..ハッカー(174,082ポイント)   Date: 2008/02/11(月) 11:54   No:14184     
Title: Re:文字列から全ての単語を取得    
> istrstreamのように読み込み位置(シーク位置)を記憶できないのでよい方法が思いつきませんでした。
 読み込み位置というかどこまで読んだかは %nで取得できますよ。

    int n, count = 0;

for(n=0; n<sizeof(str)/sizeof(str[0]); ++n){
const char *p = &str[n][0];
do{
int pos;
if(sscanf(p, " %s %n", ary[count++], &pos) == 1)
p += pos;
}while(*p != '\0');
}


236ポイント を手に入れた。

Name: たかぎ [URL]  ..プログラマー(29,492ポイント)   Date: 2008/02/11(月) 17:17   No:14185     
Title: Re:文字列から全ての単語を取得    
strpbrk とか strcspn を使うのも一つの手です。
その場合、おそらく strspn も組み合わせる必要があるでしょう。



4ポイント を手に入れた。

Name: ワグナス  ..ぴよぴよ(427ポイント)   Date: 2008/02/12(火) 03:08   No:14212 解決!     
Title: Re:文字列から全ての単語を取得    
ご回答いただきありがとうございます。
みなさまのコードを例示していただき参考になりました。
これに関しての有用な関数やアプローチを複数拝見でき、手法をより明確に認識することができました。

ありがとうございました。


103ポイント を手に入れた。



Name: AAA  ..かけだし(1,256ポイント)   Date: 2008/02/12(火) 00:41   No:14210       
Title: 新しく敵がでるたびに時間差ショットの座標が変わってしまいます    
シューティングゲームの館の時間差ショットのようなものをつくりたいと思い、
自機狙い→以後角度固定というようなショットを作ったのですが、
新しい敵が自機狙いするたび、先に出ていた敵の自機狙いで得た座標もあとから出た方に書き換えられてしまいます。

どこが悪いのかは、なんとなくわかるのですが理屈がよくわかりません。
配列使って敵の数だけ繰り返しているのに何でなんでしょう?

C言語はまだまだ勉強中の身でしてたいして詳しくないのですが、
よろしければご教授してください。


133ポイント を手に入れた。




Name: L  ..ぴよぴよ(706ポイント)   Date: 2008/02/10(日) 04:05   No:14147       
Title: スコア    
はじめまして、Lと申します。
今、大学の勉強でC言語でシューティングゲームを作っているのですが、20日にそのゲームを提出しなければいけないのです。

今、製作中なのですが、スコア表示について教えていただきたいです。
スコア表示は文字だけでしたいので、画像は必要ないです。

下記のソースを見てください。

void Score( int x, int y, int color )
{

DrawFormatString( x, y, color ,"Score 0000000", Score );
ScreenFlip();

}

   ・
   ・
   ・

// ループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{

// 画面を初期化する
ClearDrawScreen() ;

//スコア表示
Score( 267 , 15 , 0xFFFFFFFF ) ;
   ・
   ・
   ・
となっています。
しかし、この方法だと本来 滑らかに動作するはずが とても重くなりました。

ソースのもっと下の方に"弾が敵に触れると敵破壊"というコードがあり、そこに破壊のついでにスコア加算コードを入れたいのです。
そうすれば、破壊した時にスコアが加算されるので、普通のシューティングと変わりありません。

ですが、その画面にスコア表示させなければいけませんので、上のコードをやってみたのですが重すぎて・・・。
それとも、コード自体 複雑すぎますか? もっと簡単にできる方法はありますか?


他にもいろいろ聞きたいことがあるのですが、スコア表示を先に教えていただきたいので
どうぞ、よろしくお願い致します。

使用:Visual C++ 2005 Express Editiom


706ポイント を手に入れた。


Name: GPGA  ..熟練のプログラマー(41,994ポイント)   Date: 2008/02/10(日) 04:43   No:14148     
Title: Re:スコア    
ScreenFlip関数は無限ループの一番最後に一度だけ呼び出す関数ですが
これを何度も呼んでいませんか?


33ポイント を手に入れた。

Name: L  ..ぴよぴよ(629ポイント)   Date: 2008/02/10(日) 16:12   No:14152     
Title: Re:スコア    
返答ありがとうございます。
この関数は無限ループだったんですか・・・。

もっと、簡単なスコア表示ができる方法はありませんか?

よろしくお願いします。


77ポイント を落としてしまった。

Name: 管理人 [URL]  ..伝説のハッカー(513,816ポイント)   Date: 2008/02/10(日) 19:27   No:14157     
Title: Re:スコア    
時間が今ないので、あまり詳しくいえませんが・・
関数が無限ループなんじゃなくて、終了処理をするまで

while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )

ここで無限ループしていますよね。このループの一番最後にだけ書くものです。


90ポイント を手に入れた。

Name: L  ..ぴよぴよ(805ポイント)   Date: 2008/02/11(月) 07:09   No:14179     
Title: Re:スコア    
ループのところに関数を入れていたのですね・・・(汗


今すぐは言いませんが、簡単な記述があるのならばよろしくお願いします。
できれば、提出期間20日前、18日や19日までにはお願いします。


2倍のポイントを手に入れた! 176ポイント を手に入れた。

Name: GPGA  ..熟練のプログラマー(42,221ポイント)   Date: 2008/02/11(月) 18:11   No:14186     
Title: Re:スコア    

void Score( int x, int y, int color )
{
DrawFormatString( x, y, color ,"Score 0000000", Score );

// ここに書いてはいけない
//ScreenFlip();
}


// ループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 画面を初期化する
ClearDrawScreen() ;

//スコア表示
Score( 267 , 15 , 0xFFFFFFFF ) ;

// 各描画処理
・・・

// ループ内の描画処理の最後にScreenFlip関数を呼ぶ
// ココ以外でScreenFlip関数を呼ぶべきではない
ScreenFlip();

// フレームレートを一定にする処理
・・・
}



227ポイント を手に入れた。

Name: L  ..ぴよぴよ(853ポイント)   Date: 2008/02/11(月) 20:44   No:14196     
Title: Re:スコア    
よく、分かりません。
できれば、修正していただけませんか?

初心ですが、よろしくお願いします。




48ポイント を手に入れた。



Name: いもいも  ..ぴよぴよ(63ポイント)   Date: 2008/02/11(月) 02:39   No:14172       
Title: はじめまして    
突然、すいません。
ピクロスを作りたいのですが作り方がわかりません。
ずうずうしいのはしょうちですがもし、可能ならば作ってはもらえないでしょうか??

言語:C言語

条件・絵をファイルから読み込む
  ・正解だった場合、問題ごとに所要時間のランキングを作る
  ・ランキングには時間と日付、名前を入れる
  ・サイズは9×9以上
  ・関数を用いる
  ・いつでも終了できるようにする
  ・間違っていた場合完成した絵と正解の絵、間違っている場所は赤で表示する


63ポイント を手に入れた。


Name: 管理人  ..伝説のハッカー(514,983ポイント)   Date: 2008/02/11(月) 05:51   No:14175     
Title: Re:はじめまして    
すみませんが、規約を守った投稿をお願いします

課題丸投げを越えた質問になっています。
ここはわからない点についてアドバイスをもらう為の場所であり、作成依頼を出す場所ではないと、させていただいています。

最初から投げださず、少しずつ勉強して作っていきましょう。



84ポイント を手に入れた。

Name: バグ  ..比類無きプログラマー(74,690ポイント)   Date: 2008/02/11(月) 08:38   No:14181     
Title: Re:はじめまして    
下記URLの本が非常に参考になります…というか、ソースコードが載ってます。
言語はJAVAですが、C言語と文法が似ているところが多いので移植作業はそれほど難しくないと思いますよ。

http://www.amazon.co.jp/%E9%89%9B%E7%AD%86%E3%83%91%E3%82%BA%E3%83%AB%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E3%83%8A%E3%83%B3%E3%83%90%E3%83%BC%E3%83%97%E3%83%AC%E3%83%BC%E3%82%B9%E3%83%BB%E3%81%8A%E7%B5%B5%E3%81%8B%E3%81%8D%E3%83%91%E3%82%BA%E3%83%AB%E3%83%BB%E3%83%8A%E3%83%B3%E3%83%90%E3%83%BC%E3%82%AF%E3%83%AD%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%81%AE%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0-%E6%A3%9A%E5%BA%8A-%E5%BC%98%E6%A8%B9/dp/4797340207


341ポイント を手に入れた。

Name:  ..ぴよぴよ(6ポイント)   Date: 2008/02/11(月) 08:43   No:14182     
Title: Re:はじめまして    


6ポイント を手に入れた。



Name: 歩兵  ..ぴよぴよ(238ポイント)   Date: 2008/02/09(土) 22:49   No:14145       
Title: とんでもなく初歩的な質問ですが…    
初心者中の初心者ですがよろしくお願いします。
入門編のDXライブラリの導入なのですが

Microsoft Visual C++ 2008 Express Edition をダウンロードしてインストール
DXライブラリ VisualC++用(Ver2.24a)をダウンロードして解凍

http://homepage2.nifty.com/natupaji/DxLib/dxuse_vc2008express.html
こちらの手順どおり、最後のプロジェクトのビルド実行も正常に完了したのですが

DxLib_VC、サンプルプログラム実行用フォルダ内のDxLib_VC2005用.slnを実行しても
何も起こらず、Microsoft Visual C++ 2008 Express Edition が起動しません。

もしかして2008では起動できないのでしょうか?
それとも私の設定がどこか間違っているのでしょうか(数回やり直したのですが)

ご指導のほういただけたら幸いです。


238ポイント を手に入れた。


Name: 管理人  ..伝説のハッカー(513,658ポイント)   Date: 2008/02/10(日) 00:38   No:14146     
Title: Re:とんでもなく初歩的な質問ですが…    
携帯から書いているので、よくわかりませんが、関連付けがうまくいってないんですかね‥
インストールは正常に終わりました?
再起動した後、メニューの「開く」からプロジェクトファイルを開いてみてください。


99ポイント を手に入れた。

Name: 歩兵  ..ぴよぴよ(302ポイント)   Date: 2008/02/10(日) 09:42   No:14149     
Title: Re:とんでもなく初歩的な質問ですが…    
管理人様、レスありがとうございますm(_ _ m)

インストールはどうだろう・・・かなり重かったので失敗してる可能性もありますね;

Projectsフォルダの中身は空っぽでした。


64ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(513,726ポイント)   Date: 2008/02/10(日) 19:25   No:14156     
Title: Re:とんでもなく初歩的な質問ですが…    
メニューの「開く」から開いてみましたでしょうか?
もし解決しない場合、本家で聞いてみてください。
http://homepage2.nifty.com/natupaji/DxLib/index.html


68ポイント を手に入れた。

Name: 歩兵  ..ぴよぴよ(396ポイント)   Date: 2008/02/10(日) 19:30   No:14158     
Title: Re:とんでもなく初歩的な質問ですが…    
申し訳ありません…違った所を操作しておりました(汗
無事に開くことが出来ました!

VisualStudio変換ウィザードが開いたのですが、これを操作していけばいいのですよね?


2倍のポイントを手に入れた! 94ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(514,381ポイント)   Date: 2008/02/10(日) 19:40   No:14160     
Title: Re:とんでもなく初歩的な質問ですが…    
はい。2003で作成されているプロジェクトだと思いますので、2008用に変換すればOKです。

2倍のポイントを手に入れた! 56ポイント を手に入れた。

Name: 歩兵  ..ぴよぴよ(483ポイント)   Date: 2008/02/10(日) 19:43   No:14161     
Title: Re:とんでもなく初歩的な質問ですが…    
了解です。ご丁寧に度々ありがとうございました(_ _ )
というかhttp://homepage2.nifty.com/natupaji/DxLib/index.htmlの掲示板で聞いたほうが良かったのかな;
スレッドは後で消しておきます。すみませんでした><


87ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(514,892ポイント)   Date: 2008/02/10(日) 19:51   No:14163     
Title: Re:とんでもなく初歩的な質問ですが…    
いえいえ、何でもお聞きください。
そして、この記事は編集はできますが、管理人以外消すことが出来ません。
また、どんな記事でも参考になる場合がありますし、消していただかなくて結構です。


DXライブラリの内部的な構造のことや、内部的なトラブルの話は本家の方でしてもらったほうが解決が早いと思いますが、
一般的なDXライブラリの質問でしたらどちらでお聞きいただいても結構です。
(製作者様にお聞きになった場合、製作者様はお忙しい方なので、本家の方では回答を得るのに時間がかかる場合がありますが。)
・・というかここは「何でも質問」OKな掲示板ですので、お気軽にご利用くださいm(_ _)m


48ポイント を手に入れた。

Name: 歩兵  ..ぴよぴよ(529ポイント)   Date: 2008/02/10(日) 20:31   No:14166 解決!     
Title: Re:とんでもなく初歩的な質問ですが…    
了解しました。また何かあれば質問させていただきますね;

2倍のポイントを手に入れた! 46ポイント を手に入れた。



Name: Lbfuvab  ..初心者(6,505ポイント)   Date: 2008/02/10(日) 20:02   No:14165       
Title: 乱数について    
ご無沙汰しておりました。
最近乱数について勉強しているのですが、(MT,XorShift,RANROT
お勧めの本があれば教えてください(頼


15ポイント を手に入れた。




Name: 初心者  ..初心者(6,347ポイント)   Date: 2008/02/10(日) 16:36   No:14153       
Title: 利用は初めてなんですが どうしでもエラー表示がうまくできません    
問題は〜〜〜scanf関数を利用して、文字列を10回入力し、最もおおきな文字列を表示する
*未入力の比較はstrcmpを使用し
*未入力の場合はエラーとし、もう一度入力するようにする事。
よろしくお願いします

ソース

#include <stdio.h>
#include <string.h>
#define MAXN 10


void main(void) {
char str[100];
int i;
char max[256];
for(i=0; i<MAXN; i++)
{
Loop:
printf("文字列入力:\n");
scanf("%s",&str);
if (strlen(str)==0)
{
printf("入力エラー");
goto Loop;
}
if (strcmp(max,str)<0 )
{
strcpy(max,str);
}
}
printf("%s\n",max);
}


26ポイント を手に入れた。


Name: 組木紙織  ..プログラマー(34,603ポイント)   Date: 2008/02/10(日) 17:29   No:14154     
Title: Re:利用は初めてなんですが どうしでもエラー表示がうまくできません    
最初はmaxには何が入っていますか?

問題文で気になることが、

>最もおおきな文字列を表示する
 最も大きな文字列とはどのような文字列ですか?
 strcmpを使っているということは辞書順を想定してあると思いますが。

>*未入力の比較はstrcmpを使用し
 未入力の比較とあるのですが、未入力と比較する必要はあるのですか?

あと、好みの問題に近いですが、gotoはできるだけ利用しないほうが良い、というのが
最近のプログラミングの常識となっています。


最後に、一つの文字列がchar[100]を超えるような場合はどうなりますか?
といった問題もあります。


145ポイント を手に入れた。



Name: りょうちん  ..入門者(3,986ポイント)   Date: 2008/02/03(日) 02:03   No:13988       
Title: 他のエディタで使用中    
こんばんは、何度も申し訳ありません。
VS2005 C++のリソースビューで、リソースファイルが
他のエディタで使用中と表示され、何もできなくなってしまいました。

調べたところ、VS2005自信の他のエディタが開いているとの事なのですが、
具体的な解決方法が分からずに困っております。

どなたか解決策を教えてください。よろしくお願いします。


92ポイント を手に入れた。


Name: へろり  ..入門者(2,609ポイント)   Date: 2008/02/03(日) 10:56   No:13991     
Title: Re:他のエディタで使用中    
その使用中のエディタを閉じてください。

2ポイント を手に入れた。

Name: りょうちん  ..入門者(4,093ポイント)   Date: 2008/02/03(日) 14:18   No:13992 解決!     
Title: Re:他のエディタで使用中    
解答ありがとうございました。
ですが、その方法が分かっていれば質問はしていません。

リソースの追加をしようとした際、使用中のエディタを
閉じるか聞かれたので、それで無理矢理終了させる事ができました。
過去にも何度かあったので、もしバグじゃないのなら
解決方法を教えて頂きたかったです。

くだらない事で質問して申し訳ありませんでした。



107ポイント を手に入れた。

Name:  ..上級者(22,989ポイント)   Date: 2008/02/03(日) 17:10   No:14001     
Title: Re:他のエディタで使用中    
ソールが表示されるところ(スタートページとかも)
で、関係ないものとかを閉じてみてはどうでしょうか?
別のエディターとかで使用してませんか?

再起動してみて、slnを開いたときすぐにやった時はどうなりますか?


95ポイント を手に入れた。

Name: りょうちん  ..入門者(4,171ポイント)   Date: 2008/02/07(木) 01:33   No:14091     
Title: Re:他のエディタで使用中    
せっかく解答していただいたのに、返信が遅れてしまってもうしわけありません。
おっしゃられてるように、他全て閉じてもなるし、再起動してもなおりませんでした。

ちなみにこの現象が発生するのは、bitmapや、dialogboxのエディタをいじってる
時になりました。不正に終了したりするのが原因なのでしょうか・・。


78ポイント を手に入れた。

Name:  ..上級者(23,700ポイント)   Date: 2008/02/07(木) 02:55   No:14092     
Title: Re:他のエディタで使用中    
>リソースの追加をしようとした際、使用中のエディタを
>閉じるか聞かれたので、それで無理矢理終了させる事ができました。
これで、閉じるエディタは何?


73ポイント を手に入れた。

Name: りょうちん  ..入門者(4,043ポイント)   Date: 2008/02/07(木) 23:56   No:14122     
Title: Re:他のエディタで使用中    
このリソースを使用しているエディタを閉じますかと聞かれたのですが、
勝手に閉じてくれたのでどのエディタの事なのかがさっぱりで・・。

bitmapやdialogbox等VS2005のエディタは全て閉じたと思ってたのですが、
閉じたと勘違いしていたのかもしれないので、再度問題が起きた時にもう一度検証してみます。





128ポイント を落としてしまった。

Name:  ..上級者(23,569ポイント)   Date: 2008/02/08(金) 14:27   No:14128     
Title: Re:他のエディタで使用中    
がんばってください。
可能性として、ダイアログ系統もソースで開けた気がするので、それが閉じているかどうかかと思っています。
ほかのアプリケーションが使用していてもだめだった気がします。
ご注意を


79ポイント を手に入れた。

Name: りょうちん  ..入門者(4,082ポイント)   Date: 2008/02/09(土) 22:45   No:14144 解決!     
Title: Re:他のエディタで使用中    
アドバイスありがとうございました。
以後その辺にも気をつけて見てみます。


39ポイント を手に入れた。



Name: <kor  ..ぴよぴよ(201ポイント)   Date: 2008/02/01(金) 19:13   No:13959       
Title: C言語関係ないかもしれませんが…    
C言語にあまり関係ないと思いますが、気になったので質問してみます。
今、弾幕シューティングゲームを作っているのですが、敵やプレイヤーの発射する玉を作ろうと思ったら、
『東方』『四聖龍神録』みたいな玉ができません(色とか形とか)
あれってどうやって作っているんですか?
何かツールとかが要るのでしたらそれも教えてください。


114ポイント を手に入れた。


Name: tkmakwins15 [URL]  ..熟練のプログラマー(55,884ポイント)   Date: 2008/02/01(金) 20:19   No:13960     
Title: Re:C言語関係ないかもしれませんが…    
Windows標準装備のペイントでも作れるはずです。
ペイント(フォト??)ショップがあると高機能ではあるはず。
フリーソフトでは[Gimp]なるものも存在する(使用者です)


79ポイント を落としてしまった。

Name: バグ  ..比類無きプログラマー(73,506ポイント)   Date: 2008/02/02(土) 08:20   No:13966     
Title: Re:C言語関係ないかもしれませんが…    
あとはフリーの素材を探してみるのもいいかもしれませんよ。ググると結構出てきます(^-^)
添付画像は製作途中のゲームなんですけど、画像に関してはほぼフリー素材を使用しています(^_^;)



83ポイント を手に入れた。

Name:  ..上級者(22,503ポイント)   Date: 2008/02/02(土) 20:52   No:13979     
Title: Re:C言語関係ないかもしれませんが…    
SAIかpixiをお勧めします!(画像ソフト

14ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(510,150ポイント)   Date: 2008/02/03(日) 01:57   No:13987     
Title: Re:C言語関係ないかもしれませんが…    
 
↑クリックするとダウンロードできます。


私が使っている弾幕でよければここにあげますので使ってください。
二次創作ではありますが、一応全部自分の手書きです。
私はフォトショップという画像ソフトを使っています。
しかし、GIMPというフリーの画像ソフトでも、CS級じゃなければ、同等のことは出来ます。
若干GIMPの方が扱いにくいと言う人もいますが、ここは慣れたら大丈夫だと思います。
後、ゲームを作るために絵を描くのなら、マウスの代わりにタブレットを使うと便利ですよ。
後、ペイントだけでも結構かけますよ。


163ポイント を落としてしまった。

Name: <kor  ..ぴよぴよ(319ポイント)   Date: 2008/02/09(土) 21:43   No:14143 解決!     
Title: Re:C言語関係ないかもしれませんが…    
皆さん本当にありがとうございました。
tkmakwins15様、ありがとうございます。ペイントでできるんですね。がんばってみます。
バグ様、フリー素材ですか…その発想はありませんでしたありがとうございます。
雷様、SAIはノリで体験版を持ってたので、試してみます。
管理人様、貴重な素材を本当にありがとうございます。

というわけで、がんばってゲーム作って恩返ししたいと思います。
本当にありがとうございました。<m(__)m>


118ポイント を手に入れた。



Name: ポポロ  ..ぴよぴよ(158ポイント)   Date: 2008/02/07(木) 16:48   No:14109       
Title: プロセスメモリについて教えてください。    
初めて投稿させてもらいます。
ここで聞いていいのかわからないですが、プロセスメモリに関して質問させてもらいます。

私自身はプロセスメモリについてはほとんど知りませんので、トンチンカンなことを
言ってるかもしれませんが、ご了承ください。

他の起動しているプログラム(A)のプロセスIDを取得して

OpenProcess()
ReadProcessMemory()

等で特定のアドレスのメモリを読むことは出来るのですが、そのプログラム(A)上で
データが更新されたときにメモリの開放・再確保でアドレスが毎回変わってしまい、
そのデータが保持されているアドレスをまた探さなくてはなりません。
これを避けるためにメモリが開放・再確保されても、すぐその保持されたアドレスを
得るには何か方法あるでしょうか?

よろしくお願いします。


158ポイント を手に入れた。


Name: たかぎ [URL]  ..プログラマー(29,382ポイント)   Date: 2008/02/07(木) 20:25   No:14114     
Title: Re:プロセスメモリについて教えてください。    
環境ぐらいは書きましょう。


19ポイント を手に入れた。

Name: ポポロ  ..ぴよぴよ(289ポイント)   Date: 2008/02/07(木) 20:32   No:14116     
Title: Re:プロセスメモリについて教えてください。    
>>環境ぐらいは書きましょう。

環境は

OS: windows XP
開発環境: Visual Studio 2005
開発言語:C言語

です。
環境がわからないと回答しようがないですね。すみません。


88ポイント を手に入れた。

Name: たかぎ [URL]  ..プログラマー(29,477ポイント)   Date: 2008/02/07(木) 20:47   No:14118     
Title: Re:プロセスメモリについて教えてください。    
アドレスを返す関数を用意すればよいだけでは?


25ポイント を手に入れた。

Name: ポポロ  ..ぴよぴよ(521ポイント)   Date: 2008/02/07(木) 21:55   No:14120     
Title: Re:プロセスメモリについて教えてください。    
たかぎさん回答ありがとうございます。

>>アドレスを返す関数を用意すればよいだけでは?

アドレスを返す関数を用意するというのはどういうことですか?

プログラム(A)というのは開発しているプログラムではなくて、他の実行されているプログラムです
(例えばExplorer.exeみたいな、他の実行中のアプリケーション)。
このプログラムは逆アセンブリをしないと書き換えできないと思うのですが・・・。
それとも他のアプリケーションが使っているメモリのアドレスを参照している変数のアドレスを返す関数を用意できるということですか?(言い方が変ですが;)
プログラム(A)から今得られているのは、プロセスIDとプロセスメモリとウィンドウハンドルです。


232ポイント を手に入れた。

Name: たかぎ [URL]  ..プログラマー(29,488ポイント)   Date: 2008/02/08(金) 06:27   No:14125     
Title: Re:プロセスメモリについて教えてください。    
既存のプログラムが相手だと難しいですね。


11ポイント を手に入れた。

Name: へろり  ..入門者(2,661ポイント)   Date: 2008/02/08(金) 09:10   No:14126     
Title: Re:プロセスメモリについて教えてください。    
GlobalAlloc()や、HeapAlloc()といったAPIをフックしてみてはどうでしょう。
スタックまでは手が出せませんが、ヒープの再確保ならば追跡可能かと思います。


52ポイント を手に入れた。

Name: ポポロ  ..ぴよぴよ(543ポイント)   Date: 2008/02/08(金) 13:16   No:14127     
Title: Re:プロセスメモリについて教えてください。    
へろりさん

>>GlobalAlloc()や、HeapAlloc()といったAPIをフックしてみてはどうでしょう。

なるほど、メモリ追跡をしたいアプリケーションはDLLを読み込んでいるので、DLLを仲介にしてAPIをフックすればいけそうですね。ただそうなるとDLLがWindows標準に入っているDLLなので、アプリケーション自体の内容を逆アセンブリして少し書き換えないとですね・・・

早速試してみます。


22ポイント を手に入れた。

Name: へろり  ..入門者(3,139ポイント)   Date: 2008/02/09(土) 07:24   No:14137     
Title: Re:プロセスメモリについて教えてください。    
>ただそうなるとDLLがWindows標準に入っているDLLなので、アプリケーション自体の内容を逆アセンブリして少し書き換えないとですね・・・

APIフックをかける実装次第ですが、システムフックを利用すればその必要はありません。
フックプロシージャを持つDLLへ対象となるプロセスがアタッチして来たときに、プロセスのイメージを取得し、
インポートアドレステーブル等からフック対象のAPIのアドレスを書き換えれば可能です。

ただ、システムフックを利用すると相手のアプリケーションがメッセージループを持っていると言うことが
最低限の条件となりますが。


2倍のポイントを手に入れた! 478ポイント を手に入れた。

Name: ポポロ  ..ぴよぴよ(883ポイント)   Date: 2008/02/09(土) 14:53   No:14141 解決!     
Title: Re:プロセスメモリについて教えてください。    
へろりさん、回答ありがとうございます。

>APIフックをかける実装次第ですが、システムフックを利用すればその必要はありません。
>フックプロシージャを持つDLLへ対象となるプロセスがアタッチして来たときに、プロセス
>のイメージを取得し、インポートアドレステーブル等からフック対象のAPIのアドレスを書
>き換えれば可能です。

このようなやり方もあるのですね。まさしく私が求めていた方法です。しかし、ものすごくすば
らしい手法なのですが、肝心の私があまり理解できてない範囲です^^;もう少し勉強してみます。

>ただ、システムフックを利用すると相手のアプリケーションがメッセージループを持っていると
>言うことが最低限の条件となりますが。

メッセージループは持っているのでこの点は大丈夫です。もしこの方法ができれば、毎回プロセス
メモリ上で必要データを探さなくても済みそうですね。
実装できるまで時間がかかりそうですが、がんばってみます。

また問題が出てきたとき、よろしくお願いします。とても勉強になりました。ありがとうございました。


340ポイント を手に入れた。



Name: へろへろ  ..かけだし(1,515ポイント)   Date: 2008/02/06(水) 23:05   No:14087       
Title: 再領布について    
久しぶりの質問になります。
最近、VisualC++ExpressEditionの新しいバージョンが出たというのでインストールしていろいろと試してみていたのですが、作った実行ファイルが友達のパソコンでは動かないと言われました。
公式ホームページには再領布パッケージのインストールが必要と言うようなことがあったので、友達に言ってみたのですが、管理者権限がないとかどうとかでインストールできなかったようです。
ここの掲示板の先日の書き込みにも同じようなことがあり、早速
プロジェクトのプロパティからランタイムライブラリをマルチスレッド(/MT)に変更してみたのですが
/MTと/clr:pureは同時に指定できません
と出てしまいビルドエラーになってしまいました。
ここら辺のことはよくわからないので僕ではどうしようもありません。
教えていただけないでしょうか?
プロジェクトはCLR Windowsフォームアプリケーションです。


307ポイント を手に入れた。


Name: 管理人 [URL]  ..伝説のハッカー(509,076ポイント)   Date: 2008/02/07(木) 13:42   No:14100     
Title: Re:再領布について    
検索はしてみましたでしょうか?

http://www.google.co.jp/search?hl=ja&q=%2FMT%E3%81%A8%2Fclr%3Apure%E3%81%AF%E5%90%8C%E6%99%82%E3%81%AB%E6%8C%87%E5%AE%9A%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93&lr=

特にDXライブラリのHPの掲示板の過去ログをお読みになるといいかもしれません。


47ポイント を手に入れた。

Name: へろへろ  ..かけだし(1,591ポイント)   Date: 2008/02/08(金) 00:24   No:14123     
Title: Re:再領布について    
アドバイスありがとうございます。
他のサイト、掲示板を見てみました。
フォームアプリケーションでは、clrを使用していて静的にリンクできないので、動的にリンクするようになり、そのためのDLLを添付しなければいけないということでしょうか。
設定は元に戻して、DLLをフォルダから読み込むためにはマニフェストファイルを分離してあげなければならないということで、分離して、フォルダにmsvcr80.dll, msvcr80d.dll, msvcm80.dll, msvcm80d.dll, msvcp80.dll, msvcp80d.dll をいれて読み込ませるようにして友達に送ったところ、アプリケーションを正しく初期化できませんでした、と出てしまったそうです。
manifestを編集しなくてはいけないようなのですが、よくわかりません。
教えていただけないでしょうか?


76ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(513,476ポイント)   Date: 2008/02/09(土) 07:06   No:14136     
Title: Re:再領布について    
出来るはずなんですが・・。
すみませんよくわかりません。
すみませんが、本家で聞いていただけますでしょうか。

http://homepage2.nifty.com/natupaji/DxLib/


76ポイント を手に入れた。

Name: へろへろ   Date: 2008/02/20(水) 20:47   No:140871203508041 解決!     
Title: Re:再領布について    
WindowsXP Professionalでは問題なくでき、目的は達成できました。
いろいろとすいませんでした。




Name: 煎餅  ..ぴよぴよ(57ポイント)   Date: 2008/02/07(木) 19:22   No:14112       
Title: 教えてください    
Cでウィンドウを作りたいのですが、できればソースを教えてもらえないでしょうか?
OSはXPで環境はCでメモ帳で書いてコマンドプロンプトで実行しています。


57ポイント を手に入れた。


Name: ポポロ  ..ぴよぴよ(201ポイント)   Date: 2008/02/07(木) 20:27   No:14115     
Title: Re:教えてください    
単にウィンドウを表示させるだけなら

http://www.geocities.jp/ky_webid/win32c/002.html

を参考にしてはどうでしょうか?


43ポイント を手に入れた。

Name: たかぎ [URL]  ..プログラマー(29,452ポイント)   Date: 2008/02/07(木) 20:45   No:14117     
Title: Re:教えてください    
> OSはXPで環境はCでメモ帳で書いてコマンドプロンプトで実行しています。

コンパイルせずに実行しているのであればインタープリタでしょうか?
どのインタープリタを使っているのか分かりませんが、CINTならWildCが使えると思います。

インタープリタではなくコンパイラであれば(インタープリタでもそうですが)、何を使っているのか明らかにしてください。



70ポイント を手に入れた。

Name: 煎餅  ..ぴよぴよ(0ポイント)   Date: 2008/02/07(木) 22:14   No:14121     
Title: Re:教えてください    
Borland C++ Compilerでコンパイルしています
Cで一通りの基礎はやりました
大学の授業程度です
将来的には簡単なソフトを作りたいと思うんですけど何からしていいかわからなくて…
何か参考になる本やサイトがありましたら教えてください


85ポイント を落としてしまった。

Name:  ..上級者(23,617ポイント)   Date: 2008/02/08(金) 14:28   No:14129     
Title: Re:教えてください    
http://www.kumei.ne.jp/c_lang/
ここのSDKでいいのかな?


2倍のポイントを手に入れた! 48ポイント を手に入れた。

Name: 煎餅  ..ぴよぴよ(13ポイント)   Date: 2008/02/08(金) 15:47   No:14131 解決!     
Title: Re:教えてください    
ありがとうございます
頑張ってみます


13ポイント を手に入れた。



Name: パソピ  ..ぴよぴよ(625ポイント)   Date: 2008/02/04(月) 16:07   No:14030       
Title: 敵の体力について    
こんにちは。私はDXライブラリを使ってゲーム制作をしている短大生です。
貴サイトの「シューティングゲームの館」を参考にして進めてきました。記載されている部分までは終わったので自分で色々プログラムを組んで行こうと思ったのですが、敵の体力を設定しようとするところでつまづいてしまいました。現在考えているのは、hpという変数をとり、自機の弾を当てるたびにhpの値を増やしていき、それがhp=5になったら敵のフラグを消す、というプログラムですが、うまくいきません。

プログラムが見づらいかもしれませんが、是非ご教授お願いします。


void CollisionDetection(){
 int s=0;
 enemy[s].hp=0;
 for(int i=0;i<PLAYER_MAX_SHOT1;i++){ //ショットの全列分
  for(int j=0;j<PLAYER_MAX_SHOT2;j++){ //1列全弾分
   if(PlayerShot[i][j].flag==1){ //その弾が発射中なら
    for(s=0;s<ENEMY_TOTAL_NUM;s++){ //全敵100体分
     if(enemy[s].flag==1){ //その敵が出現中なら
      double x,y;
      int range;
      x=(int)(PlayerShot[i][j].x-enemy[s].x);
      y=(int)(PlayerShot[i][j].y-enemy[s].y);
      switch(i){
       case 0: //0列目と
       case 5: //5列目と
       case 6: //6列目の
        range=12; //大きさは半径12
        break;
       default:
        range=9; //大きさは半径9
        break;
      }

//当たり判定。敵の体力設定
      if((int)sqrt(x*x+y*y) < range+enemy[s].range){ //当たり判定内なら
       PlayerShot[i][j].flag=0;
       enemy[s].hp++;
       if(enemy[s].hp==5){
        enemy[s].flag=0; //表示フラグを戻す
        PlayerShot[i][j].flag=0; //当たった弾を消す
        if(CheckSoundMem(sound_enemy_death)==1){ //消滅音が鳴っていなかったら
         StopSoundMem(sound_enemy_death); //とめて
        }
        PlaySoundMem(sound_enemy_death, DX_PLAYTYPE_BACK); //消滅音を鳴らす
       }
      }
     }
    }
   }
  }
 }
}


612ポイント を手に入れた。


Name: しりうす〜  ..入門者(3,021ポイント)   Date: 2008/02/04(月) 16:27   No:14031     
Title: Re:敵の体力について    
これ、コンパイル通ってます?
とりあえず、関数の頭の変数の宣言と初期化が微妙ですし、
ローカルのx,yの宣言位置おかしくないでしょうか?

当たり判定等のデバッグ時は、各オブジェクトの座標位置等の情報や、
当たった時は"当たった"って画面に表示して見るとデバッグし易いですよ。


129ポイント を手に入れた。

Name: box  ..ハッカー(106,724ポイント)   Date: 2008/02/04(月) 16:59   No:14032     
Title: Re:敵の体力について    
> とりあえず、関数の頭の変数の宣言と初期化が微妙ですし、

enemy[]を、外部変数として正しく定義してあれば、問題ありません。

> ローカルのx,yの宣言位置おかしくないでしょうか?

当該のif文が構成するブロックの中だけで有効な変数定義として、正しい方法です。


>パソピさんへ

コードを載せるときは、前後を<pre>タグと</pre>タグ(<>は半角)で
はさんでください。

全角空白を使うと、見た目はインデントしていますが、
見ている人たちの環境でコンパイルするときに、
全角空白をタブや半角空白に置き換える手間がかかります。


2倍のポイントを手に入れた! 342ポイント を手に入れた。

Name: Mist  ..ぴよぴよ(54ポイント)   Date: 2008/02/04(月) 17:30   No:14033     
Title: Re:敵の体力について    
弾の当たり判定のたびにこの関数を通るんですよね?
だとすると、関数の最初で
enemy[s].hp=0;
してるからじゃないですか?
これだといつまでたってもhp=5にはならないと思います。


54ポイント を手に入れた。

Name: やそ  ..上級者(19,500ポイント)   Date: 2008/02/05(火) 09:49   No:14042     
Title: Re:敵の体力について    
みなさん、お疲れ様です。

パソピさんの提示されたコードはほぼシューティングの館の19の当たり判定のまんまなわけで・・・
>double x,y;
>int range;
も管理人さんのコードのままなわけで・・・回答者たちの知識を試すミスリードかと思いましたよ。
(自分もあの位置での宣言っていいの?って指摘する寸前でした(^^; )
で、結果的に何が悪いかと言うとMistさんも指摘している通り、
この当たり判定関数に飛んできたときに、敵の体力(というか被弾回数?)を0クリアしてしまっているからですね。
敵の体力を変数で管理する。→宣言しなきゃ→初期値入れなきゃ

という本来ならば正しい行動が裏目に出てしまった結果ではないでしょうか。


205ポイント を落としてしまった。

Name: しりうす〜  ..入門者(3,129ポイント)   Date: 2008/02/05(火) 10:58   No:14044     
Title: Re:敵の体力について    
あれ?
下の当たり判定のsqrtの部分のx,yって有効ですっけ?
って思っての指摘だったのですが、よく見たら同ブロック内でしたね。
普段tab大き目の数字にしてる弊害が・・・orz
switchで切れてるみたいに見えたので(確認甘くてすいません)。

あと、初期化が微妙なのは配列なのに先頭要素(s=0)しか初期化していない点を指摘したつもりだったのですが。
残りの99体はどうなってるんでしょう?


108ポイント を手に入れた。

Name: しりうす〜  ..入門者(3,165ポイント)   Date: 2008/02/05(火) 11:01   No:14045     
Title: Re:敵の体力について    
というか、そこで体力初期化した駄目ジャンって話でしたね・・・orz
ゴミレス連投申し訳ありません。


36ポイント を手に入れた。

Name: パソピ  ..ぴよぴよ(738ポイント)   Date: 2008/02/05(火) 12:44   No:14049     
Title: Re:敵の体力について    
レスが遅れて申し訳ありません。
皆さん回答ありがとうございます。Mistさんの言うとおり宣言の位置がおかしいですね…自分で変数毎回0にしていたら敵不死身になりますね…
コードを修正したいと思います。
初心者的な質問で色々混乱させてしまってすみませんでしたm(_ _)m

また、タグを使わず見づらいコードにしてしまったこともお詫びします。

皆さんありがとうございました。


113ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(510,254ポイント)   Date: 2008/02/07(木) 15:04   No:14105     
Title: Re:敵の体力について    
非効率プログラムのため、本当にいろんな方の混乱招いているようで申し訳ない限りです・・・。
勝手にHP作るのはいいけど、人に迷惑かけるなと・・(汗

HPの設定は減算の方がいいのではないでしょうか。
というのも、enemy[i].hp>0の時存在している・・というプログラムの方が書きやすくないでしょうか?
敵にはいろんな体力があるでしょう。
5の敵、10の敵、15の敵・・・
aの敵は5以上になったら死んで、bの敵は10以上になったら死んで・・
とするより、0になったら全部死ぬというほうがアルゴリズムとしては簡単ではないでしょうか。
その代わり登録時には、個別に設定が必要ですが。

・・まぁどちらでもいいのですが(汗


301ポイント を手に入れた。

Name: パソピ  ..ぴよぴよ(848ポイント)   Date: 2008/02/08(金) 14:37   No:14130 解決!     
Title: Re:敵の体力について    
管理人さん回答ありがとうございます。

私のC言語に対する知識が不足しているため、私が勝手に混乱しているだけです^^;
HPの設定には減算方式をとります。
また質問をするときがあると思いますが、そのときはみなさんよろしくお願いします。


110ポイント を手に入れた。



Name: けるびん  ..入門者(4,306ポイント)   Date: 2008/02/05(火) 01:13   No:14038       
Title: 構造体について    
課題で三角形の各x、y座標を入力し、その面積を構造体を用いたプログラムで求めよ。というのが出題されたのですが、コンパイルは通ったものの、面積が合いません。。。
プログラム自体初心者なので、基本的なこと、もしくは単純なミスだとは思いますが。。

どこがおかしいのかご指南よろしくおねがいします

*****************

OS LINUX KNOPPIX
コンパイルはgccで行なっています

*****************


125ポイント を手に入れた。


Name: box  ..ハッカー(106,730ポイント)   Date: 2008/02/05(火) 07:23   No:14039     
Title: Re:構造体について    
何はさておき、ソースコードを見せてください。

6ポイント を手に入れた。

Name: toyo  ..初心者(6,438ポイント)   Date: 2008/02/05(火) 10:35   No:14043     
Title: Re:構造体について    
3個の座標を入力してるのに
calc_triangle(XYdata a, XYdata b);
では2個しか使ってないから?

>>boxさん
ソースはフロッピーのアイコンをクリックすると見られます。


81ポイント を手に入れた。

Name: やそ  ..上級者(19,799ポイント)   Date: 2008/02/05(火) 11:37   No:14046     
Title: Re:構造体について    
三角形の面積の公式は
「底辺×高さ÷2」と小学校で習いますが、他にも公式があります。

面積 = (1/2) × 2辺の掛け算 × その間の角のサイン

※(1/2)・・・2分の1のつもり^^

でも求められます。

1.1辺の長さと両端の角度
2.2辺の長さとその間の角度
3.3辺の長さ

のどれかが分かればそれぞれ別の公式を用いて面積を求めることが出来ます。

今回は2番を用いて求めようとされているようです。
が、辺A(len_a)、辺B(len_b)を求める処理ですが・・・

ピタゴラスの定理では(ここで説明する定理の辺Aは問題の辺Aとは関係有りません)
辺Aと辺Bの間の角度が90度とすると、
 (辺Cの長さ)^2 = (辺Aの長さ)^2 + (辺Bの長さ)^2
ですよね。

なので座標(点)でしかないa.x、a.yを2乗してもだめじゃないでしょうか? 
点aと点bを結ぶ辺Aを求めるならば・・・
1. a.y-b.yにて差を求め絶対値を取ります。(点aと点bの間の高さが求められます。辺Xとする)
2. a.x-b.xにて差を求め絶対値を取ります。(点aと点bの間の横軸の長さが求められます。辺Yとする)
3. 辺A^2=辺X^2 + 辺Y^2
4. 出た答えの平方根を取る。

により求まります。
これを応用して考えてみてください。

それと、toyoさんの言われるとおり2点しか渡していないと2辺は測定できません^^;
ちゃんと3点渡しましょうね^^
(間違っていたらゴメンナサイ((((((^_^;)


299ポイント を手に入れた。

Name: box  ..ハッカー(106,723ポイント)   Date: 2008/02/05(火) 12:21   No:14047     
Title: Re:構造体について    
これは大変失礼な投稿をしてしまいました。
申し訳ございません。


7ポイント を落としてしまった。

Name: tkmakwins15 [URL]  ..熟練のプログラマー(56,459ポイント)   Date: 2008/02/05(火) 17:16   No:14054     
Title: Re:構造体について    
ちなみに、3辺が求まっている三角形の求め方として、「ヘロンの公式」があります。具体的には…

3辺をそれぞれa,b,cとすると,三角形の面積Sは…

T=(1/2)×(a+b+c)ならば
/___________________
S=/ T(T-a)(T-b)(T-c)


という方法があります。


35ポイント を手に入れた。

Name: やそ  ..上級者(20,500ポイント)   Date: 2008/02/05(火) 17:53   No:14055     
Title: Re:構造体について    
ヘロンの公式、ありましたね^^

3辺の長さが分かっていれば、角度は問わず面積が出せるなんて、すばらしい公式ですね。

まあ、どの公式を使うかはけるびんさんの自由だ〜!!(by犬井ヒロシ)




57ポイント を手に入れた。

Name: けるびん  ..入門者(4,447ポイント)   Date: 2008/02/06(水) 00:26   No:14061 解決!     
Title: Re:構造体について    
みなさん返信ありがとうございます。

完全に勘違いしてましたね。座標は3こ入力してるのに、関数で2こしか引数書いてないなんて。。

あれから友達にやり方を聞いたところ、

友達のプログラムでは基本となる座標を原点に一度合わせてから計算するというものでしたが、

3辺さえ分かればヘロンの公式を使い、角度無しでいけるという事なので

ヘロンの公式使ってやり直しをしてみようと思います♪



ヘロンの公式 is Freedom(笑)


141ポイント を手に入れた。

Name: PK  ..ぴよぴよ(28ポイント)   Date: 2008/02/06(水) 04:00   No:14064     
Title: Re:構造体について    

|x1 x2 x3|
S = |y1 y2 y3| * 0.5
| 1 1 1|
もシンプルで良いですよ。(x1,y1),(x2,y2),(x3,y3)を頂点とする三角形の面積が|S|です。


28ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(509,953ポイント)   Date: 2008/02/07(木) 15:00   No:14104     
Title: Re:構造体について    
余計な事ですが、
携帯で投稿すると、アイコンが表示されません。
なので、投稿がPCからか携帯からかわかります。
そして、携帯から見ていると、添付ファイルが見れないので、投稿にファイルが添付されているかどうかわかりません。なので誤解されたのだと思います。
すみませんが、掲示板の仕様のようなのでよろしくお願いしますm(_ _)m


96ポイント を手に入れた。



Name: ウィンドウ  ..ぴよぴよ(56ポイント)   Date: 2008/02/07(木) 11:34   No:14096       
Title: 無題    
ウインドウモードの時にはちゃんと画像が表示されるのフル画面でで表示するとおかしくなります。
どんな原因があるのでしょうか??


56ポイント を手に入れた。


Name: 管理人 [URL]  ..伝説のハッカー(509,952ポイント)   Date: 2008/02/07(木) 12:44   No:14098     
Title: Re:無題    
もう少し詳しく書いていただかないとよくわかりませんが、
http://homepage2.nifty.com/natupaji/DxLib/
こちらの質問コーナーの過去ログに似たようなトラブルが無いか、お探しになったうえで、無いようでしたら、
DXライブラリの内部的な事になるとこちらでわかりかねますので、
そちらの質問掲示板にお聞き下さい。


84ポイント を手に入れた。



Name: kanna  ..ぴよぴよ(71ポイント)   Date: 2008/02/06(水) 16:46   No:14075       
Title: 質問です。    
DXライブラリを用いて、名前をつけて保存や、ファイルの呼び出しなどといった事は
可能なんですか?

もし出来るんでしたら、サンプルプログラム等あれば助かるんですが。
どなたか教えていただけませんか?


71ポイント を手に入れた。


Name: バグ  ..比類無きプログラマー(74,476ポイント)   Date: 2008/02/06(水) 17:03   No:14076     
Title: Re:質問です。    
それだけならば、わざわざDXライブラリを使用する必要は無いような気がしますが…?

44ポイント を手に入れた。

Name: kanna  ..ぴよぴよ(166ポイント)   Date: 2008/02/06(水) 17:46   No:14078     
Title: Re:質問です。    
初心者的な質問してしまい、すいません。

DXライブラリを用いなくても出来るんですか?
どのようにやればよいか教えてもらえないでしょうか・・・

私の持っている本ではどこにも書いてないんですよ・・・


95ポイント を手に入れた。

Name: やそ  ..上級者(21,743ポイント)   Date: 2008/02/06(水) 18:17   No:14079     
Title: Re:質問です。    
グーグルなどで検索してみましたか?

ちょっと検索をかければすぐに出てきます。(検索キーワード次第では)

http://wisdom.sakura.ne.jp/system/winapi/common/common6.html



16ポイント を手に入れた。

Name: kanna  ..ぴよぴよ(100ポイント)   Date: 2008/02/06(水) 18:47   No:14080 解決!     
Title: Re:質問です。    
初歩的な問題でしたね。
申し訳ありません。

やそさんの教えてくれたサイトを参考に勉強してみます。
ありがとうございました。


66ポイント を落としてしまった。

Name: バグ  ..比類無きプログラマー(74,506ポイント)   Date: 2008/02/06(水) 18:55   No:14081     
Title: Re:質問です。    
初歩的な質問が悪い訳ではありませんよ。みんな最初は分からない事だらけですからね(^-^)
それでは頑張ってください。


30ポイント を手に入れた。

Name: kanna  ..ぴよぴよ(147ポイント)   Date: 2008/02/06(水) 19:39   No:14082     
Title: Re:質問です。    
バグさん、ありがとうございます。
おかげでますますやる気が出ました。
頑張ってC言語マスターしたいと思います。



47ポイント を手に入れた。

Name: やそ  ..上級者(22,056ポイント)   Date: 2008/02/07(木) 09:36   No:14094     
Title: Re:質問です。    
kannaさんへ

こちらも言葉足らずでした。
バグさんの言われるとおり、初歩的な質問だろうと高度な質問だろうとどんな質問でも、投げかけることはぜんぜん問題になりません。
というか、質問があったほうが活気が出てイイんじゃないかな^^

このファイル関連のコモンダイアログなどはいつもいろんなソフトで何気に見ている割に、その作成方法の書かれた冊子は少ないと思います。
お高ーい本には載っているのでしょうけどね^^;

webの検索はいろんなキーワードで試さないと、自分の欲しい情報にHITしないことが多々有りますので、
いろんな角度から何度も挑戦してみましょう。

また、一度見つけた「良さ気なサイト」は気軽にブックマークしておきましょう^^


313ポイント を手に入れた。

Name: バグ  ..比類無きプログラマー(74,349ポイント)   Date: 2008/02/07(木) 10:40   No:14095     
Title: Re:質問です。    
ネットでの検索は非常に便利ですが、むしろ一冊くらいは高価な本を買った方が、自分の中で本気度が増すんではないでしょうか?(笑)

私が入社した当時(といっても2年程前ですが…)、職場の環境がVC++6.0でMFCを使用した仕事が主だったので、入社と同時に林晴比古著の『新 Visual C++6.0 入門』という書籍のスーパービギナー編、ビギナー編、シニア編、それからC言語に関する書籍を数札まとめて買いました。全部で10000円は軽く超えていたと思います。

C言語やC++に関しては全くの無知状態でしたので、自分を追い込む意味では良い刺激になりました(苦笑)


157ポイント を落としてしまった。



Name: ゆりっこ  ..ぴよぴよ(104ポイント)   Date: 2008/02/06(水) 23:49   No:14089       
Title: 10進数を2進数に変換させたい。    
入力された10進数の数値を2進数に変換する、プログラムを教えてください。
仕様がありまして、2進数を求めるには、入力された10進数の数値を、for文を使用し商が0になるまで2で割り、2進数の値を求め、表示させなければいけません。
ご教授お願いいたします。


104ポイント を手に入れた。


Name: 組木紙織  ..プログラマー(34,458ポイント)   Date: 2008/02/07(木) 00:32   No:14090     
Title: Re:10進数を2進数に変換させたい。    
>仕様がありまして、2進数を求めるには、入力された10進数の数値を、for文を使用し商が0になるまで2で割り、2進数の値を求め、表示させなければいけません。

ほとんど2進数への変換方法ですが、2進数にするためには、商でなく、余りを使います。
余りを逆順に並べていくといえばいいのかな。
詳しいやり方は"2進数"で探せばすぐ見つかると思います。

下のは、仕様に従っていませんが、10進数から2進数に変換するプログラムです。
結果をみて、参考までにどうぞ。


#include <stdio.h>

void dtob(int num)
{
if(num>0){
dtob(num>>1);
printf("%d",num%2);
}
}

int main(void)
{
dtob(3);
return 0;
}


323ポイント を手に入れた。



Name: Cげんが〜  ..初心者(5,224ポイント)   Date: 2008/02/05(火) 18:28   No:14056       
Title: for文を用いたループについて    
いつもお世話になっております。
今回質問させていただきたいのは、for文を用いたループ処理です。
下記のように同じようなプログラムをループによってまとめたいんですが、
変数が多すぎてどのようにしたらよいのか、苦戦しております。
このように変数がいろいろ多くてもループ処理は可能なのでしょうか?
ご教授お願いいたします。

if(DLG==1)                               
{
DialogBox(hCurInst, "REACTDLG", NULL, (DLGPROC)ReactDlgProc);

strcpy(element[0].name , name);
strcpy(element[0].value , value);


}
else if(DLG==2)
{
DialogBox(hCurInst, "CONDENSADLG", NULL, (DLGPROC)CondensaDlgProc);

strcpy(element[0].name , Cname);
strcpy(element[0].value , Cvalue);


}
/ *************************************************************************************/
if(DLG==11)
{
DialogBox(hCurInst, "REACTDLG", NULL, (DLGPROC)ReactDlgProc);

strcpy(element[1].name , name);
strcpy(element[1].value , value);


}
else if(DLG==12)
{
DialogBox(hCurInst, "CONDENSADLG", NULL, (DLGPROC)CondensaDlgProc);

strcpy(element[1].name , Cname);
strcpy(element[1].value , Cvalue);


}
/****************************************************************************************/
if(DLG==21)
{
DialogBox(hCurInst, "REACTDLG", NULL, (DLGPROC)ReactDlgProc);

strcpy(element[2].name , name);
strcpy(element[2].value , value);


}
else if(DLG==22)
{
DialogBox(hCurInst, "CONDENSADLG", NULL, (DLGPROC)CondensaDlgProc);

strcpy(element[2].name , Cname);
strcpy(element[2].value , Cvalue);

/**********************************************************************************************/

}if(DLG==31)
{
DialogBox(hCurInst, "REACTDLG", NULL, (DLGPROC)ReactDlgProc);

strcpy(element[3].name , name);
strcpy(element[3].value , value);


}
else if(DLG==32)
{
DialogBox(hCurInst, "CONDENSADLG", NULL, (DLGPROC)CondensaDlgProc);

strcpy(element[4].name , Cname);
strcpy(element[4].value , Cvalue);


}

/************************/ と /*****************************/で囲まれた部分の繰り返しです。


945ポイント を手に入れた。


Name: PK  ..ぴよぴよ(485ポイント)   Date: 2008/02/06(水) 04:34   No:14065     
Title: Re:for文を用いたループについて    
コードの流れからいって、最後のelement[4]はelement[3]なのでは?

void copy_struct(struct* element, char* szName, char* szValue)
{
strcpy(element->name, szName);
strcpy(element->value, szValue);
}
void ShowDlgR(int n)
{
DialogBox(hCurInst, "REACTDLG", NULL, (DLGPROC)ReactDlgProc);
copy_struct(element + n, name, value);
}
void ShowDlgC(int n)
{
DialogBox(hCurInst, "CONDENSADLG", NULL, (DLGPROC)CondensaDlgProc);
copy_struct(element + n, Cname, Cvalue);
}

(コード本体)
{
if (DLG == 1) ShowDlgR(0);
else if (DLG == 2) ShowDlgC(0);

if (DLG == 11) ShowDlgR(1);
else if (DLG == 12) ShowDlgC(1);

if (DLG == 21) ShowDlgR(2);
else if (DLG == 22) ShowDLgC(2);

if (DLG == 31) ShowDlgR(3);
else if (DLG == 32) ShowDlgC(4); // 本当はShowDlgC(3)?
}

このように、コードは短くできます。
ダイアログボックスの処理内容次第で変数DLGの値が変わるのでしょうか...。
それによってループもサブルーチンも変わるので、詳しく書いてください。
関数DialogBox()は閉じるまで制御が返らないので、普通の関数同様の感覚で使ってよいと思います。
ループを組みたい位置も/******/がみっつあるのでもう少し詳しく+判りやすくお願いします。
疑問点もあげておきます。

(1)if〜else if 文においてデフォルトの処理は必要ないのですか?
(2)関数DialogBox()の戻り値は必要ないのですか?

あと、できれば上記コードにおける関数copy_struct()は、できるだけ関数DialogBox()内で処理させましょう。

あ、もしかして

(コード本体)
{
int i;

for(i = 0; i < 4; i++)
{
if (DLG == i * 10 + 1) ShowDlgR(i);
else if (DLG == i * 10 + 2) ShowDlgC(i); // (i)のところを、((i == 3) ? 4 : i)
}
}
ということですか?


457ポイント を手に入れた。

Name: Cげんが〜  ..初心者(5,458ポイント)   Date: 2008/02/06(水) 15:10   No:14072 解決!     
Title: Re:for文を用いたループについて    
質問の内容不足だったようで、申し訳ございませんでした。
やりたかった事は、同じような処理を100個ほど書かなくてはならなかった為、
ループにてまとめれないか?という疑問でした。

しかし、PKさんの

> for(i = 0; i < 4; i++)
> {
> if (DLG == i * 10 + 1) ShowDlgR(i);
> else if (DLG == i * 10 + 2) ShowDlgC(i); // (i)のところを、((i == 3) ? 4 : i)
> }

を参考にさせていただきましたおかげで、
上手く出来ました。
本当にありがとうございました。

またこれからもC言語頑張らせていただきます。


234ポイント を手に入れた。



Name: 雪中 蓮  ..初心者(7,605ポイント)   Date: 2008/02/04(月) 22:10   No:14035       
Title: アプリケーションエラーになるのですが・・・    
こんにちは。今、学校の課題で出されていたテトリスのAIを改造していたのですが
関数の最後のreturnでアプリケーションエラーがでてしまうのですが、
どうすればなおるのでしょうか?

その関数部分のみ貼っておきます。

int mitudo(const int field[FIELD_HEIGHT][FIELD_WIDTH], const int block[BLOCK_SIZE][BLOCK_SIZE], int posX, int xMin, int xMax){
int sField[FIELD_HEIGHT][BLOCK_SIZE];
int sBlock[BLOCK_SIZE][BLOCK_SIZE];
int aki;

for(int y = 0; y < FIELD_HEIGHT; y++){
int x2;
for(int x = 0, x2 = posX-BLOCK_SIZE/2; x < BLOCK_SIZE; x++,x2++){
sField[y][x]=field[y][x2];
}
}

for(int y = 0; y < BLOCK_SIZE; y++){
int x2;
for(int x = 0, x2 = xMin; x < BLOCK_SIZE; x++,x2++){
sBlock[y][x]=block[y][x2];
}
}

int Fitflg=0, posY=0;
while(!Fitflg){
for(int y=BLOCK_SIZE-1;y>=0&&!Fitflg;y--)
{ for(int x=0;x<BLOCK_SIZE&&!Fitflg;x++)
{ //ブロックが存在すれば
if(sBlock[y][x]!=0)
{//フィールド上の座標を取得
int fy = posY + y;
int fx = x;
//縦幅チェック
if(FIELD_HEIGHT < fy || sField[fy][fx]!=0)
{
posY--;
for(int y2=0;y2<BLOCK_SIZE;y2++){
for(int x2=0;x2<BLOCK_SIZE;x2++){
sField[posY+y2][x2]=sBlock[y2][x2];
}
}
Fitflg++;
}
}
}
}
posY++;
}

int lastY;
aki=0;
for(int x=0;x<BLOCK_SIZE;x++){
for(int y=0; y<FIELD_HEIGHT; y++){
if(sField[y][x]){
lastY=y;
}
}

for(int y=FIELD_HEIGHT-1;y>lastY;y--){
if(!sField[y][x]) aki++;
}
}

return aki; //←この部分でアプリケーションエラーと出る
}

よろしくお願いします。


726ポイント を手に入れた。


Name:  ..上級者(23,575ポイント)   Date: 2008/02/05(火) 13:45   No:14050     
Title: Re:アプリケーションエラーになるのですが・・・    
<pre>で囲んでください。
テトリスでAI?
>int Fitflg=0, posY=0;
はCでも認められてたっけ?
>int lastY;
これも。

とりあえず、最初に初期化してみたら?


76ポイント を手に入れた。

Name: 雪中 蓮  ..初心者(7,716ポイント)   Date: 2008/02/05(火) 15:30   No:14053     
Title: Re:アプリケーションエラーになるのですが・・・    
回答ありがとうございます。

初期化を最初にしてみてもなりませんでした。
コンパイル自体はちゃんと通るのですが、
いざ実行させると小窓が出て、アプリケーションエラーと出て

"0x00000000"の命令が"0x00000000"のメモリを参照しました。メモリが"read"になることはできませんでした。

というメッセージが出るんです。


111ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..熟練のプログラマー(56,369ポイント)   Date: 2008/02/05(火) 18:29   No:14057     
Title: Re:アプリケーションエラーになるのですが・・・    
returnの前にストップさせる関数をいれるとどうなりますか。それぞれのストップ命令は以下です。

コンソールプログラム。→getchar()
Windows API→MessageBox(NULL,"","",MB_OK)
Dxライブラリ→WaitKey()



90ポイント を落としてしまった。

Name: Justy  ..ハッカー(173,031ポイント)   Date: 2008/02/05(火) 22:25   No:14059     
Title: Re:アプリケーションエラーになるのですが・・・    
 スタック破壊していませんか?
 具体的に言うと mitudo()の最もネストが深い部分

  sField[posY+y2][x2]=sBlock[y2][x2]

 ここで sFieldへ書き込みを行っていますが、posY+y2や x2の値は
配列の範囲内に収まっていますか?


2倍のポイントを手に入れた! 124ポイント を手に入れた。

Name: 雪中 蓮  ..初心者(7,773ポイント)   Date: 2008/02/06(水) 01:59   No:14063 解決!     
Title: Re:アプリケーションエラーになるのですが・・・    
回答ありがとうございます。
そして遅くなって申し訳ありません。

デバックしてみたら、Justyさんの仰ってたように
スタック破壊をしてしまっていたようです。

回答してくれた皆さんどうもありがとうございました。


57ポイント を手に入れた。



Name: ф魔理沙ф  ..ぴよぴよ(75ポイント)   Date: 2008/01/24(木) 22:16   No:13710       
Title: シューティングゲームのタイトル画面について    
えっとC言語歴2年(真面目やり始めて2ヶ月)のいつもサイト拝見させてもらってる者です。

今、サイトを参考にしつつシューティングゲームを制作させてもらってるのですが、

館のプログラムだとタイトル画面からGameStartを押すとゲーム開始みたいなことが

乗っていなかったので(見落としかもしれませんが^^;

ちょっと聞きたいんですが、どのようにしたらそんな感じにできるのでしょうか?

自分的にはmain.cppの方で全てのゲームの流れをやりたいのですが・・・

とりあえずサイトの方は一通りやってみました。



75ポイント を手に入れた。


Name: はね  ..入門者(4,554ポイント)   Date: 2008/01/24(木) 23:42   No:13717     
Title: Re:シューティングゲームのタイトル画面について    
はじめまして。
私はいつも列挙型で下のように書いています。


enum{
TITLE,
RUN,
GAMEOVER,
CLEAR,
};
int State= TITLE;

メインループ{
switch(State){
case TITLE:
タイトルで処理する関数
break;
case RUN:
プレイ画面(?)で処理する関数
break;
case GAMEOVER:
    ゲームオーバーで処理する関数
break;
case CLEAR:
    クリア画面で処理する関数
break;
}
}
のようなことを書いています。
int型変数を用いて、1ならタイトル、2ならクリアー。のように書いても良いと思いますが
パッと見でわかりやすいので列挙型を使っています。


186ポイント を手に入れた。

Name: ф魔理沙ф  ..ぴよぴよ(0ポイント)   Date: 2008/01/25(金) 00:23   No:13723     
Title: Re:シューティングゲームのタイトル画面について    
返信ありがとうございます"(*^^)/。・:*:・゜★,。・:*:・゜☆

何となく感覚的にわかるんですが・・・[壁]-T)

えっと、メインループのところで

switch(State){
case TITLE:
タイトルで処理する関数
break;
case RUN:
プレイ画面(?)で処理する関数
break;
case GAMEOVER:
    ゲームオーバーで処理する関数
break;
case CLEAR:
    クリア画面で処理する関数
break;
}
}

のコードの「タイトルで処理する関数」とかありますが、

その処理をほかのcppファイル丸ごと引っ張ってくるにはどうすればいいのでしょう?

一個一個の関数をグローバルで引っ張って来た方がいいのでしょうか?

すいません初心者で[壁]-T)授業中寝てばっかりなので・・・(‐‐).。oO


304ポイント を落としてしまった。

Name: はね  ..入門者(4,852ポイント)   Date: 2008/01/25(金) 01:02   No:13732     
Title: Re:シューティングゲームのタイトル画面について    
呼び出したい関数をプロトタイプ宣言すれば大丈夫ですよ。

======Title.cpp=====================================
void Title(){
処理云々
}
====================================================

=======main.cpp=====================================
//プロトタイプ宣言
void Title();

メインループ{
Title();
}
====================================================

でいけます。

ちなみに、
プロトタイプ宣言はそのcppファイルがインクルードしているヘッダーファイルで行うのが一般的です。

詳しくは「ヘッダーファイル」や「プロトタイプ宣言」で調べてみてください。


298ポイント を手に入れた。

Name: ф魔理沙ф  ..ぴよぴよ(161ポイント)   Date: 2008/01/25(金) 02:04   No:13735     
Title: Re:シューティングゲームのタイトル画面について    
やり方はわかりました。ありがとうございます(≧∇≦)/

それで早速やってみたのですが、

int START = title;

の宣言のことで
error C2628: '<unnamed-tag>' の後に 'int' を続けて記述できません(セミコロン ';' で区切ってあるか確認してください)。

と出てはじかれてしまいます。何ででしょうか?

何度も質問ばっかりですいません(ノ_<。)


161ポイント を手に入れた。

Name: ф魔理沙ф  ..ぴよぴよ(550ポイント)   Date: 2008/01/25(金) 02:30   No:13739     
Title: Re:シューティングゲームのタイトル画面について    
すいません。↑の問題は自己解決できました^_^;

しかし次は処理のことでわからないのですが、

当然の事ながらcase文で囲ってある以上、値を変化させないといけないですよね?

それで、はねさんの言うとおり

======Title.cpp=====================================
void Title(){
処理云々
state = RUN
}
====================================================

=======main.cpp=====================================
//プロトタイプ宣言
void Title();

メインループ{
case title:
Title();
case RUN:
ゲーム処理
}
====================================================

という形でプログラムを組んでみたのですが、

なぜか宣言の段階ではじかれてるみたいでうまくいきません。

ちなみにtitle.cppのほうではじかれています。

またしてもご教授お願いいたします(ノ_<。)



389ポイント を手に入れた。

Name: はね  ..入門者(4,939ポイント)   Date: 2008/01/25(金) 02:40   No:13740     
Title: Re:シューティングゲームのタイトル画面について    
int START = title;
は間違っていないですし、
それだけでは憶測でしか言えないのですが、
エラーを見るかぎり、「;」が抜けているかもしれないです。

今回の処理で間違いやすい点としてはenumに;を忘れることが多いです。

enum{
title,
};←
最後に;がありますでしょうか?

もし解決しなければ、よろしければソースを見せてください。


87ポイント を手に入れた。

Name: はね  ..初心者(5,001ポイント)   Date: 2008/01/25(金) 02:46   No:13741     
Title: Re:シューティングゲームのタイトル画面について    
おっと、入れ違いになってしまいましたね^^;

上のソースを見る限り、
state = RUN に;が無いのですがどうでしょう?



62ポイント を手に入れた。

Name: ф魔理沙ф  ..ぴよぴよ(499ポイント)   Date: 2008/01/25(金) 02:57   No:13742     
Title: Re:シューティングゲームのタイトル画面について    
あ、すいません(ノ_<。)

そこの部分は手打ちしたので抜けていました。

プログラムの方はしっかりと入っています。


51ポイント を落としてしまった。

Name: はね  ..初心者(5,084ポイント)   Date: 2008/01/25(金) 03:05   No:13743     
Title: Re:シューティングゲームのタイトル画面について    
>プログラムの方はしっかりと入っています。
そうでしたか。

だと、現状の情報ではわからないので
エラーと、もしよければソースを見せていただけないでしょうか?


83ポイント を手に入れた。

Name: ф魔理沙ф  ..かけだし(1,234ポイント)   Date: 2008/01/25(金) 03:13   No:13745     
Title: Re:シューティングゲームのタイトル画面について    
あ、すいません^^;

えっと長いですけどのせてみます。

=======main.cpp=====================================
 

#include "DxLib.h"
#include "GlobalVariable.h"


enum{
TITLE,
RUN,
GAMEOVER,
CLEAR,
};
int State = TITLE;

int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){

extern void img_sound_load();
extern void initialization();
extern void SetColor();
extern void Background();
extern void PlayerShotCalc();
extern void PlayerShotDisp();
extern void PlayerControl();
extern void EnemyControl();
extern void EnemyCalcDisp();
extern void EnemyShotControl();
extern void EnemyShotCalcDisp();
extern void CollisionDetection();
extern void Background2();
extern void FpsTimeFanction();
extern void title();
int RefreshTime=0;

ChangeWindowMode( TRUE ) ;
if( DxLib_Init() == -1 ) return -1;

SetDrawScreen( DX_SCREEN_BACK ) ; //裏画面を使用する。

img_sound_load();
initialization();
SetColor();

while(ProcessMessage() == 0 && GetHitKeyStateAll(Key) == 0){
switch(State){
case TITLE:
title();
break;
if(Key[KEY_INPUT_ESCAPE]==1)
break; //Escapeが押されたら終了
while(GetNowCount() - RefreshTime < 17);//1周の処理が17ミリ秒になるまで待つ


case RUN:
RefreshTime = GetNowCount(); //今の時間を取得
ClearDrawScreen(); //裏画面のデータを全て削除

Background();

PlayerShotCalc();

PlayerShotDisp();

PlayerControl();

EnemyControl();

EnemyCalcDisp();

EnemyShotControl();

EnemyShotCalcDisp();

CollisionDetection();

Background2();

FpsTimeFanction();

ScreenFlip() ; //裏画面データを表画面へ反映

counter++;
break;

if(Key[KEY_INPUT_ESCAPE]==1)
break; //Escapeが押されたら終了
while(GetNowCount() - RefreshTime < 17);//1周の処理が17ミリ秒になるまで待つ

case GAMEOVER:
break;
case CLEAR:
break;
}
}
DxLib_End();
return 0;
}

====================================================

=======title.cpp=====================================

#include "DxLib.h"
#include "ExternGV.h"


void title(){
DrawGraph(0,0,img_background[2],FALSE);
if(CheckHitKeyAll()==1)
State = RUN;
}

====================================================

とこんな感じになっています。どうでしょうか?




851ポイント を手に入れた。

Name: はね  ..初心者(5,190ポイント)   Date: 2008/01/25(金) 03:22   No:13746     
Title: Re:シューティングゲームのタイトル画面について    
enum と int State がローカルになっているので
Title.cppでは見つけられません。

たぶんエラー内容は「State がみつかりません」とかなっているのではないでしょうか?

enum と int State をグローバルにしてください。


106ポイント を手に入れた。

Name: ф魔理沙ф  ..かけだし(1,275ポイント)   Date: 2008/01/25(金) 03:43   No:13747     
Title: Re:シューティングゲームのタイトル画面について    
ご教授の通りグローバルで宣言してみました。

そうしたら今度は再定義のエラーがでてしまいました。

何ででしょう?(ノ_<。)


41ポイント を手に入れた。

Name: ф魔理沙ф  ..かけだし(1,407ポイント)   Date: 2008/01/25(金) 04:02   No:13748     
Title: Re:シューティングゲームのタイトル画面について    
すいません。↑の奴の修正です。

グローバルで

extern enum{
TITLE,
RUN,
GAMEOVER,
CLEAR,
};
extern int State;


と宣言したら、一応エラーは無くなって動くことはできたのですが、

これだとStateに何も入っていないので動かしても真っ黒なままです。

なのでextern int State=TITLEとしたいのですが、これだと再定義が出るようです。

どうしたらいいでしょうか?


132ポイント を手に入れた。

Name: はね  ..初心者(5,605ポイント)   Date: 2008/01/25(金) 04:26   No:13749     
Title: Re:シューティングゲームのタイトル画面について    
GlobalVariable.hに
enum{
  TITLE,
  RUN,
  GAMEOVER,
  CLEAR,
};

int State=TITLE;

と書いていますか?

externはどこかにその変数や関数がある。という意味ですので(私の勝手な概念の解釈ですが^^;)
どこかで定義しないと意味ないです。

つまり、

=========GlobalVariable.h============

enum{
  TITLE,
  RUN,
  GAMEOVER,
  CLEAR,
};

int State=TITLE;

=============================

===========ExternGV.h=============

enum{
  TITLE,
  RUN,
  GAMEOVER,
  CLEAR,
};

extern int State;
=============================

と書いてみてください。


415ポイント を手に入れた。

Name: ф魔理沙ф  ..かけだし(1,497ポイント)   Date: 2008/01/25(金) 04:52   No:13750 解決!     
Title: Re:シューティングゲームのタイトル画面について    
なんとか無事にタイトル画面→ゲームができました(-^〇^-)

長いことありがとうございました。☆⌒(*^∇゜)v

あといろいろすいませんでした。(×_×;)

いろいろ勉強になりました、またご教授お願いします♪



90ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(496,733ポイント)   Date: 2008/01/25(金) 14:03   No:13763     
Title: Re:シューティングゲームのタイトル画面について    

今、家からネットに繋がらないので、夜は返信が出来ず、すみません(_ _||)

いちいち
=========GlobalVariable.h============
の中身も
===========ExternGV.h=============
の中身もかえるのめんどくさいですよね。
こちら、変更が一度で済む方法があるので、よければご参考下さい。

まず、main関数のあるファイルの一番最初に

#define _GLOBAL_INSTANCE_

と書き、他のファイルにはこれを書きません。
そしてGlobalVariable.h内で、

#ifdef _GLOBAL_INSTANCE_
#define GLOBAL
#else
#define GLOBAL extern
#endif

と書きます。
この意味は

main関数のあるファイルからこのヘッダファイルが呼ばれたときは、
「GLOBAL」という文字列は「空白」に置き換えて、

他のファイルからこのヘッダファイルが呼ばれたときは、
「GLOBAL」という文字列は「extern」という文字列に置き換えてね

という意味になります。

だから、これからは、全てのファイルからGlobalVariable.hを呼び、
ExternGV.hは使わないので削除してOKです。

今までGlobalVariable.hで

int func_state;

などと宣言していた部分は

GLOBAL int func_state;

に置き換えてください。オートで必要に応じてexternにしてくれる仕様になり便利です。
こうすると、宣言と同時に値代入が出来なくなるので注意してください。

GLOBAL int func_state=2;

などと書くとエラーになります。これは

extern int func_state=2;

が出来ないのと同じ理由です。
定義で、

#define GLOBAL_VAL(v) =(v)

などを用いれば出来ることは出来るのですが、
値の初期化は初期化関数を作って行ったほうがいいので、
自然と宣言と同時に値格納は使わなくてもよくなると思いますので・・。

ご参考までに。

 


787ポイント を手に入れた。

Name: ф魔理沙ф  ..かけだし(1,566ポイント)   Date: 2008/01/26(土) 03:09   No:13796     
Title: Re:シューティングゲームのタイトル画面について    
なるほど〜そういう方法もあるわけですねぇ〜

さすがは管理人様です(≧∇≦)/

とっても勉強になります。(-^〇^-)

早速試してみますね♪


69ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(502,929ポイント)   Date: 2008/01/26(土) 04:02   No:13797     
Title: Re:シューティングゲームのタイトル画面について    
最初はややこし〜な〜と思ったり、普段のでいいよ、と思ったりするかもしれませんが、
覚えたらずっとこっちの方が楽なのでおススメです。

後、ご存知だと思いますが、沢山のものを一気に置換する時は

エディタの「置換」という機能を使えば便利です。
今回の場合ですと、GlobalVariable.hのファイル内で

int



GLOBAL int

で置換すればいいでしょう。double,char等がある場合はそちらも。
VS2005などのコンパイラなら、単語単位で置換とか、オプション色々ありますので、必要に応じてご利用下さい。
VSならCtrl + Hで置換ウィンドウがでてきます。

今日は質問が色々あったので、大学まで出てきましたが、もう遅いので、そろそろ帰ります。
何かわからないことがあれば、またノコノコ出てきますので、遠慮なくどうぞm(_ _)m


218ポイント を手に入れた。

Name: シー  ..ぴよぴよ(58ポイント)   Date: 2008/01/30(水) 12:39   No:13881     
Title: Re:シューティングゲームのタイトル画面について    
私も上を参考に作らせてもらったのですが、「error C2018: 文字 '0x81' は認識できません。」と出るのですが、どうしたらいいですか?


58ポイント を手に入れた。

Name: バグ  ..比類無きプログラマー(73,206ポイント)   Date: 2008/01/30(水) 13:06   No:13882     
Title: Re:シューティングゲームのタイトル画面について    
どこかに全角スペースがあるのだと思います。それを削除するか、半角スペースに書き換えればいけると思いますよ。

36ポイント を手に入れた。

Name: シー  ..ぴよぴよ(97ポイント)   Date: 2008/02/05(火) 18:42   No:14058 解決!     
Title: Re:シューティングゲームのタイトル画面について    
返信遅れました。
バグさん、ありがとうございました。おかげさまで、エラーが取れました。


39ポイント を手に入れた。



Name: カル  ..入門者(2,646ポイント)   Date: 2008/01/24(木) 21:50   No:13709       
Title: カレンダーについて    

#include<stdio.h>

int main() {

int iyear,imonths,iday;
int sum,i;
int m_array[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
char*cweek[7] = {"日","月","火","水","木","金","土"};

sum =0;
printf ("input (e.g. ****/**/**)\n>>");
scanf ("%d/%d/%d",&iyear,&imonths,&iday);
/*閏年の判定*/
if ((imonths >2) && ((iyear % 4 == 0) && ((iyear % 100 !=0) || (iyear % 400 == 0)))) {
sum++;
}
/*前月までの日数*/
for (i =0; i < imonths-1; i++) {
sum += m_array[i];
}

iyear--;
/*前月と前年度と今月の日数の合計*/
sum = sum + iyear * 365 + (((iyear / 4)-(iyear / 100))+(iyear / 400))+iday;
printf("%s曜日",cweek[sum%7]);
return 0;

}

「このプログラムを利用した今年のカレンダーを表示させる」
外部変数、goto文は使わない、途中でreturn exitは使えない
意味のある定数はマクロ(define文)とする
関数名 変数名の命名規約を守る

カレンダー表示の問題なんですがさっぱりわかりません
ググってはみたのですがわかりませんでした
まずはどうしたらいいのでしょうか?



520ポイント を手に入れた。


Name: カル  ..入門者(2,657ポイント)   Date: 2008/01/25(金) 12:46   No:13756 解決!     
Title: Re:カレンダーについて    
スイマセン完全に丸投げでした

11ポイント を手に入れた。

Name: やそ  ..上級者(15,394ポイント)   Date: 2008/01/25(金) 13:03   No:13758     
Title: Re:カレンダーについて    
そうですねえ^^;

見るからに丸投げですよね〜(苦笑)

<pre>
の”<”、”>”も半角で書いてくださいね。

で、前回作成したプログラムを使ってカレンダーを表示する。ですか。

難しいことはそれほどないと思います。

2008年1月1日から2008年12月31日を1日ずつ曜日取得して表示して、日めくりカレンダーの出来上がり(笑)










ゴメンナサイm(_ _)m


ですけど、
「このプログラムを利用した今年のカレンダーを表示させる」
だけでは仕様が確定できません^^;

カルさんも知っておられると思いますが、市販されているカレンダーだけでも千差万別。
1ヶ月ごとのカレンダーでも横一列だったり縦一列だったり、一行=1週間だったり、
一行=1週間でも日曜始まりとは限らず、月曜始まりのほうがビジネスマンには便利だったりします(笑)
また、土日、祝祭日に色が付いているものいないもの。ブラックマンデー・・・じゃない(笑)ハッピーマンデーなんて迷惑な制度が出来たために、祝日も決め打ちが出来ず、曜日判定にて行わなければなりません。

出題者さんがどの程度のカレンダーを想定しておられるのかを今一度ご確認されたほうがよろしいかと思います。





400ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(495,473ポイント)   Date: 2008/01/25(金) 13:40   No:13760     
Title: Re:カレンダーについて    
カレンダーというからには、
日曜日から土曜日まで書いてあって、


日月火水木金土
     1 2 3
4 5 6 7 8 910
........

 
みたいなのを想像していらっしゃるのでしょう。
とりあえず、引数に「月の始まりの曜日、その月の日数」を渡したら、
カレンダーを表示する関数を作ってみてください。
それが出来ればあとは簡単だと思います。

そのプログラムをいじろうと思わず、一から書いてみてください。そのほうが簡単だと思います。


213ポイント を手に入れた。

Name: カル  ..入門者(2,697ポイント)   Date: 2008/01/25(金) 14:18   No:13766     
Title: Re:カレンダーについて    
アドバイスありがとうございます。
1から10まで教えてもらおうとした自分が恥ずかしいです


40ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(497,382ポイント)   Date: 2008/01/25(金) 14:27   No:13767     
Title: Re:カレンダーについて    
時間があったらもうちょっと丁寧に書くんですけどね(T_T
今日は午後7時までに論文提出なので特に忙しくて・・。

なので若干30秒で書いたようなプログラムなので
間違ってる可能性大ですが、とりあえず、こんな感じでやれば出来ますよね。
がんばってください。


#include <stdio.h>

void display(int day, int total_day){
int i,j,t;
char str_day[7][3]={"日","月","火","水","木","金","土"};
for(i=0;i<7;i++)
printf("%s ",str_day[i]);
printf("\n");

for(i=0;i<day;i++)
printf(" ");
for(j=i,t=1;t<=total_day;j++,t++){
printf("%2d ",t);
//jを使ってうまく改行を
}
}

int main(){
display(2,30);
}


245ポイント を落としてしまった。

Name: 管理人 [URL]  ..伝説のハッカー(498,132ポイント)   Date: 2008/01/25(金) 17:06   No:13771     
Title: Re:カレンダーについて    
お答えできるかわからないので、添削待ちの間に・・。



#include <stdio.h>

void display(int day, int total_day){
int i,j,t;
char str_day[7][3]={"日","月","火","水","木","金","土"};
for(i=0;i<7;i++)
printf("%s ",str_day[i]);
printf("\n");

for(i=0;i<day;i++)
printf(" ");
for(j=i,t=1;t<=total_day;j++,t++){
printf("%2d ",t);
if(j%7==6)
printf("\n");
}
printf("\n");
}

int main(){

int iyear,imonths,iday;
int sum,i;
int m_array[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
char*cweek[7] = {"日","月","火","水","木","金","土"};

sum =0;
printf ("input (e.g. ****/**)\n>>");
scanf ("%d/%d",&iyear,&imonths);
iday=1;
/*閏年の判定*/
if ((imonths >2) && ((iyear % 4 == 0) && ((iyear % 100 !=0) || (iyear % 400 == 0)))) {
sum++;
}
/*前月までの日数*/
for (i =0; i < imonths-1; i++) {
sum += m_array[i];
}

iyear--;
/*前月と前年度と今月の日数の合計*/
sum = sum + iyear * 365 + (((iyear / 4)-(iyear / 100))+(iyear / 400))+iday;
printf("\n%d年%d月は%s曜日から始まって%d日間あるから・・\n\n",iyear+1,imonths,cweek[sum%7],m_array[imonths-1]);

display(/*コ コ*/);
}

実行結果

input (e.g. ****/**)
>>2008/1

2008年1月は火曜日から始まって31日間あるから・・

日 月 火 水 木 金 土
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31


 
もう曜日がわかってるなら後は簡単ですよね。
急いで書いたので違うかもしれませんが、色つきの部分しか変更していません。
後はうるう年を入れてやれば・・。
どうでしょうか、解らないところがあれば聞いてください。


750ポイント を手に入れた。

Name: やそ  ..上級者(15,854ポイント)   Date: 2008/01/25(金) 17:42   No:13772     
Title: Re:カレンダーについて    
管理人さん、いつも答えすぎ(笑)
コレではカルさん自身が考えねばならないところがほとんどありませぬ^^;



55ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(498,036ポイント)   Date: 2008/01/25(金) 17:58   No:13773     
Title: Re:カレンダーについて    
失礼しました。
これでは丸投げでも答えますよと言っているようなものでしたね。

「display(/*コ コ*/);」

の部分を注釈に変更しておきました。
この部分を補って、うるう年の表示が出来るようにすれば完成です。


96ポイント を落としてしまった。

Name: カル  ..入門者(2,758ポイント)   Date: 2008/01/25(金) 19:41   No:13775     
Title: Re:カレンダーについて    
こんなに・・・わざわざスイマセン
私の身勝手な行動がこのような事を生んでしまったのですね
やそさん、管理人さん、申し訳ないです。

とりあえずやってみますね。
管理人さんは大学生なんですか?
卒論とか大変そうですね


61ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(498,867ポイント)   Date: 2008/01/25(金) 20:03   No:13777     
Title: Re:カレンダーについて    
最後に教授に見てもらおうと思って部屋まで行ったらもう帰ってました・・orz

はい、学生です。
もうすぐ修士論文の期限なので、ヒィヒィ言ってます。
しかもその後2つも他に発表する機会があって、英語にも訳さないといけなかったり、色々追われてまして、・・。

プログラムがさっぱりわからないという気持ちはわかりますよ。
この気持ち、自分がずっと将来熟練者の仲間入りが出来たとしても、忘れないようにしようと思っています。
私もまだまだ入門者の端くれですが、プログラムのコードをある程度見慣れてくると、調べる事や挫けず考えることに抵抗が無くなり、
プログラムがちょっとわからなくても、さっぱりで、嫌になってたころの記憶忘れてくるんですよね。
小さな事でプログラムがわからないといっている人間を見ると、
「それ位ちょっと調べたらわかるはずじゃん。お前が調べる気無いからだろう」
そう思うようになってくると思います。
でも、最初ってちょっとわからなくてもホント嫌になるし、何しらべたらいいかもわからないもんですよね。
今では朝から晩までアホみたいにゲームプログラム書いてたりしますが、
大学入ったころはCとかさっぱりで、よく友達が書いたコードそのまま学校に提出するような人間でした。
プログラムがよくわからないから、ウェブでも聞き方がわからず、丸投げしては怒られて、誰も相手にされない。
誰も相手にしてくれないからわからないし、嫌になるし・・。
悪循環でした。

熟練者からしたら丸投げする人間は「人の力借りて楽しようとするズルい奴」と思われるようです。
丸投げだと力にならないから・・などという言葉は立てまえの場合が多く、多くの場合は丸投げされると答える気が無くなるというのが本音だと思います。
でも、どう聞いたらいいかわからないんですよね。全部わからないんだから、聞きようがないジャン・・。
そう思ってました。
でも、それは自分にやる気がそこまで無かったからなんです。
少しわからなかったら、調べるのやめる・・その姿勢をなくし、もう少し頑張れば解けるものばかりでした。
学校で、出る問題なんて「解かそう」と思って出してるんだから、頑張ったら解けて当然なんです。
頑張って調べているうちに、「わからない場所」っていうのが解ってきます。
そんな「わからない箇所」を特定して質問すればみんな気持ちよく答えてくれます。
「どう質問するか」も解決する為の一つのスキルだと思いました。

なので、他の掲示板で相手にされないような質問者にもその時自分が求めていたような回答をしたいと日々思っています。
今どう思っていらっしゃるかはわかりませんが、Cが楽しくない、とか、別に興味ないと思えるのは、まだまだわかって無いからなんですよね。
解りかけてくると楽しいです。その壁を頑張って乗り越えてください。


714ポイント を手に入れた。

Name: カル  ..入門者(2,953ポイント)   Date: 2008/01/25(金) 23:52   No:13784     
Title: Re:カレンダーについて    
論文だらけですねw毎日ご苦労様です、明日は土日なのでゆっくりしてくださいといってもまた相談や質問してしまうかもしれませんが・・・管理人さんがおっしゃる通り今は楽しくないです、まったくわからない状態なんですけどわからないなりに勉強はしてるんです。今研修中でCを勉強しています、体験みたいなやつです。
でもさっぱりで・・・・人に聞いても帰ってくる答えの意味すら理解できてないしネットで見ても・・・・あ、基礎の方は最近分かり始めました(まだ全然ですけど)



195ポイント を手に入れた。

Name: カル  ..入門者(3,218ポイント)   Date: 2008/01/26(土) 00:00   No:13786     
Title: Re:カレンダーについて    
連続投稿失礼します
今日やった課題で疑問に思ったのですが
1234567 1234567 1234567と数字がありましてこれを
123456712345671234567
このように並べて画面に表示させるにはどうしたらいいか

#include <stdio.h>

int main()
{
int a, b;
for ( b = 0; b < 1; b++ ) {
for ( a = 0; a <= 3; a++ ) {
printf( "1234567");
}
printf( "\n" );
}
return 0
}

珍しく成功しました。ちょっと嬉しかったですwそれで今度はこの1234567,7個の数字を3回繰り返すようにするということなのですがこれってさっきやったfor文の二重ループと同じことなんでしょうか?


265ポイント を手に入れた。

Name: box  ..ハッカー(104,810ポイント)   Date: 2008/01/26(土) 00:23   No:13787     
Title: Re:カレンダーについて    
そのコードの場合、変数bに関するループは
不要であることがおわかりになりますか?


46ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(500,358ポイント)   Date: 2008/01/26(土) 00:26   No:13788     
Title: Re:カレンダーについて    
大学までまた来て見ました。

まず、プログラムについてですが、
お喜びのところ水を差すようですが、、、二重ループの意味が無いです。
外側のfor文を消しても同じ結果になることでしょう。
for ( b = 0; b < 1; b++ ) {
ってことは1回しか通らないからです。
もしやるならこうでしょう。


#include <stdio.h>

int main()
{
int a, b;
for ( b = 0; b < 3; b++ ) {
for ( a = 1; a <= 7; a++ ) {
printf("%d",a);
}
}
printf( "\n" );
return 0;
}

 
 
%dで値が表示できることはおkでしょうか?
あと、次の課題として出されている「1234567,7個の数字を3回繰り返すようにするということなのですが」という課題は
どういうことでしょう?


237ポイント を手に入れた。

Name: カル  ..入門者(3,497ポイント)   Date: 2008/01/26(土) 02:37   No:13793     
Title: Re:カレンダーについて    
確かに一回しか通ってないですね
うわぁbのループ意味ないよ・・orz
boxさん、指摘ありがとうございます。


なるほど、管理人さんの言うとおりですね
説明不測でした

今日出された課題は先ほど言った1,2,3,4,5,6,7 1,2,3,4,5,6,7 1,2,3,4,5,6,7
これを123456712345671234567と並べて表示させる
そこで私は例の無意味なループを使ったコードで担当の人に見せました
「確かに出てはいるけどコレの意味がないよね」と言われました(無意味なループの件)
この時わたしはその意味を理解していませんでした
で、今度は1,2,3,4,5,6,7 この一つ一つの数字全部で7個あります
これをfor文2つ使って7個表示させるのを3回繰り返せ
と言われました。for文2つ使ってなのでおそらく「二重ループを使って出せ」と言ってると思うのですが
私はこの時点でまだ無意味なコードに気付いていなかったので「なんでもっかい同じ事するの?」
と思ったんです。
説明ヘタですいません、これでいいでしょうか?







279ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(502,711ポイント)   Date: 2008/01/26(土) 03:00   No:13795     
Title: Re:カレンダーについて    
え〜と、、、それは先ほど私が書いたコードじゃダメなんでしょうか??
for文を二回使って「123456712345671234567」ですよね??
出来てると思うんですが。

あ、それとも、
理解したし、解決したけど、先ほどの補足だけしていただいたのでしょうか?

もしまだ未解決で、
あの方法がいやなら、やる方法はいくらでもあります。
先ほど紹介した

@
#include <stdio.h>
int main(){
for ( int b = 0; b < 3; b++ )
for ( int a = 1; a <= 7; a++ )
printf("%d",a);
return 0;
}

これ以外にも

A
#include <stdio.h>
int main(){
for ( int b = 0; b < 3; b++ )
for ( int a = 1; a <= 7; a++ )
printf("%c",'0'+a);
return 0;
}

他にもこんなのとか

B
#include <stdio.h>
int main(){
char str[8]="1234567";
for ( int b = 0; b < 3; b++ )
for ( int a = 1; a <= 7; a++ )
printf("%c",str[a-1]);
return 0;
}

ひねくれてこんなのとかも

C
#include <stdio.h>
int main(){
int t=0;
char str[8]="1234567";
for ( int b = 0; b < 100000000; b++ ){
for ( int a = 1; a <= 100000000; a++,t++ ){
printf("%c",str[t%7]);
if(t==7*3-1)
return 0;
}
}
return 0;
}

アドレス使えばこんなのとか

D
#include <stdio.h>
int main(){
char str[8]="0000000";
for ( int b = 0; b < 3; b++ )
for ( int a = 1; a <= 7; a++)
printf("%d",(&str[a-1]-&str[0])+1);
return 0;
}


やり方しだいでいくらでも出来ます。
一応どれも出力は「123456712345671234567」です。
求められている答えは@だと思います。


研修中ってことはお仕事ですか?
家ではネットが繋がらないのでしばし家からは携帯でこちら来ますので(_ _|||)


801ポイント を手に入れた。

Name: やそ  ..上級者(16,420ポイント)   Date: 2008/01/26(土) 10:02   No:13800     
Title: Re:カレンダーについて    
うわ、なんだか、別の展開になってますね(笑)

私も、C言語初心者と言えば初心者なので、「プログラムが分からない」という気持ちは十分理解できます。
プログラムを習い始めたばかりの頃は・・・
「何だこの呪文の羅列は?」、
「意味のなさそうなこの命令は一体何のため?」、
などとちんぷんかんぷんでした。
問題文を読んでも一向にアルゴリズムが構築できなくて(イメージすら湧かない)誰かに質問しようにも、「一体全体なにをどうしていいやら分かりません」としか言えなかった(ココでいう丸投げ状態ですね(笑))記憶があります。

なので、出来る限り、答えてあげたいと言う気持ちは十分あるのですが、
どこまで答えるのがいいのだろう?(管理人さんやboxさんら古強者(ベテラン)勢には敵うべくもありませぬが^^;)
と、自問自答しつつ、自分の知識&経験の及ぶ範囲内で答えているつもりです。
丸投げのように見える投稿でも、自身の経験を踏まえて、何が分からないのか、どのように質問すればよいのか、を導き出して上げられればいいなと思っています。(その日の気分により多少口調などは違ってしまうかもしれませんが^^;)

自身、C言語は専門学生時代にAI研究で使用したくらいなのでリハビリが大変です^^;
Z80マシン語(アセンブラ)やBASIC、COBOL、CASL(情報処理試験対策で覚えた)辺りを中学生頃からやっているのでプログラムそのものについては多少知識なり経験なりあると思います。
そのへんの経験が活かせられればいいのですが^^


さて、今回のプログラムですが、
今日出された課題は先ほど言った1,2,3,4,5,6,7 1,2,3,4,5,6,7 1,2,3,4,5,6,7
これを123456712345671234567と並べて表示させる
これをfor文2つ使って7個表示させるのを3回繰り返せ

という問題のようですが、
管理人さんの紹介された@

@
#include <stdio.h>
int main(){
for ( int b = 0; b < 3; b++ )
for ( int a = 1; a <= 7; a++ )
printf("%d",a);
return 0;
}


がシンプルな形で分かりやすいのではないでしょうか。
また、出題者の意図(イメージ)もこのようなループ構造だと思いますよ。


566ポイント を手に入れた。

Name: カル  ..入門者(3,316ポイント)   Date: 2008/01/26(土) 15:36   No:13806     
Title: Re:カレンダーについて    
ですね、私もやそさんや管理人さんがおっしゃってる@が近い回答だと思います
私がループの仕組みを完全に把握していなかったから
担当さんもあの課題を出してくれたんだと思います
気付かせてくれてありがとうございました
これからは質問内容をよく確認してから投稿しますね。
>管理人さんへ
いろんなやり方ってあるんですね、勉強になります
意図と答えは理解できたのでさっきのは捕捉です
仕事といえばそうですね、研修して勉強してる感じなので
携帯からわざわざありがとうございました。
>やそさんへ
「何がわからないのか、どのように質問すればいいのか」
ここらへんをよく考えていませんでした・・・
これからは意識しつつ質問していきたいと思います。



181ポイント を落としてしまった。

Name: カル  ..入門者(3,397ポイント)   Date: 2008/01/27(日) 19:46   No:13826     
Title: Re:カレンダーについて    
質問なのですが、管理人さんが作ってくれたプログラムで
void display(int day, int total_day){
このvoidというのは実行後、結果を報告しない(値を戻さない)と
書いてあったのですがどういう意味なのでしょうか?


81ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(505,528ポイント)   Date: 2008/01/28(月) 04:46   No:13840     
Title: Re:カレンダーについて    
関数を呼ぶということについてはもうOKでしょうか。


#include <stdio.h>

int display(){
printf("表示して終わり\n");
return 0;
}

int main(){
int a;
display();
printf("mainでも表示しちゃいます\n");
return 0;
}

これすんなり理解できますか?
メインから始まったプログラムはdisplay関数を呼び、そちらの関数にうつって、
return 0にて、関数終了の合図をうけると、メインに戻り、
メインでprintfした後、returnが呼ばれて終了しますね。
return という言葉からして、何かを返すわけですが、
これは関数が終了したときに、呼んだところに何か返すわけです。

return 0;

というのは、呼んできたところに、0を返すというわけです。
ですから、

return 1;

と書けば、よんできたところに、1を返します。
違うサンプルを見てみましょう。

#include <stdio.h>

int display(){
printf("表示して終わり\n");
return 1;
}

int main(){
int a;
a=display();
printf("貰ってきたのは%d\n",a);
return 0;
}

実行結果

表示して終わり
貰ってきたのは1


呼んできたところに1を返すので、aには1が返ります。
何でこんなことが必要かというと、その関数がどういう状態で終わったのか知るためです。
このdisplay関数内で、もし異常が発生したとき、return -1;を返すように書いておけば、
メイン内で-1が返ってきたら、この関数は途中でエラーを起こしたなと言うことがわかるわけです。
この関数の最初につける

int display(){

のintというのは、返り値の型のことです。double型で返したいならdoubleで、structならstructで表します。

一方、void型というのは、何も値を返さないことです。
一番上のサンプルのような場合、途中でエラーが起きる可能性もありませんし、
特に関数がどういう状態で終わったか知りたくないですね。
別に返り値がいらないときは、返り値を持たないと言う意味のvoidと書くわけです。



524ポイント を手に入れた。

Name: カル  ..入門者(3,434ポイント)   Date: 2008/01/28(月) 17:52   No:13854     
Title: Re:カレンダーについて    
なるほど、メイン関数からよんでいくんですね
よく見たらすごい初歩的なことでした・・・・。


37ポイント を手に入れた。

Name: カル  ..入門者(3,515ポイント)   Date: 2008/01/28(月) 20:22   No:13857     
Title: Re:カレンダーについて    
続いて質問です
char str_day[7][3]={"日","月","火","水","木","金","土"}
これって2次元配列だと思うんですけど
このプログラムは何を意味してるのでしょうか。


81ポイント を手に入れた。

Name: 通りすがり  ..初心者(6,898ポイント)   Date: 2008/01/29(火) 01:04   No:13863     
Title: Re:カレンダーについて    
何が聞きたいのかよくわかりませんが、初歩的な疑問は「C言語 入門」で検索すれば解決しますし、
解らないことがあるたびに人に聞かずに自分で解決するのもまたそれも力だと思います。
今回の場合、配列と文字列あたりをキーワードにおしらべ下さい。


96ポイント を手に入れた。

Name: やそ  ..上級者(17,066ポイント)   Date: 2008/01/30(水) 16:43   No:13885     
Title: Re:カレンダーについて    

char str_day[7][3]={"日","月","火","水","木","金","土"};


ですが、かなり前から使っていたのに、今頃質問ですかっ!?
っていうツッコミはお約束として(笑)
その曜日を表示するソースが以下になっていましたね?


for(i=0;i<7;i++)
printf("%s ",str_day[i]);
printf("\n");


char型で宣言してますが、
printf関数では%sの【文字列】として表示していますよね。
ココから何が考えられると思いますか?

str_day[7][3]={"日","月","火","水","木","金","土"};
がどのようにメモリに格納されているかを考えてみれば分かります。


str_day[0][0]="日"
のメモリアドレスを10000とする。(仮)
と・・・

address:10000 0xFA
10001 0x93
10002 0x00


というように一文字3バイトで格納されているのです。
漢字は2バイトで表現されているのはご存知ですよね?
そこに、文字列の終端文字である"\0"を追加しています。
でないと%sで表示しようとしたときにバグを起こします。(終端文字を探して三千里?)



どうでしょうか?(笑)


570ポイント を手に入れた。

Name: box  ..ハッカー(105,943ポイント)   Date: 2008/01/30(水) 22:29   No:13901     
Title: Re:カレンダーについて    
> char str_day[7][3]={"日","月","火","水","木","金","土"};

カルさんご自身は、このトピックにおいて
配列の配列を使ったコードを投稿なさっていません。
ポインタの配列はお使いでしたけれど。


26ポイント を手に入れた。

Name: カル  ..入門者(3,572ポイント)   Date: 2008/02/05(火) 00:15   No:14036     
Title: Re:カレンダーについて    
スイマセン、PCの調子が悪くて・・・カキコできませんでした
多分あともうちょっとで分かりそうなので調べて考えてみます
通りすがりさん、やそさんboxさんありがとうございました。


57ポイント を手に入れた。



Name: yoko  ..かけだし(1,688ポイント)   Date: 2008/02/03(日) 22:39   No:14017       
Title: fscanf関数について    
以下のプログラムなのですが、ファイルからデータが読み込めません。
デバッグを行った結果、関数read_dataの最初のfscanf関数でfscanf.cの52行めのstream != NULLというところでエラーが発生しているようです。どこを直せばよいのでしょうか。プログラムが長いので、複数回に分けて投稿します。
コンパイラ Microsoft Visual Studio 2005
OS Windows XP

プログラム

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define ERROR -1

/*構造体定義*/
struct student{
char name[100];
int student_number;
char password[100];
int score[3][5];
};
struct teacher{
char name[100];
int teacher_number;
char password[100];
int subject_id;
};

/*プロトタイプ宣言*/
void ninsho(struct student* data,struct teacher* data1,int b,int* student,int* teacher,int* ninsho);
void student_score(struct student* data,int student_number,int b);
void teacher_score(struct student* data,struct teacher* data1,int teacher_number,int b,int subject,char subject_name[]);
void teacher_topx(struct student* data_copy,struct teacher* data1,int teacher_number,int b,int subject,char subject_name[]);
void sort(struct student* data,int left,int right,int subject,int b,int jiki);
void teacher_menu(struct student* data,struct teacher* data1,int teacher_number,int b);
void teacher_logout(struct student* data,struct teacher* data1,int teacher_number,int b);
void read_data(struct student* data,struct teacher* data1,int b);
void student_logout(struct student* data,int student_number,int b);
void student_menu(struct student* data,int student_number,int b);
void student_topx(struct student* data_copy,int student_number,int b);
void file_out(struct student* data,int b,int subject,int hyoji,char* subject_name,int* juni,double average_score,double* deviation_score,int jiki);
void entry(struct student* data,struct teacher* data1,int b,int subject,int teachre_number);

int main(void)
{
int b,student_number=1,teacher_number,ninsho1=ERROR;
struct student data[31];
struct teacher data1[3];
b=sizeof(data)/sizeof(data[0]);

read_data(data,data1,b);

/*認証*/
ninsho(data,data1,b,&student_number,&teacher_number,&ninsho1);


if(ninsho1==0){
student_menu(data,student_number,b); /*学生の場合*/
}else if(ninsho1==1){
teacher_menu(data,data1,teacher_number,b);
}
return 0;
}

/*認証関数*/
void ninsho(struct student* data,struct teacher* data1,int b,int* student,int* teacher,int* ninsho){
int i,number;
char dmy[100],name[100],pass[100];
printf("氏名と番号とパスワードを入力してください。\n");
printf("氏名:");
fgets(name,sizeof(name),stdin);
name[strlen(name)-1]='\0';
printf("番号:");
fgets(dmy,sizeof(dmy),stdin);
number=atoi(dmy);
printf("パスワード:");
fgets(pass,sizeof(pass),stdin);
pass[strlen(pass)-1]='\0';
for(i=0;i<b;i++){
if(strcmp(name,data[i].name)==0&&
number==data[i].student_number&&
strcmp(pass,data[i].password)==0){
*ninsho=0;
*student=number;
break;
}
}
if(*ninsho!=0){
for(i=0;i<3;i++){
if(strcmp(name,data1[i].name)==0&&
number==data1[i].teacher_number&&
strcmp(pass,data1[i].password)==0){
*ninsho=1;
*teacher=number;
break;
}
}
}
printf("\n");
if(*ninsho==ERROR){
printf("認証失敗\n\n");
exit(0);
}else{
printf("認証成功\n\n");
}
}


1,688ポイント を手に入れた。


Name: yoko  ..入門者(3,804ポイント)   Date: 2008/02/03(日) 22:41   No:14019     
Title: Re:fscanf関数について    
プログラム続き

void student_score(struct student* data,int student_number,int b){
int jiki=1,i,j,sum1_score[3]={0},score_total[31]={0},sum1_total=0;
double sum2_score[3]={0.0},sum2_total=0.0;
double average_score[3],average_total;
double standard_score[3],standard_total;
double deviation_score[3],deviation_total;
char test_name[100],dmy[100];

printf("成績を見たい時期の番号を入力してください。\n1:1学期中間\n2:1学期期末\n3:2学期中間"
"\n4:2学期期末\n5:3学期学年末\n");
do{
printf("番号?");
if(jiki!=1){
printf("1〜5以外の番号が入力されました。\n");
exit(0);
}
fgets(dmy,sizeof(dmy),stdin);
jiki=atoi(dmy);
}while(jiki<1||jiki>5);
for(i=0;i<b;i++){
for(j=0;j<3;j++){
score_total[i]+=data[i].score[j][jiki-1];
sum1_score[j]+=data[i].score[j][jiki-1];
}
sum1_total+=score_total[i];
}

/*平均点*/
for(i=0;i<3;i++){
average_score[i]=(double)sum1_score[i]/b;
}
average_total=(double)sum1_total/b;

for(i=0;i<b;i++){
for(j=0;j<3;j++){
sum2_score[j]+=pow((double)(data[i].score[j][jiki-1]-average_score[j]),2.0);
}
sum2_total+=pow((double)(score_total[i]-average_total),2.0);
}

/*標準偏差*/
for(i=0;i<3;i++){
standard_score[i]=sqrt((double)(sum2_score[i]/b));
}
standard_total=sqrt((double)(sum2_total/b));

/*学力偏差値*/
for(i=0;i<3;i++){
deviation_score[i]=(10.0*((double)(data[student_number-1].score[i][jiki-1]-average_score[i])/standard_score[i])+50.0);
}
deviation_total=(10.0*((double)(score_total[student_number-1]-average_total)/standard_total)+50.0);

switch(jiki){
case 1:
strcpy(test_name,"1学期中間");
break;
case 2:
strcpy(test_name,"1学期期末");
break;
case 3:
strcpy(test_name,"2学期中間");
break;
case 4:
strcpy(test_name,"2学期期末");
break;
case 5:
strcpy(test_name,"3学期学年末");
break;
}

/*個人成績表示*/
printf("\n%sさんの%sの各科目の点数と平均点と偏差値は\n",data[student_number-1].name,test_name);
printf("総合 得点:%3d 平均点:%4.5f 偏差値:%2.5f\n",score_total[student_number-1],average_total,deviation_total);
printf("数学 得点:%3d 平均点:%4.5f 偏差値:%2.5f\n",data[student_number-1].score[0][jiki-1],average_score[0],deviation_score[0]);
printf("国語 得点:%3d 平均点:%4.5f 偏差値:%2.5f\n",data[student_number-1].score[1][jiki-1],average_score[1],deviation_score[1]);
printf("英語 得点:%3d 平均点:%4.5f 偏差値:%2.5f\n\n",data[student_number-1].score[2][jiki-1],average_score[2],deviation_score[2]);

student_logout(data,student_number,b);
}

void teacher_score(struct student* data,struct teacher* data1,int teacher_number,int b,int subject,char subject_name[]){
int i,j,sum1_score[5]={0},score[31][5],student_number=1;
double sum2_score[5]={0};
double average_score[5],standard_score[5],deviation_score[5];
char dmy[100];

printf("\n成績を見たい学生の番号を入力してください。\n");
do{
if(student_number!=1){
printf("その番号の学生は存在しません。\n");
exit(0);
}
printf("番号?");
fgets(dmy,sizeof(dmy),stdin);
student_number=atoi(dmy);
}while(student_number<1||student_number>b);

switch(subject){
case 1:
for(i=0;i<b;i++){
for(j=0;j<5;j++){
score[i][j]=data[i].score[0][j];
}
}
break;
case 2:
for(i=0;i<b;i++){
for(j=0;j<5;j++){
score[i][j]=data[i].score[1][j];
}
}
break;
case 3:
for(i=0;i<b;i++){
for(j=0;j<5;j++){
score[i][j]=data[i].score[2][j];
}
}
break;
}

for(i=0;i<b;i++){
for(j=0;j<5;j++){
sum1_score[j]+=score[i][j];
}
}

/*平均点*/
for(i=0;i<5;i++){
average_score[i]=(double)sum1_score[i]/b;
}

for(i=0;i<b;i++){
for(j=0;j<5;j++){
sum2_score[j]+=pow((double)(score[i][j]-average_score[j]),2.0);
}

}

/*標準偏差*/
for(i=0;i<5;i++){
standard_score[i]=sqrt((double)(sum2_score[i]/b));
}

/*学力偏差値*/
for(i=0;i<5;i++){
deviation_score[i]=(10.0*((double)(score[student_number-1][i]-average_score[i])/standard_score[i])+50.0);
}

printf("%sさんの%sの点数と平均点と偏差値は\n",data[student_number-1].name,subject_name);
printf("1学期中間 得点:%d 平均点:%f 偏差値:%f\n",score[student_number-1][0],average_score[0],deviation_score[0]);
printf("1学期期末 得点:%d 平均点:%f 偏差値:%f\n",score[student_number-1][1],average_score[1],deviation_score[1]);
printf("2学期中間 得点:%d 平均点:%f 偏差値:%f\n",score[student_number-1][2],average_score[2],deviation_score[2]);
printf("2学期期末 得点:%d 平均点:%f 偏差値:%f\n",score[student_number-1][3],average_score[3],deviation_score[3]);
printf("3学期学年末 得点:%d 平均点:%f 偏差値:%f\n",score[student_number-1][4],average_score[4],deviation_score[4]);
printf("\n");

teacher_logout(data,data1,teacher_number,b);
}


2,116ポイント を手に入れた。

Name: yoko  ..初心者(5,304ポイント)   Date: 2008/02/03(日) 22:43   No:14020     
Title: Re:fscanf関数について    
続き

void teacher_topx(struct student* data_copy,struct teacher* data1,int teacher_number,int b,int subject,char subject_name[]){
int i,sum1_score=0,jiki=1,hyoji=1,juni[31],fileout;
double sum2_score=0.0;
double average_score,standard_score,deviation_score[31];
char dmy[100];
struct student data[31];

for(i=0;i<b;i++){
data[i]=data_copy[i];
}

printf("1:1学期中間\n2:1学期期末\n3:2学期中間\n4:2学期期末\n5:3学期学年末\n");
do{
printf("番号?");
if(jiki!=1){
printf("1〜5以外の番号が入力されました。\n");
exit(0);
}
fgets(dmy,sizeof(dmy),stdin);
jiki=atoi(dmy);
}while(jiki<1||jiki>5);
printf("表示人数を入力してください。\n");
do{
printf("人数?");
if(hyoji!=1){
printf("間違った人数が入力されました。\n");
exit(0);
}
fgets(dmy,sizeof(dmy),stdin);
hyoji=atoi(dmy);
}while(hyoji<1||hyoji>b);

sort(data,0,b-1,subject,b,jiki);

for(i=0;i<b;i++){
sum1_score+=data[i].score[subject-1][jiki-1];
}

average_score=(double)(sum1_score/b);

for(i=0;i<b;i++){
sum2_score+=pow((double)(data[i].score[subject-1][jiki-1]-average_score),2.0);
}

for(i=0;i<b;i++){
standard_score=sqrt((double)(sum2_score/b));
}

for(i=0;i<b;i++){
deviation_score[i]=(10.0*((double)data[i].score[subject-1][jiki-1]-average_score)/standard_score)+50.0;
}

/*順位付け*/
for(i=0;i<hyoji;i++){
if(i==0){
juni[i]=i+1;
}else{
if(data[i].score[subject-1][jiki-1]==data[i-1].score[subject-1][jiki-1]){
juni[i]=juni[i-1];
}else{
juni[i]=i+1;
}
}
}

/*成績トップ表示*/
printf("\n\t%s成績トップ%d\n",subject_name,hyoji);
for(i=0;i<hyoji;i++){
printf("%2d位\t%10s\t得点:%3d\t平均点:%2.5f\t偏差値:%2.5f\n"
,juni[i],data[i].name,data[i].score[subject-1][jiki-1]
,average_score,deviation_score[i]);
}
printf("ファイル出力しますか?(1:YES,2:NO)\n");
printf("番号?");
fgets(dmy,sizeof(dmy),stdin);
fileout=atoi(dmy);
if(fileout!=1&&fileout!=2){
printf("1か2以外の番号が入力されました。\n");
exit(0);
}
if(fileout==1){
file_out(data_copy,b,subject,hyoji,subject_name,juni,average_score,deviation_score,jiki);
}

teacher_logout(data_copy,data1,teacher_number,b);
}

void sort(struct student* data,int left,int right,int subject,int b,int jiki){
int pl=left,pr=right,x;
struct student temp;

x=data[(pl+pr)/2].score[subject-1][jiki-1];

do{
while(data[pl].score[subject-1][jiki-1]>x){
pl++;
}
while(data[pr].score[subject-1][jiki-1]<x){
pr--;
}
if(pl<=pr){
temp=data[pl];
data[pl]=data[pr];
data[pr]=temp;
pl++;
pr--;
}
}while(pl<=pr);

if(left<pr){
sort(data,left,pr,subject,b,jiki);
}
if(pl<right){
sort(data,pl,right,subject,b,jiki);
}
}

void teacher_menu(struct student* data,struct teacher* data1,int teacher_number,int b){
int menu,subject;
char dmy[100],subject_name[100];

printf("担当教科番号を入力してください。\n");
printf("番号?");
fgets(dmy,sizeof(dmy),stdin);
subject=atoi(dmy);
if(subject!=data1[teacher_number-1].subject_id){
printf("担当教科番号が違います。\n");
exit(0);
}

switch(subject){
case 1:
strcpy(subject_name,"数学");
break;
case 2:
strcpy(subject_name,"国語");
break;
case 3:
strcpy(subject_name,"英語");
break;
}
printf("\n教員メニュー\n");
printf("1.%s成績トップ表示\n2.個人成績表示\n3.成績更新\n4.ログアウト\n",subject_name);
printf("番号?");
fgets(dmy,sizeof(dmy),stdin);
menu=atoi(dmy);
if(menu<1||menu>4){
printf("1〜4以外の番号が入力されました。");
exit(0);
}
printf("\n");
switch(menu){
case 1:
teacher_topx(data,data1,teacher_number,b,subject,subject_name);
break;
case 2:
teacher_score(data,data1,teacher_number,b,subject,subject_name);
break;
case 3:
entry(data,data1,b,subject,teacher_number);
break;
case 4:
teacher_logout(data,data1,teacher_number,b);
break;
}
}

void teacher_logout(struct student* data,struct teacher* data1,int teacher_number,int b){
int menu,program,ninsho1=ERROR;
char dmy[100];
printf("\n教員メニュー終了しますか?(1:YES,2:NO)\n");
printf("番号?");
fgets(dmy,sizeof(dmy),stdin);
menu=atoi(dmy);
if(menu!=1&&menu!=2){
printf("1か2以外の番号が入力されました。\n");
exit(0);
}
if(menu==2){
teacher_menu(data,data1,teacher_number,b);
}else{
printf("\nプログラムを終了しますか?(1:YES,2:NO)\n");
printf("番号?");
fgets(dmy,sizeof(dmy),stdin);
program=atoi(dmy);
if(program!=1&&program!=2){
printf("1か2以外の番号が入力されました。\n");
exit(0);
}
if(program==2){
printf("\n");
main();
}else{
exit(0);
}
}
}


1,500ポイント を手に入れた。

Name: yoko  ..初心者(6,677ポイント)   Date: 2008/02/03(日) 22:45   No:14021     
Title: Re:fscanf関数について    
続き

void read_data(struct student* data,struct teacher* data1,int b){
int i,j,k;
FILE *file;
if(file=fopen("score.txt","r")==NULL){
printf("ファイルが存在しません。\n");
exit(0);
}else{
/*データ値代入*/
/*学生*/
for(i=0;i<b;i++){
fscanf(file,"%s%d%s",&data[i].name,&data[i].student_number,&data[i].password);
for(k=0;k<3;k++){
for(j=0;j<5;j++){
fscanf(file,"%d",&data[i].score[k][j]);
}
}
}
/*教師*/
for(i=0;i<3;i++){
fscanf(file,"%s%d%s%d",&data1[i].name,&data1[i].teacher_number,&data1[i].password,&data1[i].subject_id);
}
fclose(file);
}
}

void student_menu(struct student* data,int student_number,int b){
int menu;
char dmy[100];


printf("\n学生メニュー\n");
printf("1.自学年成績トップ表示\n2.個人成績表示\n3.ログアウト\n");
printf("番号?");
fgets(dmy,sizeof(dmy),stdin);
menu=atoi(dmy);
if(menu<1||menu>3){
printf("1〜3以外の番号が入力されました。");
exit(0);
}
printf("\n");
switch(menu){
case 1:
student_topx(data,student_number,b);
break;
case 2:
student_score(data,student_number,b);
break;
case 3:
student_logout(data,student_number,b);
break;
}
}

void student_logout(struct student* data,int student_number,int b){
int menu,program,ninsho1=ERROR;
char dmy[100];
printf("\n学生メニュー終了しますか?(1:YES,2:NO)\n");
printf("番号?");
fgets(dmy,sizeof(dmy),stdin);
menu=atoi(dmy);
if(menu!=1&&menu!=2){
printf("1か2以外の番号が入力されました。\n");
exit(0);
}
if(menu==2){
student_menu(data,student_number,b);
}else{
printf("\nプログラムを終了しますか?(1:YES,2:NO)\n");
printf("番号?");
fgets(dmy,sizeof(dmy),stdin);
program=atoi(dmy);
if(program!=1&&program!=2){
printf("1か2以外の番号が入力されました。\n");
exit(0);
}
if(program==2){
printf("\n");
main();
}else{
exit(0);
}
}
}

void student_topx(struct student* data_copy,int student_number,int b){
int i,sum1_score=0,jiki=1,hyoji=1,juni[31],subject=1;
double sum2_score=0.0;
double average_score,standard_score,deviation_score[31];
char dmy[100],subject_name[100];
struct student data[31];

for(i=0;i<b;i++){
data[i]=data_copy[i];
}

printf("1:1学期中間\n2:1学期期末\n3:2学期中間\n4:2学期期末\n5:3学期学年末\n");
do{
printf("番号?");
if(jiki!=1){
printf("1〜5以外の番号が入力されました。\n");
exit(0);
}
fgets(dmy,sizeof(dmy),stdin);
jiki=atoi(dmy);
}while(jiki<1||jiki>5);
printf("見たい教科の番号を入力してください。\n");
printf("1:数学\n2:国語\n3:英語");
do{
printf("番号?");
if(subject!=1){
printf("1〜3以外の数字が入力されました。\n");
exit(0);
}
fgets(dmy,sizeof(dmy),stdin);
subject=atoi(dmy);
}while(subject<1||subject>3);

switch(subject){
case 1:
strcpy(subject_name,"数学");
break;
case 2:
strcpy(subject_name,"国語");
break;
case 3:
strcpy(subject_name,"英語");
break;
}

printf("表示人数を入力してください。\n");
do{
printf("人数?");
if(hyoji!=1){
printf("間違った人数が入力されました。\n");
exit(0);
}
fgets(dmy,sizeof(dmy),stdin);
hyoji=atoi(dmy);
}while(hyoji<1||hyoji>b);

sort(data,0,b-1,subject,b,jiki);

for(i=0;i<b;i++){
sum1_score+=data[i].score[subject-1][jiki-1];
}

average_score=(double)(sum1_score/b);

for(i=0;i<b;i++){
sum2_score+=pow((double)(data[i].score[subject-1][jiki-1]-average_score),2.0);
}

for(i=0;i<b;i++){
standard_score=sqrt((double)(sum2_score/b));
}

for(i=0;i<b;i++){
deviation_score[i]=(10.0*((double)data[i].score[subject-1][jiki-1]-average_score)/standard_score)+50.0;
}

/*順位付け*/
for(i=0;i<hyoji;i++){
if(i==0){
juni[i]=i+1;
}else{
if(data[i].score[subject-1][jiki-1]==data[i-1].score[subject-1][jiki-1]){
juni[i]=juni[i-1];
}else{
juni[i]=i+1;
}
}
}

/*成績トップ表示*/
printf("\n\t%s成績トップ%d\n",subject_name,hyoji);
for(i=0;i<hyoji;i++){
printf("%2d位\t%d\t%10s\t得点:%3d\t平均点:%2.5f\t偏差値:%2.5f\n"
,juni[i],data[i].student_number,data[i].name,data[i].score[subject-1][jiki-1]
,average_score,deviation_score[i]);
}


student_logout(data,student_number,b);
}


1,373ポイント を手に入れた。

Name: yoko  ..初心者(7,549ポイント)   Date: 2008/02/03(日) 22:47   No:14022     
Title: Re:fscanf関数について    
続き
<pre>
void file_out(struct student* data,int b,int subject,int hyoji,char* subject_name,int* juni,double average_score,double* deviation_score,int jiki){
int i;
char file_name[100];
FILE *file;
printf("ファイル名?");
fgets(file_name,sizeof(file_name),stdin);
file_name[strlen(file_name)-1]='\0';
file=fopen(file_name,"w");
fprintf(file,"%s成績トップ%d\n\n",subject_name,hyoji);
for(i=0;i<hyoji;i++){
fprintf(file,"\t%2d位\t%d\t%10s\t得点:%3d\t平均点:%2.5f\t偏差値:%2.5f\n"
,juni[i],data[i].student_number,data[i].name,data[i].score[subject-1][jiki-1]
,average_score,deviation_score[i]);
}
fclose(file);
}

void entry(struct student* data,struct teacher* data1,int b,int subject,int teacher_number){
int i,j,k,jiki=1,student_number=1,score=0,number=1;
char dmy[100];
FILE *file;
file=fopen("score.txt","w");
printf("更新したいテストの時期を入力してください。\n");
printf("1:1学期中間\n2:1学期期末\n3:2学期中間\n4:2学期期末\n5:3学期学年末\n");
do{
printf("番号?");
if(jiki!=1){
printf("1〜5以外の番号が入力されました。\n");
exit(0);
}
fgets(dmy,sizeof(dmy),stdin);
jiki=atoi(dmy);
}while(jiki<1||jiki>5);
fgets(dmy,sizeof(dmy),stdin);
jiki=atoi(dmy);
printf("更新したい学生の番号を入力してください。\n");
do{
if(student_number!=1){
printf("その番号の学生は存在しません。\n");
exit(0);
}
printf("番号?");
fgets(dmy,sizeof(dmy),stdin);
student_number=atoi(dmy);
}while(student_number<1||student_number>b);
do{
printf("更新する得点を入力してください。\n");
do{
if(score!=0){
printf("間違った点数が入力されました。\n");
exit(0);
}
printf("得点?");
fgets(dmy,sizeof(dmy),stdin);
score=atoi(dmy);
}while(score<0||score>100);
printf("更新する得点は%dでいいですか?(1:YES,2:NO)\n",score);
printf("番号?");
fgets(dmy,sizeof(dmy),stdin);
number=atoi(dmy);
if(number!=1&&number!=2){
printf("1か2以外の番号が入力されました。\n");
exit(0);
}
}while(number==2);

data[student_number-1].score[subject-1][jiki]=score;

/*データ値代入*/
/*学生*/
for(i=0;i<b;i++){
fprintf(file,"%s\t%d\t%s\t",data[i].name,data[i].student_number,data[i].password);
for(k=0;k<3;k++){
for(j=0;j<5;j++){
fprintf(file,"%d",data[i].score[k][j]);
if(j!=4){
fprintf(file,"\t");
}else{
fprintf(file,"\n");
}
}
}
}
/*教師*/
for(i=0;i<3;i++){
fprintf(file,"%s\t%d\t%s\t%d\n",data1[i].name,data1[i].teacher_number,data1[i].password,data1[i].subject_id);
}
printf("更新終了\n\n");

fclose(file);

teacher_logout(data,data1,teacher_number,b);
}





872ポイント を手に入れた。

Name:  ..上級者(23,499ポイント)   Date: 2008/02/04(月) 00:22   No:14024     
Title: Re:fscanf関数について    
>関数read_dataの最初のfscanf関数でfscanf.cの52行めのstream != NULL…
こう書くのであれば、とりあえず関数ひとつだけあげて、ほかはファイル後とあげてしまったほうがこちらもやりやすいかと、、、

>52行めのstream != NULL
これ、どこ???

>fscanf(file,"%s%d%s",&data[i].name,&data[i].student_number,&data[i].password);
"%s%d%s" これってしてよかったっけ?
多分うまく読み取れないはず、、、
後、区切りっていらなかったっけ?スペースか[,] どっちか

どの関数を追加した時点で問題が起こった?


219ポイント を手に入れた。

Name: Justy  ..ハッカー(172,578ポイント)   Date: 2008/02/04(月) 00:29   No:14025     
Title: Re:fscanf関数について    
>関数read_dataの最初のfscanf関数でfscanf.cの52行めの
 そこまで特定できてるなら、後はその周辺を見れば何か判るというモノ。

if(file=fopen("score.txt","r")==NULL)

 この if文では fopenに成功したかどうかの判定がおかしく、
変数 fileに fopenの戻り値が入りません。

 で、不正な fileをもって fscanfをしようとすれば当然何かしらのエラーになるというもの。
 演算子の優先順位を思い出して、直してみて下さい。




>これ、どこ???
 多分 CRT(fscanf)の中でしょう。


201ポイント を手に入れた。

Name: box  ..ハッカー(106,382ポイント)   Date: 2008/02/04(月) 07:21   No:14027     
Title: Re:fscanf関数について    
>>fscanf(file,"%s%d%s",&data[i].name,&data[i].student_number,&data[i].password);
>"%s%d%s" これってしてよかったっけ?

入力ファイルの中の各フィールドを
空白文字で区切っていれば、問題ありません。


41ポイント を手に入れた。

Name: たかぎ [URL]  ..プログラマー(29,363ポイント)   Date: 2008/02/04(月) 11:35   No:14028     
Title: Re:fscanf関数について    
> if(file=fopen("score.txt","r")==NULL){

この部分の解釈は意外に難しいので、念のため解説しておきます。

1. fopen("score.txt","r") が評価される。このときの返却値を仮に A とする。
2. A==NULL が評価される。1.で fopen が成功していれば 0 に、そうでなければ 1 になる。これを仮に B とする。
3. file=B が評価される。B は int 型であるが、暗黙的に FILE* に型変換される。B が 1 のとき式全体も 1 になる。
4. 3.の評価結果が 1 であれば if の条件は真となる。


121ポイント を手に入れた。

Name: yoko  ..初心者(7,496ポイント)   Date: 2008/02/04(月) 15:30   No:14029 解決!     
Title: Re:fscanf関数について    
if(file=fopen("score.txt","r")==NULL){

if((file=fopen("score.txt","r"))==NULL){
としたらエラーなく動きました。
ありがとうございました。


53ポイント を落としてしまった。



Name: ねこ  ..ぴよぴよ(178ポイント)   Date: 2008/02/03(日) 15:04   No:13994       
Title: 宿題が分かりません。助けてください。    
#include <stdio.h>
まったくの初心者です;;nの階乗が2で何回割り切れるかのプログラムですが、

#include<stdio.h>
main(){
int n,k,sum=0;
printf("自然数を入力しなさい");
scanf("%d",&n);
for(i=0,i<=n,i++){
k=n/2;
sum=sum+k;
k=n;
if(n==1){break;}

printf("2で%d回割り切れる",sum);

}

と入力しましたが、間違ったところいっぱいあると思いますが、教えて欲しいです。お願いします。


178ポイント を手に入れた。


Name: バグ  ..比類無きプログラマー(74,359ポイント)   Date: 2008/02/03(日) 15:17   No:13995     
Title: Re:宿題が分かりません。助けてください。    
まず順番に考えてみましょう。

1:任意の値を入力する
2:1で入力された値の階乗を求める
3:2で求められた値が何回2で割り切れるかを求める
4:3で求められた値を画面に出力する

この4段階位に分けると分かり易いでしょうか?
ざっとプログラムを見させてもらいましたが、今は1の段階まではとりあえず問題無いようです。

さて、これから2の段階以降に取り組む訳ですが、どういう事が分からないのでしょうか?


171ポイント を手に入れた。

Name: たかぎ [URL]  ..プログラマー(29,242ポイント)   Date: 2008/02/03(日) 15:33   No:13996     
Title: Re:宿題が分かりません。助けてください。    
> 2:1で入力された値の階乗を求める
> 3:2で求められた値が何回2で割り切れるかを求める
> 4:3で求められた値を画面に出力する

その方法だと、2の段階ですぐにオーバーフローするのであまりよろしくありません。
そうではなく、1で入力した値を n とすると、

(n 以下の 2 の倍数の数) + (n 以下の 4 の倍数の数) + ... + (n 以下の 2m の倍数の数)

を求めれば、いったん階乗を計算しなくてもよくなります。
質問の中のコードは決して正しくはありませんが、これをやろうとしている形跡があります。



125ポイント を手に入れた。

Name: バグ  ..比類無きプログラマー(74,405ポイント)   Date: 2008/02/03(日) 15:43   No:13997     
Title: Re:宿題が分かりません。助けてください。    
あぁ、なるほど、そういう事でしたか(^_^;)
了解です。ご指摘ありがとうございますm(_ _)m


46ポイント を手に入れた。

Name: ねこ  ..ぴよぴよ(393ポイント)   Date: 2008/02/03(日) 16:07   No:13998     
Title: 返事ありがとう ございました。    
返事ありがとうございました。nの階乗の値を計算しなくても、できるプログラムです。もう一回考えまして、下のように・・・しかし、また間違いました。繰り返し(つまり、for文)のところはよく分かりません。

#include<stdio.h>
main(){
int n,i,k,sum=0;
printf("自然数を入力しなさい");
scanf("%d",&n);
for(i=0;i<=n;i++){
if(n==1){break;}
if(n>1){
k=n/2;
sum=sum+k;
k=n;
printf("%dは2で%d回割り切れる",n,sum);
}
}
}


215ポイント を手に入れた。

Name: バグ  ..比類無きプログラマー(74,432ポイント)   Date: 2008/02/03(日) 16:42   No:13999     
Title: Re:宿題が分かりません。助けてください。    
大サービスでヒントです。


#include <stdio.h>

void main(void)
{
int i, j, n, cnt = 0;

printf("自然数を入力しなさい");
scanf("%d", &n);

if (n != 1)
{
for (j = 2; j <= n; j *= 2)
{
for (i = j; i <= n; i += j)
{
/*** ここにある処理を書き込む事で答えが求まります ***/
}
}
}

printf("%dの階乗は2で%d回割り切れる\n", n, cnt);
}


27ポイント を手に入れた。

Name: 通りすがりの者  ..ぴよぴよ(80ポイント)   Date: 2008/02/03(日) 17:23   No:14002     
Title: Re:宿題が分かりません。助けてください。    

別の解です。


#include <stdio.h>

int main(void)
{
int count, n, i, j;

do {
printf("n=? ");
scanf("%d", &n);
} while (n < 0);

for (count = 0, i = 2; i <= n; i += 2)
for (j = i; j % 2 == 0; j /= 2)
count++;

printf("%dの階乗は、2で%d回割り切れる。\n", n, count);
return 0;
}



80ポイント を手に入れた。

Name: ねこ  ..ぴよぴよ(366ポイント)   Date: 2008/02/03(日) 17:55   No:14004 解決!     
Title: 教えてくれて、本当にありがとうございました。    
いろいろありがとうございました。また、質問あったら聞いても、よろしいですか?

27ポイント を落としてしまった。

Name: フリオ  ..上級者(21,528ポイント)   Date: 2008/02/03(日) 22:50   No:14023     
Title: Re:教えてくれて、本当にありがとうございました。    
 
 もっと簡単に、これで出来ます。

#include <stdio.h>

int main(void)
{
int n, m, i;

scanf("%d", &n);
for(m = 0, i = 2; i <= n; i *= 2) m += (n / i);
printf("%d\n", m);
return 0;
}


130ポイント を手に入れた。



Name: ねこ  ..ぴよぴよ(649ポイント)   Date: 2008/02/03(日) 20:47   No:14007       
Title: 皆さん、またよろしくお願いします。    
プログラム1
・2以上の自然数を入力すると、その素因数分解の結果を表示するプログラムを作成せよ。
できれば、出力に工夫して、20とにゅうりょくすると、2*2*5と出力されるようにする。

下はわたしが考えたなんですが、どこが間違ったかを教えてくれますか?
#include <stdio.h>

main(){
int n,k,i,a;
printf("自然数nを入力せよ:");
scanf("%d",&n);
k=2;
for(i=1;i<=n;i++){

a=n%k;
if(a==0){
n=n/k;
printf("%d\n",n");
}

else{
for(i=1;i<n;i++)
k=k+i;
n=n/k;
}
printf("%d\n",n");
if(n==1){break;}
}
printf("%d\n",n);
}



283ポイント を手に入れた。


Name:  ..上級者(23,196ポイント)   Date: 2008/02/03(日) 21:37   No:14011     
Title: Re:皆さん、またよろしくお願いします。    
else{
for(i=1;i<n;i++)
k=k+i;
n=n/k;
}

ここは何をしていますか?


39ポイント を手に入れた。

Name: ねこ  ..ぴよぴよ(888ポイント)   Date: 2008/02/03(日) 22:12   No:14016 解決!     
Title: Re    
ok

5ポイント を手に入れた。



Name: ねこ  ..ぴよぴよ(830ポイント)   Date: 2008/02/03(日) 21:31   No:14008       
Title: よろしくお願いします。    
下のwhile文のところをfor文かif文に変えますか?教えてください。
#include <stdio.h>

main()
{
int k, n;

printf("2以上の自然数を入力しなさい: ");
scanf("%d", &n);

printf("%d = ", n);
k= 2;
while (k < n) {
if (n%k == 0) {
printf("%d*", k);
n = n/k;
} else {
k++;
}
}
printf("%d\n", k);

return 0;
}



181ポイント を手に入れた。


Name:  ..上級者(23,157ポイント)   Date: 2008/02/03(日) 21:33   No:14010     
Title: Re:よろしくお願いします。    
>下のwhile文のところをfor文かif文に変えますか?

????

<pre>を使用してください。

ifとは、forとはどんなものでしたか?


60ポイント を手に入れた。

Name: ねこ  ..ぴよぴよ(867ポイント)   Date: 2008/02/03(日) 21:52   No:14012     
Title: 返事ありがとうございます。    
while文は私が勉強したことないので、その代わりに、for文又はif文ができるかなぁと思ってますが・・・

37ポイント を手に入れた。

Name:  ..上級者(23,280ポイント)   Date: 2008/02/03(日) 21:57   No:14013     
Title: Re:返事ありがとうございます。    
googleで検索するといい説明が多く出てくると思います。

int i=0;
while(i<10){
i++;
}

int i;
for(i=0; i<10; i++)

同じ意味になるはずです。
速度が変わったりするのかもしれませんが知りません。


84ポイント を手に入れた。

Name: ねこ  ..ぴよぴよ(883ポイント)   Date: 2008/02/03(日) 22:12   No:14015 解決!     
Title: 雷さんへ    
ありがとうございました。できました。

16ポイント を手に入れた。



Name: elf  ..ぴよぴよ(269ポイント)   Date: 2008/01/31(木) 19:38   No:13933       
Title: 文字の出力で    
初めましてelfといいます。どうしても解らない事があったので
質問させてもらいます。
まず、その前に自分はクイズみたいなものを作ろうとしているのですが
半角と全角が混じった場合の区別の仕方や「要」、「記」、「プ」で文字化けしまう事
によってプログラムが上手く働なくなってしまう事の改善方法です。
後は、空打ちした場合に次の行に行かずにそのまま入力するカーソルが動かないようにしたい事。
また、あるボタンを押したら文章を一気に表示させたい事をやりたいと思っています。
プログラムは長いので添付しました。

で txtの中身は大体こんな感じです。

test.txt
----------------------------------------------------------
標準のヘッダーファイルを取り込むための書き方として
正しいものを選択して下さい。

(1) #include "ファイル名 "
(2) #include (ファイル名 )
(3) #include {ファイル名 }
(4) #include <ファイル名 >

j
q[解説 ]
標準のヘッダーファイルは< > で囲みます。
< > で囲んだヘッダファイルは、標準インクルードファイルの格納場所から
取り込まれます。
通常は、コンパイラがインストールしてある
includeディレクトリに格納されています。q
.
.
.
.
.
.
.
.
.
第10問目



j
q[解説 ]
................................
................................
................................q


-----------------------------------------------------------
みたいな感じです。

プログラム が駄目だったので ソースに変更
記述が駄目だったので 書き方に変更
要素数 が駄目だったので・・・  わかりません。(思考中。)
ってな感じで1バイトの文字と2バイトの文字が混ざった場合の対処法が知りたい
ので教えて欲しいです。
ちなみにmain関数から
この関数を呼び出していると考えてもらって良いです。
CLSやLOCATEは 前者は画面消去 後者は文字位置指定と同じです。
では宜しくお願いします


269ポイント を手に入れた。


Name: 組木紙織  ..プログラマー(32,626ポイント)   Date: 2008/01/31(木) 20:11   No:13934     
Title: Re:文字の出力で    
>半角と全角が混じった場合の区別の仕方や「要」、「記」、「プ」で文字化けしまう事
>によってプログラムが上手く働なくなってしまう事の改善方法です。

ということは環境(特に文字コード)を指定する必要があります。
それによってかなり実装方法が変わってくるはずですから。


103ポイント を手に入れた。

Name: たかぎ [URL]  ..プログラマー(28,548ポイント)   Date: 2008/01/31(木) 20:46   No:13935     
Title: Re:文字の出力で    
可能な限り移植性を向上させるには、

setlocale(LC_CTYPE, "");

としてから、ワイド文字(列)として入力する方法があります。
これで、完全ではないですが、主だった処理系では何とかなることでしょう。


21ポイント を手に入れた。

Name: elf  ..ぴよぴよ(408ポイント)   Date: 2008/02/03(日) 22:02   No:14014 解決!     
Title: Re:文字の出力で    
ご返信して下さったお二人方ありがとうございます。
ですが、自分では

setlocale(LC_CTYPE, "");

これを自分のプログラムのどこに組み込めば良いのか
またどんな動きをするのかいまいち自分では理解出来ないので
諦めます。

ご返信して下さったお二人方本当にありがとうございました。


139ポイント を手に入れた。



Name:  ..上級者(22,105ポイント)   Date: 2008/01/31(木) 21:26   No:13938       
Title: C++のクラスの使い方についての質問です。    
C++ のクラスについての質問です。

構成は最後に載せています。
色々と省いたので、必要なものがあった場合言って下さい。

Substance.hの
//戦略パート
void Strategy_situation();

//戦闘パート
void Battle_situation();

この二つを別のクラスを宣言して使用したいと考えたのですが、方法が思いつきません。
クラス名をStrategyとした時
コンストラクタを呼び出したときに
Strategy sg;
sg.situation();

と宣言して使用する方法は考え付いたのですが、
Strategy::situation();
と使用したいと考えています。
Strategy *sg= new Strategy();
で宣言しても、使用方法は
sg->situtaion();
となりますし、deleteもややこしいので使いたくありません。
Strategy::situation();
の形で使用する方法は無いでしょうか?
C++はほとんど理解できていないので、ご助力お願いします。


********* 構成 ******************************************************
//Main.cpp
int WINAPI WinMain(HINSTANCE hI, HINSTANCE hp, LPSTR lpC, int nC){
SetMainWindowText("テトリス Ver2.0"); //タイトル変更
Substance *sub = new Substance();
sub->doMainLoop();
delete sub;
}

//substance.h
class Substance :public Frame{
bool drawMain(); //画面パートの追加設定

S_GAME_STATE s_g_state; //現在の状態

//戦略パート
void Strategy_situation();

//戦闘パート 
void Battle_situation();

public:
S_GAME_STATE setS_GameState(S_GAME_STATE state);
Substance(){
setS_GameState(BATTLE);
}
};

//substance.cpp
bool Substance::drawMain(){
switch(s_g_state){
case STRATEGY:
Strategy_situation();
break;
case BATTLE:
Battle_situation();
break;
}
return true;
}

//Frame.h
void Frame::doMainLoop(){
(省略)
switch(g_state){
case GAME_TITLE:
drawTitle();
break;
case GAME_MAIN:
if( drawMain() == false){
setGameState(GAME_OVER);
}
break;
case GAME_END:
if( drawEnd() == false)
frag=FALSE;
break;
case GAME_CLEAR:
drawClear();
break;
case GAME_OVER:
drawOver();
break;
case GAME_OPTION:
drawOption();
break;
}
(省略)
}


686ポイント を手に入れた。


Name: 組木紙織  ..プログラマー(33,476ポイント)   Date: 2008/01/31(木) 22:16   No:13939     
Title: Re:C++のクラスの使い方についての質問です。    
状況が良くわかりませんが、
以下のように定義すれば求めているかたちで使えます。(表記だけ)
が、普通のメンバ関数と違うので、必要な場合以外は使わないほうがいいかと。
(というより普通に使おうと思っても使えないと思う)


class Strategy
{
public:
static void situation();

};
//このようにして使う。
Strategy::situation()




119ポイント を手に入れた。

Name: 組木紙織  ..プログラマー(33,589ポイント)   Date: 2008/01/31(木) 22:33   No:13940     
Title: Re:C++のクラスの使い方についての質問です。    
>コンストラクタを呼び出したときに
>Strategy sg;
>sg.situation();
>と宣言して使用する方法は考え付いたのですが、

sgはコンストラクタ内だけで使うオブジェクトですか?
そうでなければコンストラクタから出たときにスコープから外れるので気をつける必要があります。

一番スタンダードな使い方は
メンバ変数にStrategy sgを入れることだと思います。
その場合はsg.situation();
となりますが。


113ポイント を手に入れた。

Name: Justy  ..ハッカー(172,002ポイント)   Date: 2008/01/31(木) 23:14   No:13945     
Title: Re:C++のクラスの使い方についての質問です。    
>Strategy::situation();
>の形で使用する方法は無いでしょうか?
 クラスじゃなくても良ければ、名前空間を使ってもできます。

namespace Strategy

{
void situation();
}



100ポイント を手に入れた。

Name:  ..上級者(22,364ポイント)   Date: 2008/02/02(土) 20:36   No:13976     
Title: Re:C++のクラスの使い方についての質問です。    
ご回答ありがとうございます。
返信遅れてすいません。


組木紙織さん
>class Strategy
>{
> public:
> static void situation();
>};
このように宣言した時、言っておられるとおり、うまく使用で居ません。

もう一つ質問なのですが、
>メンバ変数にStrategy sgを入れることだと思います。
>その場合はsg.situation();
の場合は、
class Substance :public Frame{
Strategy sg;
}:

で使用するとして、sgの消滅のタイミングはいつなのでしょうか?
Substance();はヒープ領域に存在するように設定しているはずなので、この関数が終了するまでsgは消滅しないのでしょうか?
良く分からないのでよろしくお願いします。

Justyさん
>クラスじゃなくても良ければ、名前空間を使ってもできます。
クラスでの使用がしたいと考えています。


259ポイント を手に入れた。

Name: 組木紙織  ..プログラマー(33,893ポイント)   Date: 2008/02/02(土) 23:30   No:13985     
Title: Re:C++のクラスの使い方についての質問です。    
>sgの消滅のタイミングはいつなのでしょうか?

一言で言うと、メンバ変数はそのインスタンスの生存期間と同じです。


int WINAPI WinMain(HINSTANCE hI, HINSTANCE hp, LPSTR lpC, int nC){
SetMainWindowText("テトリス Ver2.0");
Substance *sub = new Substance(); //ここでStrategy sgの生成
sub->doMainLoop();
delete sub; //ここでStrategy sgの消去
}


この場合は構造体をポインタで扱ってるというイメージに近いかな。


Substance()はSubstanceクラスのコンストラクタなので関数だと思いますが、
関数だと明言されるとなんか違和感が。



207ポイント を手に入れた。

Name: yamahara [URL]  ..ぴよぴよ(32ポイント)   Date: 2008/02/03(日) 08:52   No:13989     
Title: Re:C++のクラスの使い方についての質問です。    
初めまして。
いつも、ROMってました……。

C++のクラスを使用して、サンプルゲームを作ってみました。
コンパイル環境はbcc++5.5です。

ループを格納するクラスを使っています。
ご参考までにどうぞ。☆

http://sansuido.jes.jp/game/test.zip


32ポイント を手に入れた。

Name:  ..上級者(22,894ポイント)   Date: 2008/02/03(日) 16:49   No:14000     
Title: Re:C++のクラスの使い方についての質問です。    
ご回答ありがとうございます。

>組木紙織さん
これで安心して使用できます。

**
>yamaharaさん

>cobject() : angle(0), color(0), range(0), speed(0), pos() {}
>class cshot : public cobject, public ccounter {
>cplayer() : shotInterval() {}
この3つの宣言方法の意味がまったくわからないので教えていただけないでしょうか?

>menu.loop()
これは何なんでしょうか?
cloopが基底クラスになっていたので、調べたのですが、パッケージが出てきました。
http://packages.debian.org/ja/source/etch/cloop
これのことでしょうか?

>cdata
と言うのも基底クラスなのですが、
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/appdev.102/B19292-01/parser.htm
に載っているCDATAのことなのでしょうか?

どちらも、よくわからなかったりしますが…(汗


391ポイント を手に入れた。

Name: Justy  ..ハッカー(172,377ポイント)   Date: 2008/02/03(日) 17:54   No:14003     
Title: Re:C++のクラスの使い方についての質問です。    
>この3つの宣言方法の意味がまったくわからないので教えていただけないでしょうか?
>cobject() : angle(0), color(0), range(0), speed(0), pos() {}
 クラスのコンストラクタとその実装です。
 ついでに初期化子によってメンバ変数 angle/color/range/speedを 0に、
posは cposクラスの引数なしのコンストラクタで初期化をしています。

コンストラクタ
http://www.02.246.ne.jp/~torutk/cxx/constructor/index.html


>class cshot : public cobject, public ccounter {
 普通の多重継承です。
 cobjectクラスと ccounterクラスを継承して cshotを作っています。


>cplayer() : shotInterval() {}
 これもコンストラクタとその実装ですね。


>menu.loop()
>cloopが基底クラスになっていたので、調べたのですが、パッケージが出てきました。
>これのことでしょうか?
 全く関係ないと思います。
 cloopクラスは DXライブラリの一般的なループを構成する部分を抽象化したもので、
実行する内容を継承することで自由にすげ替えることができるようにしたクラスのようです。
 今回の場合は cmenuクラスのメンバ関数 draw()/exec()を 基底クラスの loop()内で
毎回実行しています。


>cdata
>に載っているCDATAのことなのでしょうか?
 全く関係ないと思います。
 cmenu/cdataにしても cを先頭に付けることでクラスであることを明示しているのだと
推察します。
 なので、ただの dataを表すクラスなのでしょう。


# VisualC++じゃコンパイル通らないんですね(^^


375ポイント を手に入れた。

Name:  ..上級者(23,097ポイント)   Date: 2008/02/03(日) 21:32   No:14009 解決!     
Title: Re:C++のクラスの使い方についての質問です。    
ありがとうございます。

何とか理解できたと思います。(意味が取れるという意味で…)

ご回答本当にありがとうございました。


2倍のポイントを手に入れた! 108ポイント を手に入れた。



Name: オークヒイロ  ..ぴよぴよ(321ポイント)   Date: 2008/01/27(日) 08:39   No:13821       
Title: 文字点滅中の入力    

#include "DxLib.h"


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; //ウィンドウモードにする。通常はX639 Y479
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了

while(1){
int White,Brack;
int MouseInput= GetMouseInput() ;

White = GetColor( 255 , 255 , 255 ) ;
Brack = GetColor( 0, 0,0);

SetDrawScreen( DX_SCREEN_BACK ) ;
SetFontSize( 30 );
DrawFormatString(235,410, White ,"EXIT" );
ScreenFlip() ;

WaitTimer( 1000 ) ;

DrawBox(235,410,298,438,Brack,TRUE);
ScreenFlip() ;

WaitTimer( 1000 ) ;

if(( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 )break;

if( ProcessMessage() == -1 )
{
break ; // エラーが起きたらループを抜ける
}
}


DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
 
上記だと左クリック押しっぱなしでしか終了できません。
左クリック一回押しで終了させるにはどうしたらよいのでしょうか?


321ポイント を手に入れた。


Name: 管理人 [URL]  ..伝説のハッカー(505,004ポイント)   Date: 2008/01/28(月) 04:37   No:13839     
Title: Re:文字点滅中の入力    
そして、今回修正しておきましたが、コードを投稿するときは<pre>と</pre>のタグで囲ってください。(<>は半角)字下げされますので。

ライブラリの使い方として、ちょっと書き方がおかしいです。
基本的なことについては、ゲームプログラミングの館にて紹介していますので、参考にしてください。


まず、

SetDrawScreen( DX_SCREEN_BACK ) ;

は最初に一度だけ呼ぶ関数です。

SetFontSize( 30 );

も出来るだけ最初に一度だけしか呼ばない関数です。
何度も呼ぶときには他の関数を使います。
何度もサイズを変更したいのならゲームプログラミングの館で紹介している方法で行ってください。

int MouseInput= GetMouseInput() ;

は後で使って無いので無意味です。

ScreenFlip() ;

は書いたものを画面に反映させる関数ですので、ループのうち一度しか書きません。
出来るだけ

WaitTimer( 1000 ) ;

で待たせて時間を合わせるプログラムはやめましょう。
サンプルのようにカウンタを使ってカウンタで条件分岐すべきです。
そうじゃないとおっしゃるように、プログラムが機能していない間にクリックされてしまっては処理出来ないからです。

最低1秒間に30回はループを一周するように心がけたいものです。

以上を理解した上で、下にサンプルを書いたので見てください。
こういう感じでいいでしょうか。

描いてあるものを消す関数

ClearDrawScreen();//描いてあるものを消す

を呼べば書いてあるものは消えるので、黒で塗りつぶす必要はありません。


#include "DxLib.h"


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; //ウィンドウモードにする。通常はX639 Y479
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了
int White,Brack,MouseInput= GetMouseInput(),count=0;
White = GetColor( 255 , 255 , 255 ) ;
Brack = GetColor( 0, 0,0);
SetDrawScreen( DX_SCREEN_BACK ) ;
SetFontSize( 30 );

while(1){
if( ProcessMessage() == -1 )break ; // エラーが起きたらループを抜ける
ClearDrawScreen();//描いてあるものを消す
if( count%120 < 60 )//2秒のうち最初の1秒なら
DrawFormatString(235,410, White ,"EXIT" );
if(( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 )break;
count++;
ScreenFlip() ;
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}


907ポイント を手に入れた。

Name: オークヒイロ  ..かけだし(1,339ポイント)   Date: 2008/01/29(火) 08:18   No:13864     
Title: 続きです    
ありがとうございました。
とりあえず前回のことは理解したつもりで、次に進んでみたのですが

#include "DxLib.h"


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; //ウィンドウモードにする。通常はX639 Y479
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了

int White,Brack,MouseX , MouseY,count=0,count2=0;

White = GetColor( 255 , 255 , 255 ) ;// 白色の値を取得
Brack =GetColor( 0, 0 , 0 ) ;
SetDrawScreen( DX_SCREEN_BACK ) ;// 描画先を裏画面に設定
SetMouseDispFlag( TRUE ) ;
SetFontSize( 30 );
LoadGraphScreen( 0 , 0 , "back.bmp" , FALSE ) ;//DXライブラリサンプルプログラムより

SetMouseDispFlag( TRUE ) ;

ScreenFlip() ;// 裏画面データを表画面へ反映


while(1){
if( ProcessMessage() == -1 )break ;// エラーが起きたらループを抜ける
GetMousePoint( &MouseX , &MouseY ) ;//MouseXとMouseY変数に座標を与える


DrawFormatString(235,290, White , "GAME START");
DrawFormatString(235,350, White , "CONFING");
DrawFormatString(235,410, White , "EXIT");

if(MouseX>235&&MouseX<391&&MouseY>290&&MouseY<317){
if( count%120 < 60 )//2秒のうち最初の1秒なら
DrawBox( 235,290,395,317 , Brack , TRUE) ;

}else if(MouseX>235&&MouseX<341&&MouseY>350&&MouseY<375){
if( count%120 < 60 )//2秒のうち最初の1秒なら
DrawBox( 235,350,345,378 , Brack , TRUE) ;

}else if(MouseX>235&&MouseX<294&&MouseY>410&&MouseY<438){
if( count%120 < 60 )//2秒のうち最初の1秒なら
DrawBox( 235,410,298,438 , Brack , TRUE) ;

if(( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 )break;

}
DrawBox( 0,0,200,100 , Brack , TRUE) ;
count++;
count2=count%120;
DrawFormatString( 0, 0, White , "%d", count2 ) ;
DrawFormatString( 100, 0, White , "%d", count ) ;
ScreenFlip() ;


}


DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}


ClearDrawScreen()関数だと全部消えてしまうため、DrawBox関数をしようしたのですがそうすると背景も消えて
しまうのでうまくいきません。


1,018ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(507,148ポイント)   Date: 2008/01/30(水) 01:04   No:13876     
Title: Re:続きです    
基本的に描画は「不必要な部分を隠す」ようにプログラムするのではなく、
「毎回全部消して、毎回必要な描画を全て行う」というスタンスを取ります。
もちろん、違う方法もありますが、最初はその方法の方がいいでしょう。

今、

LoadGraphScreen( 0 , 0 , "back.bmp" , FALSE ) ;//DXライブラリサンプルプログラムより

ここで描画した画像が必要なら消した後で毎回書きましょう。これを毎回描いた位では、全体の処理速度はほとんど変わりません。


179ポイント を手に入れた。

Name: オークヒイロ  ..かけだし(1,359ポイント)   Date: 2008/02/03(日) 19:53   No:14006 解決!     
Title: 解決しました    
管理人さんのおかげで解決しました。ありがとうございます。

20ポイント を手に入れた。



Name: tsurukamepanda  ..ぴよぴよ(12ポイント)   Date: 2008/01/31(木) 22:39   No:13941       
Title: c言語 2進数ローテートについて    
こんばんは。只今C言語について勉強していてわからなくなってしまったので、質問させていただきました。よろしくお願いします。

設問は....


符号無し整数xを右にnビット回転した値を返す関数rrotateと、左にnビット回転した値を返す関数lrotate
 unsigned rrotate(unsigned x, int n){ /* … */ }
 unsigned lrotate(unsigned x, int n){ /* … */ }
を作成せよ。


というものなのですが、途中まで自分で作ってみてわからない点は、最下位ビットに1がある時にさらに右にシフトさせると、今度はその1が最上位ビットに移動するということができませんでした。どのような考え方をすればよいのか、わかる方ご指導お願いします(わかりづらかったらすみません。)


12ポイント を手に入れた。


Name: box  ..ハッカー(106,058ポイント)   Date: 2008/01/31(木) 22:58   No:13942     
Title: Re:c言語 2進数ローテートについて    
> その1が最上位ビットに移動するということができませんでした

その1を何ビットシフトすれば、最上位に移動するでしょうか。


2ポイント を手に入れた。

Name: 組木紙織  ..プログラマー(33,686ポイント)   Date: 2008/01/31(木) 23:12   No:13944     
Title: Re:c言語 2進数ローテートについて    
いくつか方法があるとは思いますが、
私のお気に入りはこんな感じです。

#include <stdio.h>
#include <limits.h>

int main(void)
{
unsigned int a = (UINT_MAX >>1)+1;
printf("%x",a);

return 0;
}


97ポイント を手に入れた。

Name: たかぎ [URL]  ..プログラマー(29,018ポイント)   Date: 2008/02/01(金) 10:40   No:13951     
Title: Re:c言語 2進数ローテートについて    
例によってそのままの答えではなく、C++によるヒントだけ。
#include <limits>

#include <cassert>

template <bool LegalType>
struct rrotate_helper;

template <>
struct rrotate_helper<true>
{
template <typename T>
static T f(T x, int n)
{
const int digits = std::numeric_limits<T>::digits;
assert(n >= 0 && n < digits);
return (x >> n) | (x << (digits - n));
}
};

template <typename T>
T rrotate(T x, int n)
{
typedef std::numeric_limits<T> limits;
return rrotate_helper<limits::is_integer && !limits::is_signed>::f(x, n);
}


C++なので丸写しは意味をなしませんが、じっくり見ると重要なヒントが見えてくるはずです。
なお、これは rrotate だけなので、lrotate は自分で考えてください。


314ポイント を手に入れた。

Name: フリオ  ..上級者(21,398ポイント)   Date: 2008/02/01(金) 12:23   No:13954     
Title: Re:c言語 2進数ローテートについて    
 
 質問のヒント、というより答えですが、
最下位(最上位)ビットが 1 のとき、それを最上位(最下位)ビットに移動する方法は、

反転 -> シフト -> 反転

です。
 


76ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..熟練のプログラマー(56,087ポイント)   Date: 2008/02/01(金) 21:08   No:13961     
Title: Re:c言語 2進数ローテートについて    
では穴埋め問題にでもしましょうか。関数名も適当なのに変えて…

unsigned int RotateRight(unsigned int index,int count){
return (index/*ここが抜けてまーす*/count/*ここも*/index<<CHAR_BIT*/*ここも抜いてます*/(unsigned int)-count);
}

回転って言うのはこういうことでしょう?(面倒なので8ビットで考えてます)
11100101 rrotate 3 = 10111100
10010110 lrotate 5 = 11010010


203ポイント を手に入れた。

Name: たかぎ [URL]  ..プログラマー(29,087ポイント)   Date: 2008/02/01(金) 21:38   No:13962     
Title: Re:c言語 2進数ローテートについて    
ちなみに、一般的には unsigned int 型のビット長は CHAR_BIT * sizeof(unsigned int) では求まりません。
なぜなら、詰め物ビットが存在するかもしれないからです。


41ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..熟練のプログラマー(56,150ポイント)   Date: 2008/02/02(土) 08:43   No:13967     
Title: Re:c言語 2進数ローテートについて    
>ちなみに、一般的には unsigned int 型のビット長は CHAR_BIT * sizeof(unsigned int) では求まりません。

それは知りませんでした。それは失礼しました。


63ポイント を手に入れた。

Name: tsurukamepanda  ..ぴよぴよ(56ポイント)   Date: 2008/02/03(日) 10:46   No:13990 解決!     
Title: Re:c言語 2進数ローテートについて    
皆さんいろいろなヒントをありがとうございました。おかげさまで何とか
答えにたどり着きました!!またちょくちょく覗きに来ます!!


44ポイント を手に入れた。



Name: chunezu  ..入門者(2,808ポイント)   Date: 2008/02/02(土) 17:26   No:13971       
Title: ヘッダファイル    
シューティングの館にあるように、ヘッダファイルをつかって構造体を呼び出すと言う事をしようとしています。

/* kouzou.h */

typedef struct{
double x,y,size;
int flag;
double angle;
}Player;

Player nz;


typedef struct{
int flag,pattern;
int x,y,size;
}Tama;

Tama t;


/*extern.h*/

typedef struct{
double x,y,size;
int flag;
double angle;
}Player;

extern Player nz;


typedef struct{
int flag,pattern;
int x,y,size;
}Tama;

extern Tama t;

コンパイルすると、

'Player' : 再定義されています。異なる基本型です。
'Tama' : 再定義されています。異なる基本型です。

とエラーが出てきてしまいます。
ググッてみてもさっぱり原因が分かりません。
一体どうしたらいいでしょうか?

OSはXPで、コンパイラがVisual C++2005です。


310ポイント を手に入れた。


Name: box  ..ハッカー(106,211ポイント)   Date: 2008/02/02(土) 17:57   No:13972     
Title: Re:ヘッダファイル    
> コンパイルすると、

当該のヘッダーファイル群をインクルードしている
ソースファイルの中身はどうなっていますか?

ヘッダーファイルだけ見ても、「同じ構造体を
複数のヘッダーファイルで定義していると、
保守しづらくて仕様変更に弱いだろうなあ」ということがわかるだけです。


94ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..熟練のプログラマー(56,212ポイント)   Date: 2008/02/02(土) 19:57   No:13974     
Title: Re:ヘッダファイル    
両方のヘッダーファイルに定義しているからエラーがでます。

片方の構造体を削除し、ヘッダーファイルの先頭に

#include"削除しなかったほうのヘッダーファイル"

としてください。


62ポイント を手に入れた。

Name: chunezu  ..入門者(4,055ポイント)   Date: 2008/02/02(土) 20:34   No:13975     
Title: Re:ヘッダファイル    
やってみました。


/*extern.h*/
#include "kouzou.h"

extern Player nz;

extern Tama t;


/*kouzou.h*/
typedef struct{
double x,y,size;
int flag;
double angle;
}Player;

Player nz;


typedef struct{
int flag,pattern;
int x,y,size;
}Tama;

Tama t;

"struct Player nz" (?nz@@3UPlayer@@A) は既に main.obj で定義されています。
"struct Tama t" (?t@@3UTama@@A) は既に main.obj で定義されています。
1 つ以上の複数回定義されているシンボルが見つかりました。
とでてきてしまいます。

もしかしたらソースに問題があるかもしれないので長くなりますがソースも載せておきます。

/*main.cpp*/
#include "DxLib.h"
#include <math.h>
#include "extern.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);
if( DxLib_Init()==-1)return -1;
SetDrawScreen(DX_SCREEN_BACK);

extern void fps();
extern void fpscolor();
extern void enemy1();


int image[2];
char Key[256];
int GHandle;

nz.x=320;
nz.y=120;
nz.angle=180;
nz.size=10;
nz.flag=1;

// 読み込み
GHandle=LoadGraph("nz.png");
LoadDivGraph("back.png",2,2,1,640,480,image);
fpscolor();

while(!ProcessMessage() && !ClearDrawScreen())
{
GetHitKeyStateAll(Key);

int RefreshTime;
RefreshTime=GetNowCount();


//左回転
if(Key[KEY_INPUT_LEFT]==1){
nz.angle=nz.angle+10;
//回転に制限
if(nz.angle>=250){nz.angle=250;}
}


//右回転
if(Key[KEY_INPUT_RIGHT]==1){
nz.angle=nz.angle-10;
//回転に制限
if(nz.angle<=120){nz.angle=120;}
}


//自機移動
nz.x=nz.x+sin((3.141592/180.0)*nz.angle)*5;

//左の壁に当たって勝手に曲がる
if(nz.x<=130){
nz.x=130;
nz.angle=nz.angle-10;
if(nz.angle<=180){nz.angle=180;}
}

//右の壁に当たって勝手に曲がる
if(nz.x>=510){
nz.x=510;
nz.angle=nz.angle+10;
if(nz.angle>=180){nz.angle=180;}
}

//背景
DrawGraph(0,0,image[1],FALSE);
DrawGraph(0,0,image[0],TRUE);


enemy1();

//自機
if(nz.flag==1){DrawRotaGraph(nz.x,nz.y,1,3.141592/180.0*nz.angle,GHandle,TRUE);}

//FPS
fps();

ScreenFlip();

while(GetNowCount()-RefreshTime<17);

}

DxLib_End(); // DXライブラリ使用の終了処理
return 0; // ソフトの終了
}

/*enemy.cpp*/
#include "DxLib.h"
#include "extern.h"

int tHandle = LoadGraph("nz.png");
int count=0;

void enemy1(){

count++;

DrawFormatString(0,0,GetColor(255, 255, 255),"%d",count);

{
if (t.flag==1&&t.pattern==1){
t.y=t.y+5;
}

switch (count)
{
case 60:
count = 0; //出現して何カウント目か測るカウンター初期化
t.flag = 1; //出現フラグを立てる
t.pattern = 1; //どういう軌道を描くか
t.x = 100.0; //xの初期座標
t.y = 100.0; //yの初期座標
t.size = 10; //敵の大きさ
break;
default:
break;
}

if (t.flag == 1){
DrawRotaGraph(t.x,t.y,t.size,0,tHandle,TRUE );
}
}
}

/*fps.cpp*/
#include "DxLib.h"

int counter=0,FpsTime[2]={0,},FpsTime_i=0;
int color_white;
double Fps=0.0;
char Key[256];

void fpscolor(){
color_white = GetColor(255,255,0); //白色ハンドルを取得
return;
}

void fps(){
if(FpsTime_i== 0)
FpsTime[0]=GetNowCount(); //1周目の時間取得
if(FpsTime_i==49){
FpsTime[1]=GetNowCount(); //50周目の時間取得
Fps = 1000.0f / ((FpsTime[1] - FpsTime[0]) / 50.0f);//測定した値からfpsを計算
FpsTime_i=0;//カウントを初期化
}
else
FpsTime_i++;//現在何周目かカウント
if(Fps != 0)
DrawFormatString(565,460,color_white,"FPS %.1f",Fps); //fpsを表示
return;
}


長々と申し訳ないです・・・
ご教授願います。



1,247ポイント を手に入れた。

Name:  ..上級者(22,489ポイント)   Date: 2008/02/02(土) 20:41   No:13977     
Title: Re:ヘッダファイル    
>"struct Player nz" (?nz@@3UPlayer@@A) は既に main.obj で定義されています。
>"struct Tama t" (?t@@3UTama@@A) は既に main.obj で定義されています。

同じ名前が存在するのが問題なので、同じ名前を使わないように
って意味ですね。
externの使い方が違ったりするのかな?
<pre></pre>でくくられてないのでソース見てませんが。


125ポイント を手に入れた。

Name: box  ..ハッカー(106,243ポイント)   Date: 2008/02/02(土) 20:45   No:13978     
Title: Re:ヘッダファイル    
> "struct Player nz" (?nz@@3UPlayer@@A) は既に main.obj で定義されています。
> "struct Tama t" (?t@@3UTama@@A) は既に main.obj で定義されています。

enemy.cpp のコンパイル時に、このメッセージが出ますか?


2倍のポイントを手に入れた! 32ポイント を手に入れた。

Name: chunezu  ..入門者(4,145ポイント)   Date: 2008/02/02(土) 20:56   No:13980     
Title: Re:ヘッダファイル    
それぞれを別々にコンパイルした時にはエラーは出ませんでした。

いっぺんにビルドするとエラーが起こるようです。


2倍のポイントを手に入れた! 90ポイント を手に入れた。

Name: box  ..ハッカー(106,341ポイント)   Date: 2008/02/02(土) 21:06   No:13981     
Title: Re:ヘッダファイル    
main.cpp と enemy.cpp の双方で extern.h をインクルードしていますので、
結果として、2つの cpp ファイルで kouzou.h をインクルードしていることになります。

そうすると、main.cpp と enemy.cpp の双方で、外部変数 nz と t の実体を
定義しようとします。
外部変数の実体を定義するのは、プログラム全体のどこか1箇所でなければなりません。


98ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..熟練のプログラマー(56,373ポイント)   Date: 2008/02/02(土) 21:55   No:13982     
Title: Re:ヘッダファイル    
一般的には、ヘッダーファイルの中身を以下でくくる方法があります。

#ifndef HEADER_H_ONCE /*※ヘッダーファイル特有の名前(つまりヘッダーごとに適当に決めればよい)*/
#define HEADER_H_ONCE /*※と同一*/

/*ヘッダーファイルの内容を書く*/

#endif /*どのifndefに対応しているかコメントを残すといいのではないでしょうか*/

コンパイラなどが変わると使えませんがVCではヘッダーファイルの先頭に以下の記述をする方法もあります。

#pragma once

インクルードガードをつけないと構造体の定義で二重定義してしまう事になります。


161ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..熟練のプログラマー(56,424ポイント)   Date: 2008/02/02(土) 21:58   No:13983     
Title: Re:ヘッダファイル    
後、グローバル変数はその定義用のソースファイルを用意するというのも一つの手ではないでしょうか。
ある意味でまとまるのかもしれません。


51ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(510,313ポイント)   Date: 2008/02/03(日) 01:52   No:13986     
Title: Re:ヘッダファイル    
早いとこなんとかしないといけませんね、すみません(_ _|||)

あのコードは、なるべく入門時に見ないような構文はかかないようにして作ったので余計に変に難しくなってしまっています。
本来書くべき方法ではありません。
私も理想のかき方というものはよく知りませんが、私のやっている方法を紹介します。


いちいち
=========GlobalVariable.h============
の中身も
===========ExternGV.h=============
の中身もかえるのめんどくさいですよね。

構造体は他のヘッダファイルにかいてもいいですし、全部一つにまとめたければ
こちら、変更が一度で済む方法があるので、よければご参考下さい。

まず、main関数のあるファイルの一番最初に

#define GLOBAL_INSTANCE

と書き、他のファイルにはこれを書きません。
そしてGlobalVariable.h内で、

#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern
#endif

と書きます。
この意味は

main関数のあるファイルからこのヘッダファイルが呼ばれたときは、
「GLOBAL」という文字列は「空白」に置き換えて、

他のファイルからこのヘッダファイルが呼ばれたときは、
「GLOBAL」という文字列は「extern」という文字列に置き換えてね

という意味になります。

だから、これからは、全てのファイルからGlobalVariable.hを呼び、
ExternGV.hは使わないので削除してOKです。

今までGlobalVariable.hで

int func_state;

などと宣言していた部分は

GLOBAL int func_state;

に置き換えてください。オートで必要に応じてexternにしてくれる仕様になり便利です。
こうすると、宣言と同時に値代入が出来なくなるので注意してください。

GLOBAL int func_state=2;

などと書くとエラーになります。これは

extern int func_state=2;

が出来ないのと同じ理由です。
定義で、

#define GLOBAL_VAL(v) =(v)

などを用いれば出来ることは出来るのですが、
値の初期化は初期化関数を作って行ったほうがいいので、
自然と宣言と同時に値格納は使わなくてもよくなると思いますので・・。

構造体は、このファイルに普通に書いていただければOKです。

つまりまとめますと、GlobalVariable.h内で、functionというグローバル変数宣言と、
x,yを持ったptという構造体を定義したければ


#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern
#endif

GLOBAL int function;

typedef struct{
int x,y;
}pt_t;


こんな感じになります。

 
 
ExternGV.hは削除します。


1,016ポイント を手に入れた。




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +