|
Name: テクテク ..ぴよぴよ(53ポイント)
Date: 2008/11/28(金) 15:25
No:24706
|
|
Title: fgets関数
|
|
ちょっとお聞きします。
#define MAX_A 512
char buf[MAX_A];
while(fgets(buf,sizeof buf,fp) != NULL){
ファイルを開いてfgetsで1行ずつ読み込みますよね??
sizeof bufの制限値..つまりMAX_Aの値を超えたときの
この場合エラー処理の仕方誰かご存知でしょうか??
知っていたら教えていただきたいんでど。
というよりこういうケースの場合エラー処理
する必要あるんですか??
53ポイント を手に入れた。
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(900,965ポイント)
Date: 2008/11/29(土) 11:18
No:24746
|
|
Title: Re:fgets関数
|
|
行いたいエラー処理の種類によります。
ループ中の読み込みは1行一周じゃないといけないのなら、改行まで読み飛ばしてはどうでしょう?
具体的には更にwhileの中でfgetcを呼んで \n か \0 か EOF が来るまで読み飛ばしてはどうでしょうか。
もしその必要がないなら、例えば上の例でいくと1行の文字数が600文字とかだったら、
2回目に呼ぶ時に後ろの600-511文字が入るだけです。
行単位の読み込みですから、逆に実際に存在する1行の文字数より多くバイト数を指定する分には問題ないです。
210ポイント を手に入れた。
|
|
|
|
Name: yu ..入門者(2,501ポイント)
Date: 2008/11/28(金) 22:37
No:24731
|
|
Title: 画像の重なり
|
|
度々と質問ばかりですみません;
なるべく自分で解決しようとしているのですが・・・
ちょっと言葉で説明しにくいのです。
同じ画像を弾の座標に合わせて何回も描画して段々小さくしていくようにして
弾の軌道を描こうと思ったのですが、
少しおかしなことになりました。
画像を何度も描画しているとたまに小さくなっていくのがわかるときがあります。
・・・すみません分かりにくくて;
小さくなっていく時の画像を添付しました
動画のほうが分かりやすかったかな・・・
以下、関係がありそうなところのソースです(管理者様の龍神録をベースに作成してあります。)
#define SHOT_START 500
//弾発射時描画用構造体
typedef struct{
//フラグ、種類、カウンタ、色、消す時間
int flag,knd,cnt,col,delcnt;
//座標、消す速さ、大きさ
double x,y,delspd,r;
}shot_start_t;
int sertch_shot_start(){//空き番号を返す
for(int i=0;i<SHOT_START;i++){
if(shot_start[i].flag==0)
return i;
}
return -1;
}
//弾発射時のエフェクト登録
//x,x座標、カウント、描く頻度(例:3なら3回に一回かく)、小さくなるスピード、大きさ、種類、色
void shot_graph(double x, double y,int kaisu, double delspd,double r, int knd, int col){
int k;
static int cnt;
if((k=sertch_shot_start())!=-1){
shot_start[k].flag = 1;
shot_start[k].cnt = 0;
shot_start[k].delcnt=kaisu;//書く頻度
shot_start[k].delspd=delspd;//小さくなるスピード
shot_start[k].x = x;//表示するx座標
shot_start[k].y = y;//表示するy座標
shot_start[k].r = r;//最初の大きさ
shot_start[k].knd = knd;//種類
shot_start[k].col = col;//色 数はkndできまる
if(cnt%kaisu!=0)//1ならすべて描画
shot_start[k].flag=0;
}
cnt++;
}
//登録例です
void boss_shot_bulletH000(){
#define TM000 200
int i,t=boss_shot.cnt%TM008;
if(t%100==0){
bullet_way(boss.x,boss.y,1,bossatan2(),0, 2,8,1,0,0);
}
for(i=0;i<BOSS_BULLET_MAX;i++){
if(boss_shot.bullet[i].flag>0){
shot_graph(boss_shot.bullet[i].x,boss_shot.bullet[i].y,1,3,1,0,4);
}
}
}
//計算
for(int j=0;j<SHOT_START;j++){
if(shot_start[j].flag>0){
shot_start[j].cnt++;
if(shot_start[j].cnt<3)
shot_start[j].r+=0.13;
if(shot_start[j].cnt>4)
shot_start[j].r-=0.01*shot_start[j].delspd;
if(shot_start[j].r<0)
shot_start[j].flag=0;
}
}
//描画処理(graph_bullet()内にあります)
if(boss_shot.flag>0){//弾幕データがオンなら
for(j=0;j<SHOT_START;j++){//弾発射時描画
if(shot_start[j].flag>0){
DrawRotaGraphFdF(shot_start[j].x, shot_start[j].y,
shot_start[j].r*2, 0,
img_shot_start[shot_start[j].knd][shot_start[j].col],TRUE);
}
}
}
描く頻度があやしいと思って数値を変えてみたのですが同じでした。
または、SHOT_STARTの数が足りてないのかなと思って2000とかにしても同じでした。
変数内を確認しても数は足りていました。
エラーばかりだしてるバカなので簡単な間違いをしていそうで怖いです。
ソースも・・・分かりにくいですね・・・(というか汚い;
すみません;
1,116ポイント を手に入れた。
|
|
|
|
Name: Justy ..ハッカー(277,445ポイント)
Date: 2008/11/28(金) 23:18
No:24733
|
|
Title: Re:画像の重なり
|
|
うーん、私にはあんまり意味がよくわからなかったです。
「小さくなっていくのがわかるときがあります」とありますが、
小さくしているのだから、わかって当然、と思ってしまいます。
どういうことなのでしょうか?
もうちょっと補足をお願いします。
14ポイント を手に入れた。
|
|
|
|
|
Name: yu ..入門者(2,891ポイント)
Date: 2008/11/29(土) 00:12
No:24737
|
|
Title: Re:画像の重なり
|
|
あぁ!自分で自己解決しました!
Justy様の返信を考えていたらわかりました;
ありがとうございます。
そして、日本語不自由ですみません;
いまから質問内容の意味を再度書いてみます。
この記事で添付した画像の枠で囲ってあるところをみると
他の画像より前面にでてしまっているものがあります。
弾速が早いとあまり気にならないかもしれませんが
最初に添付したものをみるとかなり目立っています;
この弾の軌跡は弾の座標に画像を何回も描画し、小さくしていくことで表現しています。
ご理解頂けたでしょうか?・・・わかりませんよね・・・すみません
以下、原因を書いてみました。
int sertch_shot_start(){//空き番号から返す
for(int i=0;i<SHOT_START;i++){
if(shot_start[i].flag==0)
return i;
}
return -1;
}
と
for(j=0;j<SHOT_START;j++){//弾発射時描画
if(shot_start[j].flag>0){
DrawRotaGraphFdF(shot_start[j].x, shot_start[j].y,
shot_start[j].r*2, 0,
img_shot_start[shot_start[j].knd][shot_start[j].col],TRUE);
}
}
のところで
shot_start[0]〜[50]内にそのデータが入ったとすると、
弾が小さくなって最初にshot_start[0]のflagが0になり
そして新しいデータがshot_start[0]に入るとshot_start[50]のほうが
後に描画されるのでshot_start[50]が前面に描画されてしまいました。
本当に説明が下手だ・・・orz
回避するため少し考えてみたのですが、
あまりいい策が思い浮かびません・・・。
上記のことが理解できないかもしれませんが、
もし分かった方がいたら
何か良い方法を教えていただけないでしょうか?
2倍のポイントを手に入れた! 390ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(277,811ポイント)
Date: 2008/11/29(土) 00:49
No:24738
|
|
Title: Re:画像の重なり
|
|
なるほど、理解しました。
ようするに描画順がおかしいため、見た目がおかしくなるということですね。
>何か良い方法を教えていただけないでしょうか?
あれ? 自己解決したんじゃ???
単純に出現した順番(或いは時間とか出現した順を区別できる何か)も記録しておき、
描画するときに新たに出現した順にソートして描画すればいいわけですよね。
一例を挙げると、描画時に int型のSHOT_START分の配列 order用意し、
shot_start[j].flag>0を満たす jの値を orderに片っ端から入れていきます。
で、orderに入っている値の shot_start[j]の要素の出現順を比較して
orderの値をソート、最後に orderの値の順番…… shot_start[order[j]]な感じで描画すれば
うまくいくはずです。
或いは shot_startのような配列ではなくリンクリストを使って管理すれば
追加はリストの先頭に、削除はリストの最後からとすれば
ソートの必要がなくなるので処理は楽になりますね。
366ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(277,945ポイント)
Date: 2008/11/29(土) 00:56
No:24739
|
|
Title: Re:画像の重なり
|
|
ちなみにある程度の規模のゲームになると、描画オブジェクトには描画プライオリティを設けて
それを元にソートしてから表示したりすることがあります。
3Dだとほぼ必須になりますし、2Dでも例えば自機の前後を動くようなものを
描画する場合、自機の奥にある場合(自機が上)と手前にある場合(自機が下)を表現するために
オブジェクトと自機をソートして描画する必要が出てきます。
余力が有れば、そのあたりをシステマチックに処理できるように改良してみるのも
いいかと思います。
134ポイント を手に入れた。
|
|
|
|
|
Name: yu ..入門者(2,987ポイント)
Date: 2008/11/29(土) 01:24
No:24740
| 解決!
|
Title: Re:画像の重なり
|
|
自己解決ではなく原因解明ですね・・・
すみません;
なるほど・・・
ソートすればいいのですね。
プログラミングを始めて2か月なので
まだまだ知識不足ですね・・・もっと勉強するようにします。
Justy様、本当にありがとうございました。
返信が早く、とても助かりました。
96ポイント を手に入れた。
|
|
|
|
Name: へたれ ..ぴよぴよ(371ポイント)
Date: 2008/11/28(金) 03:13
No:24671
|
|
Title: ベジェ曲面について
|
|
私は学校の課題でベジェ曲面を書くプログラムを作成しています。
作成したプログラムは少し、内容が長いのでこちらからダウンロードして見ていただきたいです。
アドレス:http://www1.axfc.net/uploader/He/so/163828
パス:bezier
このプログラムの説明として、イメージとしては制御点を16点(x,y,z座標)を指定しています(つまり48個の座標を指定するということです)
*-*-*-*
*-*-*-*
*-*-*-*
*-*-*-*どれがどれに対応しているかはp[3][4][4]の[3]は(x,y,z)で次の[4][4]は各制御点です([0][0]が一番左下で[3][0]が右下で[3][0]が左上です)
これをベジェ曲線の計算式に入れて取り出したい面q00,q10,q01,q11の座標をstl形式風のファイルに出力さしているのですが、面の分割数(ここではm,nとしています)を5,5などm=nにしているのにきれいに分割されないです。添付した画像のような感じです。
長々しく書きましたが、用は指定通りに分割されないのはどうしてか?
学校の先生はプログラムの中の植木算がおかしいんだね。と言ってくれたのですが、
どこのことかいまいち分かりません。
分かる方がおられましたらご教授のほうお願いします。
371ポイント を手に入れた。
|
|
|
|
Name: Justy ..ハッカー(277,431ポイント)
Date: 2008/11/28(金) 21:24
No:24728
|
|
Title: Re:ベジェ曲面について
|
|
なんともすごい scanfですね。
ソースを見る限りコンパイル出来そうにないので、
植木算と言っているあたりから推測しますと問題になりそうなのは
for( i=0; i<=m; i++ ){
for( j=0; j<=n; j++ ){
の部分でしょう。
mと nが面の分割数だとすると、 for文における iや jの最後ループは
mや nの値をとることになり、その場合
u1 = ((double)i + 1.0) / (double)m;
v1 = ((double)j + 1.0) / (double)n;
この部分で iや jに 1.0を足したことで、
u1 = (m + 1.0) / m;
v1 = (n + 1.0) / n;
という計算をすることになり、u1や v1は 1.0を越えます。
これが問題なのではないでしょうか。
349ポイント を手に入れた。
|
|
|
|
|
Name: へたれ ..ぴよぴよ(478ポイント)
Date: 2008/11/29(土) 00:12
No:24736
| 解決!
|
Title: Re:ベジェ曲面について
|
|
まずは回答ありがとうございます。
ご指摘どうり問題の部分
for( i=0; i<=m; i++ ){
for( j=0; j<=n; j++ ){
のとこに原因がありました。
まだまだ勉強不足でお恥ずかしい限りです。
本当にありがとうございました。
107ポイント を手に入れた。
|
|
|
|
Name: 大工 ..プログラマー(33,159ポイント)
Date: 2008/11/28(金) 21:57
No:24729
|
|
Title: +演算子のオーバーロード
|
|
配列同士を足し合わせる+演算子をオーバーロードしようとしたらコンパイルエラーとなりました.
引数を int operator+(int, int); とするのは禁止されているのは分かるのですが,なぜポインタを
渡してはいけないのでしょうか?
hoge.cpp:6: error: ‘int* operator+(int*, int*)’ must have an argument of class or enumerated type
#include<iostream>
#define N 10
typedef int* p_int;
p_int operator+(const p_int p, const p_int q) {
p_int array_;
array_ = new int[N];
for(int i = 0; i < N; i++) {
array_[i] = p[i] + q[i];
}
return array_;
}
int main(void) {
// まだ途中です
return 0;
}
356ポイント を手に入れた。
|
|
|
|
Name: 御津凪 [URL] ..プログラマー(39,802ポイント)
Date: 2008/11/28(金) 23:31
No:24734
|
|
Title: Re:+演算子のオーバーロード
|
|
(VC++ ヘルプから抜粋)
オーバーロードされた演算子に、クラス型のパラメータが指定されていません。
"a < b" (a と b は型クラス A) を記述できるためには、参照 (ポインタではなく参照を使用) または型によるパラメータを少なくとも 1 つ渡す必要があります。
どちらのパラメータもポインタの場合は、ポインタ アドレスの純粋な比較が行われるため、ユーザー定義の変換は使用されません。
-------------------------------------
つまり、演算子オーバーロードは、最低でもどちらかの型がクラス型でなくてはならなく、かつ両方ともポインタ型であってはならない、ということです。
282ポイント を手に入れた。
|
|
|
|
Name: 柏 ..上級者(17,139ポイント)
Date: 2008/11/25(火) 16:12
No:24537
|
|
Title: 龍神録プログラミングの館34章、円と長方形の当たり判定について
|
|
こんにちは。早速ですがテンプレートを使用して質問させて頂きます。
[1] 質問文
[1.1] 自分が今行いたい事は何か
34章の「長方形の中に円が入り込んでいないか」について、どうしてこうなるのか? という疑問を解決したいと思っています。
[1.2] どのように取り組んだか(プログラムコードがある場合記載)
龍神録プログラミングの館34章と睨めっこしつつ、ベクトル、atan2、などの理解が不足している所は参考書なりグーグルで検索するなりして調べたという感じです。
[1.4] 今何がわからないのか、知りたいのか正直分からない事だらけで、かなり整理出来ていないのですが……とりあえずまず一番に理解したい事は、
そもそも内積と外積とは一体なんなのか?
ということです。
参考書には「内積はかけ算」と書いてありますが、ベクトルのかけ算をして出るその"内積"というものは一体どういうもので、どのような情報なのか、色々調べてはみましたがよく分かりませんでした。。。
[2] 環境
[2.1] OS : WindowsXP
[2.2] コンパイラ名 : VC++ 2005
[3] その他
・使用ライブラリ
DXライブラリ。
・どの程度C言語を理解しているか
構造体、ポインタ、ファイル入出力などなど、基本的な所は大丈夫だと思います。
非常に掴み所のない質問で申し訳ないのですが、何かアドバイスあればよろしくお願いします。
もう少し自分の中で整理出来れば質問内容を修正したいと思います。
/*追記*/
投稿してすぐに、そういえばこの章は掲示板で関係するスレッドがあった事を思い出しましたので、読んでみます。
以下、適当に理解していること、おそらくこういうことでは?と思っていることなど。
・とりあえず回転方向を考えず、角度(0°〜180°)を求めるだけなら内積の定義からcosθを求め、アークコサインを使えばいいらしい。
・長方形が傾いていない事を想定するなら、内積・外積は求めずベクトルC→P,C→Qのなす角をatan2で求めれば恐らく判定出来る。
613ポイント を落としてしまった。
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(897,088ポイント)
Date: 2008/11/25(火) 19:33
No:24547
|
|
Title: Re:龍神録プログラミングの館34章、円と長方形の当たり判定について
|
|
ちょっと的外れな回答になるかもしれませんが、仕様を変えてみるというのはどうでしょう?
一般的に初歩的なブロック崩しはそこまで考えられて無いと思います。
円は正方形として当たり判定を考えた方がわかりやすくないでしょうか?
この赤の部分に当たる機会はほとんどないですよね。
ブロックの角に赤の部分がもしあたったとして、それを忠実に計算して進行方向を変えるのは結構めんどくさいんじゃ無いかと思います。
正方形と長方形の当たり判定は簡単に計算できると思うので、そちらで実装してみてはどうでしょう?
もし実装してみて、これではやはり違和感があるという場合は、改めて実装してみては。
2倍のポイントを手に入れた! 544ポイント を手に入れた。
|
|
|
|
|
Name: 柏 ..上級者(16,576ポイント)
Date: 2008/11/25(火) 20:42
No:24548
|
|
Title: Re:龍神録プログラミングの館34章、円と長方形の当たり判定について
|
|
管理人さん、アドバイスありがとうございます。
まず最初に、色々と情報が少なく、質問内容が分かりづらくなってしまい申し訳ありません。。。
管理人さんが紹介してくださった短形同士の当たり判定(という表現でいいでしょうか?)ですが、難しい数学などは苦手なため、わりと楽に実装できる点と、過去に旧シューティングゲームの館のソースをいじっている時に試した事があるという点で、一度すでに実装してはいました。
おっしゃる通りブロック崩しを作成する場合、この当たり判定で全く問題ありません。
そもそもブロック崩しで、長方形に円が入り込むという状況は想定しなくても問題ないですね。。。
というわけでブロック崩しを作るうえでは問題ないのですが、将来的に色々と応用出来るかと思い、ブロック崩しを別にして「長方形と円の当たり判定」を学んでおこうと思った次第です。
……という内容を書けばよかったですねorz
とりあえず回転(傾き?)を考えない場合の「長方形の中に円が入り込んでいないか」という当たり判定は実際に動かして確認出来ましたので、もうちょっとベクトル、内積・外積について調べてみます。
・報告
34章の、
ベクトルAとBの内積及び外積の定義
の所に書かれている外積の定義ですが、もしかして
A×B=Ax*By - Ay*Bx
でしょうか?
一応ご報告しておきます。
563ポイント を落としてしまった。
|
|
|
|
|
Name: 柏 ..上級者(16,962ポイント)
Date: 2008/11/26(水) 21:50
No:24618
|
|
Title: Re:龍神録プログラミングの館34章、円と長方形の当たり判定について
|
|
とりあえず内積・外積についての理解を深め、
少し違う方法でなんとか「(傾いた)長方形の中に円が入り込んでいないか」の判定について出来るようになりました。
ですが、34章でご紹介されているやり方の最後、atan2に内積・外積の値を渡すと何故角度が求まるのか? ということが理解出来ません。
一応作れた判定では、自分の理解している範囲で判定処理をしてみようということで、
内積・外積を求める所まではほぼ一緒の処理をし、
「内積は2つのベクトルの角度が90度以下のときは正、90度より大きいときは負の値になる」
と書かれたサイトがありましたので、これと回転方向(向き?)の値である外積を併用し、
内積1>0 && 内積2>0 && 外積1<0 && 外積2<0
という条件で判定処理を行いました。
が、これが分かった所でやはりatan2を使用して何故角度が求まるのかが謎です。
私の調べた限りでは、
・内積
それぞれのベクトルがどれほど近いかという値。
BがAに対してどれだけがんばったかを表す値。
90度以下か大きいかで正負の値となる。
・外積
向き、回転方向などを表す。
とのことですので、atan2にベクトルがどれほど近いか、またその向きはどちらか、
という情報を与えて角度が返ってくることが理解できない、ということです。
だいぶベクトル及び内積・外積については理解できましたが、これだけがどうにも分かりません……。
386ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(900,018ポイント)
Date: 2008/11/26(水) 23:16
No:24634
|
|
Title: Re:龍神録プログラミングの館34章、円と長方形の当たり判定について
|
|
もうちょっと解り易い判定方法について、以下のような判定方法が考えられます。
図のように長方形の中心を通る辺に平行な2つの直線を考えます。
円をまずは中心点のみの点だと思います。
点から直線に垂線を下ろします。「下ろした垂線の足が線分の中で、かつ線分と点との距離が長方形の長さの半分+円の半径以内」なら接触している事がわかります。
図は直線に下ろした垂線の足が線分外なのでこの判定式にひっかかりません。
引っかからなかった場合は、長方形の頂点が円の半径の中に無いか調べます。
それでも判定式にひっかからなかったら接触していない事になります。
こっちの判定式の方がずっと簡単ですよね。点と線分の関係についてはま〜くさんにアドバイス頂きました。
これを見て思ったんですが、長方形を回転させても似たようなことが出来ると思います。
長方形の横の直線の部分がx軸と重なるように回転させて下の図のようにします。
円の中心が長方形のxの範囲内ならy座標で距離を求め、円の中心が長方形のyの範囲内ならx座標で距離を求めることで、
先ほど垂線を下ろして判定したような事が出来ます。
こちらも同様に判定した後、頂点と円の中心との距離を測り、それでも判定式にあてはまらなかったら
接触していない事がわかります。
もっとよい方法があるかもしれませんので、もう少しだけ考えてみようと思います。
500ポイント を手に入れた。
|
|
|
|
|
Name: 柏 ..上級者(17,378ポイント)
Date: 2008/11/28(金) 19:49
No:24727
| 解決!
|
Title: Re:龍神録プログラミングの館34章、円と長方形の当たり判定について
|
|
色々と考えましたがatan2と内積・外積の関係についてはすっきり理解できず、
それでもとりあえず最後の判定処理である「長方形の辺と円の中心との距離」についても、
ちょっと私の学力では理解出来ませんでしたが、適当に他の判定方法を考え実装することで落ち着きました。
ただその判定方法は効率が悪いため、引き続き数学に関して理解を深め、
34章の内容が理解出来るようになりたいと思います。
あと、ご紹介して頂いた判定方法も試してみます。
アドバイスありがとうございました!
2倍のポイントを手に入れた! 416ポイント を手に入れた。
|
|
|
|
Name: 初心者 ..上級者(17,093ポイント)
Date: 2008/11/27(木) 16:15
No:24649
|
|
Title: ファイルからの図形描写
|
|
今まで質問させていただいた総まとめのような問題ですが・・
【したいこと】 2つのプログラムを組み合わせる。
【取り組んできたこと】 2つのプログラムを作りました。
{
FILE *fp;
char *str,buf[1000];
char subbuf[100],*s1;
char buf2[100],*s2;
if ((fp = fopen("test.txt", "r")) == NULL) {
printf("ファイルが開けません\n");
return EXIT_SUCCESS
}
while (fgets(buf, 1000, fp) != NULL) {
str=buf
while(*str!='\0'){
if(*str!='\0' && (*str=='G' || *str=='X' || *str=='Y' || *str=='I' || *str=='J')){
s2=buf2;
while(*str!='\0' && (*str=='G' || *str=='X' || *str=='Y' || *str=='I' || *str=='J'))
*s2++=*str++;
*s2='\0';
}
if(isdigit(*str) || *str=='-' || *str=='.'){
s1=subbuf;
while(*str!='\0' && (isdigit(*str) || *str=='-' || *str=='.'))
*s1++=*str++;
*s1='\0';
printf("[%s] [%lf]\n",buf2,atof(subbuf);
}
else
str++;
}
}
fclose(fp);
return 0;
}
似たスレがありましたがそのスレをぱくって英大文字を取り出す機能を付け加えました。
このプログラムにより英大文字と数字を仕分けでき、中でもG、X、Y、I、Jのみにしました。(必要なのはこれだけな為)
例実行すると
[G][1]
[X][12]
[Y][31]
[I][13.2]
[J][-12]
な感じになります。
2つ目のプログラムが図形描写のプログラムで
{
CEdit *p,*q,*r,*s,*t;
CDC *v;
CString a,b,c,d,z;
p=(CEdit *)GetDlgItem(IDC_EDIT1);
q=(CEdit *)GetDlgItem(IDC_EDIT2);
r=(CEdit *)GetDlgItem(IDC_EDIT3);
s=(CEdit *)GetDlgItem(IDC_EDIT4);
t=(CEdit *)GetDlgItem(IDC_EDIT5);
p->GetWindowText(a);
q->GetWindowText(b);
r->GetWindowText(c);
s->GetWindowText(d);
t->GetWindowText(z);
int Z=atoi(z);
double A=atof(a);
double B=atof(b);
double C=atof(c);
double D=atof(d);
switch(Z){
case 92:
v=GetDC();
v->MoveTo((int)(A),(int)(B));
bx=A;
by=B;
ReleaseDC(v);
break;
case 01:
v=GetDC();
v->MoveTo((int)(bx),(int)(by));
v->LineTo((int)(A),(int)(B));
bx=A;
by=B;
ReleaseDC(v);
break;
case 02
v=GetDC();
double r2;
r2=sqrt(C*C+D*D);
v->Arc((int)(bx+C-r2),(int)(by+D-r2),(int)(bx+C+r2),(int)(by+D+r2),(int)(A),(int)(B),(int)(bx),(int)(by))
bx=A;
by=B;
ReleaseDC(v);
break;
case 03
v=GetDC();
double r1;
r1=sqrt(C*C+D*D);
v->Arc((int)(bx+C-r1),(int)(by+D-r1),(int)(bx+C+r1),(int)(by+D+r1),(int)(bx),(int)(by),(int)(A),(int)(B))
bx=A;
by=B;
ReleaseDC(v);
break;
}
}
このプログラムはCADで使うんですが、
G92:現在位置変更
G01:直線を引く
G02:時計回りに円弧を書く
G03:反時計回りに円弧を書く
例えば
G01 X100 Y100とすると原点or前の座標から(100,100)まで直線を引く
G02 X100 Y100 I50 J50とすると原点or前の座標から(100,100)で前の座標から(50,50)行った所を中心とする円弧
という風になっています。ややこしいので深く書きませんがこのように図形を書きます。
この書き方をLineToやArc関数で表したものです。
この2つはMFCとコンソールでちょっとタイプが違いますが・・
作りたいプログラムは
G01X100Y100
G02X200Y200I50J50
M90
D90
のような文が書かれているファイルから一行ずつ読み込み上の例ですと上2文を取り出して
図形を書いていくというプログラムです。
1,620ポイント を手に入れた。
|
|
|
|
Name: バグ ..ハッカー(126,800ポイント)
Date: 2008/11/27(木) 21:19
No:24661
|
|
Title: Re:ファイルからの図形描写
|
|
2つの関数が正しく動く事を前提として書くと…
1:文字列を読み込む
2:1回の描画に必要なコマンドをCEditに書き込む
3:描画用の関数を呼ぶ
これで、いいんじゃないでしょうか?
61ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(17,567ポイント)
Date: 2008/11/28(金) 10:31
No:24672
|
|
Title: Re:ファイルからの図形描写
|
|
聞きたいこと明確に書いてませんでした。この2つ組み合わせると
OnZukei はvoid型として宣言されていますが、値を返しました。
OnZukei の宣言を確認してくださいとエラーでます。
私が使っているのはVC++6.0ですが調べてみると
VC++6.0ではreturnを許さないとかどうとか書いてありました。
改善方法はないのでしょうか?
void CMainFlame::OnZukei()
{
FILE *fp;
char *str,buf[1000];
char subbuf[100],*s1;
char buf2[100],*s2;
char buf3[100],*s3;
char buf4[100],*s4;
if ((fp = fopen("test.txt", "r")) == NULL) {
printf("ファイルが開けません\n");
return EXIT_SUCCESS;
}
while (fgets(buf, 1000, fp) != NULL) {
str=buf;
while((*str!='\0'){
if(*str!='\0' && *str=='G'){
*str++;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
s2=buf2;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
while(*str!='\0'&&(isdigit(*str) || *str=='-' || *str=='.'))
*s2++=*str++;
*s2='\0';
}
if(*str!='\0' && *str=='X'){
*str++;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
s3=buf3;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
while(*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.')) *s3++=*str++;
*s3='\0';
}
if(*str!='\0' && *str=='Y'){
*str++;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
s4=buf4;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
while(*str!='\0' &&(isdigit(*str) |*str=='||*str=='.')) *s4++=*str++;
*s4='\0';
}
CDC *v;
v=GetDC();
if(atof(buf2)==92){
MoveTo(atof(buf3),atof(buf4));
ReleaseDC(v);
}
else if(atof(buf)==01){
MoveTo(0,0);
LineTo(atof(buf3),atof(buf4));
ReleaseDC(v);
}
else
str++;
}
}
fclose(fp);
return 0;
}
要はreturnがあるのがいけないのだとはおもいますが消しても動かないしどうすればいいのかさっぱり
474ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..プログラマー(39,314ポイント)
Date: 2008/11/28(金) 10:58
No:24674
|
|
Title: Re:ファイルからの図形描写
|
|
void CMainFlame::OnZukei()
↑
上記のこれが戻り値の型ですが、この関数は void 型なので、 return に値を指定することができません。
戻り値を必要とするのであればここの型を変え(クラスで宣言しているところも同様に)、
そうでないのなら、 Mist さんの通り、値を指定しないで書いてください。
コードを見ると、開けなかった時と関数の終了時に return で値を返している(処理結果を返している)ので、
戻り値の型を変更するほうが良いですね。
# よく見ると、いくつかセミコロンが無いところがありますね。
272ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(17,627ポイント)
Date: 2008/11/28(金) 11:01
No:24675
|
|
Title: Re:ファイルからの図形描写
|
|
そういうことでしたか。エラーは出ないんですが動きませんね・・
ちょっとがんばってみます。ありがとうございました
60ポイント を手に入れた。
|
|
|
|
|
Name: ま〜く ..初心者(7,715ポイント)
Date: 2008/11/28(金) 15:30
No:24707
|
|
Title: Re:ファイルからの図形描写
|
|
動かないとは、描画されないということですか?
それとも値が読めないのですか?
30ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(17,697ポイント)
Date: 2008/11/28(金) 15:47
No:24708
|
|
Title: Re:ファイルからの図形描写
|
|
試しにちゃんとGとXとYの値がbuf2,buf3,buf4に行ってるのかをチェックしたら大丈夫でしたので
描画されない方です。
44ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(32,957ポイント)
Date: 2008/11/28(金) 16:12
No:24710
|
|
Title: Re:ファイルからの図形描写
|
|
> else if(atof(buf)==01){
else if (atoi(buf2) == 1) {
じゃないかな?
bufには読み込んだ行がそのまま入っているからatoiは0だと思うよ。
あと、01と書くと8進数の1になるので今回は間違いではないけども修正したほうがいいです。
48ポイント を手に入れた。
|
|
|
|
|
Name: ま〜く ..初心者(7,912ポイント)
Date: 2008/11/28(金) 16:18
No:24711
|
|
Title: Re:ファイルからの図形描写
|
|
では描画について。
void CMainFlame::OnZukei()
ということから、アプリケーションの種類は SDIまたはMDIで作ったと思います。
このCMainFlameは外側の枠をあらわすウィンドウなのでそこに描いても描画できないと思います。
CViewから派生してできたxxxViewで描画処理を行う必要があると思います。
ちなみに、貼り付けてあるソースコードではその描画部分がコンパイルできそうにないので
本物?のコードを見せていただいたほうが直接どうすればよいか言えるかもしれません。
MainFrameで行っている処理をViewで行えばできると思うので試してみてください。
197ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(127,520ポイント)
Date: 2008/11/28(金) 16:30
No:24712
|
|
Title: Re:ファイルからの図形描写
|
|
あら?
たしかMFC使用のダイアログベースアプリだったような気がしたんですが…?
作り直したんでしょうか?(^_^;)
35ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(17,715ポイント)
Date: 2008/11/28(金) 16:35
No:24713
| 解決!
|
Title: Re:ファイルからの図形描写
|
|
ま〜くさんのおっしゃってる通り、SDIでは描写できなかったので
ダイアログベースですると何か変な黒い塊が描写されましたので少しいじくってみます。
ありがとうございました
18ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(17,766ポイント)
Date: 2008/11/28(金) 16:37
No:24714
|
|
Title: Re:ファイルからの図形描写
|
|
始めはダイアログでしてたんですがSDIのが原点関係で楽かなと思いSDIに移し、
今またダイアログに戻しました
51ポイント を手に入れた。
|
|
|
|
Name: いけやん ..上級者(15,876ポイント)
Date: 2008/11/28(金) 13:02
No:24689
|
|
Title: 【雑談】ゲームソフトとそのハードについて
|
|
いつも、お世話になっています。
いけやんです。
皆さん体調は大丈夫でしょうか?
風邪等引いてないでしょうか?
寒くなってきたので、お気をつけて。
先に謝っておきます。かなりのしょーもない雑談になるので・・・
すいません。
さて、皆さんゲームは好きですか?
皆さんゲームを作ったりする方が得意?好き?みたいですね
私は、やる方専門です(汗
今度ガンダム無双2でも買う予定なんですが
PS3 PS2 XBOX360で発売するのですが、
自分はPS2とXBOX360を持っています。
そこで少し思ったのですが、PS2とXBOX360では
XBOX360の方がやはりゲーム画面がキレイですか?
それともカセット?開発している会社?に依存するのでしょうか?
もうひとつ気になるのは、次世代機のカセットはなぜ高いのでしょうか?
それだけの開発コスト的な物がかかるのでしょうか?
長々すいません。
ゲームに詳しい皆さんに聞きたいのは、以下の2点です。
@次世代機のゲームの方がゲーム画面がキレイ?それともカセットによる?
A次世代機のカセットがなぜ高い?開発コストが掛かるから?
の2点です。
本当にしょーもない質問なので、怒らないで下さいね?
よろしくお願い致します。
427ポイント を手に入れた。
|
|
|
|
Name: 御津凪 [URL] ..プログラマー(39,465ポイント)
Date: 2008/11/28(金) 13:34
No:24690
|
|
Title: Re:【雑談】ゲームソフトとそのハードについて
|
|
1番目の方はハードによります。
一般的に後続のハードの方が上です。
(それ以上は何も言いません)
2番目のほうは開発コスト(人数+製作期間)が掛かることが大きな要因でしょう。
特にハードが出たばかりの時は、ハードの仕様や、それに対してどのようにプログラムを組めばいいかなど、
ある程度の準備期間を要しますし、高レベルなゲームの場合、
(スタッフロールを見れば分かりますが)大人数の製作者が関わります。
125ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(32,909ポイント)
Date: 2008/11/28(金) 13:37
No:24691
|
|
Title: Re:【雑談】ゲームソフトとそのハードについて
|
|
カセットはやめて…(汗
歳がばれますよ(^^;
現行のコンシューマでカセットと呼べるようなものはないよね。
> @次世代機のゲームの方がゲーム画面がキレイ?それともカセットによる?
両方です。
まず、ハード自体の性能が不十分であればどうしようもないです。
ハード性能の低いDSはPSPの足元にも及びません。
任天堂はWiiにしろDSにしろ、「画面の綺麗さ≠ソフトのおもしろさ」ではないとしてそこには力を入れなくなっていますね。(PS3や360と比較して)
また、ハードに十分に性能があったとしても、ソフトがその性能を引き出せなければ意味がありません。
PS最後のFF9は、PSのハード性能を限界まで引き出したソフトで同時期のPS2ソフトと見比べても遜色のないものでした。
> A次世代機のカセットがなぜ高い?開発コストが掛かるから?
そうですね。
ハードの性能があがればより高度な表現が可能になりますが、それらを利用するためにはより高度な開発機材が必要になりますので
それらの購入・維持費だけでも大変なものです
また、機材を使う側のスキルアップも必要ですから彼らに対する教育費なんてのもばかにはなりません。
とくに次世代機の場合、開発のためのベーススキルの構築から始めないといけないので開発期間も長くなりますし
携わる人間も多くなりますので必然的に高くなります。
以下、海外サイトで見つけたFFの開発費です。(広告費は含まない)
・ファイナルファンタジーVII 2600万ドル
・ファイナルファンタジーX 4000万ドル
・ファイナルファンタジーXII 5230万ドル
1ドル=100円とすると、FF7(PS)は26億でFF10(PS2)は40億となります。
PS3のMGS4の開発費は70億という噂。
同じくPS3で発売されるFF13の開発費は80〜100億と噂され、ぶっちゃけPS3の普及台数から考えると回収できなさそうなので
ガンダム無双のようにPS2での発売や、360での発売の可能性もあるという噂です。
487ポイント を落としてしまった。
|
|
|
|
|
Name: バグ ..ハッカー(127,087ポイント)
Date: 2008/11/28(金) 13:45
No:24692
|
|
Title: Re:【雑談】ゲームソフトとそのハードについて
|
|
2の質問に関しては、開発費の割には安いと感じてる私の感覚はおかしいのかな?
ROMカセット時代と比べれば、相当に割安だと思いますよ。
SFCのソフトとか1本で1万円オーバーとかザラでしたからねぇ…(^_^;)
99ポイント を手に入れた。
|
|
|
|
|
Name: at ..入門者(2,551ポイント)
Date: 2008/11/28(金) 13:55
No:24693
|
|
Title: Re:【雑談】ゲームソフトとそのハードについて
|
|
カセットは発注してから入荷するまで経費と時間が、プレスするだけのCD/DVDよりかかる。
そのためカセットでは需給に迅速に対応できません。ただし…いや、話すと長くなるので質問の回答としてはこの辺にしておきましょう。(^ ^;)
83ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(900,544ポイント)
Date: 2008/11/28(金) 14:01
No:24694
|
|
Title: Re:【雑談】ゲームソフトとそのハードについて
|
|
書こうとしたことは既にだいたいみなさんがおっしゃっている‥w
ハードの性能はPS3の方が上だったと思いますよ。完全に開発者の自己満足路線走ってますよね‥。詳しいことはググれば比較してるサイトとか見つかりそうな気がします。
てかはっきり言って10年前のゲームを思い出させるポリゴンでもWiiスポーツみんなでやる方が楽しいですねw
125ポイント を手に入れた。
|
|
|
|
|
Name: いけやん ..上級者(16,058ポイント)
Date: 2008/11/28(金) 14:26
No:24696
|
|
Title: Re:【雑談】ゲームソフトとそのハードについて
|
|
皆さんご回答ありがとうございます。
御津凪さん
>(スタッフロールを見れば分かりますが)大人数の製作者が関わります。
やはり人数=ゲームの規模自体も大きくなるわけだから、ソフトが高くなるのは
仕方ないわけですね。
Mistさん
>歳がばれますよ(^^;
えっ?まじですか!?Mistさんどうか、歳は内緒で・・・www
これからは、ソフトと呼びます(汗
>任天堂はWiiにしろDS
確かにグラフィックには、力を入れてませんね。
あえて、あれが良さかもしれませんが・・・
>ハードの性能があがればより高度な表現が可能になりますが、それらを利用するためにはより高度な開発機材が必要になりますので
>それらの購入・維持費だけでも大変なものです
>また、機材を使う側のスキルアップも必要ですから彼らに対する教育費なんてのもばかにはなりません。
やはり、人件費その他の費用何かも掛かるわけですね。
>以下、海外サイトで見つけたFFの開発費です。(広告費は含まない)
〜省略〜
40億!!ですか・・・
途方もない額ですね・・・
そんなに開発費が掛かるとは、知りませんでした。
ゲームの方々も大変ですね〜。
バグさん
確かに、そうですね〜。
昔のカセットは1万2千円とかしてましたね〜。
おっと、歳がばれるwww
atさん
>そのためカセットでは需給に迅速に対応できません
そうなんですか〜。
atさんは生産される所も詳しいんですね〜。
私は何も知りませんでした〜。
182ポイント を手に入れた。
|
|
|
|
|
Name: いけやん ..上級者(16,335ポイント)
Date: 2008/11/28(金) 14:35
No:24698
|
|
Title: Re:【雑談】ゲームソフトとそのハードについて
|
|
更新押してませんでした。
回答ありがとうございます。
管理人さん
>完全に開発者の自己満足路線走ってますよね
ですね・・・www
>詳しいことはググれば比較してるサイトとか見つかりそうな気がします。
ググって見たのですが、検索キーワードが引っかからず見つけれませんでした。
キーワードが悪かったのかな?
>てかはっきり言って10年前のゲームを思い出させるポリゴンでもWiiスポーツみんなでやる方が楽しいですねw
そうですね。昔のゲームって、今みたいにお世辞にもキレイとは、いえないですが、
みんなでやると意外と盛り上がりますよね?
277ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..プログラマー(38,019ポイント)
Date: 2008/11/28(金) 14:35
No:24699
|
|
Title: Re:【雑談】ゲームソフトとそのハードについて
|
|
カセットかー。懐かしいですね。
ってかうまくつかない時、カセットの差し込み部分をなめてつけるのは大丈夫だったんですかね?^^;
自分もバグさん同様、今のソフトって安すぎなんじゃないかって思います。。
しかも今じゃ某掲示板にいけばすぐに落とせちゃったり。
作ってる側・・・大変だろーなぁって思います。
本題それちゃいました。。失礼しました。
130ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..プログラマー(39,520ポイント)
Date: 2008/11/28(金) 14:55
No:24701
|
|
Title: Re:【雑談】ゲームソフトとそのハードについて
|
|
> しかも今じゃ某掲示板にいけばすぐに落とせちゃったり。
> 本題それちゃいました。。失礼しました。
あながちそれていないかも。
違法対策の為の費用もかかっていますし。
ソフトが安いのは売れるように必死になっているためで、
そのためか給料が安いそうです。
55ポイント を手に入れた。
|
|
|
|
|
Name: いけやん ..上級者(16,540ポイント)
Date: 2008/11/28(金) 15:50
No:24709
|
|
Title: Re:【雑談】ゲームソフトとそのハードについて
|
|
kazuoniさん
>カセットの差し込み部分をなめてつけるのは大丈夫だったんですかね?
私の場合は、息をフゥーと吹きかけていました。
けど、あれをやるとカセットがつきやすくなるんですよね。
>今じゃ某掲示板にいけばすぐに落とせちゃったり。
>作ってる側・・・大変だろーなぁって思います。
確かにお金を掛けた作った物ただで落とされては、損しかないですもんね〜。
御津凪さん
>ソフトが安いのは売れるように必死になっているためで、
今そーいうのが多いですね・・・
うにーみたいなので何でも落とせるとかで、流行ってますもんね。
>そのためか給料が安いそうです。
何だか、かわいそうですね・・・
ゲームを作っている方々がんばって下さい
私は頑張って買って遊びますのでw(ぉい)
205ポイント を手に入れた。
|
|
|
|
Name: ミラクル ..ぴよぴよ(370ポイント)
Date: 2008/11/28(金) 11:39
No:24679
|
|
Title: ファイル読み込みの際のパス
|
|
すみませんタイトルがなかった。。。
ファイル読み込みの際に引数を受け取った時、
例えば
実行ファイルがsampleだとして
sample "テキストファイル"
のようにテキストファイルを引数にした場合
で下記のようなパスがつくとうまくいかなくて,
fp = fopen("/local/file","r"); のところを
fp = fopen(file,"r")にするとうまくいくんですけど
なにがわるいんでしょうか??
#define MN 256
int main(int argc,char **argv){
test(argv[1]);
}
int test(char val[MN]){
FILE *fp;
char file[MN];
strcpy(file,val);
fp = fopen("/local/file","r");
・・・・
}
310ポイント を手に入れた。
|
|
|
|
Name: ouh ..かけだし(1,253ポイント)
Date: 2008/11/28(金) 12:22
No:24687
|
|
Title: Re:ファイル読み込みの際のパス
|
|
fopen("//local//file", "r")
とすればいいと思います。
6ポイント を手に入れた。
|
|
|
|
|
Name: ouh ..かけだし(1,304ポイント)
Date: 2008/11/28(金) 12:24
No:24688
|
|
Title: Re:ファイル読み込みの際のパス
|
|
ごめんなさい。無視してください。
スラッシュとバックスラッシュを見間違えて...
恥ずかしい...
51ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..プログラマー(37,973ポイント)
Date: 2008/11/28(金) 14:22
No:24695
|
|
Title: Re:ファイル読み込みの際のパス
|
|
テキストファイルの位置の事ですかね。
mainのコードが書かれたところにテキストファイルが置いてあるのでそうなります。
もしmainのコードと同じところにlocalというファイルがあり、
その中にテキストファイルがあれば、
fp = fopen("/local/file","r");
で大丈夫です。
環境がわからないので何とも言えないですが、visual c++なら
fp = fopen("./local/file.txt","r") ですかね。
環境によっては
/local/file
でいけるのでしょうか^^;まだ他の環境での知識が浅いもので・・・。
あ、雰囲気コマンドライン引数を使ってるようですけど・・・
これだと題意を満たさないような気がしますが。。
独り言でした。
135ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..プログラマー(37,889ポイント)
Date: 2008/11/28(金) 14:29
No:24697
|
|
Title: Re:ファイル読み込みの際のパス
|
|
ありゃ。下に無題で同じスレがありましたね^^;
すみませんでした。
しかも外れた回答・・・^^;
失礼しました。
これは削除されるのでしょうか?
管理人さんあとよろしくお願いしますw
(あ、無視で構いません。<ミラクルさん)
84ポイント を落としてしまった。
|
|
|
|
Name: ミラクル ..ぴよぴよ(60ポイント)
Date: 2008/11/28(金) 11:38
No:24678
|
|
Title: 無題
|
|
ファイル読み込みの際に引数を受け取った時、
例えば
実行ファイルがsampleだとして
sample "テキストファイル"
のようにテキストファイルを引数にした場合
で下記のようなパスがつくとうまくいかなくて,
fp = fopen("/local/file","r"); のところを
fp = fopen(file,"r")にするとうまくいくんですけど
なにがわるいんでしょうか??
#define MN 256
int main(int argc,char **argv){
test(argv[1]);
}
int test(char val[MN]){
FILE *fp;
char file[MN];
strcpy(file,val);
fp = fopen("/local/file","r");
・・・・
}
60ポイント を手に入れた。
|
|
|
|
Name: non ..中級者(11,420ポイント)
Date: 2008/11/28(金) 11:46
No:24681
|
|
Title: Re:無題
|
|
UNIXですか?
fileというファイル名ではなくfileという変数に入っているファイルをオープンしたいのでしょうか?
46ポイント を手に入れた。
|
|
|
|
|
Name: ミラクル ..ぴよぴよ(335ポイント)
Date: 2008/11/28(金) 11:48
No:24683
|
|
Title: Re:無題
|
|
ありがとうございます。
おっしゃるとおりfileという変数に入っているファイルを
パスで指定して読み取りたいんですけどうまくいかなくて.
35ポイント を落としてしまった。
|
|
|
|
|
Name: Mist ..プログラマー(33,396ポイント)
Date: 2008/11/28(金) 11:54
No:24684
|
|
Title: Re:無題
|
|
> fp = fopen("/local/file","r");
これではlocalフォルダにあるfileという名前ファイルを開こうとしています。
char filepath[MN + 20];
sprintf(filepath, "/local/%s", file);
fp = fopen(filepath, "r");
というようにしなければいけません。
たぶん、文字列の扱いについての知識が不足していると思います。
7ポイント を手に入れた。
|
|
|
|
|
Name: non ..中級者(11,424ポイント)
Date: 2008/11/28(金) 11:57
No:24685
|
|
Title: Re:無題
|
|
UNIXって使ったことないので自信ないけど・・
こんなんじゃだめですか?
strcpy(file,"/local/file");
strcat(file,val);
fp = fopen(file,"r");
4ポイント を手に入れた。
|
|
|
|
|
Name: non ..中級者(11,369ポイント)
Date: 2008/11/28(金) 11:58
No:24686
|
|
Title: Re:無題
|
|
間違った。
strcpy(file,"/local/");
strcat(file,val);
fp = fopen(file,"r");
55ポイント を落としてしまった。
|
|
|
|
Name: 関西人 ..かけだし(1,850ポイント)
Date: 2008/11/26(水) 13:46
No:24592
|
|
Title: ファイル読み込み
|
|
ちょっと教えていただきたいんやけどよろしいか??
ほな質問させていただきますよって。
下記のソースコードを見てほしいんやけど。。
今の段階でファイルの中身が
EKI="KANE"-"SAM"
KANE="SAM"%"EKI" だとします。これを読み込んで.hファイルに書き込んだ場合
#define KANE 0
#define SAM 0
#define EKI 0
#define EKI 0
#define KANE 0 となります。これを重複したものに関しては2度書き込まないようにしたいんやけど。。。
つまり.......
#define KANE 0
#define SAM 0
#define EKI 0 という結果にしたいと思ってるんやけど
どないしたらよろしいやろか??
みなはんお忙しいとは思いますが一つお力を貸していただきたい思います。どうぞよろしゅうたのんます。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 1024
int main()
{
rightsidehfunction();
leftsidehfunction();
}
/* 左辺の値をとって.hファイルに書き込む関数 */
int leftsidehfunction()
{
FILE *ft;
FILE *fh;
char buf[MAX];
char *cPid[MAX]; // 採取したPID
char *cWorkRegiAdd; // 採取文字列作業域アドレス
char *cStoRegiAdd; // 文字列格納域アドレス
int n = 0;
int str = 0;
int k;
char *p;
ft = fopen("test.txt","r");
fh = fopen("test.h","a+");
if (fh == NULL || ft == NULL) {
printf("ファイルを開けません。\n");
return 1;
}
/* ファイルを1行ずつ読み込む処理 */
while (fgets(buf, sizeof buf, ft) != NULL){
cWorkRegiAdd = strtok(buf, "=");
for(k = 0;k < n;k++){
if(*cPid[k] != *cWorkRegiAdd)continue;
if(strcmp(cPid[k],cWorkRegiAdd) == 0)break;
}
if(k < n) continue;
cStoRegiAdd = malloc(strlen(cWorkRegiAdd) + 1);
strcpy(cStoRegiAdd,cWorkRegiAdd);
cPid[n] = cStoRegiAdd;
fprintf(fh, "#define %s 0\n", cStoRegiAdd);
n++;
}
fclose(fh);
fclose(ft);
return 0;
}
/* 右辺の値をとって.hファイルに書き込む関数 */
int rightsidehfunction()
{
FILE *ft; // 入力ファイルポインタ
FILE *fh; // 出力ファイルポインタ
int c; //読み込み文字
char buf[MAX]; //バッファ領域
char buf1[MAX];
char cPid[MAX]; // 採取したPID
char *cWorkRegiAdd; // 採取文字列作業域アドレス
char *cStoRegiAdd; // 文字列格納域アドレス
char *cRegiTab[MAX]; // 文字列登録表
int iflag = 0; // 0/1; 右/左のクオート
int ichs = 0; // chrの文字数
int istr = 0; // strの文字数
int k; // ntrの探索index
int iOid; //OID
char *p;
ft = fopen("test.txt", "r");
fh = fopen("test.h", "w");
if (fh == NULL || ft == NULL) {
printf("ファイルを開けません。\n");
return 1;
}
//ファイルを1文字ずつ読み込む
while ((c = fgetc(ft)) != EOF) {
switch (c) {
case '"':
iflag = 1 - iflag;
/*右のクオート*/
if (iflag == 0) {
cPid[ichs] = '\0';
cWorkRegiAdd = cPid;
for(k = 0;k < istr;k++){
if(*cRegiTab[k] != *cWorkRegiAdd) continue;
if(strcmp(cRegiTab[k],cWorkRegiAdd) == 0) break;
}
if(k == istr){
cStoRegiAdd = malloc(strlen(cWorkRegiAdd) + 1);
strcpy(cStoRegiAdd,cWorkRegiAdd);
cRegiTab[istr] = cStoRegiAdd;
istr++;
fprintf(fh, "#define %s 0\n", cStoRegiAdd);
}
ichs = 0;
}
break;
case '\n':
if (iflag == 1) {
cPid[ichs] = '\0';
iflag = 0;
}
ichs = 0;
break;
default:
if (iflag == 1) {
cPid[ichs] = c;
if (ichs < MAX - 1) {
ichs++;
}
}
break;
}
}
/* ファイルの最後が改行じゃなかった場合 */
if (ichs>0) {
cPid[ichs]='\0';
}
fclose(ft);
fclose(fh);
return 0;
}
1,850ポイント を手に入れた。
|
|
|
|
Name: ステハン ..ぴよぴよ(43ポイント)
Date: 2008/11/26(水) 14:20
No:24595
|
|
Title: Re:ファイル読み込み
|
|
言葉使いの方はあえてスルーして…
質問の意味がいまいちわからないのは私だけでしょうか?
43ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..プログラマー(38,294ポイント)
Date: 2008/11/26(水) 14:29
No:24596
|
|
Title: Re:ファイル読み込み
|
|
要約すると、マクロ定義が書かれたヘッダファイルを出力するプログラムで、
マクロ名を重複しないようにするには?
と、いうことですかね?
それなら、単純に出力してあるマクロ名を記憶しておいて、
既に書き込まれていたら書き込まないように処理すればいいと思います。
# あと、字下げされていないので、非常に読みづらいです。
149ポイント を落としてしまった。
|
|
|
|
|
Name: 関西人 ..かけだし(2,114ポイント)
Date: 2008/11/26(水) 14:46
No:24601
|
|
Title: Re:ファイル読み込み
|
|
返信ありがとうございます。
質問の意味分かりませんか??
ソースを実行すれば一目瞭然なんですけど....
単純にテキストファイルを読み込んで、条件付で読み込んだものを.h
ファイルに書式付で書き込んでいるだけ何すけど。。。。
特に難しいことはしていないですよ。
出来れば具体的にどこを直したらいいとか教えていただきたいんですけど????
2倍のポイントを手に入れた! 264ポイント を手に入れた。
|
|
|
|
|
Name: non ..中級者(10,925ポイント)
Date: 2008/11/26(水) 15:24
No:24604
|
|
Title: Re:ファイル読み込み
|
|
特に難しいことはしてないようですが、読むのは大変です。
2つの関数の変数がローカルだから、右辺と左辺の文字列がダブると思われます。
46ポイント を手に入れた。
|
|
|
|
|
Name: 通りすがり ..中級者(11,783ポイント)
Date: 2008/11/26(水) 15:58
No:24606
|
|
Title: Re:ファイル読み込み
|
|
見ている人は全員が現在コンパイル出来る環境にあるとは限りませんし、読みにくい、わかりにくいという指摘に「実行すればわかるだろう」という返答はナンセンスです。
携帯で見てる人もいますしね。
だいたい、タグを使う、丁寧語を使う、そのたもろもろの規約を守っていません。
利用するならまず規約を読みましょう。
いちいち変な関西弁で書く意味がわかりません。
99ポイント を手に入れた。
|
|
|
|
|
Name: 通りすがり ..中級者(11,891ポイント)
Date: 2008/11/26(水) 19:13
No:24610
|
|
Title: Re:ファイル読み込み
|
|
投稿する文章としてふさわしくない事には変わりないのに、わざわざ横から指摘する必要がありませんね。
何故こんな事を擁護するのかもわかりません。スレ主の別ハンドルなんでしょうか?
あなたは会議でプレゼンする時や、上司や初対面の相手に話す時もそんな話し方なんでしょうか?
文面から言って小学生や中学生かもしれませんが、それならまず社会の基本マナーを覚ることから始めましょう。
108ポイント を手に入れた。
|
|
|
|
|
Name: 初級者 ..かけだし(2,060ポイント)
Date: 2008/11/26(水) 21:26
No:24614
|
|
Title: Re:ファイル読み込み
|
|
敬語のカテゴリーに属する丁寧語と、
方言のカテゴリーに属する関西弁とを
同じ土俵に立たせるのは変だと言っているだけです。
日本語がわかりますか?
関西弁であろうがいわゆる標準語であろうが、
内容が正確に伝わりさえすればどちらでもいいです。
関西弁だから丁寧ではないなんておっしゃっていると、
関西の方から総スカンを食らうおそれがあります。
理解できますか?
71ポイント を手に入れた。
|
|
|
|
|
Name: ドミノ甲子園 ..ぴよぴよ(1ポイント)
Date: 2008/11/26(水) 22:29
No:24626
|
|
Title: Re:ファイル読み込み
|
|
(意味不明な書き込みの為、管理人により削除されました)
(書き込みの意図を明確にしていただければ記事は元に戻します)
1ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(899,502ポイント)
Date: 2008/11/26(水) 22:41
No:24627
|
|
Title: Re:ファイル読み込み
|
|
あまり状況が芳しくなくなってきたので規約の面から発言させて頂きます。
やはり関西弁に限らず方言で話す事は丁寧ではありません。
関西に住んでいる人は関西弁しか話せないというのなら、関西弁は丁寧ではないという発言に問題は生じるかもしれませんが、そういうわけではありませんよね。
現に私は関西に住んでいますが、ネットを初め、公の場等で話す時は標準語で話します。
また、生まれは広島なのですが、ネットで「じゃけぇねぇ?へじゃけぇ、してぇやぁ」みたいな言葉は使おうとは思いません。
やはり標準語で話せるのにあえて方言で書く事は丁寧ではありませんよね。
例えば、人から物を頼まれる時、初対面の相手にネット上で「じゃけぇねぇ?へじゃけぇ、してぇやぁ」と頼まれるのと
「そういう理由で、これをして頂けないでしょうか?」と頼まれるのはどちらが気分よく引き受けられるでしょうか。
>内容が正確に伝わりさえすればどちらでもいいです。
と仰っていますが、その文章を読むことで気分を害する方がいらっしゃれば、それは改善するべきだと私は考えます。
その本人が改善出来ないのなら仕方ないですが、あえて方言で記載しているように感じました。
規約には方言で話すなとは書いてありませんが、
規約にいちいち「○○禁止」「方言禁止」とか書きたくないので、ある程度は常識の範囲内で判断して頂きたいと思っています。
規約にない事は守る必要が無いという基準では六法全書みたいな規約ページになってしまいます・・・。
今回の件につきましては、丁寧語であり、かつ標準語で話していただきますようお願いします。
129ポイント を手に入れた。
|
|
|
|
|
Name: 木霊 ..プログラマー(27,555ポイント)
Date: 2008/11/26(水) 22:48
No:24628
|
|
Title: Re:ファイル読み込み
|
|
>バグさん
>『関西弁は丁寧語ではない』というのは正しいと思いますけど?
確かに丁寧な言葉遣いではありませんが、関西弁や他の方言の中にも地方独特の敬語や言い回しが
あるので、上記の指摘は誤りだと思います。
>通りすがりさん
>いちいち変な関西弁で書く意味がわかりません。
関西弁としてはおかしくないと思います。それとも関西弁が変だというのでしょうか?
>投稿する文章としてふさわしくない事には変わりないのに、わざわざ横から指摘する必要がありませんね。
以前、別のトピで「ツンデレ」や「じじい」バージョンの回答がありましたが、
あちらは投稿するにふさわしい文章だと言う事でしょうか?
それとも回答者であれば一部規約を守らず(丁寧語を使わず)に投稿することが許されるのでしょうか?
※個人的にあの回答の文章は好きですので、貶める為に例に出させてもらったわけではありません。念のため。
>関西人さんへ
方言はその地方以外の人間以外には分からなかったり意味が変わるものもあるので、
こういった公の場では「標準語で丁寧な言葉遣いを心がけて」書き込みされた方がいいと思います。
ビジネス文書などは標準語が基本ですから、「標準語が出来ない=常識が欠落している」と
勘違いしている人が多くいます。
ただ、通りすがりさんの仰っている通り「実行すればわかる」という開き直った態度は
全国どこであってもよくありません。
以上、関西圏の人間として言わせてもらいました。
自分はこのトピにはこれ以上参加しませんので、その旨了解ください。
PS
質問と全く関係なくて申し訳ありません。荒れない事を祈ってます。
710ポイント を手に入れた。
|
|
|
|
|
Name: ムンバ ..中級者(11,974ポイント)
Date: 2008/11/26(水) 23:20
No:24636
|
|
Title: Re:ファイル読み込み
|
|
関東圏の人間として言わせて頂きます。
今まで、私が使ってる言葉が標準語だとは思ってません。
横浜での方言は「じゃん。」かと思われますが
教えてくれても、いいじゃん?
それで、いいじゃん。
遊ぼう♪
横須賀では「べ。」になる事が多かったです。
教えてくれても、いいべ?
それで、いいべ。
遊ぶべ♪
私が、いずれも友達に使う言葉です。
>質問と全く関係なくて申し訳ありません。荒れない事を祈ってます。
木霊さんの、ご意見に賛同させて頂きます。
どうしてもやるせないので私の意見、投稿させて頂きました。
失礼します。
58ポイント を手に入れた。
|
|
|
|
|
Name: 初級者 ..かけだし(2,104ポイント)
Date: 2008/11/26(水) 23:54
No:24639
|
|
Title: Re:ファイル読み込み
|
|
敬語と方言を同一視してしまう勘違いさんがいなければ、
荒れることはないでしょう。
44ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(900,133ポイント)
Date: 2008/11/27(木) 00:30
No:24645
|
|
Title: Re:ファイル読み込み
|
|
他の方を煽る発言はどうかお控え下さい。
このトピはこの件について話し合うトピではないので、この件について討論したいという希望があればトピをお立て下さい。
このトピではまず関西人さんの質問内容を解決しましょう。
今後の投稿は標準語、丁寧語で行っていただきますようお願いします。
※
規約を少々変更し、「極端な方言禁止」とさせていただきました。
方言禁止と書くと、一言でも些細な方言が入ると指摘される可能性があるので、
些細な方言は可とさせていただきました。
この辺の判断は常識の範囲でご判断下さい。
115ポイント を手に入れた。
|
|
|
|
Name: gore ..ぴよぴよ(267ポイント)
Date: 2008/11/26(水) 20:15
No:24612
|
|
Title: ポインタを用いた並び替え
|
|
はじめまして 私はいま「要素数n個のint型配列の要素を降順に並び変える関数sortを作成し、main関数の中で宣言した要素数5個の配列変数x[5]をsortを用いて降順に並び変えるプログラムを作成せよ。
sortには配列変数のアドレスをポインタを用いて引き渡すこと。また、要素数を示す値nは引数としてsortに与えること。」というような課題をやっていて
#include<stdio.h>
void sort(int *);
int main(void)
{
int x[5]={6,8,5,7,9};
printf("%d\n",x);
sort(x);
getchar ();
getchar ();
return 0;
}
void sort(void *n)
{
int temp,i;
for(i=0;i<5;i++){
temp=*n;
*n=*(n+i);
*(n+i)=temp;
}
のようなプログラムを作成したのですがうまく動作しません。教えていただけませんか?
267ポイント を手に入れた。
|
|
|
|
Name: box ..ハッカー(130,101ポイント)
Date: 2008/11/26(水) 21:21
No:24613
|
|
Title: Re:ポインタを用いた並び替え
|
|
うまく動きません、だけでは、
何も言っていないのと同じです。
どういう結果になったのでうまく動かないと判断されたかを
具体的に説明してください。
55ポイント を手に入れた。
|
|
|
|
|
Name: gore ..ぴよぴよ(296ポイント)
Date: 2008/11/26(水) 21:27
No:24615
|
|
Title: Re:ポインタを用いた並び替え
|
|
返信ありがとうございます。
コンパイルすると16から18行の間でエラーが出ます
29ポイント を手に入れた。
|
|
|
|
|
Name: non ..中級者(11,238ポイント)
Date: 2008/11/26(水) 22:00
No:24622
|
|
Title: Re:ポインタを用いた並び替え
|
|
#include<stdio.h>
void sort(int *);
int main(void)
{
int x[5]={6,8,5,7,9};
printf("%d\n",x);
ここでxは配列のアドレスです。アドレスを表示するなら%pです
sort(x);
ソートした後の値を表示しないとソートされたかわかりません
getchar ();
getchar ();
return 0;
}
void sort(void *n)
プロトタイプでは int *n です。
{
int temp,i;
for(i=0;i<5;i++){
temp=*n;
*n=*(n+i);
*(n+i)=temp;
}
ソートのアルゴリズムになっていません。
最後の閉じカッコがありません
313ポイント を手に入れた。
|
|
|
|
|
Name: gore ..ぴよぴよ(549ポイント)
Date: 2008/11/26(水) 22:22
No:24625
|
|
Title: Re:ポインタを用いた並び替え
|
|
ご指摘ありがとうございます。直した結果
#include<stdio.h>
void sort(int *);
int main(void)
{
int x[5]={6,8,5,7,9};
sort(x);
printf("%d",x);
getchar ();
getchar ();
return 0;
}
void sort(int *n)
{
int i,temp;
for(i=0;i<4;i++){
if(n<n+i){
temp=n;
n=n+i;
n+i=temp;
}
}
}
のようになったのですがまだ先ほどのようなエラーが消えません。教えていただけると助かります。
237ポイント を手に入れた。
|
|
|
|
|
Name: 通りすがり ..中級者(12,303ポイント)
Date: 2008/11/26(水) 22:50
No:24629
|
|
Title: Re:ポインタを用いた並び替え
|
|
#include<stdio.h>
#define N 5
void print(int *);
void sort(int *);
int main(void)
{
int x[N] = { 6, 8, 5, 7, 9 };
printf("ソート前\n");
print(x);
sort(x);
printf("ソート後\n");
print(x);
return 0;
}
void print(int *x)
{
int i;
for (i = 0; i < N; i++) {
printf("%d ", x[i]);
}
printf("\n");
}
void sort(int *x)
{
int i, j;
for (i = 0; i < N - 1; i++) {
for (j = i + 1; j < N; ++j) {
if (x[i] < x[j]) {
int t = x[i];
x[i] = x[j];
x[j] = t;
}
}
}
}
412ポイント を手に入れた。
|
|
|
|
|
Name: gore ..ぴよぴよ(569ポイント)
Date: 2008/11/26(水) 23:02
No:24631
| 解決!
|
Title: Re:ポインタを用いた並び替え
|
|
ありがとうございました。参考にして完成させることができました。
20ポイント を手に入れた。
|
|
|
|
|
Name: non ..中級者(11,374ポイント)
Date: 2008/11/26(水) 23:09
No:24632
|
|
Title: Re:ポインタを用いた並び替え
|
|
しかし、タイトルがポインタを用いた並び替えですからね。はたして、これをポインタを用いたと言って
いいのかと。いや、用いたと言えば・・・・用いたのかも?
だからといって、 x[i]を *(x+i) とすればいいというものでもないだろうし・・・
質問者がよければこれでよいのですが・・・
136ポイント を手に入れた。
|
|
|
|
|
Name: 通りすがり ..中級者(12,336ポイント)
Date: 2008/11/26(水) 23:11
No:24633
|
|
Title: Re:ポインタを用いた並び替え
|
|
参考にして、というよりは丸写しして、だと思います。
なぜ、あのソースでうまくいったのか、しっかり吟味してくださいね。
33ポイント を手に入れた。
|
|
|
|
|
Name: 通りすがり ..中級者(12,370ポイント)
Date: 2008/11/26(水) 23:17
No:24635
|
|
Title: Re:ポインタを用いた並び替え
|
|
x[n]という書き方は*(x+n)の糖衣構文に過ぎないので、
あのコードでじゅうぶんポインタを使っていることになります。
34ポイント を手に入れた。
|
|
|
|
|
Name: フリオ ..プログラマー(28,559ポイント)
Date: 2008/11/26(水) 23:25
No:24637
|
|
Title: Re:ポインタを用いた並び替え
|
|
課題文に、
sortには配列変数のアドレスをポインタを用いて引き渡すこと。
また、要素数を示す値nは引数としてsortに与えること。
とありますけど。
2倍のポイントを手に入れた! 116ポイント を手に入れた。
|
|
|
|
|
Name: 通りすがり ..中級者(12,813ポイント)
Date: 2008/11/26(水) 23:41
No:24638
|
|
Title: Re:ポインタを用いた並び替え
|
|
おっと失礼いたしました。
#include<stdio.h>
#define N 5
void print(int *, int);
void sort(int *, int);
int main(void)
{
int x[N] = { 6, 8, 5, 7, 9 };
printf("ソート前\n");
print(x, N);
sort(x, N);
printf("ソート後\n");
print(x, N);
return 0;
}
void print(int *x, int n)
{
int i;
for (i = 0; i < n; i++) {
printf("%d ", x[i]);
}
printf("\n");
}
void sort(int *x, int n)
{
int i, j;
for (i = 0; i < n - 1; i++) {
for (j = i + 1; j < n; ++j) {
if (x[i] < x[j]) {
int t;
t = x[i], x[i] = x[j], x[j] = t;
}
}
}
}
443ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..中級者(10,350ポイント)
Date: 2008/11/28(金) 01:32
No:24668
|
|
Title: Re:ポインタを用いた並び替え
|
|
交換の処理は
#define SWAP(a,b) #
do{ #
a^=b; #
b^=a; #
a^=b; #
}while(0);
って感じでどうでしょうかね。
109ポイント を落としてしまった。
|
|
|
|
Name: situmon ..初心者(6,803ポイント)
Date: 2008/11/07(金) 20:24
No:23670
|
|
Title: 弾消しフラグ。
|
|
シューティングの館で、
敵を倒しても弾が撃ち続けられる問題で、
if( (int)sqrt(x*x+y*y) < range+enemy[s].range){
if(enemy[s].hp <= 0){
enemy[s].flag=0;
if(enemy[s].flag==1)//その敵のショットが出現中なら
EnemyShot[j].flag==0;//弾を消す。
とすれば
敵が倒されるときに玉を消すことができるかと思ったのですが、実際には消えませんでした。
どのように指定すればいいのでしょうか?
追記
自分の学校は前期 後期 だけですので期末ではなく中間になります。
回数が少ないのですがその分範囲が広いです。
280ポイント を手に入れた。
|
|
|
|
Name: 初級者 ..ぴよぴよ(508ポイント)
Date: 2008/11/07(金) 21:08
No:23679
|
|
Title: Re:弾消しフラグ。
|
|
>EnemyShot[j].flag==0;//弾を消す。
0と比較しています。そうしたいのですか?
36ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..初心者(6,702ポイント)
Date: 2008/11/08(土) 09:59
No:23726
|
|
Title: Re:弾消しフラグ。
|
|
間違えました。ありがとうございました。
でも、敵を倒すと発射フラグを0にするとすれば、できるとおもったのですが
なんのフラグが発射フラグなのでしょう。
・・・略
if(enemy[s].hp <= 0){
enemy[s].flag=0;
EnemyShot[i].flag=0;
・・・
いろいろと試しましたが、上記は失敗でした。
101ポイント を落としてしまった。
|
|
|
|
|
Name: situmon ..初心者(6,806ポイント)
Date: 2008/11/08(土) 15:00
No:23746
|
|
Title: Re:弾消しフラグ。
|
|
やはりできません。
敵が弾を発射している途中に倒したらそこで発射をやめる
という風にしたいのですが・・・
0は消す、1はあるというくらいならわかるのですが。
62ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..初心者(6,884ポイント)
Date: 2008/11/09(日) 19:56
No:23824
|
|
Title: Re:弾消しフラグ。
|
|
全てオフだったら
というのはif分を使えばいいのでしょうが、
すべてオフだったらとはどういう意味でしょう。
45ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(881,007ポイント)
Date: 2008/11/09(日) 20:37
No:23827
|
|
Title: Re:弾消しフラグ。
|
|
例えば
int a[100];
この配列に入っている要素が全て0かどうかは
for(i=0; i<100; i++){
if(a[0]!=0){
break;
}
}
if(i==100){
//この時全て0だったことがわかる。
}
または
int flag = 0;
for(i=0; i<100; i++){
if(a[0] != 0){
flag = 1;
break;
}
}
if(flag == 0){
//この時全て0だったことがわかる。
}
で確認出来ますよね?
99ポイント を落としてしまった。
|
|
|
|
|
Name: situmon ..初心者(7,164ポイント)
Date: 2008/11/09(日) 21:06
No:23834
|
|
Title: Re:弾消しフラグ。
|
|
宣言 flagは0を代入。
繰り返す(iは0を代入。100回繰り返す。{iが100より小さい iをインクリメント(+1)}
もし(aが0と等しくないなら)
flagに1を代入。
もし(flag と 0 を比較){
}
こういう意味であっていますよね。
だからa[0]をEnemyShot[i]に変えてやればいいのですか。
for(i=0; i<100; i++){
if(EnemyShot[i]!=0){
break;
}
}
if(i==100){
EnemyShot[i].flag=1;
}
ではないのですか?
280ポイント を手に入れた。
|
|
|
|
|
Name: 木霊 ..上級者(22,972ポイント)
Date: 2008/11/15(土) 02:05
No:24102
|
|
Title: Re:弾消しフラグ。
|
|
situmonさん、一度今のゲーム製作を中断してC言語の基礎からやり直した方が良いのではないですか?
問題にぶつかって質問をしても、自分で考える気が全く無いのであれば根本的に解決しません。
確か、今作ってるゲームは「卒業制作」と記憶していますが、
管理人さんのコードを他ならぬ管理人さん自身に改変してもらってコピペしているだけ、
の製作方法(とは言えませんが)では完成までにあと何年掛かるか分かりません。
それで間に合いますか?それを胸を張って自分の作品と言えますか?
今のsitumonさんに一番必要なのは、自分の頭を使って考える事です。
基礎を理解する為の努力をせず、文字通り全て教えてもらっているのでは力も付きません。
「弾を消す」それだけの事で既に一週間もやり取りをされていますが、situmonさん自身に
使われている変数(構造体等)を理解しようという気があれば、たった一日で解決している問題です。
「急がば回れ」「急いては事を仕損じる」という諺はご存知ですよね?
現状のsitumonさんでしたら質問の回答待ちの時間の方が圧倒的に長いですから、しばらく中断して
学習しなおした方が有意義に時間を使えますし、その後の作業効率も比べ物にならない程に上がると思います。
414ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..初心者(7,372ポイント)
Date: 2008/11/15(土) 14:17
No:24111
|
|
Title: Re:弾消しフラグ。
|
|
>あら、中学生って言ってませんでしたっけ? 違ったかな^^;
はい、そうです。中学1年です。
>C言語入門系のサイトを熟読
明快入門C++を見ながらやっていますが、その中のサンプルはif文ならif文だけfor文ならfor文だけにしてあって理解できるのですがゲームになるとたくさんの文を応用してあるのでわからなくなってしまうのです。
139ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..初心者(7,406ポイント)
Date: 2008/11/15(土) 14:48
No:24112
|
|
Title: Re:弾消しフラグ。
|
|
やっとなんとなくわかりました。
弾幕データが持つ全ての弾のフラグであるiとjを消せばいいので
EnemyShot[i].EnemyShots[j].flag=0;でしょうか?
34ポイント を手に入れた。
|
|
|
|
|
Name: 木霊 ..上級者(23,632ポイント)
Date: 2008/11/15(土) 20:30
No:24134
|
|
Title: Re:弾消しフラグ。
|
|
>はい、そうです。中学1年です。
そうでしたか。他の方と混同してしまっていたようです。すみません。
質問内容を見ると今回が初めてのプログラミングのように思えるのですが、
改変していくには敷居が高過ぎるのではないかと思います。
課題でないのならなおさら、前回のトピで他の方に紹介されたサイトでじっくりと
勉強された方がいいのではないでしょうか?
それだけ若いのであれば吸収・理解が早いのでそんなに長く中断しなくても済みます。
また、管理人さんがよく例に出される「じゃんけんゲーム」ぐらいの長さのコードを読んで
変数の意味を調べてみたり、別の値を入れてみてトライ&エラーで慣れていったほうがいいと思います。
この先、改変を続けていくにしても変数一つ一つの意味を理解出来ずに続けては早晩行き詰ります。
(というか、既に詰まってますが・・・)その都度、質問するにしても限度があります。
ゲーム製作に熱意があるのは分かりますが、今の製作状況では完成までその熱意が持つかも分かりません。
まずは本当に小さなものから作り上げて(改変でも)「完成させる喜び」を感じて熱意を維持してください。
それでは、再度の横槍失礼しました。
2倍のポイントを手に入れた! 660ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..初心者(7,504ポイント)
Date: 2008/11/15(土) 21:13
No:24137
|
|
Title: Re:弾消しフラグ。
|
|
二人ともありがとうございました。
iがなにか理解できなかったのですが少しわかりました。
<課題でないのならなおさら、前回のトピで他の方に紹介されたサイトでじっくりと
勉強された方がいいのではないでしょうか?
明快入門C++ビギナー編でもいいのでしょうか。
98ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..初心者(7,559ポイント)
Date: 2008/11/15(土) 21:19
No:24139
|
|
Title: Re:弾消しフラグ。
|
|
じゃんけんのコードなら理解できました。
簡単なことでも複雑になるとわからなくなってしまうのでよく読まなければいけませんね・・・
55ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..中級者(9,334ポイント)
Date: 2008/11/15(土) 22:58
No:24147
|
|
Title: Re:弾消しフラグ。
|
|
あとこんどこそいろいろなことに気をつけて
タイトル画面
を作ることに挑戦したのですが
#include "DxLib.h"
#include "GlobalVariable.h"
int GetHitKeyStateAll_2(int KeyStateBuf[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) KeyStateBuf[i]++;
else KeyStateBuf[i]=0;
}
return 0;
}
void char_disp(int White,int y){
DrawString( 150 , y , "⇒" , White );
DrawString( 170 , 100 , "NEW GAME" , White );
DrawString( 170 , 120 , "END" , White );
}
void message_box(){
int flag;
flag=MessageBox(
NULL ,
TEXT("ウィンドウモードで起動しますか? おすすめ") ,
TEXT("スクリーン設定") ,
MB_YESNO | MB_ICONQUESTION );
if(flag==IDYES)
ChangeWindowMode( TRUE );
}
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 playerCollisionDetection();
extern void Background2();
extern void FpsTimeFanction();
int RefreshTime=0;
int White , y=100; //色とy座標の宣言
message_box();
if( DxLib_Init() == -1 ) return -1;
SetDrawScreen( DX_SCREEN_BACK ) ; //裏画面を使用する。
img_sound_load();
initialization();
SetColor();
White = GetColor( 255 , 255 , 255 ) ; //色の取得
while(ProcessMessage() == 0 && GetHitKeyStateAll(Key) == 0){
RefreshTime = GetNowCount(); //今の時間を取得
ClearDrawScreen(); //裏画面のデータを全て削除
SetMainWindowText( "悲しみの王女 〜ver 1.01〜" ) ;
if( Key[KEY_INPUT_DOWN]==1 ||( Key[KEY_INPUT_DOWN]%5==0 && Key[KEY_INPUT_DOWN]>30)){
// たった今押したか、30カウンター以上押しっぱなしかつ5回に一度
y+=20;
if(y==140) // y座標が260なら(選択が一番下なら)
y=100; // 選択座標を一番上に
if(y==120 && Key[KEY_INPUT_RETURN]== 1)
goto End;
if(y==100 && Key[KEY_INPUT_RETURN]== 1)
goto Opening;
}
Opening:
if(CheckSoundMem(sound_bgm[0])==0)
PlaySoundMem(sound_bgm[0],DX_PLAYTYPE_BACK);
Background();
PlayerShotCalc();
PlayerShotDisp();
PlayerControl();
EnemyControl();
EnemyCalcDisp();
EnemyShotControl();
EnemyShotCalcDisp();
CollisionDetection();
playerCollisionDetection();
Background2();
FpsTimeFanction();
ScreenFlip() ; //裏画面データを表画面へ反映
counter++;
if(Key[KEY_INPUT_ESCAPE]==1) break; //Escapeが押されたら終了
while(GetNowCount() - RefreshTime < 17);//1周の処理が17ミリ秒になるまで待つ
}
End:
DxLib_End() ;
return 0 ;
}
では表示されませんでした。
これであっているのではないですか?
1,775ポイント を手に入れた。
|
|
|
|
|
Name: 木霊 ..上級者(24,997ポイント)
Date: 2008/11/15(土) 23:27
No:24148
|
|
Title: Re:弾消しフラグ。
|
|
複雑になるなら、簡単にしてしまいましょう。
中学生なら英語の授業で訳したりしますよね。
その時に、文章をまとめて訳すのではなくて、単語ごとに分けて辞書を引きませんか?
落ち着けばちゃんと理解できます。
諦めるのが早すぎるので理解できないと思い込んでいるだけです。
慣れるまではコードの横にコメントで何をしているのかを書いていけば混乱も少なくなるでしょうし、
変数の意味(何の為にあるのか)が分かれば、その変数の横にコメントを書いていけば時間が経っても
大丈夫でしょう。
数が多いのであれば、現実のノートやメモ帳に書いておいて分からなくなった時に見返してみるのも
良いかもしれません。
ただ、先にも伝えましたがシューティングの館のコードは分割もされていて、初心者が改変していくには
敷居が高すぎると思います。
まずはその理解した「じゃんけんゲーム」を練習台として改変してみてはどうですか?
例えば、
1・五回勝負にして、それぞれの手を出せる回数を限定する(手を出した回数をフラグで管理)
2・勝った時の手によって点数を変える
3・後出しを認めて、対戦相手によって後出しの出来る時間を変える(配列で時間を管理)
4・1対1ではなく3人以上同時参加(if文の総当りでは複雑になるので工夫が必要)
5・相手がフェイントを仕掛けてくる
今situmonさんが作ろうとしているものに比べると完成した所で「ショボイ」かもしれません。
ですが、1・3あたりをスムーズに作れるようになった頃にはきっと、前回や今回のような所では
躓かなくなるはずです。
>iがなにか理解できなかったのですが少しわかりました。
EnemyShot[i].EnemyShots[j].flagのiの事ですか?
多分ここのi、jは何らかの数字が入る以外に意味は無いと思います。
そもそもiやjは別の言語でループの際に使われていたから、というものですから
数学のa、b、xぐらいの意味だと思います。
>iは弾幕データです。jはそれに属する弾データです
と言うのは、つまり
・弾幕データ[i番目].弾データ[j発目].画面にあるかのフラグ
と言う事だと思います。
弾幕データ1・・・弾データ1・・・画面にあるかのフラグ
2・・・画面にあるかのフラグ
3・・・画面にあるかのフラグ
4・・・画面にあるかのフラグ(これが0なら画面には無い)
2・・・弾データ1(上の「弾データ1」とは名前が同じだが住所が違うので別物)
3
4
弾幕データと言うと言葉がかぶって分かりにくいかもしれませんので、
学校の「クラス」に置き換えると分かりやすいかも
1組・・・○○君・・・出席してるかのフラグ
□□君・・・出席してるかのフラグ
△△君・・・出席してるかのフラグ
××君・・・出席してるかのフラグ(0なら欠席)
2組・・・○○君(同じ名前だがクラスが違うので別人)
3組
4組
・・・あくまで管理人さんの書き込みからの理解ですので間違っているかもしれませんが、
多分こういうことです。
situmonさんの考えと同じでしたか?
自分の理解が違っていたらフォローお願いします。
1,365ポイント を手に入れた。
|
|
|
|
|
Name: 木霊 ..プログラマー(25,013ポイント)
Date: 2008/11/15(土) 23:37
No:24149
|
|
Title: Re:弾消しフラグ。
|
|
と、書き込みを推敲してる間にsitumonさんの投稿が・・・
situmonさん、一度にあちこちやっていくのではなくて、一つ一つ問題を解決していきましょう。
ある部分での理解も不十分なまま違う所をやってしまうとごちゃごちゃに混ざってしまいますよ?
それこそNo24102の自分の投稿の様に・・・
>明快入門C++ビギナー編でもいいのでしょうか
大丈夫だと思いますよ
16ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(890,572ポイント)
Date: 2008/11/15(土) 23:48
No:24150
|
|
Title: Re:弾消しフラグ。
|
|
あれ、今弾消しやってたのでは?それはもう解決して次に挑戦中ですか?
char_dispが追加されているのはわかりますが、どこにも呼ばれていませんよね?
あとオープニングにシューティングに必要な関数を呼ぶ必要は無いですよね。
スイッチ文を作るかまずそれらを消してオープニング処理だけ書いてみてはどうでしょう。
goto文は使わない方がいいです。
goto文の適切な使い方もありますが、ここでは使うべきではないでしょう。
しかもこのままではgoto文をせっかく書いているのに何度も素通りしていると思います。
また、SetMainWindowTextは何度も呼ばなくていいです。
最初だけにしましょう。
260ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..中級者(9,404ポイント)
Date: 2008/11/16(日) 00:28
No:24152
|
|
Title: Re:弾消しフラグ。
|
|
<今弾消しやってたのでは?
EnemyShot[j].flag=2;
としたらできたのですがそれではないのでしょうか?
あとタイトル画面の問題は中断し
木霊さんのじゃんけんからがんばりたいです。
70ポイント を手に入れた。
|
|
|
|
|
Name: 木霊 ..プログラマー(25,279ポイント)
Date: 2008/11/16(日) 01:16
No:24156
|
|
Title: Re:弾消しフラグ。
|
|
>EnemyShot[j].flag=2;
>としたらできたのですがそれではないのでしょうか?
それだけだと、「なぜそうなったのか?」が分かっていませんよね?
でたらめやってたら偶然出来た、のではそこにどんなバグが潜んでいるか分かりません。
別の場所を改変していたら、強制終了するようになった・・・ってこともありえない話じゃないです。
なぜ期待した通りに動くようになったのか、コードを追ってみて下さい。
>木霊さんのじゃんけんからがんばりたいです。
そうですか、でしたら最初に十戦終わったら勝敗を表示するようにしてみてください。
配列への代入と表示にfor文とif文(switch文)を使うので、それらの練習と復習を兼ねてます。
そんなに難しくないので落ち着けばきっと大丈夫です。
まずは使われている変数がどんな役割を持っているのか?
それを把握していかないと改変は難しいですよ。(と言うか、自分には無理です)
266ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..中級者(9,540ポイント)
Date: 2008/11/16(日) 11:44
No:24163
|
|
Title: Re:弾消しフラグ。
|
|
< それだけだと、「なぜそうなったのか?」が分かっていませんよね?
1なら表示する、0なら消す。2はどちらでもないので表示されない。
だからフラグを2にすれば表示されない。
< そんなに難しくないので落ち着けばきっと大丈夫です。
それがコツですね。
136ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..中級者(9,705ポイント)
Date: 2008/11/16(日) 18:43
No:24182
|
|
Title: Re:弾消しフラグ。
|
|
今回は本当にありがとうございました。
弾消しフラグではない問題に移ったので別のスレに書き直そうと思ったのですが
迷惑をかけてしまったみたいですいません。
void syouhai(){
if(state==1)
y++; //やった回数をインクリメント。
if(state==2)
k++; //勝った回数をインクリメント。
y++; //やった回数をインクリメント。
}
void kekka(){
if(y==10)//やった回数が10回ならば
DrawFormatString(150,50,GetColor(255,255,255),"%s","***勝負の結果は・・・***");//勝負の結果を表示
}
としたのですが表示されませんでした。
165ポイント を手に入れた。
|
|
|
|
|
Name: array [URL] ..プログラマー(38,389ポイント)
Date: 2008/11/16(日) 20:05
No:24187
|
|
Title: Re:弾消しフラグ。
|
|
いきなりですが
多分、上記のプログラム(消えてますが)だと、木霊さんの思う回答になっていないんじゃないかと思って
じゃんけんゲームのポイント
1.グー、チョキ、パー をどうやって入力するか
2.相手の、グー、チョキ、パー をどう決めるか
3.勝敗はどうやって判定するか(引き分けも含む)
大きく分けて、こういのが重要になってくると思います。
勝敗の判定は、言葉で、こうすれば出来るよ。と簡単に言えるかもしれません。
この3点を是非プログラムで考えてください。結果表示はその次だと思います。
------ 追記 ------
> 今回は本当にありがとうございました。
戻してとは言いませんが・・・。
レスが付いた後に大雑把に内容を変更するのは以後やめてほしいです^^;
精神的にショックですので。
2倍のポイントを手に入れた! 354ポイント を手に入れた。
|
|
|
|
|
Name: 木霊 ..プログラマー(25,540ポイント)
Date: 2008/11/16(日) 22:49
No:24208
|
|
Title: Re:弾消しフラグ。
|
|
>1なら表示する、0なら消す。2はどちらでもないので表示されない。
>だからフラグを2にすれば表示されない。
元のコードを知らないので断言はできませんが、半分正解、半分間違いです。
1なら表示、0なら消す。ここまでは大丈夫です。
でも2は「何をするか決めていない」はずです。なぜなら「2になることは無い」という前提で
プログラムしているはずだからです。
今回は、偶然期待した結果と同じ動作をしただけで、何が起こってもおかしくないと
考えておいた方がいいと思います。
それこそ、使っているパソコンのハードディスクが初期化されるぐらいのことが起こっても仕方が無いぐらいです。(ある本での「未定義の動作について」の引用なので少し脅しすぎですけどw)
それに2にして表示されないのであれば0にしたときも表示されないはずですが、そうなってないのならば
問題はまだそこにあるので解決はしてません。
261ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..中級者(14,410ポイント)
Date: 2008/11/16(日) 23:48
No:24215
|
|
Title: Re:弾消しフラグ。
|
|
0にしても表示されないのですが、
敵が新しくフラグを立てたときに
一度0にしたはずの画像がまたでてきてしまうので
2にしました。
58ポイント を手に入れた。
|
|
|
|
|
Name: 木霊 ..プログラマー(25,769ポイント)
Date: 2008/11/17(月) 00:07
No:24217
|
|
Title: Re:弾消しフラグ。
|
|
それなら敵が新しくフラグを立てるところで問題があるという事です。
この問題を解決しなければ2体以上の敵を同時に出現させる事ができないかもしれませんよ?
そのやり方は、問題を解決するどころかさらに問題を増やす事になりかねません。
夏休み明けの登校日に、宿題をやってもいないのに「持ってくるのを忘れました」と言ってその日を
乗り切ろうとしているのと同じ事です。
「エラーが出ないバグを放置」しているだけ、と言えるかもしれません。
170ポイント を手に入れた。
|
|
|
|
|
Name: 木霊 ..プログラマー(25,851ポイント)
Date: 2008/11/18(火) 00:19
No:24261
|
|
Title: Re:弾消しフラグ。
|
|
>前にも書きましたけど、2の時はそれ以上弾を登録しないようにし、弾の起動は計算します。
あ、そうでしたか・・・では2であっていたのですね。
管理人さん、situmonさん、申し訳ありません。
82ポイント を手に入れた。
|
|
|
|
|
Name: 木霊 ..プログラマー(26,572ポイント)
Date: 2008/11/18(火) 01:37
No:24268
|
|
Title: Re:弾消しフラグ。
|
|
>もし既に実装済みだったらごめんなさい。
いえ、多分実装されて無いのではないかと・・・「2にしたらできた」と仰ってますから、
フラグの意味も割りと曖昧なままここまでやってきたように思います。
>まぁ改造が難しければ、少しずつDXライブラリになれて自分で作っていくのが一番ですね。
最終的にはそうですけど、本人にやる気がありますから処理や変数を把握しないまま質問攻めに
する癖を控えれば、その(改変した)ゲームを遊べるのではないかと期待してます。
それに他人のコードを読むのは一から作るよりも勉強になりますから。
ただ、取り組み姿勢がちょっと・・・と思ったものですから。
結果優先で過程への理解を疎かにしてる節が感じられましたので、口を出してしまいました。
期待といえば四聖2が最近の一番なんで管理人さんにはもっと頑張ってもらわないとw
自分のはこのままエターナりそうなんで・・・orz
251ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..上級者(17,304ポイント)
Date: 2008/11/23(日) 17:59
No:24474
|
|
Title: Re:弾消しフラグ。
|
|
if(EnemyShot[j].flag!=0)//もし弾がまだ外じゃないなら
EnemyShot[j].flag=2; //2にする。
else if(EnemyShot[j].flag==2 && EnemyShot[j].flag==0) //フラグが2の弾でかつ全部外にあるなら
EnemyShot[j].flag=0; //フラグを2にしてフラグが2の弾をなくす。
ではだめなのでしょうか?
今回エラーが直接でず
バグなので、これがだめなのかどうかわかりません。
どうやって見分ければいいのでしょう。
113ポイント を手に入れた。
|
|
|
|
|
Name: 木霊 ..プログラマー(26,689ポイント)
Date: 2008/11/24(月) 00:37
No:24488
|
|
Title: Re:弾消しフラグ。
|
|
>else if(EnemyShot[j].flag==2 && EnemyShot[j].flag==0) //フラグが2の弾でかつ全部外にあるなら
このif文ではEnemyShot[j].flagが0であり2の時にしかその後の処理をしません。
このどちらかが間違っています。(多分後ろの条件の方が)
117ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..上級者(17,445ポイント)
Date: 2008/11/27(木) 19:16
No:24660
|
|
Title: Re:弾消しフラグ。
|
|
あとシューティングゲームの館はもう更新を終了され
龍神録プログラミングの館が主となりました。
今はシューティングゲームの館で勉強しているので、
龍神録プログラミングの館のこの章の機能を
シューティングゲームの館のコードに取り入れたいと思うことがあります。
ですが龍神録プログラミングの館のコードの書き方とシューティングゲームの館のコードの書き方は
別物です(元は同じですが)。なのでどうしてもシューティングゲームの館のコードに取り入れることができません。それで質問ばかりで迷惑をかけてします。
いい方法はありませんか?
129ポイント を手に入れた。
|
|
|
|
|
Name: 通りすがり ..中級者(12,938ポイント)
Date: 2008/11/27(木) 21:26
No:24663
|
|
Title: Re:弾消しフラグ。
|
|
フラグが0で無いなら2にするという書き方は意図した結果になるのでしょうか?
後、数だけで表せるのかという質問の意味がよくわかりませんね。
44ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..上級者(17,483ポイント)
Date: 2008/11/27(木) 23:23
No:24667
|
|
Title: Re:弾消しフラグ。
|
|
if文から考え直してみます。
ご返事ありがとうございます。
新版 明解C言語 入門編 のようなC言語の本はどれがいいのかと思い迷ってしまいます・・・
38ポイント を手に入れた。
|
|
|
|
Name: y ..ぴよぴよ(233ポイント)
Date: 2008/11/20(木) 14:36
No:24359
|
|
Title: シグナルハンドラが動かない
|
|
aaa.cの略した中身
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<signal.h>
//シグナルハンドラ
void xxx_handler(int sig);
void xxx_handler(int sig)
{
〜〜(いろいろな処理)
}
main(int abc, char def[])
{
signal(SIGTERM, &xxx_handler);
〜〜(いろいろな処理)
for(int i=0;i<hensu;i++){
//bbb.cのsample関数を呼ぶ
sample(int ghi);
}
〜〜(いろいろな処理)
}
このような感じのソースで
この処理は300秒以上かかってしまうことがあり
SIGTERMで強制終了させられてしまいます。
上記のようにシグナルハンドラを設定しても
なぜかいつもbbb.cの処理中にシグナルハンドラの処理がされないまま
強制終了してしまいます・・・
bbb.cの1回の処理は3秒ほどかかりますが
bbb.cのように他のソースを呼んでいる時は
そっちにもシグナルハンドラは必要ですか?
ちなみにaaa.cとbbb.cはメイクして作成されるバイナリは一つです。
プロセスも一つです。
よろしくお願いいたします。
220ポイント を手に入れた。
|
|
|
|
Name: 御津凪 [URL] ..プログラマー(37,299ポイント)
Date: 2008/11/20(木) 14:56
No:24360
|
|
Title: Re:シグナルハンドラが動かない
|
|
MSDN のリファレンスを見た限りですが…
> 上記のようにシグナルハンドラを設定しても
> なぜかいつもbbb.cの処理中にシグナルハンドラの処理がされないまま
> 強制終了してしまいます・・・
強制終了のシグナルハンドラを処理するなら SIGTERM ではなく、 SIGABRT のような気がします。
( SIGTERM は、終了要求時、 SIGABRT は異常終了時 )
113ポイント を手に入れた。
|
|
|
|
|
Name: y ..ぴよぴよ(757ポイント)
Date: 2008/11/20(木) 18:42
No:24370
|
|
Title: Re:シグナルハンドラが動かない
|
|
返信ありがとうございます。
300秒経過後に送られてくるシグナルはSIGTERMです。
>signal(SIGTERM, &xxx_handler);
この部分を
int sig;
for(sig=0;sig<256;sig++){
signal(sig, &xxx_handler);
}
と書いて全てのシグナルを登録しても
キャッチできないんです。。。
int sig;
for(sig=0;sig<256;sig++){
signal(sig, &my_handler);
}
while(1){
;
}
上記のようにシグナル登録後に無限ループを入れると
300秒後にSIGTERMをキャッチできたのですが。。。
2倍のポイントを手に入れた! 524ポイント を手に入れた。
|
|
|
|
|
Name: y ..ぴよぴよ(607ポイント)
Date: 2008/11/21(金) 00:53
No:24386
|
|
Title: Re:シグナルハンドラが動かない
|
|
レスありがとうございます
>処理系不明、ソース不明の状況では正確なことは何もわかりませんが...
申し訳ございません、
大手企業の社内システムのため詳しいソースは書けません。
SQL文の実行が多く、perlを書き出しCGI生成処理も含まれます。
>ハンドラの中でハンドラを再登録していますか?
はい、もちろんハンドラ処理中に再びシグナルがきた場合も
考えましたが登録してもやはり処理されません。
150ポイント を落としてしまった。
|
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(73,396ポイント)
Date: 2008/11/21(金) 09:50
No:24392
|
|
Title: Re:シグナルハンドラが動かない
|
|
> 大手企業の社内システムのため詳しいソースは書けません。
それでは掲示板上で解決するのは困難です。
自己解決してください。
職業柄、個別に相談を受ければ解析しないでもないですが...(もちろん有償で)
まあ、できるだけ自己解決することをお勧めします。
51ポイント を手に入れた。
|
|
|
|
|
Name: y ..ぴよぴよ(710ポイント)
Date: 2008/11/21(金) 13:20
No:24398
|
|
Title: Re:シグナルハンドラが動かない
|
|
すみません、簡単に質問内容をまとめると
aaa.cにmain関数があり
bbb.cとccc.cの関数を呼び出す処理があり
そこにシグナルハンドラを追加したい場合
aaa.cにだけ
・#include <signal.h>
・シグナルハンドラのプロトタイプ
・シグナルハンドラ
・シグナル登録
を追加して
途中で呼び出される
bbb.cとccc.cの方には何も追加しなくていいんですよね?
ということです。
よろしくお願いいたしますm(_ _)m
103ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(73,429ポイント)
Date: 2008/11/21(金) 16:58
No:24400
|
|
Title: Re:シグナルハンドラが動かない
|
|
> aaa.cにmain関数があり
> bbb.cとccc.cの関数を呼び出す処理があり
> そこにシグナルハンドラを追加したい場合
>
> aaa.cにだけ
> ・#include <signal.h>
> ・シグナルハンドラのプロトタイプ
> ・シグナルハンドラ
> ・シグナル登録
> を追加して
>
> 途中で呼び出される
> bbb.cとccc.cの方には何も追加しなくていいんですよね?
一般的にはそうです。
ただし、マルチスレッド環境など、標準規格の範疇を超えた処理系特有の事情がある場合はその限りではありません。
33ポイント を手に入れた。
|
|
|
|
|
Name: y ..ぴよぴよ(911ポイント)
Date: 2008/11/27(木) 18:49
No:24657
|
|
Title: Re:シグナルハンドラが動かない
|
|
たかぎ様、遅くなりましたが返信ありがとうございます。
途中で出される方(仮名bbb.c)にシグナルハンドラを設定してみたところsignal:17(SIGCHLD)をキャッチしました。
子プロセス実行中にシグナルSIGTERMを受信すると親プロセスのハンドラでは
キャッチできませんよね?
つまりシグナルハンドラが動かなかった原因はどこかで子プロセスが起動し、
子プロセス実行中に子プロセスがシグナルで死に、
親プロセス側のハンドラは無反応だったということでしょうかね?
しかし、ソースの中にforkは使っていないのでどこで子プロセスが生成されているのかわかりませんが・・・
201ポイント を手に入れた。
|
|
|
|
|
Name: y ..ぴよぴよ(787ポイント)
Date: 2008/11/27(木) 18:58
No:24658
|
|
Title: Re:シグナルハンドラが動かない
|
|
あ、ちなみに
>ただし、マルチスレッド環境など、標準規格の範疇を超えた処理系特有の事情がある場合はその限りではありません。
スレッド関連のヘッダはインクルードしていないのでマルチスレッドではないと思います。
貴重なご意見ありがとうございます。
124ポイント を落としてしまった。
|
|
|
|
Name: AC ..ぴよぴよ(775ポイント)
Date: 2008/11/26(水) 03:47
No:24572
|
|
Title: C++によるタスクシステムに関する質問(少々面倒です)
|
|
こちらでは、はじめて質問させていただきますACです。
C++については大体基本はわかってるぐらいの知識です。
DxLibを使用してゲームのひな形でも作ろうなと思い、C++でリストを使ってタスクシステムを実装したのですが、一部挙動が不明のところがあり、いくら考えても分からず気になって気になってしょうがないので、質問するしだいに至りました。
ここには全てを書きにくいいのでソースをアップしましたのでそちらを参照しながら見ていただけたらと思います。
アドレス:http://www1.axfc.net/uploader/He/so/163203
ダウンロード&解凍パス:sitsumonyo
既に実行できる状態のVC2008のプロジェクトです(DxLibのインクルードとリンクはそちらの方でお願いします)。
まず、タスクシステムについては、これはTNKソフトウェアさんのサイトの
http://www.tnksoft.com/reading/classgame/engine/01/011.php
を参考にしています(ほぼまんまですが・・・)。
タスクに関する全処理はMaster.cppに書かれています。
さて本題ですが、不明な点はOpening.cppにあります。
簡単にいえば使いたいときに AddTask(new クラス名()...) でタスクに追加して、いらなくなったら RemoveTask(インスタンス) で削除すればよいのですが、Opening.cpp内でRemoveTask(this)のようにしてタスクを消したところ、エラーが出てしまいました(色々試しましたがOpening.cpp内でなくてもエラーが起こるようです)。
リストの要素のerase時にエラーが出てるらしく、どうもイテレータによる参照が変な感じであることがわかったのですが、なぜおかしくなるのかがどうしてもわかりませんでした。
少々面倒な質問ですが、エラーのでる理由のわかる方は教えていただけたら幸いです。よろしくお願いします。
775ポイント を手に入れた。
|
|
|
|
Name: GPGA ..熟練のプログラマー(53,871ポイント)
Date: 2008/11/26(水) 10:35
No:24577
|
|
Title: Re:C++によるタスクシステムに関する質問(少々面倒です)
|
|
削除後のイテレータを設定し直していないためです。
× TaskList.erase(iter);
○ iter = TaskList.erase(iter);
63ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..プログラマー(38,443ポイント)
Date: 2008/11/26(水) 10:36
No:24578
|
|
Title: Re:C++によるタスクシステムに関する質問(少々面倒です)
|
|
恐らく、自分自身を RemoveTask したあとは既にインスタンスは delete されているので、その後の自分自身に対する処理はエラーになります。
対処は、自分自身が RemoveTask した後に直ぐに出るか、 removeTask をタスクループ外で呼び出すか、
タスクシステムの構造を変えるかのどれかになります。
88ポイント を手に入れた。
|
|
|
|
|
Name: GPGA ..熟練のプログラマー(53,964ポイント)
Date: 2008/11/26(水) 10:46
No:24580
|
|
Title: Re:C++によるタスクシステムに関する質問(少々面倒です)
|
|
御津凪さんの言うとおりですね。
今回の場合COpening01::Execメソッド内の
++timer;
のところで開放済みのクラスのメンバにアクセスしているため
アクセス違反を起こしています。
82ポイント を手に入れた。
|
|
|
|
|
Name: AC ..かけだし(1,210ポイント)
Date: 2008/11/27(木) 00:55
No:24647
| 解決!
|
Title: Re:C++によるタスクシステムに関する質問(少々面倒です)
|
|
御津凪さん、GPGAさん、ご解答ありがとうございます。
まさしくおっしゃる通りでした。
サンプルだしー、という感じで何気なく書いてしまったtimer++が原因でしたorz。
ひとまず解決です。
ありがとうございました。
でも、それならまたいくつか疑問に思う点がありまして、
1.なぜこのエラーはプログラム終了時に発生するのか(delete時には発生してないようですので)
2.アップした質問用プロジェクトは作製途中の元ソースのエラー探しの過程でできたものでもあるのですが、元のソースの方ではVC側からはxmemory(リスト関連のヘッダ?)というところの
void deallocate(pointer _Ptr, size_type)
{ // deallocate object at _Ptr, ignore size
→ ::operator delete(_Ptr);
}
でエラーが起きているといわれるのですが、これは何を意味しているのか
の2点がよく分かりません。
2の方は元ソースの方はアップしてないので情報不足でしたらスルーしてくださって構いません。
もしよかったら回答のほうよろしくお願いします。
435ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..プログラマー(39,042ポイント)
Date: 2008/11/27(木) 10:13
No:24648
|
|
Title: Re:C++によるタスクシステムに関する質問(少々面倒です)
|
|
1.については、deleteの処理自体は正常に処理され、
その後deleteされたthisポインタを持った状態で関数から戻ってきているので、
deleteされたthisポインタを参照してしまうとアクセス違反エラーになります。
もしエラーにならなくても、終了時に何らかの形で(ヒープが壊れているとか)エラーを出します。
(後者が該当する原因かと)
2.は1.によるものだと思われます。
ちなみに、ヒープが壊れているというのは、確保した領域の前後(あるいは確保していた領域)に
書き込みが行われたことが原因となります。
243ポイント を手に入れた。
|
|
|
|
|
Name: AC ..かけだし(1,284ポイント)
Date: 2008/11/27(木) 18:34
No:24656
| 解決!
|
Title: Re:C++によるタスクシステムに関する質問(少々面倒です)
|
|
御津凪さん、丁寧なご回答ありがとうございます。
完全に納得いたしました。
これにて全て解決ということにさせていただきます。
本当に勉強になりました。
ご回答してくださった皆様ありがとうございました。
74ポイント を手に入れた。
|
|
|
|
Name: 海老天 ..入門者(2,901ポイント)
Date: 2008/11/26(水) 23:55
No:24640
|
|
Title: シミュレーションとRPG
|
|
ゲームプログラミングの館からゲームの作成を始めたのですが今つまっています
最終的にはファイナルファンタジータクティクスに育成ゲームの要素をプラスしたようなシミュレーションを作りたいと思っています
最初に作るのはやはりRPGが良いのでしょうか?
96ポイント を手に入れた。
|
|
|
|
Name: 御津凪 [URL] ..プログラマー(38,799ポイント)
Date: 2008/11/27(木) 00:22
No:24643
|
|
Title: Re:シミュレーションとRPG
|
|
最初からあまり規模の大きい(複雑なシステムなども含む)ゲームを作ろうとすると、
途中で挫折しやすいです。
RPGを一通り作って、ここはこうしたほうがいいんだなと、作り方を自分自身で覚えてから、
ワンランク上のシステムやゲームを作ったほうがいいと思いますよ。
たとえば、RPGのキャラの扱いとか、ゲームの推移などがありますね。
これらを書いたことのない状態と、一度書いたことがある状態とでは、
その処理の構造が大きく変わったりすることがあります。
(俗に言うソースコードは二度書けということ)
つまり、ゲームのある部分がプログラムでどうなっているかを自分が理解しないと製作が破綻しやすくなります、ということです。
結論としては、製作の勉強としてRPGからのほうがいいと思います。
それでも無理と感じたらもう少し規模の小さいミニゲームを作っているといいですよ。
207ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(900,419ポイント)
Date: 2008/11/27(木) 00:46
No:24646
|
|
Title: Re:シミュレーションとRPG
|
|
私も「コードは二度書け」は大切だと思います。
最初に作るのはもっと簡単なものがいいんじゃないでしょうか?
RPGから作り始めるのもありだと思いますが、
今製作中のRPGはボツになり、作り直すことになる可能性が大きいです。
2度以上書いて、書き方が解ってくるものだと思います。
初めて作るゲームを完璧にしたいなら、簡単なゲームで下積みするのがいいと思います。
サンプルプログラミングの館に簡単なコードがいくつかあります。
コンソール画面でジャンケンゲームを作った後、
DXライブラリでジャンケンを作るとか、
それが終わったらリンゴの落ちゲーを作ってみるとかしてみてはどうでしょう。
ゲームの基本的なことが解ってくると思います。
286ポイント を手に入れた。
|
|
|
|
|
Name: 海老天 ..入門者(2,942ポイント)
Date: 2008/11/27(木) 16:31
No:24650
|
|
Title: Re:シミュレーションとRPG
|
|
アドバイスの通りに簡単なゲームから作ってみようと思います
ご意見ありがとうございました
41ポイント を手に入れた。
|
|
|
|
Name: ムンバ ..中級者(11,770ポイント)
Date: 2008/11/26(水) 21:57
No:24619
|
|
Title: Visual C++ 2008 Express Editionについて
|
|
こんばんは。お世話になります。
先日は(も^^;)的を得ない質問に対して、ご丁重なご解説頂きありがとうございました。
階乗のプログラムできました。ありがとうございました。
ここで質問させて頂く事なのかどうか散々迷ったのですが
検索エンジンかけて調べてみたのですが、自力で探せませんでした。
Visual C++ 2008 Express Edition の設定について
お時間ある方、どうか教えて下さい。
添付させて頂いた、gifファイルの
int printf (const char *_Format, ...) ←この部分です!
プログラムを記述してると時々、突然出現しまして(そのうち便利と感じる時が来るかもしれませんが)
今の私には邪魔に感じているので出ない様にしたいのです。
この、突然出てくる上述の部分の名称?が解らないので「ヘルプ」でも調べられませんでした。
この様な設定の詳細が書かれてる(日本語の)ページ等
ご存知でしたらご紹介頂けないでしょうか?
つまり int printf (const char *_Format, ...) の部分が出ない様にしたいのです。
宜しくお願い致します。
365ポイント を手に入れた。
|
|
|
|
Name: Justy ..ハッカー(275,802ポイント)
Date: 2008/11/26(水) 22:02
No:24623
|
|
Title: Re:Visual C++ 2008 Express Editionについて
|
|
オプションの「テキストエディタ -> C/C++ -> 全般」の
「入力候補」の「パラメータヒント」のチェックボックスじゃないか、とおもいます。
このチェックを外せば、薄い黄色の枠は出なくなるはずです。
2倍のポイントを手に入れた! 76ポイント を手に入れた。
|
|
|
|
|
Name: ムンバ ..中級者(11,916ポイント)
Date: 2008/11/26(水) 22:09
No:24624
| 解決!
|
Title: Re:Visual C++ 2008 Express Editionについて
|
|
Justyさん、早速のご解説どうもありがとうございます。
できましたっ!と言いますか、消えましたっ!
以前から、気になっていたので助かりました。
どうもありがとうございました。(感謝
2倍のポイントを手に入れた! 146ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(899,518ポイント)
Date: 2008/11/26(水) 22:52
No:24630
|
|
Title: Re:Visual C++ 2008 Express Editionについて
|
|
>そのうち便利と感じる時が来るかもしれませんが
自分がやりやすい設定にするのが一番だと思いますが、パラメータヒントは案外便利な時ありますよ。
例えば
DXライブラリのDrawRotaGraph2関数とかって引数が多いので順番どうだったか悩む時あったんですが、入力していると
int DrawRotaGraph2( int x, int y, int cx, int cy, double ExtRate, double Angle, int GrHandle, int TransFlag, int TurnFlag ) ;
と表示されるので、どこにどれを書けば良いのか、リファレンス見ずに解ったりします。
まぁ関数の仕様をばっちり覚えてる時なんかは確かに必要ありませんね。
16ポイント を手に入れた。
|
|
|
|
|
Name: ムンバ ..中級者(12,240ポイント)
Date: 2008/11/27(木) 00:09
No:24642
| 解決!
|
Title: Re:Visual C++ 2008 Express Editionについて
|
|
こんばんはっ!
ご解説どうもありがとうございます。
>パラメータヒントは案外便利な時ありますよ。
>関数の仕様をばっちり覚えてる時なんかは確かに必要ありませんね。
ばっちり・・・覚えて無いです。^^;
と言いますか勉強不足で、そこまで行ってません。(激汗
あっ?ちょっと待って下さいっ!
今はDXライブラリの勉強は中断してまして(ごめんなさい。)
C言語の基礎を、参考書や参考HPを参考に勉強させて頂いてます。
パラメータヒント
って言うんですね?この突然現れる奴。^^
もうちょっと勉強進んだら、この「突然現れる奴」が参考になるかもしれません。
どうもありがとうございました。
266ポイント を手に入れた。
|
|
|
|
Name: もずく ..ぴよぴよ(271ポイント)
Date: 2008/11/26(水) 00:31
No:24563
|
|
Title: fopenの返り値について
|
|
ファイルを読み込む時は,まず
FILE *fp = fopen("hoge","r");
とすると思います.
その後のエラー処理について,
if(fp==NULL)
…
と習ったのですが,
if(!fp)
…
としているソースを見かけました.
実行してみると確かに動きましたが,
これは何を評価しているのでしょうか?
また,バグになる可能性のない安全なコードなのでしょうか?
144ポイント を手に入れた。
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(897,390ポイント)
Date: 2008/11/26(水) 00:56
No:24567
|
|
Title: Re:fopenの返り値について
|
|
C言語においてどのように定義されているかは他の方に任せます。
大抵のコンパイラでは
#define NULL ((void*)0)
と定義されているようです。汎用ポインタ型の0ですね。
また、他トピの回答内容と同じになりますが、
判定式は真か偽かで判定されますよね。
if(真){
//
}
はいつも実行されますが
if(偽){
//
}
はいつも実行されませんね。では「!(=否定)」をつけるとどうなるか
if(!真){
//
}
はいつも実行されません。
if(!偽){
//
}
はいつも実行されます。そして真とは0以外、偽とは0であることから、
if(!0){
//
}
はいつも実行されます。そこで
if(!fp){
//
}
の成す意味は、「fpが0なら実行し、0以外なら実行しない」と言う意味になります。
218ポイント を手に入れた。
|
|
|
|
|
Name: 木霊 ..プログラマー(26,845ポイント)
Date: 2008/11/26(水) 00:56
No:24568
|
|
Title: Re:fopenの返り値について
|
|
自分の持っている辞典では NULL の定義例として、
#define NULL (void *)0
とあります。 また、以前は「0」に定義されている事もあったようです。
ですから、
if(fp==NULL){オープン失敗} は
if ( fp == 0 ) { オープン失敗 } になり、さらに「!」が否定演算子なので
if ( !fp ) { オープン失敗 }// fp が NULL なら()内が真になる
という形に出来るようです
156ポイント を手に入れた。
|
|
|
|
|
Name: もずく ..ぴよぴよ(323ポイント)
Date: 2008/11/26(水) 23:58
No:24641
| 解決!
|
Title: Re:fopenの返り値について
|
|
なるほど,
#define NULL (void *)0
とNULLが定義されているから成せる技なのですね.
どうもありがとうございました.
52ポイント を手に入れた。
|
|
|
|
Name: matu ..ぴよぴよ(362ポイント)
Date: 2008/11/24(月) 22:59
No:24502
|
|
Title: 与えられた順列の距離から一番最短距離のみ表示する
|
|
かなり今焦っています。
学校から与えられた課題で、ある店が61店舗(店舗番号は1から61)ありその店から自分で4店舗ランダムに選び、その4店舗の順列(24通り)の距離を求め一番最短距離の順列と距離のみを出力するよう課題が
でました。今のところ、順列と距離は求めるプログラムは組めたのですが最短距離の順列と距離を選択し出力するところがどうやっていかわかりません。ご教授ください。いまできているところまでのコードを載せます。
下のコードでは4店舗は店舗番号(8,7,13,24)です。コードの中の61店舗のそれぞれの距離間
d[MAX+1][MAX+1]の配列の中身は文字数の関係で省略させていただきます。
</pre>
#include <stdio.h>
#define MAX 61
#define N 4
int v[N+1]={0,8,7,13,24};
int p[N + 1];
void perm(int);
int main(void)
{
int i;
for (i=1;i<=N;i++)
p[i] = i;
perm(1);
return 0;
}
void perm(int i)
{
int j, t,sum,min;
min=100000;
sum=0;
if (i < N)
{
for (j = i; j <= N; j++) {
t = p[i]=v[i]; p[i]=v[i] = p[j]=v[j]; p[j]=v[j] = t;
perm(i + 1);
t = p[i]=v[i]; p[i]=v[i] = p[j]=v[j]; p[j]=v[j] = t;
}
}
else {
int d[MAX+1][MAX+1]={
};
/*p[j]とv[j]の交換*/
for(j=1;j<=N;j++)
{
p[j]=v[j];
}
/*距離(sum)をだしている*/
for(j=1;j<=N;j++)
{
printf("%d ",v[j]);
sum +=d[v[j]][v[j+1]];
}
printf("%d",sum);
printf("\n");
}
}
362ポイント を手に入れた。
|
|
|
|
Name: matu ..ぴよぴよ(176ポイント)
Date: 2008/11/24(月) 23:14
No:24503
|
|
Title: Re:与えられた順列の距離から一番最短距離のみ表示する
|
|
すいません字下げするの忘れてしまいました
#include <stdio.h>
#define MAX 61
#define N 4
int v[N+1]={0,8,7,13,24};
int p[N + 1];
void perm(int);
int main(void)
{
int i;
for (i=1;i<=N;i++)
p[i] = i;
perm(1);
return 0;
}
void perm(int i)
{
int j, t,sum,min;
min=100000;
sum=0;
if (i < N)
{
for (j = i; j <= N; j++) {
t = p[i]=v[i]; p[i]=v[i] = p[j]=v[j]; p[j]=v[j] = t;
perm(i + 1);
t = p[i]=v[i]; p[i]=v[i] = p[j]=v[j]; p[j]=v[j] = t;
}
}
else {
int d[MAX+1][MAX+1]={
};
/*p[j]とv[j]の交換*/
for(j=1;j<=N;j++)
{
p[j]=v[j];
}
/*距離(sum)をだしている*/
for(j=1;j<=N;j++)
{
printf("%d ",v[j]);
sum +=d[v[j]][v[j+1]];
}
printf("%d",sum);
printf("\n");
}
}
186ポイント を落としてしまった。
|
|
|
|
|
Name: box ..ハッカー(130,141ポイント)
Date: 2008/11/24(月) 23:24
No:24505
|
|
Title: Re:与えられた順列の距離から一番最短距離のみ表示する
|
|
せめて、こんな風に字下げできないものでしょうか。
元のコードは読みづらいことこの上ありません。
#include <stdio.h>
#define MAX 61
#define N 4
int v[N+1]={0,8,7,13,24};
int p[N + 1];
void perm(int);
int main(void)
{
int i;
for (i=1;i<=N;i++)
p[i] = i;
perm(1);
return 0;
}
void perm(int i)
{
int j, t,sum,min;
min=100000;
sum=0;
if (i < N) {
for (j = i; j <= N; j++) {
t = p[i]=v[i]; p[i]=v[i] = p[j]=v[j]; p[j]=v[j] = t;
perm(i + 1);
t = p[i]=v[i]; p[i]=v[i] = p[j]=v[j]; p[j]=v[j] = t;
}
}
else {
int d[MAX+1][MAX+1]={
};
/*p[j]とv[j]の交換*/
for(j=1;j<=N;j++) {
p[j]=v[j];
}
/*距離(sum)をだしている*/
for(j=1;j<=N;j++) {
printf("%d ",v[j]);
sum +=d[v[j]][v[j+1]];
}
printf("%d",sum);
printf("\n");
}
}
330ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..初心者(8,169ポイント)
Date: 2008/11/24(月) 23:25
No:24506
|
|
Title: Re:与えられた順列の距離から一番最短距離のみ表示する
|
|
最短の順列とは何でしょうか?
また距離に関しては、最短距離がいくつもあった場合にも依りますが、
1.距離を配列aで保存
2.最小値を格納する変数minを用意しminに*aを代入
3.以下の4〜5を必要回数繰り返す。
4.aをインクリメントする
5.*aとminを比べて*aが小さければminに*aを代入
で良いと思いますよ。
90ポイント を手に入れた。
|
|
|
|
|
Name: matu ..ぴよぴよ(271ポイント)
Date: 2008/11/24(月) 23:49
No:24510
|
|
Title: Re:与えられた順列の距離から一番最短距離のみ表示する
|
|
lbfuvab さん、boxさん返信ありがとうございます。
最短の順列とは最短距離になる順列も一緒に出力したいのです。
1の部分
#define M 24
int a[M];
int k;
a[k]=sum;
2の部分はポインタを使うのですか?
85ポイント を手に入れた。
|
|
|
|
|
Name: non ..中級者(9,509ポイント)
Date: 2008/11/25(火) 09:48
No:24522
|
|
Title: Re:与えられた順列の距離から一番最短距離のみ表示する
|
|
>d[MAX+1][MAX+1]の配列の中身は文字数の関係で省略
たぶん、各店舗間の距離が入っているのだと思いますが、
現在地から、最初の店までの距離または最後の店から現在地までの距離は、
必要ないのでしょうか?
/*距離(sum)をだしている*/
for(j=1;j<=N;j++) {
printf("%d ",v[j]);
sum +=d[v[j]][v[j+1]];
}
j=Nのとき v[j+1]ってのは何?
35ポイント を手に入れた。
|
|
|
|
|
Name: matu ..ぴよぴよ(365ポイント)
Date: 2008/11/25(火) 10:34
No:24524
|
|
Title: Re:与えられた順列の距離から一番最短距離のみ表示する
|
|
non さん返信ありがとうございます。d[MAX+1][MAX+1]には各店舗間の距離が入っています。
実際はある出発地点を出発し最後はそこに戻ってくるというようにしたいんのですが、今はそのプログラム
がわからないので4店舗間を回る最短距離とその順列を求めたいのです。
j=Nの時のd[v[j]][v[j+1]]のv[j+1]というのは3店舗目と4店舗目の距離です
94ポイント を手に入れた。
|
|
|
|
|
Name: matu ..ぴよぴよ(370ポイント)
Date: 2008/11/25(火) 10:51
No:24525
|
|
Title: Re:与えられた順列の距離から一番最短距離のみ表示する
|
|
すいません、まちがえました
/*距離(sum)をだしている*/
for(j=1;j<=N;j++) {
printf("%d ",v[j]);
sum +=d[v[j]][v[j+1]];
のforループは()中はfor(j=1;j<N;j++){
間違えました。すいません
}
5ポイント を手に入れた。
|
|
|
|
|
Name: non ..中級者(9,442ポイント)
Date: 2008/11/25(火) 10:55
No:24526
|
|
Title: Re:与えられた順列の距離から一番最短距離のみ表示する
|
|
> 実際はある出発地点を出発し最後はそこに戻ってくるというようにしたいんのですが、今はそのプログラム
> がわからないので4店舗間を回る最短距離とその順列を求めたいのです。
了解です。
> j=Nの時のd[v[j]][v[j+1]]のv[j+1]というのは3店舗目と4店舗目の距離です
>#define N 4
>int v[N+1]={0,8,7,13,24};
と宣言されていますから、j=Nのときv[4+1]すなわちv[5]になり、配列の範囲外です。
>2の部分はポインタを使うのですか?
ポインタでなくてもいいです。
min=a[0] のように配列でもOK
ただ、プログラムを読むと、すべて、permという1つの関数でやろうとしていますが、分けた方が
わかりやすいと思います。再帰呼び出しを使ったプログラムが書けるのですから、その心配はいらない
のかもしれませんけど・・・って、元になる再帰呼び出し部分は提供されたものなんでしょうか?
136ポイント を落としてしまった。
|
|
|
|
|
Name: matu ..ぴよぴよ(470ポイント)
Date: 2008/11/25(火) 11:07
No:24527
|
|
Title: Re:与えられた順列の距離から一番最短距離のみ表示する
|
|
返信ありがとうございます。
そうなんです。permという1つの関数でやっているので、分けたいのですが、
順列生成部分の再帰を使ったところは提供されたのものなので分け方がわかりません。
実際にはどうやってやればいいのでしょうか
100ポイント を手に入れた。
|
|
|
|
|
Name: non ..中級者(9,477ポイント)
Date: 2008/11/25(火) 11:49
No:24529
|
|
Title: Re:与えられた順列の距離から一番最短距離のみ表示する
|
|
配列pはまったく役に立っていないと思いますが、これは何の使用目的がありますか?
35ポイント を手に入れた。
|
|
|
|
|
Name: non ..中級者(9,997ポイント)
Date: 2008/11/25(火) 12:08
No:24530
|
|
Title: Re:与えられた順列の距離から一番最短距離のみ表示する
|
|
必要なさそうなものを省いて、わかりやすくしたつもりです。
配列dはグローバルにしました。おそらくファイルで提供されるだろうから、再帰呼び出しの中で
宣言しない方がいいと思います。
配列passに24通りの道順を入れることにしました。
距離の合計と最小を求める部分は書いていません。
#include <stdio.h>
#define MAX 61
#define N 4
#define nPr 24
int v[N+1]={0,8,7,13,24};
int d[MAX+1][MAX+1]={0}; //データ略
int pass[nPr][N+1];
void perm(int);
void wayPass(void);
int main(void)
{
int i;
perm(1);
/* この後、配列passの合計を求め、最小値を求める*/
return 0;
}
void wayPass(void)
{
static int no=0;
int i;
for(i=1;i<=N;i++)
pass[no][i]=v[i];
no++;
}
void perm(int i)
{
int j, t;
if (i < N) {
for (j = i; j <= N; j++) {
t = v[i]; v[i] =v[j]; v[j] = t ;
perm(i + 1);
t = v[i]; v[i] =v[j]; v[j] = t;
}
}
else
wayPass();
}
520ポイント を手に入れた。
|
|
|
|
|
Name: matu ..ぴよぴよ(486ポイント)
Date: 2008/11/25(火) 15:13
No:24534
|
|
Title: Re:与えられた順列の距離から一番最短距離のみ表示する
|
|
配列Pは意味ありませんでした。
配列passに24通りの道順はどうやって入れるのですか?
16ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..初心者(8,227ポイント)
Date: 2008/11/25(火) 17:38
No:24542
|
|
Title: Re:与えられた順列の距離から一番最短距離のみ表示する
|
|
分けて考えましょう。
@重複の無い4つの乱数の生成
A24通りの順列とそれぞれの距離の生成
B最短距離の判定(前に私がレスした奴です)
C出力
どれが出来てどれが出来ないのですか?
58ポイント を手に入れた。
|
|
|
|
|
Name: matu ..かけだし(1,125ポイント)
Date: 2008/11/25(火) 18:36
No:24543
|
|
Title: Re:与えられた順列の距離から一番最短距離のみ表示する
|
|
質問が下手ですいません、
どこのコードの部分に
A24通りの順列とそれぞれの距離の生成
/*距離(sum)をだしている*/
for(j=1;j<=N;j++) {
printf("%d ",v[j]);
sum +=d[v[j]][v[j+1]];
}
printf("%d",sum);
printf("\n");
さらにBC
<pre>
pass[nPr][N]は以下のようになっていると思います。そのうえで
pass[nPr][N]={8,7,13,24,sum},
{8,13,7,24,sum},
.
.
.
{ sum}};
最小値を求めるコード
int min,s,u,j;
for(u=0;u<nPr-1;u++){
min=pass[u][N];
s=u;
for(j=0;j<=23;j++){
if(min>pass[j][N]){
min=pass[j][N];
s=j;
}
}
t=pass[u][N];pass[u][N]=pass[s];pass[s]=pass[s]=t;
}
上のコードを最小値の判定の仕方。最小値の時の道順と最小値のみを出力の仕方がわかりません
639ポイント を手に入れた。
|
|
|
|
|
Name: matu ..かけだし(1,420ポイント)
Date: 2008/11/25(火) 18:42
No:24544
|
|
Title: Re:与えられた順列の距離から一番最短距離のみ表示する
|
|
すいません字下げとコードまちがえてました。
pass[nPr][N]は以下のようになっていると思います。そのうえで
pass[nPr][N]={8,7,13,24,sum}
{8,13,7,24,sum}
.
.
.
{ sum}};
最小値を求めるコード
int min,s,u,j;
for(u=0;u<nPr-1;u++){
min=pass[u][N];
s=u;
for(j=u;j<=23;j++){
if(min>pass[j][N]){
min=pass[j][N];
s=j;
}
}
t=pass[u][N];pass[u][N]=pass[s];pass[s]=pass[s]=t;
}
295ポイント を手に入れた。
|
|
|
|
|
Name: non ..中級者(10,259ポイント)
Date: 2008/11/25(火) 20:56
No:24549
|
|
Title: Re:与えられた順列の距離から一番最短距離のみ表示する
|
|
pass[nPr][N]には、まだ合計は入れてませんし、入れるための配列も用意していません。
0列目はmatuさんの、ほかの配列同様、未使用です。
ですから、合計を入れるなら、0列目を使って、={sum,8,7,13,24}のようにすればいいかもしれません。
するとAの部分は次のような関数になります。
void wayPass(void)
{
static int no=0;
int i;
for(i=1;i<=N;i++)
pass[no][i]=v[i];
pass[no][0]=0;
for(i=1;i<N;i++)
pass[no][0]+=d[v[i]][v[i+1]];
no++;
}
Bで、
>t=pass[u][N];pass[u][N]=pass[s];pass[s]=pass[s]=t;
は、何をやりたいのかわかりませんが?
262ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..中級者(9,129ポイント)
Date: 2008/11/25(火) 21:40
No:24552
|
|
Title: Re:与えられた順列の距離から一番最短距離のみ表示する
|
|
えーと
配列Passはint型の二次元配列ですよね?
とするとpass[u][N]=pass[s];とかpass[s]=pass[s]=t;はまずいと思うのですが…
とりあえず適当な0〜23の数をaとすると
pass[a][0]〜pass[a][3]は順番、pass[a][4]は距離の合計ですよね?
後、乱暴な話
#define INPUT_PERM(pass,a,b,c,d) #
do{ #
pass[0 ][0]=a;pass[0 ][1]=b;pass[0 ][2]=c;pass[0 ][3]=d; #
pass[1 ][0]=a;pass[1 ][1]=b;pass[1 ][2]=d;pass[1 ][3]=c; #
pass[2 ][0]=a;pass[2 ][1]=c;pass[2 ][2]=b;pass[2 ][3]=d; #
pass[3 ][0]=a;pass[3 ][1]=c;pass[3 ][2]=d;pass[3 ][3]=b; #
pass[4 ][0]=a;pass[4 ][1]=d;pass[4 ][2]=b;pass[4 ][3]=c; #
pass[5 ][0]=a;pass[5 ][1]=d;pass[5 ][2]=c;pass[5 ][3]=b; #
pass[6 ][0]=b;pass[6 ][1]=a;pass[6 ][2]=c;pass[6 ][3]=d; #
pass[7 ][0]=b;pass[7 ][1]=a;pass[7 ][2]=d;pass[7 ][3]=c; #
pass[8 ][0]=b;pass[8 ][1]=c;pass[8 ][2]=a;pass[8 ][3]=d; #
pass[9 ][0]=b;pass[9 ][1]=c;pass[9 ][2]=d;pass[9 ][3]=a; #
pass[10][0]=b;pass[10][1]=d;pass[10][2]=a;pass[10][3]=c; #
pass[11][0]=b;pass[11][1]=d;pass[11][2]=c;pass[11][3]=a; #
pass[12][0]=c;pass[12][1]=a;pass[12][2]=b;pass[12][3]=d; #
pass[13][0]=c;pass[13][1]=a;pass[13][2]=d;pass[13][3]=b; #
pass[14][0]=c;pass[14][1]=b;pass[14][2]=a;pass[14][3]=d; #
pass[15][0]=c;pass[15][1]=b;pass[15][2]=d;pass[15][3]=a; #
pass[16][0]=c;pass[16][1]=d;pass[16][2]=a;pass[16][3]=b; #
pass[17][0]=c;pass[17][1]=d;pass[17][2]=b;pass[17][3]=a; #
pass[18][0]=d;pass[18][1]=a;pass[18][2]=b;pass[18][3]=c; #
pass[19][0]=d;pass[19][1]=a;pass[19][2]=c;pass[19][3]=b; #
pass[20][0]=d;pass[20][1]=b;pass[20][2]=a;pass[20][3]=c; #
pass[21][0]=d;pass[21][1]=b;pass[21][2]=c;pass[21][3]=a; #
pass[22][0]=d;pass[22][1]=c;pass[22][2]=a;pass[22][3]=b; #
pass[23][0]=d;pass[23][1]=c;pass[23][2]=b;pass[23][3]=a; #
}while(0)
こういうのもありですね。
902ポイント を手に入れた。
|
|
|
|
|
Name: non ..中級者(10,279ポイント)
Date: 2008/11/25(火) 21:47
No:24555
|
|
Title: Re:与えられた順列の距離から一番最短距離のみ表示する
|
|
それは、ちょっと乱暴すぎるのでは。。。(^o^)
20ポイント を手に入れた。
|
|
|
|
|
Name: matu ..かけだし(1,637ポイント)
Date: 2008/11/25(火) 21:56
No:24556
|
|
Title: Re:与えられた順列の距離から一番最短距離のみ表示する
|
|
返信ありがとうございます。
void wayPass(void)
{
static int no=0;
int i;
for(i=1;i<=N;i++)
pass[no][i]=v[i];
pass[no][0]=0;
for(i=1;i<N;i++)
pass[no][0]+=d[v[i]][v[i+1]];
no++;
}
上のコードでpass[no][0]が道順の距離の総和になるのですよね!
Bの部分は考えた結果先ほどのは間違えで私は
for(j=0;j<=23;j++){
if(min>pass[j][0]){
min=pass[j][0]
}
}
printf("%d",min);
だと思うのですが・・・
217ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(130,168ポイント)
Date: 2008/11/25(火) 22:06
No:24557
|
|
Title: Re:与えられた順列の距離から一番最短距離のみ表示する
|
|
> だと思うのですが・・・
思ったら、人に聞くよりも前に、すぐやってみるべし。
27ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..中級者(10,018ポイント)
Date: 2008/11/25(火) 22:11
No:24558
|
|
Title: Re:与えられた順列の距離から一番最短距離のみ表示する
|
|
えっpass[a][0]が距離の総和なのですか?
ならば
#define INPUT_PERM(pass,a,b,c,d) #
do{ #
pass[0 ][1]=a;pass[0 ][2]=b;pass[0 ][3]=c;pass[0 ][4]=d; #
pass[1 ][1]=a;pass[1 ][2]=b;pass[1 ][3]=d;pass[1 ][4]=c; #
pass[2 ][1]=a;pass[2 ][2]=c;pass[2 ][3]=b;pass[2 ][4]=d; #
pass[3 ][1]=a;pass[3 ][2]=c;pass[3 ][3]=d;pass[3 ][4]=b; #
pass[4 ][1]=a;pass[4 ][2]=d;pass[4 ][3]=b;pass[4 ][4]=c; #
pass[5 ][1]=a;pass[5 ][2]=d;pass[5 ][3]=c;pass[5 ][4]=b; #
pass[6 ][1]=b;pass[6 ][2]=a;pass[6 ][3]=c;pass[6 ][4]=d; #
pass[7 ][1]=b;pass[7 ][2]=a;pass[7 ][3]=d;pass[7 ][4]=c; #
pass[8 ][1]=b;pass[8 ][2]=c;pass[8 ][3]=a;pass[8 ][4]=d; #
pass[9 ][1]=b;pass[9 ][2]=c;pass[9 ][3]=d;pass[9 ][4]=a; #
pass[10][1]=b;pass[10][2]=d;pass[10][3]=a;pass[10][4]=c; #
pass[11][1]=b;pass[11][2]=d;pass[11][3]=c;pass[11][4]=a; #
pass[12][1]=c;pass[12][2]=a;pass[12][3]=b;pass[12][4]=d; #
pass[13][1]=c;pass[13][2]=a;pass[13][3]=d;pass[13][4]=b; #
pass[14][1]=c;pass[14][2]=b;pass[14][3]=a;pass[14][4]=d; #
pass[15][1]=c;pass[15][2]=b;pass[15][3]=d;pass[15][4]=a; #
pass[16][1]=c;pass[16][2]=d;pass[16][3]=a;pass[16][4]=b; #
pass[17][1]=c;pass[17][2]=d;pass[17][3]=b;pass[17][4]=a; #
pass[18][1]=d;pass[18][2]=a;pass[18][3]=b;pass[18][4]=c; #
pass[19][1]=d;pass[19][2]=a;pass[19][3]=c;pass[19][4]=b; #
pass[20][1]=d;pass[20][2]=b;pass[20][3]=a;pass[20][4]=c; #
pass[21][1]=d;pass[21][2]=b;pass[21][3]=c;pass[21][4]=a; #
pass[22][1]=d;pass[22][2]=c;pass[22][3]=a;pass[22][4]=b; #
pass[23][1]=d;pass[23][2]=c;pass[23][3]=b;pass[23][4]=a; #
}while(0)
ですね、失礼しました。。。
889ポイント を手に入れた。
|
|
|
|
|
Name: matu ..かけだし(1,740ポイント)
Date: 2008/11/25(火) 22:18
No:24559
|
|
Title: Re:与えられた順列の距離から一番最短距離のみ表示する
|
|
lbfuvab box さん返信ありがとうございます。今は学校にいないのでできません明日すぐにやってみます。
あと本当に申し訳なのですがlbfuvab のコードですが、今の段階では4店舗ですが、今後は店舗を10店舗にしてやりたいと思っているので・・・・
お答えいただいたのに本当に申し訳ありません。
103ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(130,046ポイント)
Date: 2008/11/25(火) 22:29
No:24560
|
|
Title: Re:与えられた順列の距離から一番最短距離のみ表示する
|
|
> ある店が61店舗(店舗番号は1から61)ありその店から自分で4店舗ランダムに選び、その4店舗の順列(24通り)の距離を求め一番最短距離の順列と距離のみを出力
今さら何を?ということかもしれませんが、
問題空間を少し狭めて考えてみてはいかがでしょうか。
6〜7店舗くらいから3店舗を選び、その3店舗の順列(6とおり)の距離を求め…
という具合に。
狭い空間でじゅうぶんデバッグできたら、本来の問題空間に戻してやればよいと思います。
プログラムのロジックは問題空間の広さとは関係ないはずですので。
122ポイント を落としてしまった。
|
|
|
|
|
Name: non ..中級者(10,446ポイント)
Date: 2008/11/26(水) 08:44
No:24575
|
|
Title: Re:与えられた順列の距離から一番最短距離のみ表示する
|
|
>今の段階では4店舗ですが、今後は店舗を10店舗にしてやりたいと
#define N 4
#define nPr 24
が、
#define N 10
#define nPr 3628800
になるだけだと思いますが。
ただ、passの配列がそんなにでかくなるのなら、配列に入れなくて直接minだけ求めた方がいいかも。
3628800×11×4バイト/1024/1024=152.27メガバイト
167ポイント を手に入れた。
|
|
|
|
|
Name: matu ..かけだし(2,182ポイント)
Date: 2008/11/26(水) 11:46
No:24581
|
|
Title: Re:与えられた順列の距離から一番最短距離のみ表示する
|
|
最終的にはそうします!
でも今の段階では、まず、4店舗チャレンジさせてください。
今nonさんのを参考にさせていただいて、最小値(min)のみはだすことができました。
次はその時の道順も出したいのですが...わかりません。今のコードは以下のとおりです。
#include <stdio.h>
#define MAX 61
#define N 4
#define nPr 24
int v[N+1]={0,8,7,13,24};
int d[MAX+1][MAX+1]={省略}};
int pass[nPr][N+1];
void perm(int);
int min;
void wayPass(void);
int main(void)
{
int i,j;
perm(1);
min=10000;
for(j=0;j<=23;j++){
if(min>pass[j][0]){
min=pass[j][0];
}
}
printf("%d",min);
printf("\n");
return 0;
}
void wayPass(void)
{
static int no=0;
int i;
for(i=1;i<=N;i++)
pass[no][i]=v[i];
pass[no][0]=0;
for(i=1;i<=N;i++){
pass[no][0]+=d[v[i]][v[i+1]];
}
no++;
}
void perm(int i)
{
int j, t;
if (i < N) {
for (j = i; j <= N; j++) {
t = v[i]; v[i] =v[j]; v[j] = t ;
perm(i + 1);
t = v[i]; v[i] =v[j]; v[j] = t;
}
}
else
wayPass();
}
442ポイント を手に入れた。
|
|
|
|
|
Name: non ..中級者(10,720ポイント)
Date: 2008/11/26(水) 12:19
No:24582
|
|
Title: Re:与えられた順列の距離から一番最短距離のみ表示する
|
|
2つの関数を作ってみました。
違いがわかりますか?
int minPerm(void)
{
int min,j;
min=pass[0][0]; // 1個目を仮の最小値とする
for(j=1;j<nPr;j++){
if(min>pass[j][0])
min=pass[j][0];
}
return min;
}
int minPerm2(void)
{
int min,j;
min=0;
for(j=1;j<nPr;j++){
if(pass[min][0]>pass[j][0])
min=j;
}
return min;
}
int main(void)
{
int i,j;
perm(1);
printf("%d\n",minPerm());
printf("%d\n",pass[minPerm2()][0]);
return 0;
}
274ポイント を手に入れた。
|
|
|
|
|
Name: matu ..かけだし(2,224ポイント)
Date: 2008/11/26(水) 13:25
No:24587
|
|
Title: Re:与えられた順列の距離から一番最短距離のみ表示する
|
|
minPermが距離を求めている関数で
minPerm2が道順を求めている関数だと思います。
42ポイント を手に入れた。
|
|
|
|
|
Name: non ..中級者(10,905ポイント)
Date: 2008/11/26(水) 13:45
No:24591
|
|
Title: Re:与えられた順列の距離から一番最短距離のみ表示する
|
|
>minPerm2が道順を求めている関数だと思います。
距離が最小となる配列の添え字番号(Index)を求めています。
では、あとは表示する関数を作れるでしょう。
55ポイント を手に入れた。
|
|
|
|
Name: 初心者 ..上級者(15,059ポイント)
Date: 2008/11/26(水) 12:55
No:24583
|
|
Title: フィボナッチ数列
|
|
フィボナッチ数を次の手順で求めるプログラムを作成せよ。
再帰関数 int fib(int n)を定義し,再帰呼出しによりfib(n)の値を求める。
こちらも,n=30までのフィボナッチ数を求めて表示せよ。
で下のようにつくりました。コンパイルはできましたが
実行すると
第何項までのフィボナッチ数? n=30
Segmentation fault (core dumped)
のようにでてきてmもとめられません。
やはりf0=0とf1=1を定義しないとできないのでしょうか?
教えてください
#include <stdio.h>
int fib(int);
main()
{
int n, i ,f;
printf("第何項までのフィボナッチ数? n=");
scanf("%d",&n);
for(i=2; i<=n; i++)
{
f=fib(n);
printf("F%d = %d\n",n, fib);
}
}
fib(int n)
{
int f;
f=fib(n-1)+fib(n-2);
}
338ポイント を落としてしまった。
|
|
|
|
Name: Mist ..プログラマー(33,315ポイント)
Date: 2008/11/26(水) 13:03
No:24584
|
|
Title: Re:フィボナッチ数列
|
|
コンパイル時にワーニングが出ていませんか?
おかしなところがいくつかあります。
> f=fib(n);
fib関数の戻り値を誰も使っていない。
> printf("F%d = %d\n",n, fib);
この場合、2個目の%dに出力される値はfib関数のアドレスになっちゃうけどそれで正しいの?
> fib関数
戻り値(return)がない。
この関数には、終わる(再帰呼び出ししない)ための条件がないから永久に再帰呼び出しを行ってダウンする。
Segmentation fault (core dumped)なるのはこのため。
187ポイント を手に入れた。
|
|
|
|
|
Name: non ..中級者(10,749ポイント)
Date: 2008/11/26(水) 13:08
No:24586
|
|
Title: Re:フィボナッチ数列
|
|
>やはりf0=0とf1=1を定義しないとできないのでしょうか?
定義しないとできません。
29ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(15,172ポイント)
Date: 2008/11/26(水) 13:29
No:24588
|
|
Title: Re:フィボナッチ数列
|
|
参考に作り替えてみましたが全くだめでした
こんどは実行したら
F30 = -1209225228
が30個表示されるようになってしまいました。
どうすればいいですか。
再帰関数を習ったばかりでよく理解できていないかもしれません。
#include <stdio.h>
int fib(int);
int main()
{
int n, i ,f;
printf("第何項までのフィボナッチ数? n=");
scanf("%d",&n);
for(i=0; i<=n; i++)
printf("F%d = %d\n",n, f);
}
fib(int n)
{
if(n=0) return 0;
int f;
f=fib(n-1)+fib(n-2);
return;
}
113ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(15,219ポイント)
Date: 2008/11/26(水) 13:35
No:24589
|
|
Title: Re:フィボナッチ数列
|
|
> >やはりf0=0とf1=1を定義しないとできないのでしょうか?
>
> 定義しないとできません。
どこにどのように定義すればいいのですか?
関数内にf0=0; f1=1;をいれたのですが
エラーでinvalid lvalue in assignmentの様に表示されるようになってしまったのですが
47ポイント を手に入れた。
|
|
|
|
|
Name: non ..中級者(10,850ポイント)
Date: 2008/11/26(水) 13:42
No:24590
|
|
Title: Re:フィボナッチ数列
|
|
>どこにどのように定義すればいいのですか?
>if(n=0) return 0;
この部分がf0を定義したことになります。
同様にf1も定義します。
(ただし、等しい時は == です)
でも、再帰呼び出しどころか、あまりにもC言語の理解が乏しいようです。
Mistさんや、管理人さんが言われたことをもう一度チェックしてください。
101ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(15,473ポイント)
Date: 2008/11/26(水) 14:16
No:24594
|
|
Title: Re:フィボナッチ数列
|
|
>if(n=0) return 0;
この部分がf0を定義したことになります。
同様にf1も定義します。
まだプログラミングをはじめて2ヶ月ぐらいですのでもう一度復習がてらチェックしてみようと思います。
あと
#include <stdio.h>
int fib(int);
int main()
{
int n, i, f;
printf("第何項までのフィボナッチ数? n=");
scanf("%d",&n);
for(i=0; i<=n; i++)
{
f=fib(n);
printf("F%d = %d\n",n,f);
}
}
fib(int n)
{
if(n=0) return 0;
if(n=1) return 1;
int f;
f=fib(n-1)+fib(n-2);
return(f);
}
にすると
F30 = 1
F30 = 1
F30 = 1
F30 = 1
が続きます
F0からF30までを表示できるようにするにはどうすればいいですか。
どうやってもうまくいかないので
254ポイント を手に入れた。
|
|
|
|
|
Name: mats ..ぴよぴよ(677ポイント)
Date: 2008/11/26(水) 14:44
No:24598
|
|
Title: Re:フィボナッチ数列
|
|
for文でiをインクリメントしているのに
f = fib(n);
では、毎回同じ計算をしてしまいます。
f = fib(i);
として、さらにprintfの中でもnではなくiを表示させないといけません。
95ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(899,373ポイント)
Date: 2008/11/26(水) 15:44
No:24605
|
|
Title: Re:フィボナッチ数列
|
|
手当たり次第変更してみるのではなく、何故そうなるのか、
そう書くとどういう振る舞いになるのかをしっかり考えて書いて行ってみましょう。
また、自分の実力では手に負えそうにない問題は、まず分解して考える事が大事です。
・数値を入力して表示するだけのプログラム
・n項のフィボナッチ数列の値を表示するプログラム
これを作った後、これらをくっつけて、課題を完成させるなど。
for文の回し方がわからないなら、まずn項だけ表示させてみるなど、わかるところから完成させてみましょう。
そうしないと、どこがおかしいのかわからなくなってしまいます。
また、最初のうちは、プログラムに注釈を書きながら作っていくとよいと思います。
回答するほうも、どこまでわかっているかが明確に解りますから、適確なアドバイスが出来ます。
例
/* 入出力関係の標準ライブラリ stdio.h をインクルードする */
#include <stdio.h>
/* プロトタイプ宣言 */
/* 引数により指定されたのフィボナッチ数列の項の値を求める関数 */
int fib(int n);
/* メイン関数 */
int main()
{
/* n : 計算するフィボナッチ数列の項を格納する為の int 型変数 */
int n;
/* i : for 文でループ回数をカウントする為の int 型変数 */
int i;
/* f : 計算したフィボナッチ数列の値を格納する為の int 型変数 */
int f;
/* キーボード入力を促すための説明を表示 */
printf("第何項までのフィボナッチ数? n=");
/* 変数 n に、キーボード入力された計算するフィボナッチ数列の項を格納 */
scanf("%d",&n);
/* フィボナッチ数列を項 0 から n までループして計算する */
/* 計算される回数は n+1 回であることに注意 */
for(i=0; i<=n; i++)
....(略)
}
/*****************************************************************/
/* 関数名とフォーマット */
/* int fib(int n) */
/* 概要 */
/* 引数により指定されたのフィボナッチ数列の項の値を求める */
/* 引数 */
/* n : 計算するフィボナッチ数列の項 */
/* 関数値 */
/* -1 : 異常終了 */
/* 自然数 : 引数 n が示す項の値 */
/* 補足 */
/* この関数は再帰関数で表現している。 */
/* 40項以上ほどになると計算に非常に時間がかかるので注意 */
/*****************************************************************/
int fib(int n){
...(略)
}
1,238ポイント を手に入れた。
|
|
|
|
Name: しょしょしょしんしゃ ..初心者(6,484ポイント)
Date: 2008/11/25(火) 01:51
No:24515
|
|
Title: 無題
|
|
すみません
質問です
外部から2つの2次元平面上の点の座標を与えた時、
その2点を通る直線の方程式を求める関数の作成。
2次元平面上の点は
typedef struct point2{
float x;
float y;
}POINT2
を用いて表すこと。
関数名および引数は各自に決めてよい。
なお直線が座標軸と平行になるときも正しい方程式が
得られるようにする。
というものです 自分なりに考えましたが、
上手く ビルトできませんでした
どこが 間違っていますか?
#include <stdio.h>
typedef struct{
double x;
double y;
}POINT;
typedef struct{
double a;
double b;
double c;
}LINE;
int getline(LINE *cf,POINT p,POINT q){
int md;
double eps=1.e-8;
double dx,dy;
double a,b;
dx=q.x-p.x;
dy=q.y-p.y;
md=0;
if(fabs(dy)>eps) md+=1;
if(fabs(dy)>eps) md+=2;
cf>a=cf>b=cf>c=0;
switch(md){
case 0:
break;
case 1
cf>a=1;
cf>c=p.x;
break;
case 2:
cf>b=1;cf>c=p.y;
break;
case 3:
a=dy/dx;
b=p.y a*p.x;
f(fabs(b)>eps){
cf>a=-a;
cf>b=1.;
cf>c=0.;
}else{
cf>a=a/b;
cf>b=1./b;
cf>c=1.;
}
break;
default:
printf("illegal case;md=%d\n",md);
}
return md;
}
int main(){
POINT p,q;
LINE cf;
double x,y;
int md;
do
printf("点1の座標=");
scanf("%lf%lf",&x,&y);
p.x=x;
p.y=y;
printf("点2の座標=");
scanf("%lf%lf",&x,&y);
q.x=x;
q.y=y;
md=getline(&cf,p,q);
printf("直線の方程式:ax+by_=c\n");
printf("[md=%d]係数:a=%f,b=%f,c=%f\n",md,cf.a,cf.b,cf.c);
}while(md>0);
printf("終了\n");
return 0;
}
たぶん 間違いは多いと思われます よろしくお願いします
823ポイント を手に入れた。
|
|
|
|
Name: rom ..ぴよぴよ(122ポイント)
Date: 2008/11/25(火) 02:24
No:24517
|
|
Title: Re:無題
|
|
・トピックにはわかりやすい名前を付けましょう
・コードはきちんと字下げしましょう
・コンパイルエラーが出たならどんなエラーが出たか書きましょう
・あきらかに間違いとわかる構文ミスや括弧記載ミス位直して投稿しましょう
103ポイント を手に入れた。
|
|
|
|
|
Name: しょしょしょしんしゃ ..初心者(6,865ポイント)
Date: 2008/11/25(火) 02:42
No:24518
|
|
Title: Re:2次元平面上のプログラミング
|
|
すみません
訂正版です
#include <stdio.h>
#include <math.h>
typedef struct{
double x;
double y;
}POINT;
typedef struct{
double a;
double b;
double c;
}LINE;
int getline(LINE *cf,POINT p,POINT q){
int md;
double eps=1.e-8;
double dx,dy;
double a,b;
dx=q.x-p.x;
dy=q.y-p.y;
md=0;
if(fabs(dy)>eps) md+=1;
if(fabs(dy)>eps) md+=2;
cf->a = cf->b = cf->c = 0;
switch(md){
case 0:
break;
case 1:
cf->a=1;
cf->c=p.x;
break;
case 2:
cf->b=1;
c f->c=p.y;
break;
case 3:
a=dy/dx;
b=p.y-a*p.x;
if(fabs(b)>eps){
cf->a=-a;
cf->b=1.;
cf->c=0.;
}else{
cf->a=a/b;
cf->b=1./b;
cf->c=1.;
}
break;
default:
printf("illegal case;md=%d\n",md);
}
return md;
}
int main(){
POINT p,q;
LINE cf;
double x,y;
int md;
printf("aのx座標=");
scanf("%f",&x);
printf("aのy座標=");
scanf("%f",&y);
p.x=x;
p.y=y;
printf("bのx座標=");
scanf("%f",&x);
printf("bのy座標=");
scanf("%f",&y);
q.x=x;
q.y=y;
md=getline(&cf,p,q);
if(p.x==q.x && p.y==q.y){
printf("直線の方程式はたくさんあります\n");
}else if(p.x==q.x){
printf("直線の方程式:x=%f\n",cf.a);
}else if(p.y==q.y){
printf("直線の方程式:y=%f\n",cf.b);
}else{
printf("直線の方程式:%fx+%fy=%f\n",cf.a,cf.b,cf.c);
}
return 0;
}
エラーはでませんでしたが、うまく実行できませんでした。
たぶん
else if(p.x==q.x){
printf("直線の方程式:x=%f\n",cf.a);
}else if(p.y==q.y){
printf("直線の方程式:y=%f\n",cf.b);
の部分に間違いがありそうです
381ポイント を手に入れた。
|
|
|
|
|
Name: non ..中級者(9,474ポイント)
Date: 2008/11/25(火) 08:50
No:24520
|
|
Title: Re:2次元平面上のプログラミング
|
|
>printf("直線の方程式:ax+by_=c\n");
なぜ、直線の方程式をこのように出力しなければいけないのですか?
一般的には y=ax+b だと思いますが。
>double eps=1.e-8;
これは、課題で与えられたものですか?
>md=getline(&cf,p,q);
mdも課題で与えられていますか?
100ポイント を手に入れた。
|
|
|
|
|
Name: non ..中級者(9,578ポイント)
Date: 2008/11/25(火) 09:55
No:24523
|
|
Title: Re:無題
|
|
y=ax+b なら、a,bは一意的に決まりますが、
ax+by=c は、a,b,cの解の組み合わせは無限に存在します。
a,b,cが最小の整数という条件があれば別ですが。a,b,cはfloatのようですし、
条件を与えるべきではありませんか?
69ポイント を手に入れた。
|
|
|
|
|
Name: しょしょしょしんしゃ ..初心者(7,007ポイント)
Date: 2008/11/25(火) 12:14
No:24532
|
|
Title: Re:無題
|
|
すみません
問題からしっかり直します。
外部から2つの2次元平面上の点の座標を与えた時、
その2点を通る直線の方程式を求める関数の作成。
なお直線が座標軸と平行になるときも正しい方程式が
得られるようにする。
というもので やはり #deine を使用した方がいいのでしょうか?
142ポイント を手に入れた。
|
|
|
|
|
Name: YuO ..プログラマー(25,030ポイント)
Date: 2008/11/25(火) 16:36
No:24538
|
|
Title: Re:無題
|
|
> y=ax+b なら、a,bは一意的に決まりますが、
> ax+by=c は、a,b,cの解の組み合わせは無限に存在します。
2次元における直線の式はax + by = cであって,y = ax + bではありません。
後者では,直線x = 0を表現出来ませんから。
そもそも,問題中に,
> なお直線が座標軸と平行になるときも正しい方程式が
> 得られるようにする。
とあるので,y = ax + bという式では,題意を満たしません。
> というもので やはり #deine を使用した方がいいのでしょうか?
#defineは関係ないです。
> うまく実行できませんでした。
「うまくいかない」といったような表現は,技術系掲示板において,何も書いていないのと同じです。
・入力した値
・予想した結果,できたら「なぜそう予想したのか」もあるとなお良いです
・実際の結果
を具体的に示して下さい。
回答する側もエスパーではないので,「予想した結果」がわからず,答えようが無くなります。
243ポイント を落としてしまった。
|
|
|
|
|
Name: しょしょしょしんしゃ ..初心者(7,545ポイント)
Date: 2008/11/26(水) 01:01
No:24569
|
|
Title: Re:無題
|
|
すみません やはり 考え直しました。
以前のやり方では 自分で考えていませんでしたので
全く分かりませんでしたが もう1度作り直すと
このように 短く終え、
エラーは無く 上手く 実行できました。
何か 工夫するところはありませんか?
あれば 是非 指摘してください。
#include <stdio.h>
#include <math.h>
typedef struct point2{
float x;
float y;
}POINT2;
void POINT2_polar_form(POINT2 a,POINT2 b){
}POINT2;
#define SLOPE(pt1,pt2,pt3,pt4) ((pt3)-(pt4))/((pt1)-(pt2));
#define INTERCEPT(pt1,pt2,pt3,pt4) ((pt3)-((pt3)-(pt4))/((pt1)-(pt2))*(pt1));
int main(void){
float c,d,e,f,g,h;
printf("aのx座標=");
scanf("%f",&c);
printf("aのy座標=");
scanf("%f",&d);
POINT2 a={c,d};
printf("bのx座標=");
scanf("%f",&e);
printf("bのy座標=");
scanf("%f",&f);
POINT2 b={e,f};
g=SLOPE(a.x,b.x,a.y,b.y);
h=INTERCEPT(a.x,b.x,a.y,b.y);
if(a.x==b.x && a.y==b.y){
printf("2点が同じ点なのでたくさんあります\n");
}else if(a.x==b.x){
printf("x=%f\n",a.x);
}else if(a.y==b.y){
printf("y=%f\n",a.y);
}else{
printf("y=%fx%+f\n",g, h);
}
return 0;
}
>・入力した値
a.x=c=1 a.y=d=2 b.x=e=3 b.y=f=4 ....@
もしくは a.x=c=1 a.y=d=2 b.x=e=1 b.y=f=4 ....A
あるいは a.x=c=1 a.y=d=2 b.x=e=1 b.y=f=2 ....B
>・予想した結果,できたら「なぜそう予想したのか」もあるとなお良いです
@y=x+1
Ax=1 にずっと続く
B無限
//普通に考えた、計算したところ このような予想になります。
>・実際の結果
@y=1.0000x+1.0000
Ax=1.0000
B2点が同じ点なのでたくさんあります
//予想と同じでした。
>を具体的に示して下さい。
このようで いいですか?
538ポイント を手に入れた。
|
|
|
|
|
Name: YuO ..プログラマー(25,451ポイント)
Date: 2008/11/26(水) 04:32
No:24573
|
|
Title: Re:無題
|
|
> 何か 工夫するところはありませんか?
ざっと見た感じだと,
・POINT2_polar_formのまわりがおかしい (コピペミス?)
・SLOPE,INTERCEPTともに0除算の可能性
# 0除算は未定義動作
g, hともに使うのはy = ax + bの形になる場合のみですから,その場合にのみSLOPEやINTERCEPTを呼び出せばよいです。
あと,標準CまたはC++のようですから,関数形式マクロをやめてinline関数にする方が,副作用等の問題もなく良いかと思います。
>>を具体的に示して下さい。
>このようで いいですか?
よいです。
今回の場合,予想した結果と実際の結果が等しかったので,「望むべき動作が得られた」と言えるわけです。
# 未定義動作が隠れてしまうわけですが,それは仕方がないです。
異なっていた場合,回答者はそれを手がかりに「間違いであろう箇所」の指摘ができますし,
掲示板に書く前にこれをまとめることで,掲示板に質問するより先にバグを見つけることができるかもしれません。
「予想と異なる場所」を小さくしていくと,最終的にバグに突き当たりますから。
421ポイント を手に入れた。
|
|
|
|
|
Name: フリオ ..プログラマー(28,443ポイント)
Date: 2008/11/26(水) 08:35
No:24574
|
|
Title: Re:無題
|
|
> #define SLOPE(pt1,pt2,pt3,pt4) ((pt3)-(pt4))/((pt1)-(pt2));
> #define INTERCEPT(pt1,pt2,pt3,pt4) ((pt3)-((pt3)-(pt4))/((pt1)-(pt2))*(pt1));
思ったことを少し、
どうして、構造体のメンバをばらばらにして渡しているのでしょうか。
構造体で渡した方がすっきりすると思います。
解釈によるかもしれませんが、この課題は"SLOPE"と"INTERCEPT"をまとめた
直線の式を求める関数またはマクロを要求しているのではないでしょうか。
先の回答で言われているように、この方法だと"x == a(aは定数)"の場合は、
別に対応しなければいけないので、
"直線が座標軸と平行になるときも正しい方程式が得られるようにする。"
という条件に反するのではないでしょうか。
130ポイント を手に入れた。
|
|
|
|
|
Name: しょしょしょしんしゃ ..初心者(7,753ポイント)
Date: 2008/11/26(水) 10:28
No:24576
|
|
Title: Re:無題
|
|
>どうして、構造体のメンバをばらばらにして渡しているのでしょうか。
構造体で渡した方がすっきりすると思います。
私もそう思いました。
何度も方法を見つけましたが
<pre>
#define SLOPE(pt1,pt2) (pt1.y-pt2.y)/(pt1.x-pt2.x)
#define INTERCEPT(pt1,pt2) (pt1.y-SLOPE(pt1,pt2)*pt1.x)
とやっておいて、
POINT2 p1, p2;
printf("y=%fx%+f\n",SLOPE(p1,p2), INTERCEPT(p1,p2));
<pre>
で実行しようとすると
うまくまとめれませんでした。
すっきりときれいに並べるいい方法を教えてください。
208ポイント を手に入れた。
|
|
|
|
Name: 紅葉 ..初心者(6,362ポイント)
Date: 2008/11/24(月) 02:04
No:24490
|
|
Title: メッシュの傾きに応じて落ちる
|
|
BallMove関数でボールの制御をしています。
床とあたっていたらそれより上にボールのy座標を置く
ということをしたいです。
ただこの関数では床の傾きに応じては進んでくれません・・・
床が傾いてもその上に常にボールがあるようにするには
使用しているGs_CheckHeight関数をどのように拡張すればいいのでしょうか?
128ポイント を手に入れた。
|
|
|
|
Name: Justy ..ハッカー(272,886ポイント)
Date: 2008/11/24(月) 21:50
No:24500
|
|
Title: Re:メッシュの傾きに応じて落ちる
|
|
>床が傾いてもその上に常にボールがあるようにするには
>使用しているGs_CheckHeight関数をどのように拡張すればいいのでしょうか?
つまり、今予定と違う挙動をしており、その原因が Gs_CheckHeight()にある、
と考えているわけですね?
では Gs_CheckHeight()の仕様をできるだけ具体的に詳しく書いてみて下さい。
特に内部的にどういうパラメータを使って何を調べて、結果最終的に何を返す関数
なのかについても書いてみて下さい。
多分それでどう直せばいいのか方向はつかめるはずです。
116ポイント を手に入れた。
|
|
|
|
|
Name: 紅葉 ..初心者(6,720ポイント)
Date: 2008/11/25(火) 00:46
No:24511
|
|
Title: Re:メッシュの傾きに応じて落ちる
|
|
指定したメッシュの上に物体があったらそれより上に物体を置くような戻り値
を返す関数です。
Gs_CheckHeightの最後の行に傾きもかけ合わせられるようにしたいのですが
掛け方がわからないので質問させていただきました・・・
D3DXIntersectというDirectXにある関数については
物体から直線?みたいなものを出してメッシュと当たっているかを判定しています。
一応、素人なりにこの関数を解析しましたができませんでした><
void CheckHeight(LPD3DXMESH lpMesh,D3DXVECTOR3 *pVec)
{
D3DXVECTOR3 ray;
BOOL isHit=FALSE;
DWORD faceCnt;
float u,v,dist;
LPD3DXBUFFER xBuf;
DWORD hitCnt;
ray=*pVec;
// ray.y+=1.0f;
ray.y+=4.0f;
// D3DXIntersect(lpMesh,&ray,&D3DXVECTOR3(0.0f,-1.0f,0.0f),&isHit,
// &faceCnt,&u,&v,&dist,&xBuf,&hitCnt);
D3DXIntersect(lpMesh,&ray,&D3DXVECTOR3(0.0f,-1.0f-0.090f,0.0f),&isHit,
&faceCnt,&u,&v,&dist,&xBuf,&hitCnt);
if(isHit) xBuf->Release();
if(isHit) pVec->y=ray.y-dist;
}
float Gs_CheckHeight(GsMESH id,float x,float y, float z)
{
D3DXVECTOR3 vec = D3DXVECTOR3(x,y,z);
CheckHeight(GsMeshHang[id].lpMesh,&vec);
return(F(vec.y));
}
358ポイント を手に入れた。
|
|
|
|
|
Name: 紅葉 ..初心者(6,850ポイント)
Date: 2008/11/25(火) 00:57
No:24513
|
|
Title: Re:メッシュの傾きに応じて落ちる
|
|
一応テストで書いてみたものをあげておきます。
間違えていますがここで投げだした質問ではないことを
分かっていただけますと助かります。
float Gs_CheckHeight2(GsMESH id,D3DXMATRIX m,float x,float y, float z)
{
D3DXVECTOR3 vec = D3DXVECTOR3(x,y,z);
CheckHeight(GsMeshHang[id].lpMesh,&vec);
D3DXVec3TransformNormal(&vec,&vec,&m);
return(F(vec.y));
}
130ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(274,566ポイント)
Date: 2008/11/25(火) 01:47
No:24514
|
|
Title: Re:メッシュの傾きに応じて落ちる
|
|
>一応、素人なりにこの関数を解析しましたができませんでした
つまり、挙動がわからない怪しい関数を使っていると?(w
>一応テストで書いてみたものをあげておきます
おっと、少し前進しました。
少し合ってます。
>Gs_CheckHeightの最後の行に傾きもかけ合わせられるようにしたいのですが
>掛け方がわからないので質問させていただきました・・・
D3DXIntersect()は端的に言えば、メッシュとレイ(点とそこからのベクトル)の
コリジョンを調べるものです。
た・だ・し。
この関数はローカル座標系でしか判定しません。
つまり、グローバル座標系では移動していたり回転していたりする箱メッシュも
移動も回転もスケーリングもしていないローカル座標系のメッシュでしか
判定しません
次に、レイの方ですが、こちらは判定に必要な情報として点とベクトルの2つがあります。
(D3DXIntersect()の第二・第三引数)
点の方は引数で指定しているようですが、ではベクトルは? というと
何故か [0,-1.09,0]固定になっています。
下向きなのは何となくわかるのですが、-1.09という数値がどこから来たものなのか
検討もつきません。
少なくともこの関数はローカル座標での判定をするもの、ということはレイ情報にしても
メッシュから見た座標系……メッシュのローカル座標系で考える必要があります。
従って、この Gs_CheckHeight()のインターフェースとしては真っ先に
行列を指定できるようにするべきでしょう。
って、 Gs_CheckHeight2()の方はしてありますね。
で、引数として与えられたグローバル座標系のレイの位置と下向きのベクトルを
同じく引数として与えられた箱の行列の“逆行列”を求めて、
レイの位置とベクトルをそれぞれ変換します。
これで、箱のローカル座標系におけるレイ情報が求まりますので、
それを D3DXIntersect()にかけます。
ここで接触している、と出たら交点に関する情報を返すことになるのですが、
少なくとも接触したかどうかの情報が必要になるので、Gs_CheckHeight()の戻り値は
bool型であった方がいいでしょう。
接触した場合、この交点はやっぱりあくまでローカル座標系のものなので、
最初に引数として与えられた行列を掛けてさっきとは逆にローカル座標系から
グローバル座標系に直します。
って、 Gs_CheckHeight2()の方はしてあ……るようですが D3DXVec3TransformNormal()ではなく、D3DXVec3TransformCoord()ではないでしょうか。
実際のところ回転だけなら D3DXVec3TransformNormal()でもいいのかもしれませんが。
後はこの交点を呼び出し元に戻せるように引数にポインタか参照を追加すれば、
この関数の機能としては十分でしょう。
と、ここまでいろいろ書きましたが、多分オリジナルの Gs_CheckHeight()と CheckHeight()の
処理内容を半分くらいは理解しないと、この内容を理解および実践できるかどうか疑問です。
まずはオリジナルの挙動、特に D3DXIntersect()について徹底的に調べてから、
周辺の挙動を追った上で修正に臨んだ方がいいかと思います。
ちなみに床の上にボールを置くためには、どこかで妥協すれば別ですが
Gs_CheckHeight()を直しても今度はその使い方も正しく修正した上で、
移動処理の方法を仕様に合わせて少し見直さないと、最終的に正しく動かないような
気がします。
なので、この関数を直しても見た目はまだおかしなままであることにご注意下さい。
2倍のポイントを手に入れた! 1,680ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(274,453ポイント)
Date: 2008/11/25(火) 02:00
No:24516
|
|
Title: Re:メッシュの傾きに応じて落ちる
|
|
実際のところ、球とメッシュのコリジョン判定をしているわけではないので、
レイを飛ばす方向がグローバル座標系において真下じゃない方がいいような気がします。
一応引数でレイのベクトルも指定できるようにしておいた方がいいと思います。
あと、引数の x, y, zなところは const VEC3&としてしまった方が楽ですよ。
113ポイント を落としてしまった。
|
|
|
|
|
Name: 紅葉 ..初心者(6,895ポイント)
Date: 2008/11/25(火) 04:56
No:24519
|
|
Title: Re:メッシュの傾きに応じて落ちる
|
|
調べていたらこんな時間になってしましましたw
いろいろ調べて挑戦してみたのですが
ここが限界です・・・
できれば戻り値は当たっているかどうかではなくY座標の移動量を返したいです><
float Gs_CheckHeight2(GsMESH id,D3DXMATRIX m,float x,float y, float z)
{
D3DXMATRIX pOutM;
D3DXVECTOR3 vec = D3DXVECTOR3(x,y,z);
D3DXMatrixInverse(&pOutM, NULL, &m); // 逆行列
D3DXVec3TransformNormal(&vec,&vec,&pOutM);
CheckHeight(GsMeshHang[id].lpMesh,&vec);
return(F(vec.y));
}
具体的な修正案を書いていただけますと助かります><
すいませんが、本日も仕事がありますので寝ますw
遅くまでありがとうございます。
45ポイント を手に入れた。
|
|
|
|
|
Name: 紅葉 ..初心者(7,047ポイント)
Date: 2008/11/25(火) 17:15
No:24539
|
|
Title: Re:メッシュの傾きに応じて落ちる
|
|
const VEC3&はこれができてから実装します><
これならやり方はわかりますw
あととりあえず1面だけでいいのでその向きに移動させたいです。
以前作った添付したものではY座標がおかしかったので><
傾きのほうに進むのですが落ちて行ってしまいます。
もし以前のものでもできるのでしたら
上記ではなく添付したものの修正案を教えていただけないでしょうか?
今夜中に作成できると助かるのですがJustyさんもお忙しい身だと思いますので
お時間があるときにご教授してください><
152ポイント を手に入れた。
|
|
|
|
|
Name: 紅葉 ..初心者(7,365ポイント)
Date: 2008/11/25(火) 21:45
No:24554
|
|
Title: 無題
|
|
Justyさん
どうか代わりに今回だけもう一度やっていただけないでしょうか?
とりあえず一面が転がっているように見えるだけで構いません。
どうかお願いします><
調べて見ましたが、どうしてもできません。
次からは一から自分でやりますのでお願いします。
と言いますか一からDirectXについて勉強してみたいと思います。
理解できるようになったらこの掲示板に戻ってきて恩返し?的なことをしたいですww
同人の方もPGが音信不通気味になってきました。
私の仕事は残り3つ(これを含め)ですのですべて終わりましたら
抜けようかと思います。
残りの課題は自分でどうにかします。
よろしくお願いします。
146ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(275,025ポイント)
Date: 2008/11/26(水) 00:26
No:24562
|
|
Title: Re:無題
|
|
>どうか代わりに今回だけもう一度やっていただけないでしょうか?
正直どうしようか迷いました。
ここは製作依頼版ではないですし、それは質問ですらありません。
しかし、全くやる気がないわけでもなく、次からは一から自分でやる、と
仰っているので、それを信じることにします。
ttp://toku.xdisc.net/cgi/up/ttt/nm5584.zip.html
zip pass : asdfghjkl
望んだ形になっているかどうかはわかりませんが、一応転がっています。
仮に望んだ形でなくても、動作を解析し理解すれば修正できるでしょう。
一応解説しておきますと、ボールは常に落下させるようにし、
箱にめり込んだことを検知したら、めり込んだ分を
押し戻すことで箱の上に載るように調整しています。
肝は追加した関数 Gs_CheckIntersect()です。
これで交点を求めています。
後は頑張って下さい。
>一からDirectXについて勉強してみたいと思います
是非そうして下さい。
2倍のポイントを手に入れた! 572ポイント を手に入れた。
|
|
|
|
|
Name: 紅葉 ..初心者(7,386ポイント)
Date: 2008/11/26(水) 00:46
No:24565
| 解決!
|
Title: Re:無題
|
|
ありがとうございます><
近いうちに必ず戻ってきます。
私でも答えられそうな質問でしたらこれからも答えれるように努力します。
今までありがとうございました。
21ポイント を手に入れた。
|
|
|
|
Name: 自尊心 ..ぴよぴよ(173ポイント)
Date: 2008/11/25(火) 20:59
No:24550
|
|
Title: C言語:ループ中のシグナルについて
|
|
初投稿で、プログラミングの初心者です。
内容や態度についておかしな点がありましたら、指摘してください。
内容ですが、
ループを回している最中に SIGINT のシグナルを送り、ハンドラでフラグを立て、それによってループを抜けるようにしているのですが、ループが高速な為か、シグナルを受け取る際にループカウンタが進みすぎてしまうことがあります。
これに対する対策等はあるのでしょうか?
173ポイント を手に入れた。
|
|
|
|
Name: 紅葉 ..初心者(7,219ポイント)
Date: 2008/11/25(火) 21:32
No:24551
|
|
Title: Re:C言語:ループ中のシグナルについて
|
|
素人の意見で申し訳ないのですが
Sleep関数を使ってほんの少しでも遅らせてみてはどうでしょうか?
40ポイント を手に入れた。
|
|
|
|
|
Name: 自尊心 ..ぴよぴよ(257ポイント)
Date: 2008/11/25(火) 21:41
No:24553
|
|
Title: Re:C言語:ループ中のシグナルについて
|
|
回答ありがとうございます。
しかし、ループをかなりの回数回す(10000以上)を想定しているので、できれば遅らせるようなことはしたくないのです。
他に方法はないでしょうか?
84ポイント を手に入れた。
|
|
|
|
Name: うい ..ぴよぴよ(681ポイント)
Date: 2008/11/22(土) 17:32
No:24443
|
|
Title: 説明の説明を希望
|
|
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されると終了
の、下の説明について、どうしてこうなるか教えててください。
また、ゲーム中キャラを動かす時には毎回必要な文字なのでしょうか?
181ポイント を手に入れた。
|
|
|
|
Name: バグ ..ハッカー(126,603ポイント)
Date: 2008/11/22(土) 18:10
No:24446
|
|
Title: Re:説明の説明を希望
|
|
ProcessMessage … Windowsプログラムに必要なメッセージ処理を行う
ClearDrawScreen … 画面のグラフィックを消去する
GetHitKeyStateAll … キーの入力状態の取得
だったかな?
で、それぞれの関数の戻り値が…
0が成功で、それ以外はなにかしらのエラーが発生した場合なので、
『!』演算子をつけて0が返ってきた場合に真としている…という訳です。
『&&』演算子を用いている箇所は、『●●であり、なおかつ▲▲である場合』という意味だと思ってください。
つまり、あの判定文は『ProcessMessage関数の実行に成功し、なおかつClearDrawScreen関数の実行に成功し、なおかつGetHitKeyStateAll関数の実行に成功し、エスケープキーが押されていない状態を真とする』という意味になります。
197ポイント を手に入れた。
|
|
|
|
|
Name: うい ..ぴよぴよ(717ポイント)
Date: 2008/11/22(土) 19:05
No:24448
|
|
Title: Re:説明の説明を希望
|
|
なるほど、!にはそういう意味があったのですね。
ありがとうございます。
36ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(895,980ポイント)
Date: 2008/11/23(日) 01:38
No:24459
|
|
Title: Re:説明の説明を希望
|
|
「!」の書き方がわかりにくかったですかね。
判定式は真か偽かで判定されますよね。
if(真){
//
}
はいつも実行されますが
if(偽){
//
}
はいつも実行されませんね。では「!(=否定)」をつけるとどうなるか
if(!真){
//
}
はいつも実行されません。
if(!偽){
//
}
はいつも実行されます。そして真とは0以外、偽とは0であることから、
if(!0){
//
}
の時いつも実行させることが出来ます。関数の返り値は0以外が異常であることから、
この時条件から外すことが出来るのです。
190ポイント を手に入れた。
|
|
|
|
|
Name: 紅葉 ..初心者(7,179ポイント)
Date: 2008/11/25(火) 17:26
No:24541
|
|
Title: Re:説明の説明を希望
|
|
素人なりに
例えば
bool型のFlgがあったとします。
A
if(Flg == true){
//処理
}
B
if(Flg){
//処理
}
AとBは同じ意味です。
では!マークの場合はどうなのか・・・
C
if(Flg == false){
//処理
}
D
if(!Flg){
//処理
}
今度はCとDが同じ意味です。
説明が下手で申し訳ないのですがこんな感じです
132ポイント を手に入れた。
|
|
|
|
Name: AS ..かけだし(2,077ポイント)
Date: 2008/11/23(日) 14:46
No:24467
|
|
Title: 川のキラキラの透過色
|
|
サンプルプログラムで見せてもらいました。
ある程度のところまでは理解できたのですが、両脇の陸地部分でわからないところがあります。
SetTransColorで設定をしていないにもかかわらず、透過色が白になっているのはなぜでしょう?(キラキラの8つの画像の透過色は黒なのに…)
そしてもう一つ、陸と川の境目の薄い黒色の部分がアルファブレンドの半透明になっているのも謎です…
これを見る限り一つの画像に全く透明でない部分、半透明の部分、完全に透明の部分が存在することになります。どうなっているのでしょうか…?
しかもwindowsに初期装備のペイントで開くと薄い黒色の部分が真っ黒になるという…さらに謎の事態に…
154ポイント を手に入れた。
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(896,623ポイント)
Date: 2008/11/23(日) 15:33
No:24471
|
|
Title: Re:川のキラキラの透過色
|
|
色は「RGB」の3原色で出来ていますね。
PNGにはこの3つ以外に「透過」という色が指定できます。
例えば同じ黒は黒でも「透明度○○の黒」という表現が可能です。
ペイントでは透過色のある画像を編集することが出来ません。
ある程度高機能な画像ソフトが必要です。
軽く使うならPictBear
高機能なフリーソフトならGIMP
有名なアドビソフトならフォトショップ
これらのどれかを使うとよいでしょう。
なお、きらめきを表現する画像は透過色黒で表現しているのではなく、
加算ブレンドしていくから、黒が描画されていないだけなのです。
加算ブレンドは光を足してブレンドする表現方法ですよね。
光って白が最大、黒が無し ですよね。
ですから、黒って0と同じです。
下地に黒足しても下地と色が変わらないのです。
ブレンドはアルファブレンドと加算ブレンドを使っているので、その辺注意してみて下さい。
338ポイント を手に入れた。
|
|
|
|
|
Name: 銘茶ハリガネ ..ぴよぴよ(42ポイント)
Date: 2008/11/23(日) 20:08
No:24478
|
|
Title: Re:川のキラキラの透過色
|
|
画像編集ソフトなら、Azpainterもオススメしてみます。
vectorと言うサイトで探すとなかなか高機能なソフトが無料で
多く見つかります。
42ポイント を手に入れた。
|
|
|
|
|
Name: AS ..かけだし(2,197ポイント)
Date: 2008/11/24(月) 10:08
No:24491
|
|
Title: Re:川のキラキラの透過色
|
|
な、なるほど…そんなことが出来るのですか…
加算ブレンドで黒は変化なしといのも言われてみれば当たり前でしたね(汗)あのウネッ(?)ってなってる部分しか眼中にありませんでした…
その透過色を指定できる機能は何と言う名前なんでしょうか?挙げていただいたソフトでも無料なので問題はないですが、もしsaiでできたらそれが一番いいなぁと。
その機能があるかどうか調べてみたいのです。
120ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(272,770ポイント)
Date: 2008/11/24(月) 12:26
No:24492
|
|
Title: Re:川のキラキラの透過色
|
|
>saiでできたらそれが一番いいなぁと。
saiってこれですか?
SYSTEMAX Software Development
ttp://www.systemax.jp/ja/
これなら一応できたはずです。
不透明度とかいう名前だったはずです。
ただ、PNGに透明情報を書き出すために 1.0.0のバージョンではだめで、
比較的新しいテスト版を使わなければならないようです。
(psdとか tgaなら問題ないようです)
224ポイント を手に入れた。
|
|
|
|
|
Name: AS ..かけだし(2,297ポイント)
Date: 2008/11/25(火) 17:23
No:24540
| 解決!
|
Title: Re:川のキラキラの透過色
|
|
Justyさん>
はい。それです。
確かにバージョン情報のところに「不透明度付きPNGに対応」と書かれてますね。
古いバージョンだと使えないようですが、そこのところは大丈夫です。
皆さんのおかげで疑問が解決しました。ありがとうございました。
100ポイント を手に入れた。
|
|
|
|
Name: 初心者 ..中級者(14,416ポイント)
Date: 2008/11/20(木) 17:05
No:24362
|
|
Title: 原点
|
|
VisualC++の図形描写で原点の位置変更などはどうやってやるのでしょうか
例えば(100,100)を原点にしたい場合など。
30ポイント を手に入れた。
|
|
|
|
Name: バグ ..ハッカー(126,222ポイント)
Date: 2008/11/20(木) 17:44
No:24364
|
|
Title: Re:原点
|
|
いまいち要領を得ませんが、これまでの質問を見ているとMFCを使用しているみたいですので、CDCクラスのメンバであるMoveTo関数で指定してやればいいんじゃないでしょうか?
51ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..中級者(14,548ポイント)
Date: 2008/11/20(木) 17:57
No:24365
|
|
Title: Re:原点
|
|
書き忘れてました。VC++のMFCのダイアログベースでやってます。
MoveToはあくまで現在位置だけを変更してるのではないでしょうか?
例えばMoveToで(100,100)としておくと次の図形はそこから始まるというものですよね。
私がスレの内容で求めているのは符号(-)を扱うことです。原点を動かさなければ-の座標が表示されないんです。
132ポイント を手に入れた。
|
|
|
|
|
Name: non ..初心者(8,581ポイント)
Date: 2008/11/20(木) 17:58
No:24366
|
|
Title: Re:原点
|
|
最近、「初心者」さんのハンドルネームのスレッドをたくさん見かけますけど、すべて同一人物ですか?
なんか、やられていることに一貫性がないし・・・・修得レベルが想像できない。
もっと、区別のつきやすいハンドルにして欲しいですよね。
8ポイント を落としてしまった。
|
|
|
|
|
Name: 初心者 ..中級者(14,725ポイント)
Date: 2008/11/20(木) 18:09
No:24367
|
|
Title: Re:原点
|
|
あー僕も思いました。バグさんはわかってるらっしゃるみたいですが、僕が質問してるのは全てVisualC++のMFC関連です。他は僕じゃないです。でも同一の名前がつけれますのでしょうがないのではないでしょうか?
「初心者」という名前は名前の時点で自分のPC経験などを相手に強く印象づけるので皆さん使ってるんじゃないでしょうか。見る限り同じ名前や類似した名前はたくさんありますよね。ただ上級者なのに初心者って名前つける人はあんましいないと思います。
177ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..プログラマー(37,532ポイント)
Date: 2008/11/20(木) 18:18
No:24368
|
|
Title: Re:原点
|
|
> もっと、区別のつきやすいハンドルにして欲しいですよね。
継続して掲示板を利用するなら、誰なのかを特定しやすい名前にしたほうが良いですね。
これを機に改名して判別しやすくしておいたほうがいいと思います。
# 改名するなら一度昇進リストを確認して、存在しない名前を考えるのがいいでしょうね。
# 初心者と名乗る方 が 中級者 の称号というのも明らかに矛盾ですし。
そうそう、
原点の設定は CDC::SetViewportOrg でできそうですよ。
(このあたりは MSDN あたりで調べればすぐに見つかりそうですが…)
233ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..中級者(14,901ポイント)
Date: 2008/11/20(木) 18:31
No:24369
|
|
Title: Re:原点
|
|
どうもありがとうございました。関数はわかったのでやってみます。MSDNとかいうのは初めて聞きました。
私は中級者になってますが質問ばかりしてるだけです。まだ始めたてのぺーぺーです。ですのでポイントや称号で
判断はできないと思いますよ。特にこだわりがあるわけじゃないのですが誰なのか特定できたほうが回答者さんにとってやはり都合がいいんですかね。規約の複数の名前所持ってのにひっかかりそうで控えてるんですが。
大丈夫そうなら考えてみますね。
176ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..中級者(14,982ポイント)
Date: 2008/11/21(金) 11:08
No:24393
|
|
Title: Re:原点
|
|
SetViewportOrgについて色々調べてみたんですがほとんどの方が使っておられるのはSDIのOnDraw関数の中で使っています。ダイアログベースだとこれは使えないみたいなのですがダイアログベースでの使い方がいまいちわかりません。
81ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(126,326ポイント)
Date: 2008/11/21(金) 11:55
No:24395
|
|
Title: Re:原点
|
|
というか、CDCクラスのメンバ関数の話な訳ですから、OnDrawとか、OnPaintとか、SDIとかダイアログとか関係ないですよね。
デバイスコンテキストを取得して、それに対して操作してやればいい訳ですから…
デバイスコンテキストに関する機能を使いやすくまとめてあるのがCDCクラスです。
CDCクラスはこれまでに何度も使ってきていますよね?
ちなみに、こちらでもテストしてみましたが、問題なく使用できました。
118ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(15,056ポイント)
Date: 2008/11/21(金) 12:21
No:24396
|
|
Title: Re:原点
|
|
CClientDC dc(this);
dc.SetViewportOrg(200,200);
でエラーはでないんですが全く変化がない・・
入れる場所が悪いんですかね。void :: ONOK(){
のすぐ後ろに入れてるのですが。CDCクラスはこれまでに1度か2度使った程度だった気がします。
74ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(126,406ポイント)
Date: 2008/11/22(土) 15:57
No:24441
|
|
Title: Re:原点
|
|
教えてくれる人ありきな、その考え方は賛同できません。
分からない事を調べる能力を鍛える方がよほど効率的です。
ただ、初心者さんの場合は、もう少し前の段階である(ご自身も書かれていた文法やポインタなど)基礎を固める方が先決だと思います。それこそ、無闇に本を読むのも効果的ではないでしょうか?無論、自分でコーディングしてのトライ&エラーは必須ですけどね。
これ以上は水掛け論になりそうなので止めておきます。キツイ書き方をしてすみませんでした。
170ポイント を落としてしまった。
|
|
|
|
|
Name: 初心者 ..上級者(15,397ポイント)
Date: 2008/11/25(火) 11:22
No:24528
| 解決!
|
Title: Re:原点
|
|
お言葉ですが、それは上級者の考え方でしょう。文法、関数、基礎などは本やサイトでわかりますが
それ以外のことは載ってないです。ただ、課題が与えられその回答を導き出す為にこの原点移動が必要だったわけです。私からすればこの課題を終わらすのに何冊もの本を長い時間かけて読み尽くし、さらにプログラムを仕上げるのにも時間をかける、なんてことはできません。もてる知識と人に聞いたり、調べたりでやりくりするしかありません。
少なくとももっと勉強してから来いみたいなこと言われるとどうしようもありませんので、情けないようですが
見捨てないようおねがいします。キツイ言い方ではないのですがこのサイトで質問しずらくなるんで・・書かせていただきました。それではまたわからない所あったらお願いします。ある程度調べてから質問しますので。
265ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(126,695ポイント)
Date: 2008/11/25(火) 12:12
No:24531
|
|
Title: Re:原点
|
|
私が言いたかった事は、MFCを使ってプログラムを書きたいならば『ポインタやクラスの概念は最低限知っておかなければいけない』という事だったんですが…
課題を出した方へは質問されてみましたか?
それで、解説してもらえないという事であれば、その出題者の方は私と同じ考え方だと思いますよ。
自分自身で解決する能力を養ってほしいのだと思います。
上級者の考えだと思うのは結構ですが、私も本格的にプログラムを始めて2年足らずなのはご理解下さい。
これまでに書き込みさせていただいた内容は私自身の少ない経験から言わせてもらっています。
闇雲に本を読み、サンプルを自分で打ち込み、少し変更してエラーが出たら、何故エラーが起こったのかを調べる…これを繰り返しての今です。
確かに非効率的だとは思いますが、よほどの天才でもなければ、結局はこれが近道でもあると思うんですね。
それでは、頑張ってください(^-^)
1ポイント を手に入れた。
|
|
|
|
Name: 海老天 ..入門者(2,773ポイント)
Date: 2008/11/23(日) 22:40
No:24481
|
|
Title: マップ移動について
|
|
今マップ移動を作っているのですがゲームプログラミングの館の24章を参考にして
int hantei[20][20] = {
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,2,0,0,0,0,0,0,0,0,2,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,2,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,2,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,2,1,1 },
{ 0,0,0,0,0,0,2,0,0,0,1,0,2,0,1,0,0,0,0,0 },
{ 1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,2,0,1,1 },
{ 1,1,1,1,1,0,0,2,0,0,0,0,2,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};
のように書きました
右端の0より右に行くと他のマップに出るようにしたかったので
[20][21]のように配列を定義していたのですがこれだと上と左端に追加しようとするとマップ全体がずれてしまいます
[-1][]や[][-1]のようにするにはどうすればいいのでしょうか
1,061ポイント を手に入れた。
|
|
|
|
Name: conio ..入門者(4,428ポイント)
Date: 2008/11/23(日) 23:43
No:24484
|
|
Title: Re:マップ移動について
|
|
配列を変える必要は無いのではないのでしょうか。
例えば以下のような場合、
int hantei[20][20] = {
{ 1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,2,0,0,1,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,1,1 },
{ 1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ 1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,1,1 },
{ 0,0,0,0,0,0,2,0,0,0,1,0,2,0,1,0,0,0,0,0 },
{ 1,0,0,0,0,0,0,0,1,1,1,0,0,0,1,0,0,0,1,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1,1 },
{ 1,1,1,1,1,0,0,2,0,0,0,0,2,0,0,0,0,0,1,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1 },
};
hantei[y][x]とすると、移動した時に
【条件】x < 20, x >= 0, y < 20, y >= 0
を満たさなかった場合、別のマップに移動、と言う風に。
もしくは、"主人公が移動した時、hantei[0][10]の場所ならば移動"という風にしてもいいかと
思うのですが、どうでしょう?
907ポイント を手に入れた。
|
|
|
|
|
Name: 海老天 ..入門者(2,805ポイント)
Date: 2008/11/25(火) 00:52
No:24512
| 解決!
|
Title: Re:マップ移動について
|
|
>>conioさん
返信が遅れ申し訳ありません
言われた通りにしたところうまく動かすことができました
本当にありがとうございます
32ポイント を手に入れた。
|
|
|
|
Name: kouzi ..ぴよぴよ(12ポイント)
Date: 2008/11/24(月) 23:25
No:24507
|
|
Title: フルスクリーンとウィンドウの保存方法について
|
|
環境設定の所で終了時にフルスクリーンとウィンドウを保存したいです。
よろしくお願いします。
bool bfullscreen = g_pD3d->IsFullScreen(); //ウィンドウモードフラグ
bfullscreen=!bfullscreen;
//終了
if( g_pInput->PushMouseBtn(0) )
{
static CRect rectWnd;
//画像の矩形
r = Ent2.GetRect();
//矩形内にマウスがある場合
if( r.PtInRect( x, y ) ) {
PostQuitMessage(0);
}
}
12ポイント を手に入れた。
|
|
|
|
Name: kouzi ..ぴよぴよ(191ポイント)
Date: 2008/11/24(月) 23:37
No:24509
|
|
Title: 訂正
|
|
環境設定の所で終了時にフルスクリーンとウィンドウを保存したいです。
よろしくお願いします。
OS : Windows Vista
コンパイラ名 : VC++ 2005
<br>
bool bfullscreen = g_pD3d->IsFullScreen(); //ウィンドウモードフラグ
bfullscreen=!bfullscreen;
//終了
if( g_pInput->PushMouseBtn(0) )
{
static CRect rectWnd;
//画像の矩形
r = Ent2.GetRect();
//矩形内にマウスがある場合
if( r.PtInRect( x, y ) ) {
PostQuitMessage(0);
}
}
179ポイント を手に入れた。
|
|
|
|
Name: アルゴ ..ぴよぴよ(838ポイント)
Date: 2008/11/24(月) 22:45
No:24501
|
|
Title: 再・分岐限定探索について
|
|
分岐限定探索アルゴリズムを用いて最適経路を求める問題について質問です。
下の結果が答えになるようですが、4)のOL=[B(4),E(4),L(7)],CL=[F,A,S]はOL=[B(4),E(4),H(4),L(7)],CL=[F,A,S]
6)のOL=[H(4),K(5),L(7),D(8)],CL=[E,B,F,A,S]はOL=[H(4),K(5),L(7),D(8)J(9)],CL=[E,B,F,A,S]
7)のOL=[K(5),L(7),D(8),G(8)],CL=[H,E,B,F,A,S]はOL=[K(5),L(7),D(8),G(8),J(9)],CL=[H,E,B,F,A,S]
では間違いなのでしょうか?回答お願いします。
----------------------------------------------------
OL=OPEN LIST,CL=CLOSE LIST の略です
()内の数値はコストの数値です
SからスタートしてGで終了です
親子ポインタリストは訪問した要素を追加するためのものです
-----------------------------------------------------
1)OL=[S],CL=[]
2)OL=[A(1),E(5)],CL=[S]
3)OL=[F(3),B(4),E(5)],CL=[A,S]
4)OL=[B(4),E(4),L(7)],CL=[F,A,S]
5)OL=[E(4),H(4),L(7),D(8)],CL=[B,F,A,S]
6)OL=[H(4),K(5),L(7),D(8)],CL=[E,B,F,A,S]
7)OL=[K(5),L(7),D(8),G(8)],CL=[H,E,B,F,A,S]
8)OL=[L(6),D(8),G(8)],CL=[K,H,E,B,F,A,S]
9)OL=[G(7),F(8),J(9)],CL=[L,K,H,E,B,F,A,S]
10)Gは目標接点となる(成功)
親子ポインタリスト={(S,A),(A,F),(A,B),(F,E),(F,H),(B,D),(E,J),(E,K),(H,G),(K,L),(L,G)}
解は親子ポインタリストから{(L,G),(K,L),(E,K),(F,E),(A,F),(S,A)}
これを逆にたどってS→A→F→E→K→L→G
コストは7
579ポイント を手に入れた。
|
|
|
|
Name: box ..ハッカー(129,811ポイント)
Date: 2008/11/24(月) 23:17
No:24504
|
|
Title: Re:再・分岐限定探索について
|
|
分岐限定探索そのものについてはググればたぶんわかると思うのですが、
OL, CL, 親子ポインタリストというような用語の意味やくだんの表記法について
ここを見ている人全員が理解できるわけではないと思います。
まずはそのあたりの説明から入っていただけますか?
98ポイント を手に入れた。
|
|
|
|
Name: アルゴ ..ぴよぴよ(259ポイント)
Date: 2008/11/24(月) 20:43
No:24498
|
|
Title: 分岐限定探索について
|
|
分岐限定探索アルゴリズムを用いて最適経路を求める問題について質問です。
下の結果が答えになるようですが、4)のOL=[B(4),E(4),L(7)],CL=[F,A,S]はOL=[B(4),E(4),H(4),L(7)],CL=[F,A,S]
6)のOL=[H(4),K(5),L(7),D(8)],CL=[E,B,F,A,S]はOL=[H(4),K(5),L(7),D(8)J(9)],CL=[E,B,F,A,S]
7)のOL=[K(5),L(7),D(8),G(8)],CL=[H,E,B,F,A,S]はOL=[K(5),L(7),D(8),G(8),J(9)],CL=[H,E,B,F,A,S]
では間違いなのでしょうか?回答お願いします。
( )←はコスト値 S:出発地点 G:ゴール地点 ***アンダーバーは無線としてください***
S---(1)A---(3)B------(4)D
|_________|___________________________|
(5)_____(2)_________________________(2)
E---(1)F---(1)H______________I
|\(1)___\(4)____\(4)
(5)J_(1)K--(1)L--(1)G
-----------------------------------------------------
1)OL=[S],CL=[]
2)OL=[A(1),E(5)],CL=[S]
3)OL=[F(3),B(4),E(5)],CL=[A,S]
4)OL=[B(4),E(4),L(7)],CL=[F,A,S]
5)OL=[E(4),H(4),L(7),D(8)],CL=[B,F,A,S]
6)OL=[H(4),K(5),L(7),D(8)],CL=[E,B,F,A,S]
7)OL=[K(5),L(7),D(8),G(8)],CL=[H,E,B,F,A,S]
8)OL=[L(6),D(8),G(8)],CL=[K,H,E,B,F,A,S]
9)OL=[G(7),F(8),J(9)],CL=[L,K,H,E,B,F,A,S]
10)Gは目標接点となる(成功)
親子ポインタリスト={(S,A),(A,F),(A,B),(F,E),(F,H),(B,D),(E,J),(E,K),(H,G),(K,L),(L,G)}
解は親子ポインタリストから{(L,G),(K,L),(E,K),(F,E),(A,F),(S,A)}
これを逆にたどってS→A→F→E→K→L→G
コストは7
259ポイント を手に入れた。
|
|
|
|
Name: box ..ハッカー(129,713ポイント)
Date: 2008/11/24(月) 21:48
No:24499
|
|
Title: Re:分岐限定探索について
|
|
<pre>と</pre>タグとで前後を挟んで、もう一度投稿してくださいますか?(<と>は半角)
図のレイアウトが崩れてしまっていて、何を説明したいのかわからなくなっているためです。
69ポイント を手に入れた。
|
|
|
|
Name: くろがね ..ぴよぴよ(381ポイント)
Date: 2008/11/24(月) 14:10
No:24493
|
|
Title: 画像が、動いた後にだけ表示されてしまうんですが…
|
|
[1] 質問文
[1.1] 自分が今行いたい事は何か
私は今こちらのサイトの「C言語ゲームプログラミングの館」で勉強をさせてもらっている者です。
現在、この講座の「12.画像を動かして表示する」で詰まっています。
[1.2] どのように取り組んだか(プログラムコードがある場合記載)
最初に、「WINAPI…」と言うところをコピペした後は、
中身だけを消して、自分で打ち込んで実行、というようにやっていました。
[1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
まず、実行してエラーは出ません。
ですが、実行すると、動いて表示されるのではなく(動画としてではなく)
実行結果のみが表示されます(動ききった後の止まっている状態、つまりは静止画)
実行後、ウインドウ内は真っ暗でその後、いきなり上の静止画が出る状態です。
自分の入力ミスの可能性もあるので、完全にコピーしたものでも実行しましたが
同じ結果でした。
[1.4] 今何がわからないのか、知りたいのか
どうすれば、動いた状態で表示できるのかが知りたいです。
[2] 環境
[2.1] OS : Windows, Linux等々
Windows Vistaです。
[2.2] コンパイラ名 : VC++ 2008EE, Borand C++, gcc等々
VC++2008です。
[3] その他
・どの程度C言語を理解しているか
「明解 C言語 入門編」という本を、全部勉強して理解しました。
基本は大体できると思います。
・ライブラリを使っている場合は何を使っているか
「DXライブラリ VC用」です。
381ポイント を手に入れた。
|
|
|
|
Name: Mist ..プログラマー(33,128ポイント)
Date: 2008/11/24(月) 14:15
No:24494
|
|
Title: Re:画像が、動いた後にだけ表示されてしまうんですが…
|
|
過去にも同じ報告がありますがVistaでは12章が正しく動作しないことがあるようなので
気にせず13章に進んでください。
54ポイント を手に入れた。
|
|
|
|
|
Name: くろがね ..ぴよぴよ(395ポイント)
Date: 2008/11/24(月) 18:14
No:24497
| 解決!
|
Title: Re:画像が、動いた後にだけ表示されてしまうんですが…
|
|
分かりました。
返答ありがとうございました。
14ポイント を手に入れた。
|
|
|
|
Name: kaiten ..入門者(3,139ポイント)
Date: 2008/11/22(土) 11:43
No:24430
|
|
Title: std::vectorの使い方
|
|
テンプレ使わせていただきます。
[1] 質問文
[1.1] std::vectorを使用してクラスを動的に確保することと、確保したクラスを引数にしないで別のクラスの関数内で使用(うまく言えないのでやりたいコードを書きます。)。
[1.2] std::vector<Player>
---main.cpp---
#include "class.h"
using namespace std;
char key[256];
int RefreshTime;
int input;
vector<Player> player[1];
BG bg(320, 10, 0);
int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lPc, int nC){
ChangeWindowMode(TRUE);
if(DxLib_Init() == -1)return(-1);
SetDrawScreen(DX_SCREEN_BACK);
//初期化などの処理を入れる
SetDrawMode(DX_DRAWMODE_BILINEAR);
Img_Ini();
while(ProcessMessage() == 0&&GetHitKeyStateAll(key) == 0){
RefreshTime = GetNowCount(); //今の時間を取得
ClsDrawScreen(); //裏画面のデータを全て削除
//実際の処理を入れる(初期化などを除く
bg.Center();
player.resize(256);
ScreenFlip(); //裏画面データを表画面へ反映
while(GetNowCount() - RefreshTime < 17); //1周の処理が17ミリ秒になるまで待つ
}
DxLib_End();
return (0);
}
---class.cpp---
〜中略〜
void BG::Center()const
{
SetDrawArea(x-10, 0, x+10, 480);
DrawBox(x-10,0,x+10,480,Cr1,TRUE);
DrawBox(320-8,480-player.life/player.Get_lifemax()*480,320-2,480,Cr2,TRUE);
}
BGクラスの関数内でplayerクラスの関数が使いたいんです。どうにもうまく言えないのですが。
[1.3] vectorの使い方がいまいちわからない。
1>main.cpp
1>c:\myvc\esth\main.cpp(30) : error C2228: '.resize' の左側はクラス、構造体、共用体でなければなりません
1> 型は 'std::vector<_Ty> [1]' です。
1> with
1> [
1> _Ty=Player
1> ]
[1.4] vectorを使用すること。また、classを型に指定すること。
[2] 環境
[2.1] Windows VISTA
[2.2] VC++ 2008EE
[3] その他
C言語、C++ともによくわかってないです。一応龍神録の館を理解するくらいならできるとは思うのですが……
ライブラリはDxLibを使用しています。
875ポイント を手に入れた。
|
|
|
|
Name: kaiten ..入門者(3,768ポイント)
Date: 2008/11/22(土) 12:21
No:24434
|
|
Title: Re:std::vectorの使い方
|
|
>たかぎさん
レスありがとうございます。
main.cppを下記のように変えてみたのですがエラーが出てしまいました。
playerが配列なのは将来的に長さ2の配列で確保するつもりだからです。今はテストも兼ねてリサイズを使ってみているだけでして。
->を使った場合
1>main.cpp
1>c:\myvc\esth\main.cpp(30) : error C2819: クラス 'std::vector<_Ty>' にはオーバーロードされたメンバ 'operator ->' がありません。
1> with
1> [
1> _Ty=Player
1> ]
1> 代わりに '.' を使用しますか?
1>c:\myvc\esth\main.cpp(30) : error C2232: '->std::vector<_Ty>::resize' : 左のオペランドが 'class' 型です。'.' を使用してください。
1> with
1> [
1> _Ty=Player
1> ]
.を使った場合
1>main.cpp
1>c:\program files\microsoft visual studio 9.0\vc\include\vector(713) : error C2512: 'Player::Player' : クラス、構造体、共用体に既定のコンストラクタがありません。
1> c:\program files\microsoft visual studio 9.0\vc\include\vector(712): クラス テンプレート のメンバ関数 'void std::vector<_Ty>::resize(unsigned int)' のコンパイル中
1> with
1> [
1> _Ty=Player
1> ]
1> c:\myvc\esth\main.cpp(10) : コンパイルされたクラスの テンプレート のインスタンス化 'std::vector<_Ty>' の参照を確認してください
1> with
1> [
1> _Ty=Player
1> ]
---main.cpp---
#include "class.h"
using namespace std;
char key[256];
int RefreshTime;
int input;
vector<Player> player;
BG bg(320, 10, 0);
int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lPc, int nC){
ChangeWindowMode(TRUE);
if(DxLib_Init() == -1)return(-1);
SetDrawScreen(DX_SCREEN_BACK);
//初期化などの処理を入れる
SetDrawMode(DX_DRAWMODE_BILINEAR);
Img_Ini();
while(ProcessMessage() == 0&&GetHitKeyStateAll(key) == 0){
RefreshTime = GetNowCount(); //今の時間を取得
ClsDrawScreen(); //裏画面のデータを全て削除
//実際の処理を入れる(初期化などを除く
bg.Center();
player->resize(2);
ScreenFlip(); //裏画面データを表画面へ反映
while(GetNowCount() - RefreshTime < 17); //1周の処理が17ミリ秒になるまで待つ
}
DxLib_End();
return (0);
}
#ちょっと修正しました
629ポイント を手に入れた。
|
|
|
|
|
Name: kaiten ..入門者(4,081ポイント)
Date: 2008/11/22(土) 15:37
No:24438
|
|
Title: Re:std::vectorの使い方
|
|
>修正
これは失礼しました。
vector<Player> player[1];
に戻したところ下記のエラーが発生しました
1>main.cpp
1>c:\program files\microsoft visual studio 9.0\vc\include\vector(713) : error C2512: 'Player::Player' : クラス、構造体、共用体に既定のコンストラクタがありません。
1> c:\program files\microsoft visual studio 9.0\vc\include\vector(712): クラス テンプレート のメンバ関数 'void std::vector<_Ty>::resize(unsigned int)' のコンパイル中
1> with
1> [
1> _Ty=Player
1> ]
1> c:\myvc\esth\main.cpp(10) : コンパイルされたクラスの テンプレート のインスタンス化 'std::vector<_Ty>' の参照を確認してください
1> with
1> [
1> _Ty=Player
1> ]
#以後は記事編集の意だったのですが解りづらかったですね。
313ポイント を手に入れた。
|
|
|
|
|
Name: kaiten ..初心者(5,342ポイント)
Date: 2008/11/22(土) 17:53
No:24444
|
|
Title: Re:std::vectorの使い方
|
|
失礼しました。
全ファイルそのまま書いておきます
---class.h---
#pragma once
#include "header.h"
extern class Object player1,player2;
class Object
{
protected:
int w,h;
int lifemax;
int r;
int img;
int speed;
public:
float x,y;
int life;
int angle;
Object (){}
Object(float, float, int, int, int, int, int);
Object(const Object ©);
virtual ~Object();
void Draw(double)const;
int Get_lifemax()const;
int Get_r()const;
int Get_speed()const;
};
class Player : public Object
{
public:
int player;
int trigger;
int score;
int energy; //専用兵装発射エネルギー。
Player(int, int, int, int,float, float, int, int, int, int, int);
Player(const Player ©, const Object &O_copy);
};
class BG
{
protected:
int w;
int h;
int img;
int Cr1;
int Cr2;
public:
int x;
int y;
BG(int, int, int);
BG(const BG ©);
virtual ~BG();
void Center()const;
};
---class.cpp---
#pragma once
#include "header.h"
extern class Object player1,player2;
//extern class Player player;
class Object
{
protected:
int w,h;
int lifemax;
int r;
int img;
int speed;
public:
float x,y;
int life;
int angle;
Object (){}
Object(float, float, int, int, int, int, int);
Object(const Object ©);
virtual ~Object();
void Draw(double)const;
int Get_lifemax()const;
int Get_r()const;
int Get_speed()const;
};
class Player : public Object
{
public:
int player;
int trigger;
int score;
int energy; //専用兵装発射エネルギー。
Player(int, int, int, int,float, float, int, int, int, int, int);
Player(const Player ©, const Object &O_copy);
};
class BG
{
protected:
int w;
int h;
int img;
int Cr1;
int Cr2;
public:
int x;
int y;
BG(int, int, int);
BG(const BG ©);
virtual ~BG();
void Center()const;
};
---function.cpp---
#include "class.h"
int sin_C(int angle)
{
float angle2=(float)angle/10;
return((int)(sin(angle2)*10));
}
int cos_C(int angle)
{
float angle2=(float)angle/10;
return((int)(cos(angle2)*10));
}
int atan2_C(float y, float x)
{
return((int)(atan2((double)y,(double)x)*10));
}
void Img_Ini()
{
//Center_Img=LoadGraph();
Player_Img[0][0]=LoadGraph("Data\\img\\Player\\Nww1P.png");
Player_Img[1][0]=LoadGraph("Data\\img\\Player\\Nww2P.png");
}
---header.h---
#pragma once
#define _USE_MATH_DEFINES
#include "DxLib.h"
#include <stdio.h>
#include <math.h>
#include <assert.h>
#include <vector>
//define
#define shiftkeyboard (CheckHitKey(KEY_INPUT_LSHIFT)|CheckHitKey(KEY_INPUT_RSHIFT))
#define shiftPAD (input&PAD_INPUT_L)
#define up (input&PAD_INPUT_UP)
#define down (input&PAD_INPUT_DOWN)
#define left (input&PAD_INPUT_LEFT)
#define right (input&PAD_INPUT_RIGHT)
#define PushZ_A (input&PAD_INPUT_A)
#define PushX_B (input&PAD_INPUT_B)
#define PushC_C (input&PAD_INPUT_C)
#define PushA_X (input&PAD_INPUT_X)
#define PushS_Y (input&PAD_INPUT_Y)
#define PushD_Z (input&PAD_INPUT_Z)
#define Bullet_max 3000
#define Effect_max 1000
#define Weapon_max 3
#define Player_kind 3
#define border_x (320-10)
//extern
extern int input;
extern int Player_Img[2][Player_kind];
//関数プロトタイプ
int sin_C(int);
int cos_C(int);
int atan2_C(int);
void Img_Ini();
---main.cpp---
#include "class.h"
using namespace std;
char key[256];
int RefreshTime;
int input;
int Player_Img[2][Player_kind];
Object player1(border_x/2, 400, 100, 0, 2, 4, Player_Img[0][0]);
Object player2(border_x/2, 80, 100, 1800, 2, 4, Player_Img[1][0]);
vector<Player> player[1];
BG bg(320, 10, 0);
int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lPc, int nC){
ChangeWindowMode(TRUE);
if(DxLib_Init() == -1)return(-1);
SetDrawScreen(DX_SCREEN_BACK);
//初期化などの処理を入れる
SetDrawMode(DX_DRAWMODE_BILINEAR);
Img_Ini();
while(ProcessMessage() == 0&&GetHitKeyStateAll(key) == 0){
RefreshTime = GetNowCount(); //今の時間を取得
ClsDrawScreen(); //裏画面のデータを全て削除
//実際の処理を入れる(初期化などを除く
bg.Center();
player->resize(2);
//player1.Draw(1.0);
//player2.Draw(1.0);
//player[0].Draw(1.0);
ScreenFlip(); //裏画面データを表画面へ反映
while(GetNowCount() - RefreshTime < 17); //1周の処理が17ミリ秒になるまで待つ
}
DxLib_End();
return (0);
}
1,261ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(126,647ポイント)
Date: 2008/11/22(土) 18:14
No:24447
|
|
Title: Re:std::vectorの使い方
|
|
各クラスのメンバ関数が実装されていないのが原因なのでは?
2倍のポイントを手に入れた! 44ポイント を手に入れた。
|
|
|
|
|
Name: kaiten ..初心者(5,425ポイント)
Date: 2008/11/23(日) 21:54
No:24479
|
|
Title: Re:std::vectorの使い方
|
|
player->resize(2);はデフォルトコンストラクタを定義することで解決しました。本当にありがとうございました。
ここからが本題なのですが、
bg.center()からplayer1.Get_life()を呼ぶ方法はあるのでしょうか?それともその必要が出ること自体が失敗なのでしょうか?
83ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(73,730ポイント)
Date: 2008/11/23(日) 22:32
No:24480
|
|
Title: Re:std::vectorの使い方
|
|
> bg.center()からplayer1.Get_life()を呼ぶ方法はあるのでしょうか?
Get_lifeとは?
PHPとかではないので、存在しないメンバ関数を呼ぶことはできません。
> ここからが本題なのですが、
タイトルの「std::vectorの使い方」とは何の関係もないような...
2倍のポイントを手に入れた! 124ポイント を手に入れた。
|
|
|
|
|
Name: kaiten ..初心者(5,520ポイント)
Date: 2008/11/23(日) 22:41
No:24482
|
|
Title: Re:std::vectorの使い方
|
|
>Get_life
書き間違いでした。正しくはGet_lifemaxです。
>本題
player1のような場合はヘッダでextern宣言すればできると思うのですが、vectorで確保した動的配列でそれができるのか知りたかったんです。解説サイトなどだとvectorで確保してその場で使うような例しか見つからなかったもので……
95ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(73,791ポイント)
Date: 2008/11/23(日) 23:45
No:24485
|
|
Title: Re:std::vectorの使い方
|
|
> player1のような場合はヘッダでextern宣言すればできると思うのですが、vectorで確保した動的配列でそれができるのか知りたかったんです。
player1.Get_lifemax()を呼び出したいんですよね。
だったらstd::vectorは何の関係もないと思いますが...
bg.center()とした場合に、centerというメンバ関数がないためにエラーになるという話でしょうか?
61ポイント を手に入れた。
|
|
|
|
|
Name: kaiten ..初心者(5,566ポイント)
Date: 2008/11/24(月) 00:15
No:24486
|
|
Title: Re:std::vectorの使い方
|
|
いえ、player1.Get_lifemax()は呼び出せるんです。
vector<Player> playerで確保したplayer[0](と[1])を呼びだしたいんです。
46ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(126,694ポイント)
Date: 2008/11/24(月) 00:32
No:24487
|
|
Title: Re:std::vectorの使い方
|
|
ようするにBGクラスのメンバであるCenter関数で、Playerクラスのメンバを参照したいという事ですよね?
Center関数の引数にPlayerクラスへのポインタを渡してやればいいのではないでしょうか?
47ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(73,809ポイント)
Date: 2008/11/24(月) 01:10
No:24489
|
|
Title: Re:std::vectorの使い方
|
|
> Center関数の引数にPlayerクラスへのポインタを渡してやればいいのではないでしょうか?
ポインタなり参照なりを渡してもよいですし、そもそもplayerもグローバル変数なので直接触れるはずです。
ただし、player[1]というのは存在しませんのでアクセスできません。
18ポイント を手に入れた。
|
|
|
|
|
Name: kaiten ..初心者(5,570ポイント)
Date: 2008/11/24(月) 16:39
No:24496
| 解決!
|
Title: Re:std::vectorの使い方
|
|
うーむ、まずはもう少しC++そのものに慣れて頭を整理してからもう一度挑戦することにします。
ともあれ、本当にありがとうございました。
4ポイント を手に入れた。
|
|
|
|
|