|
|
Name: Mist ..プログラマー(35,059ポイント)
Date: 2008/12/08(月) 22:11
No:25343
|
|
Title: Re:LP_solveをC言語の中で使う方法について質問です。
|
|
> なお、想定している計算機環境は、以下の通りです。
> ・Linux (debian) カーネル2.4
> ・gcc (g++) version 2.95.4
> ・lp_solve 4.0
って書いてあるからWindows環境でやるならCygwinをインストールするとかしないと無理じゃないですか。
44ポイント を落としてしまった。
|
|
|
|
|
Name: box ..ハッカー(131,227ポイント)
Date: 2008/12/08(月) 22:28
No:25344
|
|
Title: Re:LP_solveをC言語の中で使う方法について質問です。
|
|
> を参考に試してみたのですが、環境が違うせいかコンパイルが上手くいきません。
そういう場合は、さしあたり、コンパイル時に出たエラーメッセージの全文を
コピー&ペーストしてみるとよいでしょう。
実は、「うまくいきません」とだけ言うのは、
「何も言っていない」のと同じことだったりします。
99ポイント を手に入れた。
|
|
|
|
|
Name: VARIO ..ぴよぴよ(377ポイント)
Date: 2008/12/08(月) 22:29
No:25345
|
|
Title: Re:LP_solveをC言語の中で使う方法について質問です。
|
|
回答ありがとうございます。
では、Cのプログラムから外部のlp_solve.exeを実行する、ということは可能でしょうか?
具体的には、
Cにより制約式を作成し、seiyaku.txtを出力する。(ここまではできています。)
↓
このseiyaku.txtをlp_solve.exeに読み込ませ、最適化を行い、
kekka.txtに出力を行う。
この一連の動作を全てCで行いたいのです。
lp_solve.exeは、通常、
c:\lp_solve.exe < c:\seiyaku.txt > c:\kekka.txt
のようにコマンドプロンプトで実行するプログラムです。
201ポイント を手に入れた。
|
|
|
|
|
Name: VARIO ..ぴよぴよ(407ポイント)
Date: 2008/12/08(月) 22:54
No:25348
|
|
Title: Re:LP_solveをC言語の中で使う方法について質問です。
|
|
>>たかぎさん
すみませんでした。重複の質問は削除しました。
困ってるので、よろしくお願いします。
30ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(284,364ポイント)
Date: 2008/12/09(火) 01:18
No:25358
|
|
Title: Re:LP_solveをC言語の中で使う方法について質問です。
|
|
Windows (VisualC++)用ありましたよ、一緒のところに。
それを使えばいいんじゃないですか?
43ポイント を手に入れた。
|
|
|
|
|
Name: VARIO ..ぴよぴよ(450ポイント)
Date: 2008/12/09(火) 02:35
No:25359
|
|
Title: Re:LP_solveをC言語の中で使う方法について質問です。
|
|
>>ハッカーさん
一緒のところとはどこでしょうか??
見落としてしまってすみません。
43ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..上級者(20,581ポイント)
Date: 2008/12/09(火) 09:24
No:25362
|
|
Title: Re:LP_solveをC言語の中で使う方法について質問です。
|
|
lp_solve_5.5.0.13_dev.zip
これに作成済みのWindows用ライブラリがあるのでこれを使うのが良さそうです
45ポイント を手に入れた。
|
|
|
|
|
Name: VARIO ..かけだし(1,436ポイント)
Date: 2008/12/09(火) 16:25
No:25401
|
|
Title: Re:LP_solveをC言語の中で使う方法について質問です。
|
|
皆さんありがとうございます。
ご指導の通り、Windows用ライブラリをインクルードしてみたのですが、
c:\program files\microsoft sdks\windows\v6.0a\include\basetsd.h(434) : warning C4005: 'MAXUINT32' : マクロが再定義されました。
c:\program files\microsoft visual studio 9.0\vc\include\lp_types.h(55) : 'MAXUINT32' の前の定義を確認してください
c:\program files\microsoft sdks\windows\v6.0a\include\basetsd.h(435) : warning C4005: 'MAXINT32' : マクロが再定義されました。
c:\program files\microsoft visual studio 9.0\vc\include\lp_types.h(52) : 'MAXINT32' の前の定義を確認してください
c:\program files\microsoft sdks\windows\v6.0a\include\basetsd.h(438) : warning C4005: 'MAXUINT64' : マクロが再定義されました。
c:\program files\microsoft visual studio 9.0\vc\include\lp_types.h(67) : 'MAXUINT64' の前の定義を確認してください
c:\program files\microsoft sdks\windows\v6.0a\include\basetsd.h(439) : warning C4005: 'MAXINT64' : マクロが再定義されました。
c:\program files\microsoft visual studio 9.0\vc\include\lp_types.h(60) : 'MAXINT64' の前の定義を確認してください
リンクしています...
lp_solve.obj : error LNK2019: 未解決の外部シンボル _get_variables@8 が関数 _main で参照されました。
lp_solve.obj : error LNK2019: 未解決の外部シンボル _get_objective@4 が関数 _main で参照されました。
lp_solve.obj : error LNK2019: 未解決の外部シンボル _solve@4 が関数 _main で参照されました。
lp_solve.obj : error LNK2019: 未解決の外部シンボル _add_constraint@20 が関数 _main で参照されました。
lp_solve.obj : error LNK2019: 未解決の外部シンボル _set_maxim@4 が関数 _main で参照されました。
lp_solve.obj : error LNK2019: 未解決の外部シンボル _set_obj_fn@8 が関数 _main で参照されました。
lp_solve.obj : error LNK2019: 未解決の外部シンボル _make_lp@8 が関数 _main で参照されました。
C:\Users\IKEBE_Lab\Documents\Visual Studio 2008\Projects\lp_solve\Debug\lp_solve.exe : fatal error LNK1120: 外部参照 7 が未解決です。
このようなエラーが出てしまいました。
引き続き自力で頑張ってみます。
もし、何か解決策がありましたらご指導お願いします。
986ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..上級者(20,729ポイント)
Date: 2008/12/09(火) 17:23
No:25407
|
|
Title: Re:LP_solveをC言語の中で使う方法について質問です。
|
|
ライブラリがリンクされてないようです
プロジェクトのプロパティから「追加の依存ファイル」で追加するかソースファイルに
#pragma comment(lib, "lpsolve55.lib") // dllの場合
等でリンク指定しましょう
78ポイント を手に入れた。
|
|
|
|
Name: えっと ..かけだし(1,890ポイント)
Date: 2008/12/09(火) 05:50
No:25360
|
|
Title: 遠近法
|
|
プログラミング初心者ですが質問させて頂きます。
STGの背景のことなんですが、遠近法に従って画像をスクロールするやり方を教えてください。
奥のほうは縮小描画し、手前に来るにつれて、徐々に拡大されるようにしたいです。
(画像の大きさは描画される領域よりも充分に大きいです。)
コンパイラはVisualC++ 2008、ライブラリはDxライブラリです。
155ポイント を手に入れた。
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(917,012ポイント)
Date: 2008/12/09(火) 13:26
No:25381
|
|
Title: Re:遠近法
|
|
まず、常にカウントアップしているカウンタを使って表現してみましょう。
今、「count」という、メイン関数のループで、1周に1度だけ毎回カウントアップされるカウンタがあったとします。
FPS60のゲームならcountは1/60秒に1度、カウントアップされていきます。
もし龍神録プログラミングの館をご覧になったことがあれば、同じなので、そちら参考にして下さい。
下に4つ簡単な問題を作っておきましたので解いてみて下さい。
1、countを使って、600カウントを1ループとし、0〜599のカウントアップを繰り返す値をiCntに格納して下さい。
例
iCnt = count%1200 ;
2、iCntを使って、600カウントの時間で、1000ピクセル移動する速さで動く物体を描画するサンプルを書いて下さい(描画関数の座標部分だけでOK)
例
DrawGraph(0,iCnt,...);
3、600カウントの時間で、1000ピクセル移動する速さで動く物体を描画、
300カウントの時間で、1000ピクセル移動する速さで動く物体を描画 するサンプルを書いて下さい(上記同様)
4、640x480のサイズのウィンドウに640x480のサイズの画像をスクロール、例えば
DrawGraph(0,iCnt,...);
したのでは、スクロールするごとに上に隙間ができてしまいます。これを2枚座標をずらして描画することで、
描画されていない部分をなくして描画するサンプルを書いて下さい(上記同様)
これが4まで解ければ、ご自分のプログラムに応用できると思います。
あと、縮小描画するということですが、同じ画像をずらしてスクロールさせるのですか?
どのような画像かわかりませんが、かなり大きな画像になってしまい、メモリを食ってしまう恐れがあります。
例えば640x480のウィンドウに1/3描画して画面いっぱいに表示しようとしたら、9倍の面積の画像が必要です。
そこは、既に縮小した画像を用意したほうがいいかもしれません。
805ポイント を手に入れた。
|
|
|
|
|
Name: えっと ..かけだし(2,145ポイント)
Date: 2008/12/09(火) 15:37
No:25396
|
|
Title: Re:遠近法
|
|
1、
iCnt = count%600 ;
2、
DrawGraph(0,iCnt*1000/600,...);
3、
DrawGraph(0,iCnt*1000/600,...);
DrawGraph(0,iCnt*1000/300,...);
4、
1、のiCntでは出来なかったので、
iCnt = count%480;として、
DrawGraph(0,iCnt,...);
DrawGraph(0,iCnt-480,...);
これでいいんでしょうか?
画像の大きさをカウンタに連動させるには、
iCnt = count%480;
DrawRotaGraph(320,iCnt+240,3-iCnt*2/600,...);
DrawRotaGraph(320,iCnt+240-480,?
こうすると?(拡大率)の部分が書けなくなってくるし・・
やり方がわかりません・・。
255ポイント を手に入れた。
|
|
|
|
|
Name: えっと ..かけだし(2,192ポイント)
Date: 2008/12/09(火) 15:55
No:25397
|
|
Title: Re:遠近法
|
|
(訂正:下から5行目、DrawRotaGraph(...,3-iCnt*2/480,...)の間違いです。この書き方自体間違ってる可能性ありますが・・。)
47ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(917,492ポイント)
Date: 2008/12/09(火) 16:03
No:25398
|
|
Title: Re:遠近法
|
|
おぉ、いいですね。
ただ、
DrawGraph(0,iCnt*1000/600,...);
DrawGraph(0,iCnt*1000/300,...);
この部分は、例えば後者が「302」のような中途半端な数字の時出来ないので
int iCnt1 = count % 600;
int iCnt2 = count % 302;
DrawGraph(0,iCnt1*1000/600,...);
DrawGraph(0,iCnt2*1000/302,...);
こんな感じで変数分けた方がいいかもしれませんね。
お書きになった順番で計算すれば正確な値がきちんと出るはずです。
どちらがわかりやすいかは人によって違うでしょうけど、
DrawGraph(0, (int)(iCnt1/600.0 *1000) , ...);
iCnt1は0〜599を繰り返す変数ですから、iCnt1/600.0こうすることでdouble型となり、
0<=○<1の範囲を変化する値となります。それに1000ピクセルをかけた方が理解しやすかったらこちらでもいいかもしれません。
もしお書きになったプログラムのほうがわかりやすければいちいちキャストする必要がない、その方法のほうが良いと思います。一応紹介だけしておきました。
あと、遠近法ということですが、もしかして、横スクロール、縦スクロールにおけるスクロールの速さを変え、階層わけして描画して奥行きを出す方法ではなく、
3次元空間を計算して描画する方法でしょうか?
もしよければここで公開している四聖龍神録Plusというゲームをみていただきたいのですが、
この1面の背景のように、スクロールの速さを変えて奥行きを出す方法か
メニューのExtraStageから選択できるPhantasmステージのように3次元空間を計算して物体の大きさを変化させる方法かどちらかあると思いますが、
どちらでしょうか?
388ポイント を手に入れた。
|
|
|
|
|
Name: えっと ..かけだし(2,290ポイント)
Date: 2008/12/09(火) 16:55
No:25403
|
|
Title: Re:遠近法
|
|
四聖龍神録Plusを見てみました。
なるほど、スクロールの速さを変えても奥行き感を表現できるのですね。
私がイメージしているのはまさにPhantasmステージのような3次元空間を利用するものです。
98ポイント を手に入れた。
|
|
|
|
Name: じゅん ..ぴよぴよ(4ポイント)
Date: 2008/12/09(火) 14:19
No:25382
|
|
Title: C言語 スレッドについて
|
|
勉強方法もわからず困っています>< 定義や考え方、参考書など教えてください
4ポイント を手に入れた。
|
|
|
|
Name: じゅん ..ぴよぴよ(61ポイント)
Date: 2008/12/09(火) 14:31
No:25389
|
|
Title: C言語 スレッドについて
|
|
開発環境はCです。 猫、、は情報が古く初心者向けではありませんでした
39ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(132,872ポイント)
Date: 2008/12/09(火) 14:46
No:25390
|
|
Title: Re:C言語 スレッドについて
|
|
定義や考え方だけなら、猫で充分だと思いますが…(^_^;)
私が参考にしたのは『Windowsゲームプログラミング』という書籍です。
開発環境が分からない(Cというのは開発言語です)ので、Windowsじゃなかったら、ごめんなさいm(_ _)m
101ポイント を手に入れた。
|
|
|
|
Name: s-rush ..ぴよぴよ(989ポイント)
Date: 2008/12/04(木) 01:50
No:25016
|
|
Title: ゲーム開発について
|
|
はじめましてs-rushといいます。
今、プログラミング技術向上のためポ○モンのゲームを作っています。
内容としては完全なパクリ作品ですが^^;
少しプログラムを組んでみたのですが、コンパイルの際エラーが出てしまって解決法が分かりません。
Visual C++ 2008 Express Edition で開発しています。
ライブラリはDXライブラリを使用しています。
C言語自体はある程度できるつもりですが、こういった物を開発するのは初めてなのでよろしくお願いします。
====================================main.cpp====================================
#include "GV.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; //ウィンドウモードにする。
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了
int White;
White = GetColor( 255 , 255 , 255 ) ; // 白色の値を取得
//動作実験
DrawFormatString( 0, 0, White , "a=%d" , poke[1].number );//文字列表示
DrawFormatString(100,100, White , "name=%s" , poke[1].name);//文字列表示
DrawFormatString( 0, 100, White , "int_atack=%d" , damege(50, 107, 120, 118) );
DrawFormatString( 0, 200, White , "int_atack=%d" , damege(50, 107, 120, 118) );
DrawFormatString( 0, 300, White , "int_atack=%d" , damege(50, 107, 120, 118) );
WaitKey() ; // キーの入力待ち(『WaitKey』を使用)
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
====================================battle.cpp====================================
#include "GV.h"
int damege(int LV, int atk, int power, int def);
float GetRandom(float max);
void battle()
{
int atk_p = damege(50, 107, 120, 118);
return;
}
int damege(int LV, int atk, int power, int def)
{
int type_relation=1; //タイプ関係
float ransu; //乱数
int critical; //急所
int damage_point; //ダメージ値
int damage_judg; //急所判定
ransu = (GetRandom(15)+85)/100;
damage_judg=GetRandom(10);
if(damage_judg == 0)
critical = 0;
else if(damage_judg == 9 && damage_judg == 10)
critical = 2;
else
critical = 1;
//「『レベル×0.4+2』×攻撃×技の威力÷防御÷50+2」×タイプ関係×乱数×急所
damage_point = ( (LV*0.4+2) *atk*power/(def*50)+2) *(type_relation*ransu*critical);
return damage_point;
}
float GetRandom(float max)
{
float random = GetRand(max);
return random;
}
989ポイント を手に入れた。
|
|
|
|
Name: s-rush ..入門者(4,371ポイント)
Date: 2008/12/04(木) 01:54
No:25017
|
|
Title: Re:ゲーム開発について
|
|
入りきらなかったので続き分です。
====================================GV.h====================================
#include "DxLib.h"
typedef struct {
int number;
char name[32];
int type1;
int type2;
}poke_tag;
poke_tag poke[492]={
{1,"フシギダネ",0,1},
{2,"フシギソウ",0,1}
};
extern void battle();
extern int damege(int LV, int atk, int power, int def);
コンパイルエラー
1>main.obj : error LNK2005: "struct poke_tag * poke" (?poke@@3PAUpoke_tag@@A) は既に battle.obj で定義されています。
1>main.obj : error LNK2019: 未解決の外部シンボル "int __cdecl GetColor(int,int,int)" (?GetColor@@YAHHHH@Z) が関数 _WinMain@16 で参照されました。
1>DxUseCLib.lib(DxUseCLibOgg.obj) : error LNK2019: 未解決の外部シンボル _theora_packet_iskeyframe が関数 "int __cdecl TheoraDecode_InitializeStream(struct tagSTREAMDATASHREDTYPE2 *,int,int)" (?TheoraDecode_InitializeStream@@YAHPAUtagSTREAMDATASHREDTYPE2@@HH@Z) で参照されました。
1>DxUseCLib.lib(DxUseCLibOgg.obj) : error LNK2019: 未解決の外部シンボル _theora_decode_init が関数 "int __cdecl TheoraDecode_InitializeStream(struct tagSTREAMDATASHREDTYPE2 *,int,int)" (?TheoraDecode_InitializeStream@@YAHPAUtagSTREAMDATASHREDTYPE2@@HH@Z) で参照されました。
1>DxUseCLib.lib(DxUseCLibOgg.obj) : error LNK2019: 未解決の外部シンボル _theora_comment_init が関数 "int __cdecl TheoraDecode_InitializeStream(struct tagSTREAMDATASHREDTYPE2 *,int,int)" (?TheoraDecode_InitializeStream@@YAHPAUtagSTREAMDATASHREDTYPE2@@HH@Z) で参照されました。
1>DxUseCLib.lib(DxUseCLibOgg.obj) : error LNK2019: 未解決の外部シンボル _theora_info_init が関数 "int __cdecl TheoraDecode_InitializeStream(struct tagSTREAMDATASHREDTYPE2 *,int,int)" (?TheoraDecode_InitializeStream@@YAHPAUtagSTREAMDATASHREDTYPE2@@HH@Z) で参照されました。
1>DxUseCLib.lib(DxUseCLibOgg.obj) : error LNK2019: 未解決の外部シンボル _theora_info_clear が関数 "int __cdecl TheoraDecode_Terminate(int)" (?TheoraDecode_Terminate@@YAHH@Z) で参照されました。
1>DxUseCLib.lib(DxUseCLibOgg.obj) : error LNK2019: 未解決の外部シンボル _theora_comment_clear が関数 "int __cdecl TheoraDecode_Terminate(int)" (?TheoraDecode_Terminate@@YAHH@Z) で参照されました。
1>DxUseCLib.lib(DxUseCLibOgg.obj) : error LNK2019: 未解決の外部シンボル _theora_clear が関数 "int __cdecl TheoraDecode_Terminate(int)" (?TheoraDecode_Terminate@@YAHH@Z) で参照されました。
1>DxUseCLib.lib(DxUseCLibOgg.obj) : error LNK2019: 未解決の外部シンボル _theora_decode_header が関数 "int __cdecl TheoraDecode_ReadHeader(struct tagDECODE_THEORA *)" (?TheoraDecode_ReadHeader@@YAHPAUtagDECODE_THEORA@@@Z) で参照されました。
1>DxUseCLib.lib(DxUseCLibOgg.obj) : error LNK2019: 未解決の外部シンボル _theora_decode_YUVout が関数 "unsigned long __stdcall TheoraDecode_Thread(void *)" (?TheoraDecode_Thread@@YGKPAX@Z) で参照されました。
1>DxUseCLib.lib(DxUseCLibOgg.obj) : error LNK2019: 未解決の外部シンボル _theora_decode_packetin が関数 "int __cdecl _TheoraDecode_IncToFrame(int,int)" (?_TheoraDecode_IncToFrame@@YAHHH@Z) で参照されました。
1>libjpeg.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _jtransform_execute_transformation が関数 _main で参照されました。
1>libjpeg.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _jcopy_markers_execute が関数 _main で参照されました。
1>libjpeg.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _jtransform_adjust_parameters が関数 _main で参照されました。
1>libjpeg.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _jtransform_request_workspace が関数 _main で参照されました。
1>libjpeg.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _jcopy_markers_setup が関数 _main で参照されました。
1>libjpeg.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _write_stdout が関数 _main で参照されました。
1>libjpeg.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _read_stdin が関数 _main で参照されました。
1>libjpeg.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _read_scan_script が関数 _parse_switches で参照されました。
1>libjpeg.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _keymatch が関数 _parse_switches で参照されました。
1>C:\Users\yossyk7\Documents\Visual Studio 2008\Projects\pokemon1\Debug\pokemon1.exe : fatal error LNK1120: 外部参照 20 が未解決です。
1>ビルドログは "file://c:\Users\yossyk7\Documents\Visual Studio 2008\Projects\pokemon1\pokemon1\Debug\BuildLog.htm" に保存されました。
1>pokemon1 - エラー 22、警告 4
プログラム自体はまだまだ未完成の状態なのですが、戦闘プログラムの1部分で、
ダメージ計算をするプログラムなんです。
実験段階なので、int damege(int LV, int atk, int power, int def)の引数はあらかじめ入力してあります。
構造体の配列に関してはプログラム内(GV.h)で考えていただいてかまいません。
よろしくお願いします。
2倍のポイントを手に入れた! 3,382ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(281,233ポイント)
Date: 2008/12/04(木) 02:35
No:25018
|
|
Title: Re:ゲーム開発について
|
|
いろいろ問題があって一度では解決出来るかわかりませんが。
まず、poke_tag poke[492]。ヘッダにグローバル変数を定義しているので
多重定義でエラーになっています。
C言語編 第32章 ファイル分割
ttp://www.geocities.jp/ky_webid/c/032.html
次に DXライブラリのヘッダのバージョンと*.libのバージョンは同じですか?
ライブラリのヘッダが古いように見えます。
183ポイント を手に入れた。
|
|
|
|
|
Name: s-rush ..入門者(4,495ポイント)
Date: 2008/12/06(土) 00:04
No:25180
|
|
Title: Re:ゲーム開発について
|
|
ご指摘があったpoke_tag poke[492]を
extern poke_tag poke[492];
と変更してみましたが、やっぱりエラーが出ます。
エラー内容も変わらず、22ものエラーが出てます。
未解決の外部シンボルがありますばかりなのですが、
これってどういうエラーなんですか?
解決法があれば並べて回答お願いします。
124ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(281,811ポイント)
Date: 2008/12/06(土) 01:11
No:25183
|
|
Title: Re:ゲーム開発について
|
|
>と変更してみましたが、やっぱりエラーが出ます
「いろいろ問題があって」と書いたとおり問題が複数あるので、
そこだけ直しても全てのエラーを無くすことは難しいでしょう。
まず、一番上の
「error LNK2005: "struct poke_tag * poke" (?poke@@3PAUpoke_tag@@A) は既に battle.obj で定義されています」から
考えていきましょう。
このエラーは複数の翻訳単位で同じ変数が定義されてしまっていることに起因しているので、
>extern poke_tag poke[492];
と変更してみましたが
これが正しく修正されて……先に紹介したページに習って、
ヘッダ側は externを付けて初期化はしない、ソース側はどれか1つのソースだけに
externなしで定義すればこのエラーは消えるはずなのですが、
具体的にどう修正しましたか?
# ところで結局ライブラリのヘッダと libファイルのバージョンは同じものだったのですか?
406ポイント を手に入れた。
|
|
|
|
|
Name: s-rush ..入門者(4,751ポイント)
Date: 2008/12/06(土) 22:08
No:25250
|
|
Title: Re:ゲーム開発について
|
|
#include "DxLib.h"
typedef struct {
int number;
char name[32];
int type1;
int type2;
}poke_tag;
extern poke_tag poke[492]={
{1,"フシギダネ",0,1},
{2,"フシギソウ",0,1}
};
extern poke_tag poke[492];
extern void battle();
extern int damege(int LV, int atk, int power, int def);
という感じに修正して、ほかのファイルはいじっていません。
ライブラリのヘッダと libファイルのバージョンは同じだと思います。
念のために、再度DLしておきましたが、やっぱりエラー内容に変化はありませんでした。
256ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(284,060ポイント)
Date: 2008/12/06(土) 22:45
No:25255
|
|
Title: Re:ゲーム開発について
|
|
>という感じに修正して、ほかのファイルはいじっていません
先に紹介したページをもう一度頭から読み直して下さい。
「複数宣言の問題〜次のプログラムは正しいでしょうか?」と同じ間違いをしています。
今ヘッダに pokeが2つありますよね?
片方のextern poke_tag poke[492];とした方はいいのですが、
もう片方は{1,"フシギダネ",0,1}などの初期化がついています。
これはどこで行うべきなのか考えてみて下さい。
>ライブラリのヘッダと libファイルのバージョンは同じだと思います
そうですか。
一応念の為にお訊きしますが、今使っている dxlib.hの GetColor(int Red, int Green, int Blue)関数の
戻り値は何になっていますか?
VisualStudioをお使いでしたら、GetColor()が使われているところで右クリックしたときに
現れるメニューから「宣言へ移動」を選べば簡単に確認できます。
498ポイント を手に入れた。
|
|
|
|
|
Name: s-rush ..入門者(4,953ポイント)
Date: 2008/12/07(日) 22:36
No:25310
|
|
Title: Re:ゲーム開発について
|
|
extern poke_tag poke[492];の初期値の設定({1,"フシギダネ",0,1}など)は
各ファイルで宣言するべきだと思うんですけど、
この初期値をほかの関数でも使いたいんです。
となると、すべてのファイル内で、同じ宣言をしなければいけなくなるんではないのでしょうか??
この構造体の初期値をテーブル?のように扱い、複数の関数で任意のタイミングで読み込みをしたいんです。
ネットで調べてはみたんですけど、このように使うときの説明がされているホームページが見つかりません。
まずは自分で調べてみようと思っているので、参考になるホームページがあれば教えてください。
GetColor(int Red, int Green, int Blue)の戻り値を調べてみたんですけど、
このような表記しかありませんでした。
extern int GetColor( int Red, int Green, int Blue ) ;
202ポイント を手に入れた。
|
|
|
|
|
Name: conio ..初心者(7,899ポイント)
Date: 2008/12/07(日) 22:53
No:25315
|
|
Title: Re:ゲーム開発について
|
|
>> extern poke_tag poke[492];の初期値の設定({1,"フシギダネ",0,1}など)は
>>各ファイルで宣言するべきだと思うんですけど、
----------------------------------------
extern poke_tag poke[492]={
{1,"フシギダネ",0,1},
{2,"フシギソウ",0,1}
};
----------------------------------------
extern宣言であっても、初期化をしてしまうと"実体を定義する宣言"として扱われてしまいます。
よって、多重定義でエラーが出ます。
各ファイルごとに定義すべきでは無いと思います。
180ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(284,745ポイント)
Date: 2008/12/07(日) 23:00
No:25317
|
|
Title: Re:ゲーム開発について
|
|
>この初期値をほかの関数でも使いたいんです
どこか1つの……例えば main.cpp……で定義と初期化し、他のソースファイルで
externで参照すれば、その初期化した値を読むことができますよ。
なので、
>すべてのファイル内で、同じ宣言をしなければいけなくなるんではないのでしょうか??
初期化は1つでいいです。後のファイルは externを使って参照して下さい。
>まずは自分で調べてみようと思っているので、参考になるホームページがあれば教えてください
それが、先に紹介したページなのですが(^^
ほら、「○複数宣言の問題」のところで、「これをうまく書くには、extern指定子というものを使います」
の後の3つのコードがそれです。
グローバル変数 g_numは main.cで定義され、200で初期化されています。
sub.hでは g_numを externして、sub.cでは sub.hをインクルードすることで
sub.cで g_num変数が使えるようにしています。
>extern int GetColor( int Red, int Green, int Blue ) ;
やっぱりヘッダは結構古そうですね。
今の最新(2.25)は戻り値は intではなく DWORDなんですよ。
先の投稿で再DLしたというDXライブラリのヘッダと比べてみて下さい。
保存された日付とか内容とかが異なるはずです。
*.lib側は最新かどうかわかりませんが、Debugビルドなのに DxUseCLib.libが
使われていたり、DxUseCLibOgg.objがあることから比較的新しいバージョンのようです。
念のため、使っているDXライブラリのヘッダとライブラリを
最新のものに更新してみて下さい。
それで、半分〜大半のエラーはとれるはずです。
325ポイント を手に入れた。
|
|
|
|
|
Name: s-rush ..初心者(5,580ポイント)
Date: 2008/12/07(日) 23:57
No:25322
|
|
Title: Re:ゲーム開発について
|
|
externのことで少し勘違いしていたようです。
Justyさんのアドバイスを参考に、新たにpoke_table.cppというファイルを新たに作り、
そこにpoke_tagの宣言、初期化を行ったところ多重定義エラーが消えました。
一応ソースコード載せておきます。
====================GV.h=============================
#include "DxLib.h"
typedef struct {
int number;
char name[32];
int type1;
int type2;
}poke_tag;
extern poke_tag poke[492];
extern void battle();
extern int damege(int LV, int atk, int power, int def);
===================poke_table.cpp==========================
#include "GV.h"
poke_tag poke[492]={
{1,"フシギダネ",0,1},
{2,"フシギソウ",0,1}
};
poke_tag, poke[492]はのちに変更するつもりですが、こんな感じで大丈夫だと思います。
ご指摘通りDXライブラリをVer2.25のものに置き換えてコンパイルしたところ、
エラーが半分に減りました。
あとはこのエラーだけです。
1>libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _jtransform_execute_transformation が関数 _main で参照されました。
1>libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _jcopy_markers_execute が関数 _main で参照されました。
1>libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _jtransform_adjust_parameters が関数 _main で参照されました。
1>libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _jtransform_request_workspace が関数 _main で参照されました。
1>libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _jcopy_markers_setup が関数 _main で参照されました。
1>libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _write_stdout が関数 _main で参照されました。
1>libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _read_stdin が関数 _main で参照されました。
1>libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _read_scan_script が関数 _parse_switches で参照されました。
1>libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _keymatch が関数 _parse_switches で参照されました。
1>C:\Users\yossyk7\Documents\Visual Studio 2008\Projects\pokemon1\Debug\pokemon1.exe : fatal error LNK1120: 外部参照 9 が未解決です。
1>ビルドログは "file://c:\Users\yossyk7\Documents\Visual Studio 2008\Projects\pokemon1\pokemon1\Debug\BuildLog.htm" に保存されました。
1>pokemon1 - エラー 10、警告 4
627ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(285,041ポイント)
Date: 2008/12/08(月) 00:49
No:25323
|
|
Title: Re:ゲーム開発について
|
|
>一応ソースコード載せておきます。
OKです。
>libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _jtransform_execute_transformation
あと少し、ですね。
このエラーはプロジェクトの設定に問題がある場合に起きることが多いです。
チェック項目は2つあります。
1つ目はプロジェクトのプロパティから、「構成プロパティ -> C/C++ -> コード生成 -> ランタイムライブラリ 」の
設定を見て下さい。
ここが「マルチスレッド デバッグ (/MTd)」になっていますか?
なっていなければ、それに設定してみて下さい。
ttp://homepage2.nifty.com/natupaji/DxLib/dxuse_vc2008express.html#R4
2つ目は同じくプロジェクトのプロパティから「構成プロパティ -> リンカ -> システム -> サブシステム」を
の設定を見て下さい。
ここが「Windows (/SUBSYSTEM:WINDOWS)」になっていますでしょうか?
なっていなければ、それに設定してみて下さい。
# 多分後者、かな。
296ポイント を手に入れた。
|
|
|
|
|
Name: s-rush ..初心者(5,743ポイント)
Date: 2008/12/08(月) 13:30
No:25325
|
|
Title: Re:ゲーム開発について
|
|
ありがとうございます。
無事に解決できました。
原因はリンカの設定になるんでしょうか?
これの設定をしていませんでした。
DXライブラリを使用する際の設定を調べてやっていたんですけど、
後者の方の設定が自分の見たホームページ(複数あります)には載っていませんでした。
ついでなのですが、多重定義エラーについてはなぜそのようなことになるのかわかったのですが、
他の
"未解決の外部シンボル ****が関数---で参照されました。"
というエラーはどういう意味なんでしょうか?
また、どのような時に発生するエラーなのでしょうか?
今後、またこのようなエラーが発生するかもしれないので、できたら回答お願いします。
163ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..熟練のプログラマー(44,298ポイント)
Date: 2008/12/08(月) 14:04
No:25326
|
|
Title: Re:ゲーム開発について
|
|
> "未解決の外部シンボル ****が関数---で参照されました。"
は、リンクされるシンボル(関数やグローバル変数など)が無く、リンクされる関数の中でそのリンクされていない(存在しない)シンボルを使おうとして出るエラーです。
なので、そのシンボルが存在するライブラリをリンクすればOK、ということになります。
115ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(284,321ポイント)
Date: 2008/12/08(月) 23:13
No:25351
|
|
Title: Re:ゲーム開発について
|
|
>後者の方の設定が自分の見たホームページ(複数あります)には載っていませんでした
あー、まぁ、DXライブラリを使って Windowsアプリを作るのに
(最初のアプリケーションウィザードの選択肢やプロジェクトの設定で)コンソールにする人は
いない、と思ったのでしょうね。
>また、どのような時に発生するエラーなのでしょうか?
エラーの内容は御津凪さんの回答の通りです。
ちなみに、今回のサブシステムをコンソールにするとリンクエラーになるのは
多分DXライブラリ、というかその付属物の不具合である可能性があります。
libjpeg_d.lib/libjpeg.lib の元のライブラリのソースコードには jpegtran.c という
ソースが付いてきますが、これは本来 libをビルドする際には必要ないので
含まれないはずなのに、何故か含まれてlibjpeg_d.lib/libjpeg.lib がビルドされています。
jpegtranは検索するとわかりますが、これはアプリケーションの名前で、
このソースには main関数が含まれています。
実はリンクエラーになっている jtransform_execute_transformation 関数や
jcopy_markers_execute 関数などはこの中で使われています。
(エントリーポイントの設定は変更していない状態では)、サブシステムが
「コンソール(/SUBSYSTEM:CONSOLE)」になっているとユーザーから見た
最初に実行される関数は main関数となりますが、ユーザーが書いた main関数よりも先に
ライブラリ内部にある main関数が評価され、jtransform_execute_transformation 関数などを
探しに行きます。
ところが、jtransform_execute_transformation 関数などは libjpeg_d.lib/libjpeg.libには含まれていない
trunsupp.c というソースの中で定義されており、どこにもその関数が存在しない
ということでエラーになっている、というのが真相のようです。
ちなみに「Windows (/SUBSYSTEM:WINDOWS)」でビルドしたときは WinMain関数から始まるので
ライブラリ内の main関数は使われず無視されます。
使われない main関数で呼ばれる jtransform_execute_transformation 関数なども
使われないので、リンクの必要なしと判断されリンクエラーになっていません。
720ポイント を落としてしまった。
|
|
|
|
|
Name: s-rush ..初心者(5,862ポイント)
Date: 2008/12/09(火) 13:06
No:25379
| 解決!
|
Title: Re:ゲーム開発について
|
|
アドバイスしていただいた方、本当にありがとうございました。
これでやっと次のシステムのプログラムを組むことができます。
ゲーム製作は初めてなので、知らないことや分からないことがたくさんあるので、
詰まったときは、また質問させていただくと思うので、
そのときはまたよろしくお願いします。
もちろん事前に調べたりして、最大限の努力はします。
119ポイント を手に入れた。
|
|
|
|
Name: ざこ ..かけだし(2,139ポイント)
Date: 2008/12/09(火) 10:05
No:25366
|
|
Title: バイナリファイル
|
|
先日バイナリファイルについてご質問させていただいたのですが、先日の件は納得できたのですが
思うように実行できないのでご質問させていただきます。
int main(void)
{
FILE *file;
long buf[100];
file=fopen("ファイル名","rb");
fread(buf,sizeof(long),1,file);
printf("%x",buf);
fclose(file);
}
基礎プログラムだと思いますがこのプログラムは
ファイルから4バイトずつを1回読み込んでbufに格納しprintfで16進数で表示するというプログラムだと思います。
この読み込んだファイルの内容は
000000 90 7D 8C 60 50 00 BE 02・・・
という内容です。
ということは 90 7D 8C 60 と4バイト分読み込み表示されると思うのですが・・
実際にbuf内に入っているのは 0x0012fdec となっています。これは何が間違っているのでしょうか?
258ポイント を手に入れた。
|
|
|
|
Name: 御津凪 [URL] ..熟練のプログラマー(44,446ポイント)
Date: 2008/12/09(火) 10:21
No:25367
|
|
Title: Re:バイナリファイル
|
|
> printf("%x",buf);
ここで渡している buf が問題です。
printf では、基本、値で渡します(文字列はポインタで渡す)、
buf は配列なので、これは先頭のポインタを渡していることになります。
(表示されている値はポインタ値です)
なので、この場合では、
printf("%x",*buf);
と書くのが処理として正しいです。
あと、16進数8桁表示(幅固定)で表示するには、"%x"を、"%8x"か"%08x"にすると良いでしょう。
148ポイント を手に入れた。
|
|
|
|
|
Name: ざこ ..かけだし(2,195ポイント)
Date: 2008/12/09(火) 10:34
No:25369
|
|
Title: Re:バイナリファイル
|
|
1つご質問を
>buf は配列なので、これは先頭のポインタを渡していることになります。
について少し詳しく教えてください。
表示された内容がポインタなのはわかります。
56ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..熟練のプログラマー(44,654ポイント)
Date: 2008/12/09(火) 11:19
No:25371
|
|
Title: Re:バイナリファイル
|
|
> >buf は配列なので、これは先頭のポインタを渡していることになります。
>
> について少し詳しく教えてください。
配列は、連続したデータを持ちます。
連続したデータということは、アドレスが隣り合わせになっていることを示します。
そして、配列の変数は、配列そのものを持っているわけでなく、配列へのポインタを指しています。
ここで、先頭のポインタ、というのは、「配列」の0番目を指すポインタのことですね。
long buf[100];
と、配列を用意した時、
buf[0] は先頭のデータを指します。
*buf も先頭のデータを指します。
先頭のポインタを指す時は、 &buf[0] で表せます。
と、いうことは、 buf でも先頭のポインタを指します。
これは、他の型の配列でも同じです。
文字列も配列の一つなので、このことが同様に当てはまります。
# ちなみに、 *(buf+1) は buf[1] と同じく、(buf+10) は、&buf[10] と同じです。
208ポイント を手に入れた。
|
|
|
|
|
Name: ざこ ..入門者(2,569ポイント)
Date: 2008/12/09(火) 11:40
No:25372
|
|
Title: Re:バイナリファイル
|
|
成る程、配列についてちゃんとわかってなかったみたいです。ありがとうございました。
最後にもう1つだけご質問なのですが、上記の例では4バイトを1回ずつ読み込み表示しました
結果 608C7D90となり、望む結果になりました。
ただ1バイトごとに4回読み込んでも同じ結果が得られるのでしょうか?
というのも2バイトのときはsizeof(short),4バイトのときはsizeof(long)と読み込むバイト数ごとに
変数を用意するというやり方もありますが、1バイトを4回読み込むなら用意する配列は1個ですむのだろうか・・と思いました。
int main(void)
{
FILE *file;
char buf[100];
file=fopen("ファイル名","rb");
fread(buf,sizeof(char),4,file);
printf("%8x",*buf);
fclose(file);
}
としましたが結果は fffff90 となり一致しません。
基本的なことで申し訳ないのですがしっかり理解しておきたいので教えてください。
374ポイント を手に入れた。
|
|
|
|
|
Name: non ..上級者(18,634ポイント)
Date: 2008/12/09(火) 11:49
No:25373
|
|
Title: Re:バイナリファイル
|
|
>printf("%8x",*buf);
これでは buf[0]のみ表示してます。1バイトなのに8桁も使って。
printf("%02x",buf[0]);
printf("%02x",buf[1]);
printf("%02x",buf[2]);
printf("%02x",buf[3)];
83ポイント を手に入れた。
|
|
|
|
|
Name: ざこ ..入門者(2,606ポイント)
Date: 2008/12/09(火) 11:53
No:25374
| 解決!
|
Title: Re:バイナリファイル
|
|
これはお恥ずかしい間違いのようです・・
ありがとうございました。
37ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..熟練のプログラマー(44,697ポイント)
Date: 2008/12/09(火) 11:54
No:25375
|
|
Title: Re:バイナリファイル
|
|
読み込み自体は正しいです。ちゃんと4バイト読み込んでいます。
ただし、char 型は1バイトで-128〜127までの数値を表現する型なので、
0x90 を読み込むと、10進数は char 型では -122 となり、その値で表示されています。
簡単に言うと、char 型では表現できる数が小さいので、正しく printf に渡せなかったわけです。
望みどおりの値を表示するには、
printf("%02x%02x%02x%02x",buf[0],buf[1],buf[2],buf[3]);
と、出力するか、型変換を使って強引に、
printf("%08x",*(long*)buf);
とすることで表示することが出来ます。
43ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..上級者(20,651ポイント)
Date: 2008/12/09(火) 12:05
No:25377
|
|
Title: Re:バイナリファイル
|
|
%xでchar型を表示するとintに変換されるので負の数がffffff90みたいになります
unsigned char buf[100];
にすればいいでしょう
(C99では%hhxでchar型の変換が出来ますが)
50ポイント を手に入れた。
|
|
|
|
Name: macka ..ぴよぴよ(411ポイント)
Date: 2008/12/08(月) 22:44
No:25347
|
|
Title: ポインタ
|
|
どうも、以前作成した下のプログラムで今はthe many peoplethe many peopleと出力されるのをthe many many peopleというように出力するようにしたいのですが、うまくいきません。うまくいくようにするにはどうすればよいでしょうか?お願いします。
<pre>#include<stdio.h>
#define B 256
int main(void)
{
char str[]="the many people";
char ptr[B],*s,*p;
int i=0;
s=str;
p=ptr;
do{
(*(p+i)=*(s+i));
}while('\0'!=*(s+i++));
while(*p)p++;
while(*p++=*s++);
printf("%s\n",ptr);
getchar ();
getchar ();
getchar ();
return 0;
}(/pre)
212ポイント を手に入れた。
|
|
|
|
Name: macka ..ぴよぴよ(465ポイント)
Date: 2008/12/08(月) 23:19
No:25352
|
|
Title: Re:ポインタ
|
|
書き忘れていましたが、16、17行目をかえるという課題です。
単語として処理するというのがよくわかりません、、、
54ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..中級者(11,021ポイント)
Date: 2008/12/08(月) 23:45
No:25353
|
|
Title: Re:ポインタ
|
|
>書き忘れていましたが、16、17行目をかえるという課題です。
何の事か良く分かりませんが、
スペースで区切るのはstrtokでググれば良いと思いますよ。
# 一応、strstrもありですが・・・・
73ポイント を手に入れた。
|
|
|
|
Name: ざこ ..かけだし(1,688ポイント)
Date: 2008/12/08(月) 17:52
No:25329
|
|
Title: プログラム
|
|
int main(void)
{
FILE *fp;
char buf[100];
short buf1;
file=fopen("ファイル名","rb");
fread(&buf,sizeof(char),8,file);
fread(&buf1,sizeof(buf1),1,file);
fclose(file);
printf("%d",buf1);
return 0;
}
バイナリエディタに関して学習してるのですがすっかり混乱してます。
とりあえずプログラムに書かれてることがどういうことかわからないと話にならないと思いますので
上記のプログラムの意味を教えていただけませんか?
221ポイント を手に入れた。
|
|
|
|
Name: Mist ..プログラマー(35,224ポイント)
Date: 2008/12/08(月) 18:11
No:25330
|
|
Title: Re:プログラム
|
|
まずfreadについて理解してください。
ファイルから size バイトのデータを n 個読み込み
【書式】
#include <stdio.h>
size_t fread(void *buf, size_t size, size_t n, FILE *fp);
【説明】
ファイルfpからsizeバイトのデータをn個読み込み、bufに格納します。ファイル位置指示子を読み込んだデータバイト分進めます。エラーが発生した場合にはファイル位置指示子の値は不定です。
【引数】
void *buf : 読み込みデータ格納先のポインタ
size_t size : 読み込みデータのバイト長さ
size_t n : 読み込みデータの数
FILE *fp : FILEポインタ
【戻り値】
正常時 : 読み込んだデータ個数(バイトではありません)
ファイル終了時及びエラー時 : nより小さな値
で、プログラムですが
> fread(&buf,sizeof(char),8,file);
ファイルから1バイトとずつ8回データを読む。
読み込んだデータをbufに書く。
ただし、このプログラムはバグっています。
正しくは
fread(buf,sizeof(char),8,file); // &いらない
> fread(&buf1,sizeof(buf1),1,file);
ファイルから2バイトとずつ1回データを読む。
読み込んだデータをbuf1に書く。
両方で10バイトリードしていますのでファイルに10バイト以上のデータがあることが前提です。
445ポイント を手に入れた。
|
|
|
|
|
Name: ざこ ..かけだし(1,746ポイント)
Date: 2008/12/08(月) 18:29
No:25332
|
|
Title: Re:プログラム
|
|
> fread(&buf1,sizeof(buf1),1,file);
ファイルから2バイトとずつ1回データを読む。
読み込んだデータをbuf1に書く
この2バイトとはどこから出てきたものなのでしょうか?
お手数ですが教えて下さい。
58ポイント を手に入れた。
|
|
|
|
|
Name: ざこ ..かけだし(1,750ポイント)
Date: 2008/12/08(月) 18:32
No:25333
|
|
Title: Re:プログラム
|
|
すいません。おそらくバイトの長さが2?だからなのだと思うのですが
sizeof(char)
sizeof(buf1)
がどうなってるのか教えて下さい。
4ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(35,103ポイント)
Date: 2008/12/08(月) 18:41
No:25334
|
|
Title: Re:プログラム
|
|
1から10まで回答するのは丸投げ臭いですし、sizeofはC言語の基礎ですから「sizeof演算子」でググってください。
いろいろな例がありますのでそれらで勉強してください。
余談
short buf1;
sizeof(buf1)
のサイズは厳密に言うと2バイトではないかもしれません。
環境に依存しますが、VCとかBCCであれば2です。
121ポイント を落としてしまった。
|
|
|
|
|
Name: ざこ ..かけだし(1,766ポイント)
Date: 2008/12/08(月) 18:57
No:25335
| 解決!
|
Title: Re:プログラム
|
|
なるほど
charのサイズが1で
shortのサイズが2
ということがわかりました。ありがとうございました。
16ポイント を手に入れた。
|
|
|
|
|
Name: 通りすがり ..中級者(13,583ポイント)
Date: 2008/12/08(月) 19:17
No:25336
|
|
Title: Re:プログラム
|
|
fopenの使い方、fcloseの使い方、freadの使い方、どれをググっても大量に説明が出てきます。
複雑な関数の使い方ならまだしも、質問されたコードは基本中の基本です。
わからないプログラムがあったとき、「はい、誰か説明して」と言う前に自分で調べましょう。
「調べるのが面倒だし、誰かに聞いた方が早い」と思っていると成長しません。
101ポイント を手に入れた。
|
|
|
|
|
Name: ざこ ..かけだし(1,881ポイント)
Date: 2008/12/08(月) 21:31
No:25338
|
|
Title: Re:プログラム
|
|
単純に語句がわからなかったんじゃなくイメージができなくて混乱したんです。
だからどういうプログラムなのかイメージしてから分解しようかと。実際にMistさんの丁寧な
説明がなければわからなかったと思います。バイトの長さ の認識が曖昧だったようです。
助言ありがとうございます。
115ポイント を手に入れた。
|
|
|
|
Name: non ..上級者(17,138ポイント)
Date: 2008/12/05(金) 14:30
No:25124
|
|
Title: 可変長配列ねぇ
|
|
雑談です
「とうや」さんのスレッド「周期境界条件を用いたプログラム」のプログラムを見ていたら
>int int_rnd(int N, int m, int *set)
>{
> int a,i,j,k,count;
> int blank[N];
> 以下略
なんてのがあるじゃないですか・・・いつのまにこんな事ができるようになったんだ・・・て
調べたらC99の新機能だとか。へぇーって。いやーあれば便利だよねって昔から思ってたんですよ。
それじゃ、試さなきゃと思い、BorlandC++5.0じゃ、きっと対応してないだろうと思い、やっぱ、
一番新しいのは、VC++2008だなと、試したらエラー。調べてみたら対応してないみたい。
試せるコンパイラないじゃないですか。なんだったら対応してるんですか?金無いけど。
250ポイント を手に入れた。
|
|
|
|
Name: non ..上級者(17,289ポイント)
Date: 2008/12/05(金) 14:49
No:25126
|
|
Title: Re:可変長配列ねぇ
|
|
GCCですか。
確か、TOPPERSの研修に行って、使いましたっけ?
あのときは Cygwin入れて、makeがえらくめんどくさいって記憶しか・・・
言われるとおりに、ただやっただけでコンパイラオプションの意味もわかりませんでした。
まったく下知識がないので、ずばり教えてください。
Widowsでやるときは、やっぱり、Cygwinの元で動かすのですか?
151ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(75,079ポイント)
Date: 2008/12/05(金) 15:08
No:25128
|
|
Title: Re:可変長配列ねぇ
|
|
> 確か、TOPPERSの研修に行って、使いましたっけ?
> あのときは Cygwin入れて、makeがえらくめんどくさいって記憶しか・・・
私もTOPPERSプロジェクトにかなり深く関わっていますので、その手の話はよく聞きますが...
TOPPERSの場合はクロスコンパイラを用意する必要があるので、自分でGCCやBinutilsをビルドする必要があるわけです。
組込み向けであれば、GCCに限らず、C99に対応した商用コンパイラも結構出ていますので、面倒ならそれらを購入するのが手っ取り早いですね。
> Widowsでやるときは、やっぱり、Cygwinの元で動かすのですか?
その方が便利だとは思います。
Cygwinなら-mno-cygwinオプションを付ければMinGWとしても使えます。
88ポイント を手に入れた。
|
|
|
|
|
Name: non ..上級者(17,412ポイント)
Date: 2008/12/05(金) 16:29
No:25130
|
|
Title: Re:可変長配列ねぇ
|
|
そうですか。面倒ですね。ただ端に、C99使ってみたいからだけでは、とても手を出したくないですね。
Blueさん。
MInGWってのは、何のことかわからないので、ちょっと調べて見ます。紹介するってことは、Cygwinより
何かがいいってことですね。
123ポイント を手に入れた。
|
|
|
|
|
Name: non ..上級者(17,448ポイント)
Date: 2008/12/05(金) 17:34
No:25133
|
|
Title: Re:可変長配列ねぇ
|
|
いろいろと情報ありがとうございます。
今日これから飲み会なので、また、後日、いろいろとアドバイスください。よろしく。
36ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(75,209ポイント)
Date: 2008/12/05(金) 19:03
No:25142
|
|
Title: Re:可変長配列ねぇ
|
|
> 面倒ですね。
何をもって面倒といわれるのか不明です。
Cygwinのインストールは、setup.exeを実行すればよいだけで、選択すべき項目も事実上2箇所です。
すなわち、ダウンロード元とGCCが使えるようにパッケージを選択する部分だけです。
Visual Studioのインストールよりずっと簡単です。
130ポイント を手に入れた。
|
|
|
|
|
Name: non ..上級者(17,693ポイント)
Date: 2008/12/05(金) 21:17
No:25157
|
|
Title: Re:可変長配列ねぇ
|
|
飲み会から帰ってきました。
>何をもって面倒といわれるのか不明です。
そうですか。TOPPERSのときの印象があって、考えてみれば、Cygwin以降が面倒だったですね。
面倒なのはクロスの方でした。
今度、インストールしてみます。クロスと違ってバージョンは一番新しいGCCをインストールすれば
いいのでしょうか?
90ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(75,262ポイント)
Date: 2008/12/05(金) 23:43
No:25179
|
|
Title: Re:可変長配列ねぇ
|
|
> クロスと違ってバージョンは一番新しいGCCをインストールすれば
> いいのでしょうか?
Cygwinのインストーラでインストールできるのは、3.4.xだと思うのでそんなに新しくありませんが、C99に触れてみたいだけならそれで十分です。
53ポイント を手に入れた。
|
|
|
|
|
Name: non ..上級者(18,401ポイント)
Date: 2008/12/08(月) 11:52
No:25324
|
|
Title: Re:可変長配列ねぇ
|
|
今日、Cygwin入れて、試してみました。
悪戦苦闘の2時間、ようやく可変長変数を試すことができました。
何に苦戦したかって・・・
まず、UNIXのコマンドがわからない。ls,mkdir,cdぐらいかな知ってるのは。
homeがどこにできたかわからない。
インストールしたところにhomeがないよ〜どこ行った。(ネットワークドライブにいたよ。なんで。)
viエディタの使い方がわからない。(いいやnotepadで)
C++の拡張子はどうすんだ。
実行ファイルができたのに、実行できない。あれ、カレントなのにパスが通ってない。
やったーできた。まで、全部で2時間かかりましたが、無事に動きました。
たぶん、もう使うことはないでしょう。やっぱ、使い慣れたBC++が一番。
214ポイント を落としてしまった。
|
|
|
|
Name: ラン ..ぴよぴよ(989ポイント)
Date: 2008/12/07(日) 17:33
No:25291
|
|
Title: 文字列の反転について
|
|
すみません
(質問者によって投稿内容が削除されました)
249ポイント を手に入れた。
|
|
|
|
Name: non ..上級者(18,526ポイント)
Date: 2008/12/07(日) 18:29
No:25294
|
|
Title: Re:文字列の反転について
|
|
「ポインタについて」のスレッドを、まずは読んでみて下さい。
参考になると思います。
47ポイント を手に入れた。
|
|
|
|
|
Name: conio ..初心者(7,719ポイント)
Date: 2008/12/07(日) 18:39
No:25295
|
|
Title: Re:文字列の反転について
|
|
@文字列を入力する方法
A終了条件を付ける方法(Qかqの時終了)
B反転させて表示する方法
まず、何が分からないのかを具体的にお願いします。
あと、考えているプログラムがどこまで出来ているのか、
出来れば添付なりしてくれれば助かります。
とりあえず、入力させる文字列はアルファベットや数字だけ(半角)という前提で考えると、
--------------------------------------------------------
【1】任意の長さの配列bufferを作る。
【2】文字列を配列bufferに入力させる
【3】入力したものが、Qかqであれば終了させる
【4】Qかqでは無い場合、入力した文字列の長さを調べる
【5】配列[文字列の長さ-1]から、配列[0]までを表示させる。
【6】【2】に戻る
--------------------------------------------------------
このような感じになると思います。
やり方は複数あると思いますが、とりあえずやり方の一例です。
302ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..中級者(10,948ポイント)
Date: 2008/12/07(日) 21:41
No:25306
|
|
Title: Re:文字列の反転について
|
|
>ランさん、お伝えしたいことがありますので、dixqhp@gmail.comまで連絡いただけないでしょうか。
なんだか怖いですねぇwwww
コメント部を埋めればほぼ答えです。
int reverse_print(char *str){
int len;
/* 変数lenにstrの長さ-1を代入 */
/* lenが0以上である間ループでstr[len--]を表示*/
return 0;
}
98ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(75,381ポイント)
Date: 2008/12/07(日) 22:24
No:25309
|
|
Title: Re:文字列の反転について
|
|
質問の意味がよく分かりませんが、C++でよければ...
#include <iostream>
#include <algorithm>
int main()
{
std::string str("abcde");
std::reverse(str.begin(), str.end());
std::cout << str << std::endl;
}
で逆順にできます。
反転が別の意味、例えば天地を逆にするとかでしたら、完全に環境に依存します。
108ポイント を手に入れた。
|
|
|
|
|
Name: non ..上級者(18,552ポイント)
Date: 2008/12/07(日) 22:44
No:25313
|
|
Title: Re:文字列の反転について
|
|
あらら、最初の質問が「すみません」に変わっちゃいました。
管理人さんから怒られたの?
26ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(914,743ポイント)
Date: 2008/12/07(日) 23:21
No:25318
|
|
Title: Re:文字列の反転について
|
|
それをやめて頂きたいのです・・。
投稿して用事が済んだら投稿内容を消すというのは、回答してくださった方にも失礼ですし、
後から見た人の参考にならないです。
質問していることが誰かにばれると誰かに怒られるのでしょうか?
もし特別な理由がある時はそれを伝えて下さい。
もし課題の質問で、先生にばれると困るとか、どこかの新人研修の課題だとかで質問出来ない時は、
似たようなカテゴリの課題を探してくるとか、勉強法を質問するとか、色々質問して消す以外に方法があると思います。
または、どうしてもその質問をしないと困るという場合は、「2日後にこの質問内容は消します」と最初に書いておけば、回答してくれる人もそれを承知で回答してくれると思います。
メールはこちらに届いていませんが、規約についてお伝えしたい事があったのでご連絡さしあげようと思いました。
投稿・編集した時点でこちらにバックアップが残りますので、もしそちらで消しても、こちらで戻せます。
理由の提示が無い時は、しばらくしたら戻す事になっています。
もし質問内容が残ると困る場合は理由を教えて下さい。
また、規約違反をしたから今後利用してはいけないなどという決まりはありませんので、
まずは規約を読み、規約を守って、これからも有意義に使って下さい。
324ポイント を手に入れた。
|
|
|
|
Name: C ..ぴよぴよ(535ポイント)
Date: 2008/12/07(日) 22:21
No:25308
|
|
Title: 線形
|
|
以前の質問なのですが
次数が大きいほうから出力されるプログラムはできたのですが次数が0の時に出力されません
4つ目のif文が原因っぽいと思うのですがその際新たに変数を増やしてif文を作り直すべきですか?
2倍のポイントを手に入れた! 120ポイント を手に入れた。
|
|
|
|
Name: non ..上級者(18,615ポイント)
Date: 2008/12/07(日) 22:58
No:25316
|
|
Title: Re:線形
|
|
こういうことでしょうか?勘違いならごめん。
if (pwork->next->degree_of_x <= pmx->degree_of_x)
63ポイント を手に入れた。
|
|
|
|
Name: 初心者 ..上級者(24,454ポイント)
Date: 2008/12/04(木) 09:49
No:25022
|
|
Title: プログラム2
|
|
お世話になっております。
void CVTestView::OnDraw(CDC* pDC)
{
CVTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: この場所にネイティブ データ用の描画コードを追加します。
CRect r;
GetClientRect(r);
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowExt(1000, 600); // 窓の論理サイズの指定
pDC->SetViewportExt(r.right, -r.bottom); //ビューポートの指定
pDC->SetViewportOrg(r.right/2, r.bottom/2); //原点の指定
CPen p(PS_SOLID, 1, RGB(0, 255, 0));
CPen* oldp=pDC->SelectObject(&p);
pDC->MoveTo(-500, 0); pDC->LineTo(500, 0);
pDC->MoveTo(0,300); pDC->LineTo(0, -300);
FILE *fp;
char *str,buf[1000];
char subbuf[100],*s1;
char buf2[100],*s2;
char buf3[100],*s3;
char buf4[100],*s4;
static double bx=0;
static double by=0;
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';
}
else
str++;
}
if((int)atof(buf2)==92){
pDC->MoveTo((int)atof(buf3),(int)atof(buf4));
bx=(int)atof(buf3);
by=(int)atof(buf4);
}
else if((int)atof(buf2)==01){
pDC->MoveTo((int)bx,(int)by);
pDC->LineTo((int)atof(buf3),(int)atof(buf4));
bx=(int)atof(buf3);
by=(int)atof(buf4);
}
}
fclose(fp);
return 0;
}
色々使ってみたんですが、nonさんの原点移動を使用させていただくことにしました。
それでこういうプログラムに結局なったんですけども1つだけ欠点があり、このプログラムは
@原点移動、ビューポートの指定など行う
Aファイルを読み込みG,X,Y,I,Jに付属する数字を格納
Bその数字をもとに図形を作図する
というプログラムになってるわけですが、
格納の作業はokなんですが図形作図に問題があってどんな場合にも作図の作業を行う。つまり
G01X100Y100
G03X200Y200I50J50
M00
03のプログラムはまだ書いてないんですがこれは円弧の作図になります。
問題はこのプログラムだと
G01で直線を書く→G03で円弧を書く→M00でも前の値が残っていてG03と同じ円弧作画作業をしてしまいます。
要は図形描画の作業を今はどんなときにも行っていますが、G,X,Yの文字を読み込まれたときに限定したいわけです。
それで図形を書くプログラムの所に、つまり
if(*str!='\0' &&(*str=='G' || *str=='X' || *str=='Y')){
if((int)atof(buf2)==92){
pDC->MoveTo((int)atof(buf3),(int)atof(buf4));
bx=(int)atof(buf3);
by=(int)atof(buf4);
}
else if((int)atof(buf2)==01){
pDC->MoveTo((int)bx,(int)by);
pDC->LineTo((int)atof(buf3),(int)atof(buf4));
bx=(int)atof(buf3);
by=(int)atof(buf4);
}
}
にこうして入れてみたんですが図形がさっぱり作画されなくなりました。
原因と対策を教えてください。
2,000ポイント を手に入れた。
|
|
|
|
Name: バグ ..ハッカー(129,438ポイント)
Date: 2008/12/04(木) 09:55
No:25023
|
|
Title: Re:プログラム2
|
|
文字を読み込んだ時だけ描画したいならば、描画開始ボタンみたいなのを作って、それが押されたら描画するように変更してはどうでしょうか?
2倍のポイントを手に入れた! 134ポイント を手に入れた。
|
|
|
|
|
Name: non ..上級者(16,147ポイント)
Date: 2008/12/04(木) 10:09
No:25025
|
|
Title: Re:プログラム2
|
|
もう一度、設計からやり直してみませんか?結局はその方がはやいですよ。
前から、言っているように仕様をはっきりさせること。
使用するコマンドには何があるのかなどを、最初に決めておくことです。
あとで、五月雨式に出てくるのは、結局はわかりにくいプログラムになります。
まずは、すべてのコードを決める。(プログラムをswitch文で行えるように。)
プログラムを下のように分ける。
ファイルを開いてデータを読み込む(OnDrawでは行わない)
読み込んだデータを配列(できれば動的に)に入れる。(リスト構造がいいと思います)
データを元に、絵を描く(OnDraw)
こうすれば、絵を追加したり、編集したりもできるようになります。
208ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(24,503ポイント)
Date: 2008/12/04(木) 10:12
No:25026
|
|
Title: Re:プログラム2
|
|
今SDIベースでやっていましてそれをするならメニューバーに図形とか作ってそれ押したら作図
という風になりますが、かなり改善しなくてはいけないですね
49ポイント を手に入れた。
|
|
|
|
|
Name: non ..上級者(16,197ポイント)
Date: 2008/12/04(木) 10:14
No:25027
|
|
Title: Re:プログラム2
|
|
>G01で直線を書く→G03で円弧を書く→M00でも前の値が残っていてG03と同じ円弧作画作業をしてしまいます。
M00って何ですか?
50ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(24,527ポイント)
Date: 2008/12/04(木) 10:15
No:25028
|
|
Title: Re:プログラム2
|
|
M00はなんの意味もない文です。
だから私の希望ではそこでは何の作業も行われないはずなんですが
24ポイント を手に入れた。
|
|
|
|
|
Name: non ..上級者(16,462ポイント)
Date: 2008/12/04(木) 10:22
No:25029
|
|
Title: Re:プログラム2
|
|
>今SDIベースでやっていましてそれをするならメニューバーに図形とか作ってそれ押したら作図
>という風になりますが、それだとpDCが使えなくなったり、なんか色々大変な作業になりそうですが。
でも、OnDrawでファイルを読むわけにはいかないでしょう。再描画するたびにファイルを読むことに
なるわけだから。大変な作業になるかどうかは、私もやったことがないのでわかりませんが。
よく、雑誌とかに、マウスをクリックして(左クリックでMoveToで、左クリックでLineToのような)
絵を描くプログラムが載ってますので参考に作ってみたらいかがでしょうか。
そして、そのデータをリスト構造でNCコードの形で記憶しておき、FileLoadとFileSaveを作成する。
みたいに膨らませていくと楽しいと思いますよ。
265ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(24,650ポイント)
Date: 2008/12/04(木) 10:38
No:25030
|
|
Title: Re:プログラム2
|
|
きついなぁ、リスト構造とかFileLoadとかFileSaveとか知らない単語で・・
膨大な時間がかかりそうです。私の記載したプログラムをいじくっても解決できないものでしょうか?
とりあえず出された課題を取り組むにあたってそれにおける最短の過程で学習していきたいんですよね。
あれが便利だからあれを基礎から勉強してから取り組むというやり方は余りにも時間がかかりすぎててにおっつかいかんじがします。私にとってはそれが最善なんですけどね。覚えないとできないなら必死に覚えますが。
123ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(24,697ポイント)
Date: 2008/12/04(木) 11:02
No:25031
|
|
Title: Re:プログラム2
|
|
自己解決しました。
if(*str!='\0' &&(*str=='G' || *str=='X' || *str=='Y')){
↓
if(buf[0]=='G' || buf[0]=='X' ||buf[0]=='Y'){
47ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..熟練のプログラマー(40,705ポイント)
Date: 2008/12/04(木) 11:13
No:25032
|
|
Title: Re:プログラム2
|
|
> きついなぁ、リスト構造とかFileLoadとかFileSaveとか知らない単語で・・
> 膨大な時間がかかりそうです。私の記載したプログラムをいじくっても解決できないものでしょうか?
覚えたほうが将来の自分の身の為かも知れません。
調べて使ってみるのもプログラミングの勉強方法です。
> とりあえず出された課題を取り組むにあたってそれにおける最短の過程で学習していきたいんですよね。
「課題を取り組むにあたってそれにおける最短の過程」は、自分自身がプログラム(コード)を
理解することです。
現在の自分の知識だけで新しい課題に取り組もうとすると、どこかで行き詰ることでしょう。
今回の(プログラムとしての)問題は、 OnDraw 内で(main 関数から呼ばれているかのように)
一つのプログラムを構築しているところにあります。
ファイルを読み込むタイミングは、メニューから「ファイルを開く」を選択した時に行い、
ファイルから情報を解析しておいて、OnDraw 内で描画するように処理を分ければ、
後に拡張が必要になった時に楽になりますよ。
今まで non さんの仰っている通り、一度設計から作り直したほうがいいと思います。
自分自身が甘えても、プログラムは一切甘えてくれませんから。
# 自己解決したようですが、何が原因で問題だったのか、具体的に分かりますでしょうか?
323ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(130,181ポイント)
Date: 2008/12/04(木) 11:41
No:25033
|
|
Title: Re:プログラム2
|
|
>>きついなぁ、リスト構造とかFileLoadとかFileSaveとか知らない単語で・・
MFCにはCListというクラスも用意されていますし、C++な訳ですからstd::listも使用できますよ。この辺りのことはググればたくさんヒットすると思います。
nonさんのおっしゃりたいのは、リストからファイルへ、データを読み書きする関数を実装しては如何でしょうか?という意味だと思います。
>>膨大な時間がかかりそうです。私の記載したプログラムをいじくっても解決できないものでしょうか?
今のプログラムをいじくって、とりあえず動くものを作る事はできますが、nonさんの言われている改善法は非常に一般的な意見です。
原則として、OnDrawの中では描画に関する処理だけを書くようにしないと駄目です。先程も書きましたが、今のままでも動かない訳ではありません。しかし、再描画の度に毎回ファイルからデータを読み込んでいてはHDDへの負担が大き過ぎます。
>>とりあえず出された課題を取り組むにあたってそれにおける最短の過程で学習していきたいんですよね。あれが便利だからあれを基礎から勉強してから取り組むというやり方は余りにも時間がかかりすぎててにおっつかいかんじがします。私にとってはそれが最善なんですけどね。覚えないとできないなら必死に覚えますが。
MFCを使用する以上はMFCのルールに則ったコーディングを行わなければいけませんし、MFCの仕様を覚えなければ使いこなすことは出来ません。MFCはC++で書かれたクラスライブラリです。つまり、C++のルールを知らなければ使いこなすことはできません。
ところで、前々から気になっていたんですが、自分の為に勉強されているんですよね?
課題を出されたから仕方なく勉強されているんですか?
どうも、書き込みからは、嫌々というか、仕方なくという雰囲気が感じられるんですよね…。
プログラムって、楽しくないですか?私は論理的に考えるのって、凄く楽しく感じるのですが…。
横槍入れて失礼しました…m(__)m
743ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..上級者(24,819ポイント)
Date: 2008/12/04(木) 11:54
No:25034
|
|
Title: Re:プログラム2
|
|
嫌々ではないですよ。ただいつまでも課題してるわけにもいかないんですよ。そこはわかりますよね。だから私としては早い所課題を片づけ、そこから色々分析して知識を得る。このやり方が望ましいわけです。
もうかなり時間かけてて早く安心したいんですよ。私の知識でもとりあえず課題は大方できました。もちろん皆様のお力添えのおかげもありますが。何が言いたいのかわかるんですけど、私にとっては
@課題を片づける
A終わったらそこで終わりじゃなく色々試す、仕組みを完璧に理解して自分の力にする
皆様が行ってるのは要は逆でしょう?
逆になったからといってさしたる問題はないと考えますが。課題には期限もありますので
私にとっては上記のやり方が最適です。
122ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(130,282ポイント)
Date: 2008/12/04(木) 14:42
No:25038
|
|
Title: Re:プログラム2
|
|
今のあなたの言い分は『とにかく答えを教えてくれ、中身を理解するのはそれからだ』という事ですよね?
そういう事であれば、私は離脱させていただきます。ここは皆さん優しいので、誰かは教えてくれるかもしれませんけどね。そうはいっても、私自身がそれほど頻繁に答えていた訳でもありませんが…(苦笑)
皆さんが似たようなことを書き込みしているのは、遠回りのようでいて、結局はそれが近道だと知っているからなんです。あなたの為に良かれと思ってアドバイスをしている訳ですが、それを全否定して聞く耳を持たないというのであれば『どうぞ、ご勝手に』としか言いようがなくなりますね。
101ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..プログラマー(25,058ポイント)
Date: 2008/12/04(木) 14:58
No:25042
|
|
Title: Re:プログラム2
|
|
ずいぶんな捉え方をしますねぇ。確かに課題をかたづけてしまうのは最優先ですが、
何も課題の答えばかり聞いてるわけじゃないでしょうに。
組み立ての発想
エラーの原因と対策
プログラムの詳細
これをメインに聞いてますよ?
課題の答えを教えてくれ教えてくれといってるわけじゃあない。
あくまで自分でも相当調べ、自分なりに勉強してるわけですよ。(段々自分から調べるようになったのは事実ですが)
今の自分は貴方はもちろんnonさんや御津さんなどよく返信していただける方のお力添えがあってこそいるんですよ。
期限のこともありますが先に解いた方がプログラムの全容を理解しやすい(私の性質かもしれませんが)
授業などでも講義より演習の方が覚えがいい人もいます。
サイトにも実際にプログラムを打ち込んで覚えてみるのもよいとかかかれてますよ?
それだけのこと。それを聞く耳持たないと解釈されるのは納得できませんね。
確かに私のプログラムはムダが多く不恰好でしょう。ですがそれを先に仕上げてしまいたい、
期限よりもむしろ多大な時間をさいて作ったプログラムの完成が見たいというのはおかしいのかな?
貴方の言ってることは私が何も考えずこの板で答えを聞いて何も成長していないと言ってるのと同義。
要は学び方の違いでしょう。
239ポイント を手に入れた。
|
|
|
|
|
Name: 通りすがり ..中級者(13,289ポイント)
Date: 2008/12/04(木) 15:08
No:25043
|
|
Title: Re:プログラム2
|
|
とりあえずどんな屁理屈並べてもあなたのような
「俺は俺のやり方でいくんだ。文句は言うな、さっさと手伝え」
そんな態度じゃ誰も助けませんよ。助けたくなるわけがない。
まぁここの常連さんは皆優しいので誰か助けてしまうかもしれませんが、
それに頼る姿は情けないですね。
95ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..プログラマー(25,113ポイント)
Date: 2008/12/04(木) 15:14
No:25045
|
|
Title: Re:プログラム2
|
|
色んなスレ見てますが貴方は討論になる度書き込まれますよね。
別に自分のやり方を貫いてるわけじゃない。他を選ぶと混乱して失敗してしまう可能性が高いから先に仕上げてから
改良していこうという考えなだけです。
55ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(908,156ポイント)
Date: 2008/12/04(木) 15:31
No:25049
|
|
Title: Re:プログラム2
|
|
現在問題になっているのは恐らく「問題を解決するための手順として適切ではない」ということでしょう。
自分が自力で打開出来ない問題にぶち当たった時、「正解を見てから間違いを探す」というスタイルが通用するのは
ごく序盤だけで、答えを知っている人が大多数居る場合だけです。
自分が仕事で問題にぶつかった時、研究職になったとしたら、その研究分野で壁にあたったとき、
「正解を教えてもらって間違いを探す」スタイルに慣れていると、自力で解決出来くなってしまう可能性があると思います。
「問題を自分で解決する」これも一つの大きなスキルだと思いますし、
何事も基礎が大事ですから、基礎が出来ていないと正解を見てもその時判った気になっても「習得」は難しい場合があります。
経験者、先輩が取っているスタンスは経験に基づいたことで、未経験者が想像でよいと思う方法より適切な事が多いと思います。
「時間が無い」と仰っていますが、プログラムの勉強には時間がかかるものです。
一方で、基礎がしっかりしてくれば応用もある程度容易に行えるようになってくると思います。
急がば回れという言葉にもあるとおり、目先の問題の解決ばかりしては全体の解決にならない場合があります。
経験者、先輩が仰っている事は、これらを身を持って知って仰っていることだと思いますし、
持論を通す前に、まず経験者のアドバイスを聞き、やってみるという姿勢が成長する姿勢だと私は思っています。
後、「回答者が手伝ってあげたくなる」質問の仕方をするというのも問題解決スキルの一つです。
何か腑に落ちないことや、自分の意見と違う事があっても、大人しく聞いた方が、より後の為になるのなら、
それは聞いておいたほうが結局自分の特になりますよ。
315ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..熟練のプログラマー(41,490ポイント)
Date: 2008/12/04(木) 15:39
No:25050
|
|
Title: Re:プログラム2
|
|
管理人さんとちょっと内容が被りますが、
> 期限のこともありますが先に解いた方がプログラムの全容を理解しやすい(私の性質かもしれませんが)
とのことですが、
「正常に動くコードを読むことでプログラムミングを覚える主義」
と見受けられます。
しかし、もしここの方々がこのスレに対し(正確な)模範解答を提示したとした場合、
初心者さんの提示しているプログラムのほとんどは使われないでしょう。
つまり、回答プログラムは丸上げに近い状態(規約に抵触)になるので、それを避けているわけです。
それに、単純に問題を解決するだけならすぐに書けるはずですが、
それではまた別の問題が起こり、また質問すると言った悪循環を避けています。
上の方でも書きましたが、自己解決して、何が原因で何が問題だったのか、
(何で*str!='\0'を外したらOKだったのか)
プログラムを読んで具体的に分かりますでしょうか?
# ちなみに通りすがりさんはスレの仲裁役と私は勝手に思っています。
272ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..プログラマー(25,565ポイント)
Date: 2008/12/04(木) 15:58
No:25053
|
|
Title: Re:プログラム2
|
|
>>自分が自力で打開出来ない問題にぶち当たった時、「正解を見てから間違いを探す」というスタイルが通用するのは
ごく序盤だけで、答えを知っている人が大多数居る場合だけです。
勘違いされてるようですがその正解を導き出すのにもう1ヶ月以上かけてます。苦労もしています。質問したりはしていますが一応自分で考えてやってますよ。
基礎力が必要なのは確かです。基礎力を身につけてから取り組まないとこれから対応できなくなるということですよね?確かにそうでしょう。ただ人には事情がある。バグさんの意見は今後の意見として多大に参考にさせていただきます。これからはそうするのかもしれません。ただ今回それが受け入れられないからといってそこまで言われることはないでしょうというだけのことですよ。
>>「正常に動くコードを読むことでプログラムミングを覚える主義」
と見受けられます。
確かにそうかもしれません。そういう主義なのかも。勉学のときも解答を見て長時間分析するタイプでした。
>>上の方でも書きましたが、自己解決して、何が原因で何が問題だったのか、
(何で*str!='\0'を外したらOKだったのか)
プログラムを読んで具体的に分かりますでしょうか?
nonさんの意見を含め、きちんと検討します。ただ*str!='\0'をはずしたからというよりbuf[0]・・
と書いたからじゃないかとは思いますけど。
>> ちなみに通りすがりさんはスレの仲裁役と私は勝手に思っています。
仲裁とは両者の仲をとりもつという意味です。一方の肩をもち一方を批判するのは仲裁とは言いません。
452ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(34,071ポイント)
Date: 2008/12/04(木) 16:17
No:25058
|
|
Title: Re:プログラム2
|
|
こういう匿名の掲示板で規約違反とかしているならともかく、勉強の仕方にまであれこれ指図するのは正直どうかと思います。
アドバイスをすることはいいと思いますが、本人が今のやり方でいいと言ってるんですからよってたかって何度も何度も指摘するのはアドバイスの範疇を超えていると思います。
私たちは単なる回答者であって、初心者さんの先生でもなければ社員教育担当でもないですから。
というのが私の意見です。異論は認めます。
#アドバイスの内容自体は私も賛成です。
今のやり方ではスパゲッティになるのは目に見えていますし(^^;
210ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..熟練のプログラマー(42,181ポイント)
Date: 2008/12/04(木) 16:20
No:25059
|
|
Title: Re:プログラム2
|
|
> 仲裁とは両者の仲をとりもつという意味です。一方の肩をもち一方を批判するのは仲裁とは言いません。
うん、間違えた。
「討論に(どちらかに)喝を入れる方」でした。
> >>「正常に動くコードを読むことでプログラミングを覚える主義」
> と見受けられます。
>
> 確かにそうかもしれません。そういう主義なのかも。
ならば、他の方の(サンプル)プログラムコードをよく読んで、どういう構造が望ましいのか、
どういう書き方が望ましいのかを学んだほうが問題解決が速くなりそうですね。
何で悪いのかが分かりますから。
80ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..プログラマー(25,673ポイント)
Date: 2008/12/04(木) 16:26
No:25060
|
|
Title: Re:プログラム2
|
|
余り他人を批判するのは好ましいことではありませんが人にはそれぞれ考え方違います。
明らかに私が悪い場合ならともかくMistさんのように提案には賛成だが指図はNGという意見もあります。
Mistさんはこのやりとりを聞いてそう感じたということですよね。
ですので一方的に喝を入れるってのはおかしいでしょう。ただの罵倒に他なりません。私からすればの話ですが。
108ポイント を手に入れた。
|
|
|
|
|
Name: GPGA ..熟練のプログラマー(55,250ポイント)
Date: 2008/12/04(木) 18:17
No:25085
|
|
Title: Re:プログラム2
|
|
基本的な意見は、もう出てしまっているので、仕事現場からの意見を一つ。
管理人さんが言っている
>自分が自力で打開出来ない問題にぶち当たった時、「正解を見てから間違いを探す」というスタイル
を持っている人は現場ではいらない、というか邪魔なんです。
これらの人は、なにかあるたびに質問してきて、こちらの仕事時間を削っていきます。
学校でこういうスタイルでやっている人が、現場にきていきなり直るわけがありませんので
学生のうちに直しておきましょう。
212ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..プログラマー(26,085ポイント)
Date: 2008/12/04(木) 19:11
No:25089
|
|
Title: Re:プログラム2
|
|
皆様お騒がせしまして申し訳ございません。
私の意見はおかしくはないが考えが甘い、直した方がいい、直さないと今後成功しない、ということはわかりました。
実は私は学生ではなくて研修生ですのでGPGAさんの言葉はすっごく痛い、というより質問しまくってしまってますね・・
私が言いたいのは1つだけです。バグさんの意見を否定してるわけでもありません。ただ今回は時間がないのと早い所完成したプログラムが見たいのもあって解答を急ぎ、別解、もしくは良解について考えませんでした。
否定したわけではないというのだけご理解ください。
アドバイスしてくれた方にとっては少し気分を害したと思いますが、あらかた課題ができたのでじっくり取り組もうと思います。但しこれからは皆様の提案の件を尊重します。良いプログラマになるためにもバグさんはもちろん他の
解答してくださった方にもお力添えをしていただければと思います。どうもご迷惑をおかけしました。
2倍のポイントを手に入れた! 412ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..プログラマー(26,389ポイント)
Date: 2008/12/04(木) 19:48
No:25092
|
|
Title: Re:プログラム2
|
|
さっそくご質問なのですが
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';
}
この部分少しおかしいと疑問に思ったのですが、
str=bufというのは先頭要素のアドレスをstrにセットしているというのはわかってるのですが
s2=buf2というのは少しおかしくないですか?
bufにはfpから読み込んだ文字列が入ってるのはわかりますが
buf2には何も入ってないですよね。実行してから色々試してみたのですがこれが何故うまくいくのがかがわかりません、buf2とかbuf3とかいらないような気もするのですがこれらを使わず書き直すことはできますか?
304ポイント を手に入れた。
|
|
|
|
|
Name: non ..上級者(16,888ポイント)
Date: 2008/12/05(金) 12:48
No:25122
|
|
Title: Re:プログラム2
|
|
>s2=buf2というのは少しおかしくないですか?
s2=&buf2[0] と同じ意味です。つまり、配列の先頭アドレスをs2に代入しています。
>bufにはfpから読み込んだ文字列が入ってるのはわかりますが
>buf2には何も入ってないですよね。
何も入っていないってことはありません。auto型変数で宣言したのですから、何が
入っているのかわからないだけです。まして、その中身をs2にいれているわけではなく、
その場所(アドレス)を入れてるんですね。
逆に言えば、s2はbuf2の配列の先頭の場所を指す(ポイント)ようになるわけです。
158ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..プログラマー(26,423ポイント)
Date: 2008/12/05(金) 17:04
No:25132
|
|
Title: Re:プログラム2
|
|
返信ありがとうございます。
しかしですね、このプログラムだと
*s2++=*str++; ここで一文字ずつ入れてるわけですよね。
s2=buf2の段階でbuf2には何かしら入っていてその値がわからないだけとのことですが
デバッグで確かめたところbuf2に
それより後に代入していくGの値が既に入ってるんですよ
図形作成のときに入ってるならまだしもこの段階で入ってるのは何かしらおかしくないですか?
イマイチ納得できないので何度も失礼。
40ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(34,488ポイント)
Date: 2008/12/05(金) 17:37
No:25134
|
|
Title: Re:プログラム2
|
|
nonさんの回答見ても見当違いのこと言ってるなら、きついこと言うけどC言語基礎から勉強やり直したら?
正解のプログラムを見ても理解できないだったら、あなたのやり方じゃ絶対に無理じゃん。
88ポイント を手に入れた。
|
|
|
|
|
Name: non ..上級者(17,507ポイント)
Date: 2008/12/05(金) 17:38
No:25135
|
|
Title: Re:プログラム2
|
|
これから飲みに行くので、また明日。
それより、このスレッド、長くなりすぎて、途中、別の話になったし、最初から読むと途中で
いやになると思うので、別スレッドを立てた方がよろしいかと思います。
59ポイント を手に入れた。
|
|
|
|
|
Name: non ..上級者(17,603ポイント)
Date: 2008/12/05(金) 17:56
No:25137
|
|
Title: Re:プログラム2
|
|
auto型の変数はスタック領域にメモリが確保されます。
アドレスをしりたいなら
printf("%p",buf2);
を入れてやってみてください。
プログラムを何も変更せずに、再度実行しても、同じアドレスが表示されませんか。
auto型変数は、中身を初期化しませんから、同じ場所にメモリが確保されるなら、
前に使ったときの値が出ているのではないでしょうか?
96ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..プログラマー(26,698ポイント)
Date: 2008/12/05(金) 18:12
No:25139
|
|
Title: Re:プログラム2
|
|
>nonさんの回答見ても見当違いのこと言ってるなら
いえ正しいこと言ってると思いますけど納得いかない部分が少しあるだけのことです。
>きついこと言うけどC言語基礎から勉強やり直したら
今がその基礎勉強している所です。
>>正解のプログラムを見ても理解できないだったら、あなたのやり方じゃ絶対に無理じゃん。
勘違いがひどい。部分部分やり方は聞きましたが自分である程度組み立てたといってるでしょう。
そもそも関数などの組み立て方がわからなかったらサンプルを見てそれを分析して覚えるというだけですよ。
その際になんでこうなるんですか?と聞いてるだけでしょう。
正しいプログラムを見て覚えるというのは同意ですが正解のプログラムを見て覚えるというのはまた少し
違うんじゃないですかね。それに正しいプログラムを一目見て完璧にわかる人とか少ないとおもいますが・・
275ポイント を手に入れた。
|
|
|
|
|
Name: 通りすがり ..中級者(13,393ポイント)
Date: 2008/12/05(金) 19:03
No:25141
|
|
Title: Re:プログラム2
|
|
とりあえず何度も屁理屈言ったり言い返したりせずに我慢するってこと出来ないんですか?
そんなんじゃ回答してくれる人減りますよ。
言いたい事散々言っておいて、次に質問する時は名前を変えればいいと思っているんでしょうか。
回答者はわざわざ何の義理もないあなたの為に時間を割いてくれてるんですよ。
少しは口答えせずに聞いてみましょう。
104ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(34,779ポイント)
Date: 2008/12/06(土) 14:50
No:25196
|
|
Title: Re:プログラム2
|
|
これで最後にします。
今回のプログラムを「ある程度」と呼べるほどあなたが作ったのであれば、今回のような頓珍漢な質問にはならないでしょ、って思うんですけどね。
コピペを多少改変して動いたからって、自分の実力だと勘違いしていませんか?
ポインタとか変数の実体とかについて勉強するべきです。
そして、それらを勉強するのに適したソースを見るべきです。
今回のプログラムはあなたの言われたとおり元のソースをなるべく直さず動くことを第一としているためつぎはぎだらけで無駄が多く勉強するためのソースとしては不向きです。
何を焦っているのか知りませんがこのソースから勉強するよりも、勉強するに適したソースで理解を深めたうえでこのソースを見たほうが時間はかからないと思いますよ。
291ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..プログラマー(26,870ポイント)
Date: 2008/12/07(日) 21:42
No:25307
|
|
Title: Re:プログラム2
|
|
>>とりあえず何度も屁理屈言ったり言い返したりせずに我慢するってこと出来ないんですか?
そんなんじゃ回答してくれる人減りますよ。
言いたい事散々言っておいて、次に質問する時は名前を変えればいいと思っているんでしょうか。
回答者はわざわざ何の義理もないあなたの為に時間を割いてくれてるんですよ。
少しは口答えせずに聞いてみましょう。
気持ちはわかりますが口答えとかいうのは少し違うでしょう。
誤解されている と言いたいだけですよ?誰の批判もしていません。
意見が気に食わないとかいうんじゃなく事実と違うだけのこと。口答えではなく釈明です。
事実を指摘されたなら素直に認めています。普通にあーそうなのかと思っていただければ結構です。
大体名前変えたってIPアドレスで管理人様にはわかりますよ。
>Mistさんへ
勘違い はしていないのですが仰る通りです。よくわからないが動いたからokというのが
何回かありましたね。それなりに私に対し真摯に書いてくださったのでしょう。少し私のやり方では
プログラムは不向きなのはわかりました。時間かけて少し改善できたらと思います。
本当にありがとう。 では私も最後にします。
172ポイント を手に入れた。
|
|
|
|
Name: ぬっち ..初心者(7,739ポイント)
Date: 2008/12/06(土) 20:09
No:25233
|
|
Title: DeleteGraphについて
|
|
こんにちは。
最近ゲームで、場面に応じて使っていない画像をDeleteGraphで消すことをしているのですが、問題が出てきてしまったのでここで質問させていただきます。
私のプログラムでは、ステージが変わるときに、
@DeleteSoundMemやDeleteGraphでクリアしたステージの画像や音楽をメモリから消去
ALoadSoundMemやLoadGraphで次のステージの画像や音楽をメモリに読み込む
という処理をしています。
しかし、この処理を行うとなぜか、次のステージで処理速度が遅くなってしまいます。(普段FPS60のところがFPS3くらいに)
そこで、何度も画像を読み込んでいるのかもしれないと思い、画像の読み込みをなくすとFPSは60で安定します。
さらに、原因を見つけるために、読み込む画像のうち一部だけを読み込むようにするとFPSは60で安定しました。
これらのことから、何度も画像を読み込んでいるのはないと思ったのですが、そうするとなぜ読み込む画像のうち一部だけこの処理を行うと処理速度が重くなるのかということがわからなくなりました。
このことに関係しているのかもしれませんが、
int image[15];
というように宣言しておいて
image_[6]=LoadGraph("1.png");
と読み取り、ステージクリア後、
DeleteGraph(image_[6]);
としてメモリから消去する。そして、
image_[3]=LoadGraph("2.png");
として次のステージの画像を読み取る、つまりimage_[3]を使う前にimage_[6]を使うという処理は問題ないのでしょうか?
アドバイスよろしくお願いします。
649ポイント を手に入れた。
|
|
|
|
Name: Justy ..ハッカー(283,302ポイント)
Date: 2008/12/06(土) 21:00
No:25245
|
|
Title: Re:DeleteGraphについて
|
|
>そうするとなぜ読み込む画像のうち一部だけこの処理を行うと処理速度が重くなるの
これだけではちょっと何ともいえません。
各関数の処理にかかった時間を調べて、どこで時間がかかっているのか
調べてみてはどうでしょうか?
全部の関数を調べると大変なので、最初はメインループ内から直接コールしている
関数から少しずつ絞り込んで調べていって、どの関数内でどのデータを扱っている
時に遅いのかを調べてみて下さい。
ちなみに「次のステージで」ということは、最初から次のステージを起動した場合は
発生しないのでしょうか?
>つまりimage_[3]を使う前にimage_[6]を使うという処理は問題ないのでしょうか
つまり配列の途中をいきなり使っても大丈夫か、ということですか?
問題ないはずです。
383ポイント を手に入れた。
|
|
|
|
|
Name: ぬっち ..初心者(7,787ポイント)
Date: 2008/12/06(土) 22:21
No:25252
|
|
Title: Re:DeleteGraphについて
|
|
Justyさん返信ありがとうございます。
>配列
途中から使っても問題ないですか。
てっきりこれが問題なのかと思ってたので。
>最初から次のステージを起動
発生しませんでした。
どうやら、ステージクリア→画像・音楽のメモリの処理→次のステージという流れの時のみ起こるようです。
>各関数の処理の時間
今いろいろ試しているのですが、やはり画像をメモリに読み込む時に問題起こっているみたいです。
質問なんですが、
image_[2]=LoadGraph("1.png");
image_[4]=LoadGraph("2.png");
image_stage_2[2]=LoadGraph("3.png");
image_stage_2[3]=LoadGraph("4.png");
sound_[1]=LoadSoundMem("1.mp3");
sound_[2]=LoadSoundMem("1.mp3");
という感じにメモリに読み込んでも大丈夫でしょうか?(私のソースがこのような感じなので)
48ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(284,080ポイント)
Date: 2008/12/06(土) 22:51
No:25256
|
|
Title: Re:DeleteGraphについて
|
|
>やはり画像をメモリに読み込む時に問題起こっているみたいです
ということは、fpsが低下するのは LoadGraph()などで読み込んでいる最中だけで
読み込みが終われば元に戻っているのですか?
>やはり画像をメモリに読み込む時に問題起こっているみたいです
配列が十分に確保されているなら……その例なら image_は5以上……あれば問題はありません。
20ポイント を手に入れた。
|
|
|
|
|
Name: ぬっち ..初心者(8,140ポイント)
Date: 2008/12/07(日) 18:01
No:25292
|
|
Title: Re:DeleteGraphについて
|
|
原因を見つけるために、ステージクリア→メモリの処理→次ステージの流れで
@通常通りの処理
A必要のない画像をメモリ上から消すという処理をなくす
Bメモリに画像読み込むを読み込むという処理をなくす
Cメモリに特定の画像のみ読み込むと言う処理のみにする
D最初から(プログラム起動時から)全ての画像をメモリに読み込んだ状態にする
ということを行ってみました。
結果は、
@FPSが3程度まで落ちる
A@と変わらず
BFPS60で安定
C場合によって異なる
DFPS60で安定
Cについて詳しく書くと、たとえば、
image_stage[2]=LoadGraph("3.png");
image_stage[3]=LoadGraph("4.png");
sound_[1]=LoadSoundMem("1.mp3");
sound_[2]=LoadSoundMem("1.mp3");
となっている場合ではFPS60安定で、
image_[2]=LoadGraph("1.png");
image_[4]=LoadGraph("2.png");
image_stage_2[3]=LoadGraph("4.png");
sound_[1]=LoadSoundMem("1.mp3");
sound_[2]=LoadSoundMem("1.mp3");
となっている場合の時FPSが低下する。
という感じです。
このことから、Cのところで問題があると考えて、いろいろ試しているのですが上手くいきません。
353ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(284,420ポイント)
Date: 2008/12/07(日) 21:18
No:25305
|
|
Title: Re:DeleteGraphについて
|
|
であるならば、どのファイルを読むと遅くなるのかを調べるのと同時に、
fpsが 3まで落ちている直接的な関数を特定した方がいいでしょう。
# ちなみにメモリが足らなくて、スワップが発生しまくっている、ってことはないですよね?
76ポイント を手に入れた。
|
|
|
|
Name: 羽流布 [URL] ..中級者(11,991ポイント)
Date: 2008/12/07(日) 12:01
No:25277
|
|
Title: フルスクリーン時のMessageBoxについて
|
|
就活真っ最中ですが、まったりゲーム制作も進めてます。羽流布です。
では、本題です。
フルスクリーン状態で終了確認メッセージボックスを表示したいのです。
しかしながら添付ファイルのような感じですと、
1回目はちゃんと表示できるのに「いいえ」を選択して2回目を試すと後ろに隠れてしまいます。
(終了はエスケープキーやALT+F4です)
解決策はありませんでしょうか?
181ポイント を手に入れた。
|
|
|
|
Name: 御津凪 [URL] ..熟練のプログラマー(44,183ポイント)
Date: 2008/12/07(日) 12:17
No:25279
|
|
Title: Re:フルスクリーン時のMessageBoxについて
|
|
こちらの環境(Vista)では正常に表示されました。
ので、これで解決するかどうかはわかりませんが、メッセージボックスの表示のフラグに、
MB_TOPMOST (常に手前に表示)を追加してみてください。
3ポイント を手に入れた。
|
|
|
|
|
Name: 羽流布 [URL] ..中級者(12,063ポイント)
Date: 2008/12/07(日) 12:27
No:25280
|
|
Title: Re:フルスクリーン時のMessageBoxについて
|
|
おっと、環境を書き忘れていましたね……失礼しましたm(_ _)m
僕の環境は、
DXライブラリ:Ver2.24c → 2.25
OS:WindowsXP ( Build 2600 Service Pack 3 )
開発環境:Visual Studio 2008 Express Edition
です。
MB_TOPMOSTを試してみたところ、変化はありませんでしたorz
OSに原因があるのでしょうか?
【追記】
先ほどDXライブラリの最新版を試してみましたが、ダメでした・・・
うーん、困りました(。´・ω・)
72ポイント を手に入れた。
|
|
|
|
|
Name: 羽流布 [URL] ..中級者(12,224ポイント)
Date: 2008/12/07(日) 19:05
No:25299
|
|
Title: Re:フルスクリーン時のMessageBoxについて
|
|
いろいろ試してみましたが解決には至らず……。
最終的には、添付ファイルのように画面を消すという発想になりました。
ですが、見た目が美しくないということもあり実用的ではないですね。
MessageBoxによる終了確認は諦めることにします。
制作中のゲームですが、4月くらいには詳細を晒すつもりです。
では失礼しますm(_ _)m
161ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(284,344ポイント)
Date: 2008/12/07(日) 20:31
No:25303
|
|
Title: Re:フルスクリーン時のMessageBoxについて
|
|
多分ですが、後ろに隠れているというより、ただ単に表示されていないだけだと思います。
つまり、表示されているだろうところをクリックすれば、何か反応するかもしれません。
で、解決方法となるかどうかはわかりませんが、DxLib_Init()前に SetUseGDIFlag()を
コールしていますよね?
これを、DxLib_Init()の前ではなく、MessageBox()の前後に挟んでみてはどうでしょうか。
前は 1を、後は 0を指定すれば、ひょっとしたらうまくいくかもしれません。
ただ、フルスクリーンのアプリでダイアログが出るというのは、やっぱり美しくはないですね(^^
264ポイント を手に入れた。
|
|
|
|
|
Name: 羽流布 [URL] ..中級者(12,269ポイント)
Date: 2008/12/07(日) 20:44
No:25304
| 解決!
|
Title: Re:フルスクリーン時のMessageBoxについて
|
|
> Justyさん
正常に表示できました!
ホント感謝です^^
どうやらSetUseGDIFlag()はDxLib_Init()の後で使うべきだったようです。
よく解らないまま使っていました……。
【追記】
表示はできるようになりましたが、メッセージボックスをドラッグして動かすと酷いことに……。
うーん、難しい課題ですねorz
ですが、こちらは特に問題なさそうなので、とりあえず気にしない方向でいきます。
完成後の課題ということで(;^^
45ポイント を手に入れた。
|
|
|
|
Name: ムンバ ..中級者(14,372ポイント)
Date: 2008/12/06(土) 23:09
No:25258
|
|
Title: つうこうにんさん,
|
|
>ちなみに、どのようなタイトルの参考書を使用しているのでしょうか?
>ちまたにはよくない書籍が大量に氾濫しているので気になります。<No:25190
よくない書籍と、よい書籍をご紹介して頂けないでしょうか?^^;
93ポイント を手に入れた。
|
|
|
|
Name: つうこうにん ..ぴよぴよ(849ポイント)
Date: 2008/12/07(日) 07:47
No:25269
|
|
Title: Re:つうこうにんさん,
|
|
余計な疑問を抱かせてしまったようで申し訳ないです
好みや目的の問題などもあるのでここでは書きませんが
本の題名や著者名で検索すると評判がわかります。
中身は見ていませんが評判を見る限り「猫でもわかるC言語」で大丈夫だとおもいます。
それとここは不特定多数が見ているBBSなので
「良い書籍と良くない書籍」みたいなトピックタイトルにしたほうが
多くの人が参加できていいとおもいますよ。
126ポイント を手に入れた。
|
|
|
|
|
Name: 初級者 ..入門者(3,008ポイント)
Date: 2008/12/07(日) 08:53
No:25271
|
|
Title: Re:つうこうにんさん,
|
|
main関数の型をvoidと書いているような本は避ける(avoid)方がよいと思います。
言語規格に関する著者の理解度が低いと思われるからです。
40ポイント を手に入れた。
|
|
|
|
|
Name: non ..上級者(18,446ポイント)
Date: 2008/12/07(日) 10:06
No:25272
|
|
Title: Re:つうこうにんさん,
|
|
初心者が最初に学ぶ本として
if (a) とか if(!a)
とか書いてある本は、わかりにくいと思います。
実際はよく使うことなんですが、超初心者は、まずは
if(a!=0)とかif(a==0)をしっかり理解する方がいいと考えます。
100ポイント を手に入れた。
|
|
|
|
|
Name: ムンバ ..中級者(14,714ポイント)
Date: 2008/12/07(日) 19:29
No:25300
| 解決!
|
Title: Re:つうこうにんさん,
|
|
こんばんは。
すみません。間違えて他のレスで解決ボタン押しても駄目っすよね。^^;
失礼しました。
近くの本屋には、C言語の書籍はあまり置いてないんですよね〜。^^;
週休1日なもんで、日曜日に本を買うために出かけるのは、どうも億劫(おっくう)でして。(自爆
ですので購入する時は、ネットで購入してます。
今、構造体の勉強をしてますが、これはこれで奥が深い。(涙
ポインタと構造体に関しましては、もう少し勉強が必要だと思いました。
皆さん、どうもありがとうございました。参考にさせて頂きます。
また何か御座いましたら、宜しくお願い致します。
172ポイント を手に入れた。
|
|
|
|
|
Name: ムンバ ..上級者(15,242ポイント)
Date: 2008/12/07(日) 19:36
No:25302
| 解決!
|
Title: Re:つうこうにんさん,
|
|
ああっ!言い忘れてました。ごめんなさい。
つうこうにんさん、お心使いありがとう御座いました。
「猫でもわかるC言語」(←実は2冊目なんです。^^;)を読み終えたら
たぶん、もう1冊だけ参考書を買おうと思ってます。
その時、つうこうにんさんの言われた
>それとここは不特定多数が見ているBBSなので
>「良い書籍と良くない書籍」みたいなトピックタイトルにしたほうが
>多くの人が参加できていいとおもいますよ
の様なタイトルで(ちょっとタイトル変わるかもしれませんが^^;)
質問させて頂きたいと思います。
その節は、宜しくお願い致します。
ありがとうございました♪
2倍のポイントを手に入れた! 528ポイント を手に入れた。
|
|
|
|
Name: ATU ..ぴよぴよ(559ポイント)
Date: 2008/12/06(土) 20:28
No:25237
|
|
Title: 釣りのゲームを作りたいのですが。
|
|
えっと、タイトルに書いたとおり釣りのゲームを作りたいと思っています。
しかし、プログラミングに関して初心者なのでどのようにやればいいのか分かりません…
ゲームのポイントとしていくつかあげたいのですが、
@釣った魚から経験値がもらえて、レベルが上がっていく。
レベルが上がるにつれてレベルアップするのに時間がかかる。(経験値がたくさん必要)
Aレベルによって持てるさおが違う。それによって、釣れる魚も違い、よって、経験値も違う(種類・大きさによって変動)。
B魚を処分することによって、ゲーム内でのお金をためる。(魚の種類大きさによって違う。)
C魚は釣れるまでの時間が決まっている(魚の種類によって違う。)。
竿には釣れる寸前に音がなるようにする。
また、魚がかかるまでの時間が多少短くなったりする。
D釣り場は自然界のような感じで。
E経験値はたまったポイントを%表示して、100%でレベルアップ。
以上のことを踏まえたゲームを作りたいと思っているのですが。
可能でしょうか??
もし可能ならば、作り方を教えていただきたいです。
不可能ならばどの条件を減らせば可能か、ということを教えていただきたいです。
お手数をおかけしますがよろしくお願いします。
失礼します
※この掲示板がこのようなことを書くのにふさわしくない掲示板だとしたらすいません。
559ポイント を手に入れた。
|
|
|
|
Name: non ..上級者(18,346ポイント)
Date: 2008/12/06(土) 20:40
No:25240
|
|
Title: Re:釣りのゲームを作りたいのですが。
|
|
「魚が釣れる」のをどうやって表現するゲームなのでしょうか?
また、何を使ってプログラムするのですか?
ATUさんが、考えているイメージがつかめませんし、プログラムのレベルもわからないので
何をアドバイスすればいいのかわからないのですが。
59ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(283,525ポイント)
Date: 2008/12/06(土) 21:24
No:25247
|
|
Title: Re:釣りのゲームを作りたいのですが。
|
|
>可能でしょうか??
どのプラットフォームで作るのかわかりませんが、とりあえず PC上のゲームだと
仮定するなら、この条件を聞く限り 2D/3D問わず特に条件を減らすことなく可能だと思います。
>もし可能ならば、作り方を教えていただきたいです
いや、環境も状況もわからないですし、さすがに無理です。
でもまぁそうですね。
とりあえず、仕様書でも書いてみてはどうでしょうか。
これがないと始まらないですから。
>プログラミングに関して初心者
本当に初心者なのであれば、もっと優しいものから作られた方がいいと思いますよ。
223ポイント を手に入れた。
|
|
|
|
|
Name: ibis ..上級者(15,634ポイント)
Date: 2008/12/06(土) 21:33
No:25249
|
|
Title: Re:釣りのゲームを作りたいのですが。
|
|
作り方は・・・
まずプラットフォーム(Windows上で動作するとか、Webブラウザ上で動作するとか)や
ユーザーインターフェースの形式(CUI、GUIなど)を決めましょう。
それから使用するプログラミング言語やライブラリ。
それらによって作り方も難易度も全然違いますので。
簡単な所でいえば、CUIで言語はPerlやBASICといったところでしょうか。
無謀ですが一度C++/WindowsAPI/Direct3Dとかに挑戦してみるのも面白いかもしれません。
で、言語が決まったらいきなり作るんではなくて、その言語でいろいろと練習してみるのが良いです。
Justyさんも「もっと優しいものから」と仰ってますが、
確かにこれは初心者が作るものにしては難しすぎると思います。
まぁCUIであれば初心者でも頑張れば作れそうですが。
343ポイント を手に入れた。
|
|
|
|
|
Name: ATU ..ぴよぴよ(562ポイント)
Date: 2008/12/07(日) 00:08
No:25262
|
|
Title: ありがとうございます。
|
|
早急な返信・アドバイスありがとうございます。
思った以上に厳しい答えが返ってきたので、少し反省しています。
少し自分でも勉強して作れるようにやっていきたいと思います。
勉強して自分で作っていくうえで何かありましたら、
また書き込みすると思いますので、そのときは何卒よろしくお願いします。
3ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..熟練のプログラマー(40,580ポイント)
Date: 2008/12/07(日) 00:31
No:25263
|
|
Title: Re:ありがとうございます。
|
|
確かに上記の条件だけなら実現は可能だと思います。
が、おそらくすぐに詰まってしまうと思います。
まず「ゲーム内で用いる画像」だと思います。
釣りゲームの画像配布サイトはあったとしてもRPG等に比べるとはるかに少ないと思います。
自分で作成されるとすれば問題はないのですが、
プログラミングと同等以上の時間が使われるかと思われます。
挫折しないためにもまずは簡単なゲームから入るのが一番だと思います。
151ポイント を手に入れた。
|
|
|
|
|
Name: ATU ..ぴよぴよ(617ポイント)
Date: 2008/12/07(日) 19:33
No:25301
|
|
Title: Re:ありがとうございます。
|
|
参考になります。
画像のことも考えて、何をするのかなど決め。
いきなりではなく簡単なゲームから初めて経験をつんでいきたいと思います。
55ポイント を手に入れた。
|
|
|
|
Name: situmon ..上級者(17,374ポイント)
Date: 2008/12/06(土) 16:15
No:25199
|
|
Title: 弾消しフラグ2
|
|
何度も何度もすいませんが、スレが古くなってしまったのでもう一度投稿しました。
EnemyShot[j].flag=2;//弾を2のフラグに
if(EnemyShot[j].flag==2)//弾が2のフラグなら
EnemyShot[i].EnemyShots[j].flag=0;//それ以上登録しない
else(EnemyShot[j].flag==2 && EnemyShot[i].flag==0);//もし(そうではなく)弾が2のフラグで弾が全部外なら
EnemyShot[j].flag=0;//弾を0にする。
でいいのでしょうか。
109ポイント を落としてしまった。
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(913,050ポイント)
Date: 2008/12/06(土) 16:40
No:25200
|
|
Title: Re:弾消しフラグ2
|
|
どの時、どの部分にこの処理が入るのでしょうか?
あと、弾の登録部と弾の軌道計算、フラグ計算部は違うと思います。
また、
EnemyShot[j].flag==2 && EnemyShot[i].flag==0
この意味がよくわかりません。jはiの特定の弾番号を示していると思いますから
これではおかしいです。
弾幕構造体の中に複数の弾があるという構造になっています。
typedef struct{
//フラグや座標データ
}弾_t;
typedef struct{
//フラグや座標データ
弾_t 弾[弾MAX];
}弾幕_t;
弾幕_t 弾幕[弾幕MAX];
こんな構造ですよね。ある特定の弾幕データが持つ弾が全部フラグオフかどうかを調べる必要があるのです。
276ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..上級者(17,382ポイント)
Date: 2008/12/06(土) 17:50
No:25214
|
|
Title: Re:弾消しフラグ2
|
|
ENEMY_TOTAL_SHOT_NUMが弾MAX、
ENEMY_TOTAL_NUMが弾MAX
であっていますか?
だから
ENEMY_TOTAL_NUMが弾MAXのフラグが0かを調べればいいわけですね。
8ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..上級者(17,475ポイント)
Date: 2008/12/07(日) 13:41
No:25282
|
|
Title: Re:弾消しフラグ2
|
|
EnemyShot[j].flag=2;
for(i=0; i<ENEMY_TOTAL_SHOT_NUM; i++){
if(EnemyShot[j].flag!=0){
break;
}
}
if(i==ENEMY_TOTAL_SHOT_NUM){
EnemyShot[j].flag=0;
}
としたら
解決できたのですが、これでもだめなのでしょうか?
93ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(912,707ポイント)
Date: 2008/12/07(日) 14:03
No:25283
|
|
Title: Re:弾消しフラグ2
|
|
上にも書きましたが、どこの判定式ですか?
プログラムのどの部分でこれを使っているのかがわからないとあってるかどうかわからないです。
>ENEMY_TOTAL_SHOT_NUMが弾MAX、
>ENEMY_TOTAL_NUMが弾MAX
>であっていますか?
とはどういういみでしょう?
上は弾データの最大値、下は弾データをもつ、敵の弾幕データの最大値です。
>ENEMY_TOTAL_NUMが弾MAXのフラグが0かを調べればいいわけですね。
もよくわかりません。
その弾幕が持つ弾が全て画面外にあるかどうかは、フラグを調べればよいです。
>としたら
>解決できたのですが、これでもだめなのでしょうか?
先日から同じ事を何度も言っているので、よく考えて下さい。
「弾幕」というデータは「弾」を持っている弾データの塊のデータなのです。
弾幕が持つ弾データのフラグが全てオフの時、弾幕フラグをオフにすればいいのです。
・・が、しかしそれは既に実装されていますよね。
自分で作る必要はありません。
あと、iとjが混在していますが、jは何を表しているのでしょうか?
また、iを使ったループの中にiがありません。
もし単なる見間違いなら、iとjを使わないようにしましょう。
iとjはOと0の次に見間違いやすい変数かと思います。
iとsなど見間違う可能性の低い文字を使うとよいでしょう。
そして、コードを投稿する時はタグを使って下さい。
532ポイント を落としてしまった。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(913,072ポイント)
Date: 2008/12/07(日) 14:14
No:25284
|
|
Title: Re:弾消しフラグ2
|
|
龍神録プログラミングの館で実装している例です。
引数は敵のID番号です。
//敵が死ぬかどうかの決定
void enemy_death_judge(int s){
int i;
se_flag[8]=1;//敵に当たった音
if(enemy[s].hp<0){//敵のHPが0未満になったら
enemy[s].flag=0;//敵を消滅させる
se_flag[1]=1;//敵のピチュリ音
enter_del_effect(s);
enter_enemy_item(s);//敵sのアイテムを出現させる(39章)
for(i=0;i<SHOT_MAX;i++){//敵総数分
if(shot[i].flag!=0){//登録されている弾幕データがあれば
if(s==shot[i].num){//その敵が登録した弾幕があれば
shot[i].flag=2;//それ以上弾幕を続けないフラグを立てる
break;
}
}
}
}
}
365ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..上級者(17,649ポイント)
Date: 2008/12/07(日) 14:17
No:25285
|
|
Title: Re:弾消しフラグ2
|
|
>上にも書きましたが、どこの判定式ですか?
プログラムのどの部分でこれを使っているのかがわからないとあってるかどうかわからないです。
void CollisionDetection(){
・・・略
if( (int)sqrt(x*x+y*y) < range+enemy[s].range){
if(enemy[s].hp <= 0){
enemy[s].flag=0;
EnemyShot[j].flag=2;
for(j=0; j<ENEMY_TOTAL_SHOT_NUM; j++){
if(EnemyShot[j].flag!=0)
break;
}
}
if(j==ENEMY_TOTAL_SHOT_NUM){
EnemyShot[j].flag=0;
}
}
の部分です。
>「弾幕」というデータは「弾」を持っている弾データの塊のデータなのです。
>とはどういういみでしょう?
上は弾データの最大値、下は弾データをもつ、敵の弾幕データの最大値です。
へんな勘違いをしていたみたいです、それに日本語もおかしかったです。
すいませんでした。
追加、
管理人さんの最新の書き込みがされたときにこの書き込みをしていました。
すいません。
174ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(913,199ポイント)
Date: 2008/12/07(日) 14:27
No:25286
|
|
Title: Re:弾消しフラグ2
|
|
これはループ文などが省略されているのでしょうか?
それともCollisionDetection関数はこれだけですか?
sとiとjが何をさしているのかわからないです。
それからEnemyShotはENEMY_TOTAL_SHOT_NUM個用意したなら
EnemyShot[ENEMY_TOTAL_SHOT_NUM]は存在しませんよね。
そして、EnemyShotはENEMY_TOTAL_SHOT_NUM個用意したものではありません。
宣言や定義をもう一度見直してみて下さい。
127ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..上級者(18,437ポイント)
Date: 2008/12/07(日) 14:31
No:25287
|
|
Title: Re:弾消しフラグ2
|
|
void CollisionDetection(){
for(int i=0;i<PLAYER_MAX_SHOT1;i++){//ショットの全列分
for(int j=0;j<PLAYER_MAX_SHOT2;j++){//1列全弾分
if(PlayerShot[i][j].flag==1){//その弾が発射中なら
for(int s=0;s<ENEMY_TOTAL_NUM;s++){//全敵100体分
if(enemy[s].flag==1){//その敵のショットが出現中なら
double x,y;
int range;
x=(int)(PlayerShot[i][j].x-enemy[s].x);
y=(int)(PlayerShot[i][j].y-enemy[s].y);
switch(i){
case 0:
case 5:
case 6:
range=12;
break;
default:
range=9;
break;
}
if( (int)sqrt(x*x+y*y) < range+enemy[s].range){
if(enemy[s].hp <= 0){
enemy[s].flag=0;
EnemyShot[j].flag=2;
for(j=0; j<ENEMY_TOTAL_SHOT_NUM; j++){
if(EnemyShot[j].flag!=0){
break;
}
}
if(j==ENEMY_TOTAL_SHOT_NUM){
EnemyShot[j].flag=0;
}
if(CheckSoundMem(sound_enemy_death)==1)
StopSoundMem(sound_enemy_death);
}
enemy[s].hp -= 1;
PlayerShot[i][j].flag=0;
if(CheckSoundMem(sound_enemy_death)==1)
StopSoundMem(sound_enemy_death);
PlaySoundMem(sound_enemy_death,DX_PLAYTYPE_BACK);
}
}
}
}
}
}
}
がすべてです。
さきほどの龍神録のにあてはめると
EnemyShot[j].flag=2;
for(j=0; j<ENEMY_TOTAL_SHOT_NUM; j++){
if(EnemyShot[j].flag!=0){
break;
}
}
if(j==ENEMY_TOTAL_SHOT_NUM){
EnemyShot[j].flag=0;
}
が
for(i=0; i<ENEMY_TOTAL_NUM; i++){
if(EnemyShot[i].flag!=0){
if(s==EnemyShot[i].flag){//その敵が登録した弾幕があれば
EnemyShot[i].flag=2;
break;
}
}
}
になりますが・・・
788ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(914,377ポイント)
Date: 2008/12/07(日) 15:31
No:25288
|
|
Title: Re:弾消しフラグ2
|
|
アルゴリズムがどうなるべきなのか、また、変数がどう変化するのか考えて見ましょう。
とりあえず10*20のループをさせるため、
for(i=0;i<10;i++){
for(i=0;i<20;i++){
//処理
}
}
これじゃ200回のループにはなりませんよね?
これと同じことがお書きになっているプログラムでも起こっています。
4重ループを作るには4つの変数が必要です。
また、あまりネストが深くなるのはよくないです。
いくつもループが必要な時は関数わけするなどしたほうがいいと思います。
そして、この4重ループは適切ではありません。
フラグを立てる時は立てるだけにして、フラグによる制御はまた別に行うべきです。
今のままでは、敵が死んだ瞬間にしか処理がされません。
void CollisionDetection(){
for(int i=0;i<PLAYER_MAX_SHOT1;i++){//ショットの全列分
for(int j=0;j<PLAYER_MAX_SHOT2;j++){//1列全弾分
if(PlayerShot[i][j].flag==1){//その弾が発射中なら
for(int s=0;s<ENEMY_TOTAL_NUM;s++){//全敵100体分
if(enemy[s].flag==1){//その敵のショットが出現中なら
double x,y;
int range;
x=(int)(PlayerShot[i][j].x-enemy[s].x);
y=(int)(PlayerShot[i][j].y-enemy[s].y);
switch(i){
case 0:
case 5:
case 6:
range=12;
break;
default:
range=9;
break;
}
if( (int)sqrt(x*x+y*y) < range+enemy[s].range){
if(enemy[s].hp <= 0){
enemy[s].flag=0;
EnemyShot[j].flag=2;
for(j=0; j<ENEMY_TOTAL_SHOT_NUM; j++){
if(EnemyShot[j].flag!=0){
break;
}
}
if(j==ENEMY_TOTAL_SHOT_NUM){
EnemyShot[j].flag=0;
}
if(CheckSoundMem(sound_enemy_death)==1)
StopSoundMem(sound_enemy_death);
}
enemy[s].hp -= 1;
PlayerShot[i][j].flag=0;
if(CheckSoundMem(sound_enemy_death)==1)
StopSoundMem(sound_enemy_death);
PlaySoundMem(sound_enemy_death,DX_PLAYTYPE_BACK);
}
}
}
}
}
}
}
見易いように自下げしました
1,178ポイント を手に入れた。
|
|
|
|
Name: int ..ぴよぴよ(29ポイント)
Date: 2008/12/07(日) 02:53
No:25265
|
|
Title: 型について質問です
|
|
int型で15桁以上を表示させるにはどう宣言すればいいのでしょうか?
29ポイント を手に入れた。
|
|
|
|
Name: GPGA ..熟練のプログラマー(55,250ポイント)
Date: 2008/12/07(日) 04:24
No:25267
|
|
Title: Re:型について質問です
|
|
int型が48bit以上の環境でint宣言をすることです。
48bitあれば-140737488355328〜140737488355327までの値を扱うことができます。
|
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(75,273ポイント)
Date: 2008/12/07(日) 11:35
No:25275
|
|
Title: Re:型について質問です
|
|
> int型で15桁以上を表示させるにはどう宣言すればいいのでしょうか?
2進数でよければ、処理系に関わらず(符号ビットを除いて)15桁以上表現できます。
10進数で15桁以上であれば、int型が48ビット以上の処理系でなければなりません。
他の整数型でよいのであれば、long long型なら64ビット以上が保証されます(非標準処理系ではそうならないものもあります。例えば、バージョンが3.4より前のGCCで、ターゲットがh8300の場合、long long型でも32ビットでした)。
35ポイント を落としてしまった。
|
|
|
|
|
Name: 組木紙織 [URL] ..熟練のプログラマー(66,865ポイント)
Date: 2008/12/07(日) 12:39
No:25281
|
|
Title: Re:型について質問です
|
|
15桁以上で上限は決まってないのですか?
大抵の環境ではint型は15桁未満(10進数で)なので、自分でint型が欲しい桁数を表現できる
コンパイラを作るしかないと思います。
ただ、通常int型は固定長の整数なので、可変長の整数をint型で表現しようという部分に問題があると思います。
97ポイント を手に入れた。
|
|
|
|
Name: CDC ..ぴよぴよ(104ポイント)
Date: 2008/12/06(土) 03:03
No:25187
|
|
Title: C言語を始めるにあたって
|
|
C++について勉強しようと思っています。
はじめて書くにはどのようなことに挑戦した方がいいでしょうか?
いくつかあげていただけますと挑戦しがいがあります。
ゲームでなくても構いません。
コンパイラ:VS2005 C++
プログラム歴 1週間程度
一応HalloWorld程度は出せます。
if文とfor分も多分理解しています。
104ポイント を手に入れた。
|
|
|
|
Name: conio ..初心者(5,789ポイント)
Date: 2008/12/06(土) 09:01
No:25189
|
|
Title: Re:C言語を始めるにあたって
|
|
「C++でプログラムを書く練習をするには、どのような事をすればいいか」
という質問で宜しいでしょうか。
@参考書などを読む
A学んだ事(if文、while文など)を利用するプログラムを考える
A考えたプログラムを実際に書き、動くか確かめる
大体こういう風にすれば、自然と書き方が分かってくると思います。
もし、「自分でプログラムが思いつかない」というのであれば、2つばかり問題を出してみます。
【1】1〜100までの値を表示する。但し、3の倍数の時は"Fizz"、5の倍数の時は"Buzz"
3の倍数でも、5の倍数でもある時は"FizzBuzz"と表示させる。
------実行例------
1
2
Fizz
4
Buzz
Fizz
------------------(以下略)
【2】for文(2重ループ)とif文を用いて、下記の模様を表示すること。
□■□■□■
■□■□■□
□■□■□■
■□■□■□
□■□■□■
■□■□■□
とりあえずは、基本的な構文を使ってみたり、自作の関数を作ってみたり、基本的な事からしっかりと
固めていけばいいと思います。
ある程度慣れてきたら、クラスや例外処理、線形リスト、ソート等のアルゴリズムに挑戦すれば
いいと思います。(参考までにどうぞ)
401ポイント を手に入れた。
|
|
|
|
|
Name: 組木紙織 ..熟練のプログラマー(66,768ポイント)
Date: 2008/12/06(土) 10:48
No:25191
|
|
Title: Re:C言語を始めるにあたって
|
|
プログラムを習い始めたばかりでC++を理解するのはかなりしんどいです。
私が思うに、
1:C言語を一通り(プリプロセッサと関数ポインタ以外の部分)を覚えて扱えるようにする。(I/O関係は細かく覚えなくても良い)
2:データ構造(リンクリスト、ツリー構造、ハッシュ、etc)とアルゴリズム(バブルソート、挿入ソート、マージソート、クイックソート、etc)を実装できるようにする。
3:C++言語(文法)を覚える。
4:C++のライブラリを覚える
5:デザインパターンを覚える
6:C++のライブラリの一部を自分で実装してみる。
7:effective C++,more effective C++, effective stlを読破する。
とりあえずは4まですれば、C++を一通り読んで書くことは出来ると思います。
#実際の現場は知らないのですが、C++を使う職業プログラマーはこれを全部終わっているんじゃないかと勝手に思っています。
2ポイント を手に入れた。
|
|
|
|
|
Name: CDC ..ぴよぴよ(155ポイント)
Date: 2008/12/06(土) 22:26
No:25253
|
|
Title: Re:C言語を始めるにあたって
|
|
conio さん
1の解答
for(int i=1; i<101; i++){
if(i%15 == 0) printf("FizzBuzz\n");
else if(i%5 == 0) printf("Buzz\n");
else if(i%3 == 0) printf("Fizz\n");
else printf("%d\n",i);
}
2の解答
bool Array[5][5] = {
{0,1,0,1,0},
{1,0,1,0,1},
{0,1,0,1,0},
{1,0,1,0,1},
{0,1,0,1,0},
};
for(int i=0; i<5; i++){
for(int j=0; j<5; j++){
if(Array[i][j] == 0) printf("□");
else if(Array[i][j] == 1) printf("■");
if(j == 4) printf("\n");
}
}
で一応はできました。
意図したとおりでしょうか?
御迷惑でなければ他に問題を出していただけますと助かります><
51ポイント を手に入れた。
|
|
|
|
|
Name: CDC ..ぴよぴよ(187ポイント)
Date: 2008/12/06(土) 22:27
No:25254
|
|
Title: Re:C言語を始めるにあたって
|
|
すいません。
ソースを規約の通りだしてませんでした><
32ポイント を手に入れた。
|
|
|
|
|
Name: conio ..初心者(7,417ポイント)
Date: 2008/12/07(日) 11:45
No:25276
|
|
Title: Re:C言語を始めるにあたって
|
|
【2】はこんな感じでも良いかと。
---------------------------------------------------
#include <stdio.h>
int main(void)
{
for(int i=0; i<5; i++){
for(int j=0; j<5; j++){
if((i + j) % 2 )printf("□");
else printf("■");
}
printf("\n");
}
return(0);
}
---------------------------------------------------
自分が参考書や基本情報技術者試験で、解いた問題の類似例です。参考にどうぞ。
強制でも何でもないので、暇な時に解いてみるといいかと。
あと、やはり参考書があれば参考書の例題を解いてみたり、参考書を見ずに参考書のプログラムを
書いてみると一番よく練習出来ると思います。
@for文を使って、配列の要素を入れ替えて表示する(配列の中身も入れ替わっていること)
【例】a[5] = {1,2,3,4,5}
【出力】a[5] = {5,4,3,2,1}
Afor文を使って、二次元配列a[5][5]の縦と横の要素を入れ替える。
【例】
11111
10000
11111
00001
11111
【出力】
10111
10101
10101
10101
11101
B数当てゲームを作る。(ランダムに1〜9の数字をxに代入。scanf関数で読み込み。)
外した場合、数が大きいか少ないかを表示し、再入力させる。
【例】3の場合
【出力例】
数を入力してください:6
大きいです!
数を入力してください:1
小さいです!
数を入力してください:3
正解です!
C10人の成績(0〜50点)を入力し、入力を元に下記の様な表を作る。(範囲外の入力は再入力を促すこと)
【出力例】
50点:★
40〜49点:★★
30〜39点:
20〜29点:★★★★
10〜19点:★★
0〜 9点:★
D簡単なタイピングゲームを作る。入力された文字が合っていれば文字を消し、
全て消した時ゲームクリア!と表示させる。但し、\rを用いて改行させないようにする。
【出力例】
test
est
st
t
ゲームクリア!
E配列a[30]に適当な数字を入れておき、0以外の数字があるかを全て探索する。
但し、0以外の数字があった時は、見つけた順番通りに「0以外の数字"●"が●個ありました」と表示させること。
【例】
a[30]= {0,9,8,1,0,0,3,2,4,1,4,9,9,8,8,0,0,1,2,3,4,1,9,3,0,0,0,2,1,5};
【出力】
0以外の数字"9"が4個ありました
0以外の数字"8"が3個ありました
0以外の数字"1"が5個ありました
0以外の数字"3"が3個ありました
0以外の数字"2"が3個ありました
0以外の数字"4"が3個ありました
0以外の数字"5"が1個ありました
686ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..熟練のプログラマー(44,180ポイント)
Date: 2008/12/07(日) 12:08
No:25278
|
|
Title: Re:C言語を始めるにあたって
|
|
HTML+JavaScript -> Java -> C++ を独学していった私ですが、
いきなりプログラミング言語を覚えるのに C++ というのは、
確かにマスターするのに時間がかかるかと思います。
私が C++ を覚えたのは C++ の入門書からでした。
なので、入門書にある例題や問題を実際に書いて、
さらに自分の思い通りに動くかコードをちょっといじって確かめたり、
他のソフトのサンプル(ここならサンプルプログラミングの館)を見て、
どのように動いているのかコードを読んでみたりするといいでしょう。
現在覚えているところでは C 言語でも共通のところですので、
組木紙織さんの方法から覚えていってもいいと思いますよ。
conio さんの問題の解答ですが、(私から言うのもおかしいですが)
問2 が惜しいです。
問題では6x6サイズですが、5x5で出力されています。
ほぼ正解している、ということなので、別解を書いてみました。
{
printf("1 の解答\n");
bool b[2];
for(int i=1;i<=100;++i){
b[0] = (i%3 == 0);
b[1] = (i%5 == 0);
if(b[0]) printf("Fizz");
if(b[1]) printf("Buzz");
if(!b[0] && !b[1]) printf("%d",i);
printf("\n");
}
}
{
printf("2 の解答\n");
for(int y=0;y<6;++y){
for(int x=0;x<6;++x){
if((x+y)%2 == 0) printf("□");
else printf("■");
}
printf("\n");
}
}
> 御迷惑でなければ他に問題を出していただけますと助かります><
とのことなので、私からも問題を3つ。
【3】conio さんの問題【1】の条件追加問題です。
1行辺り5個の値を表示するようにする。ただし、整形した形で表示させること。
例)
1 2 Fizz 4 Buzz
Fizz 7 8 Fizz Buzz
11 Fizz 13 14 FizzBuzz
--------------------------------------------(以下略)
【4】conio さんの問題【1】の処理追加問題です。
数値の入力を求め、その数値の文字数の正方形の模様を表示する。
例)
2を入力した場合:
□■
■□
3を入力した場合:
□■□
■□■
□■□
【5】2つの値を求め、その2値のそれぞれ加減乗除(左右入れ替えてそれぞれ計算)した値を表示する。
このとき入力する値及び表示する値は浮動小数点として扱い、計算、表示すること。
また、0を入力した場合、エラーを表示し、再度入力を促すこと。
浮動小数点の値の型は double を使用すること。
例)
2 5.5 を入力した場合:
2.000000 + 5.500000 = 7.500000
2.000000 - 5.500000 = -3.500000
2.000000 * 5.500000 = 11.000000
2.000000 / 5.500000 = 0.363636
5.500000 + 2.000000 = 7.500000
5.500000 - 2.000000 = 3.500000
5.500000 * 2.000000 = 11.000000
5.500000 / 2.000000 = 2.750000
# ちょっと長くなってしまいました。
1,169ポイント を手に入れた。
|
|
|
|
Name: ムンバ ..中級者(14,513ポイント)
Date: 2008/12/07(日) 11:29
No:25273
| 解決!
|
Title: 無題
|
|
つうこうにんさん、了解しました。
また何かあれば宜しくお願いします。
ありがとうございました。
39ポイント を手に入れた。
|
|
|
Name: Syobon ..ぴよぴよ(18ポイント)
Date: 2008/12/06(土) 17:07
No:25205
|
|
Title: 無題
|
|
今、龍神録プログラミングの館を見ながらプログラムを打ち込んでいるのですが
10章の「敵を表示させてみよう」のページを見ながら打ち込んだ後コンパイルを実行すると
error C2065: 'SHOT_BULLET_MAX' : 定義されていない識別子です。
error C2065: 'se_flag' : 定義されていない識別子です。
error C2065: 'SE_MAX' : 定義されていない識別子です。
error C2065: 'sound_se' : 定義されていない識別子です。
というエラーが帰ってきます。
これはどうやって解決すればいいのでしょうか?
18ポイント を手に入れた。
|
|
|
|
Name: 紅葉 ..中級者(9,806ポイント)
Date: 2008/12/07(日) 03:01
No:25266
|
|
Title: Re:無題
|
|
#define と 定義文は書きましたか?
#define A 16
等と書くとそれ以降Aというものは16として扱えます。
配列などでいくつかの場所に使うもののサイズをこれで定義してあげれば
修正がかなり楽になります。
95ポイント を手に入れた。
|
|
|
|
Name: cuser ..ぴよぴよ(172ポイント)
Date: 2008/12/06(土) 16:49
No:25203
|
|
Title: main()関数の終了について
|
|
終了コードを持たせるプログラムのとき
main()関数の終了はどのようにしていますか?
1.関数の型を int として return で終了する。
2.関数の型を int として exit() 関数で終了する。
3.関数の型を void として exit()関数で終了する。
4.その他
「一般的な方法である」、「慣例である」、「安全面を考えて」、
「公の機関で推奨されている、またははっきりと定義されている」など
そうしている理由も知りたいです。
172ポイント を手に入れた。
|
|
|
|
Name: ibis ..上級者(15,305ポイント)
Date: 2008/12/06(土) 17:49
No:25212
|
|
Title: Re:main()関数の終了について
|
|
私は1ですね。
理由は、exitが必要な機会があまり無い、といったところでしょうか。
C++に慣れてるのもありますし。
ちなみにC++ではexitは良くないんですよ。
exitでは終了の際にデストラクタ(オブジェクトの解体をする関数)が呼び出されないのがその理由で、
この場合はthrowかreturnを使います。
97ポイント を手に入れた。
|
|
|
|
|
Name: cuser
Date: 2008/12/13(土) 16:46
No:252031229154380
| 解決!
|
Title: Re:main()関数の終了について
|
|
ありがとうございます。利用させていただきます。
|
|
|
|
Name: ラン ..ぴよぴよ(187ポイント)
Date: 2008/12/06(土) 16:15
No:25198
|
|
Title: forのプログラムについて
|
|
・問題
キーボードから数値を入力して、その数値に10を加えた値までを表示するプログラムを作成しなさい。
・出力例(5を入力した場合)
input=5
5 6 7 8 9 10 11 12 13 14 15
です。私もプログラムを考えているのですが、全然わかりません。
個人的に問題解いてるのですが答えがなくてできません。
宿題でもないので急ぎはしません。
ゆっくりでいいのでプログラムを教えてください。
187ポイント を手に入れた。
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(913,239ポイント)
Date: 2008/12/06(土) 16:45
No:25201
|
|
Title: Re:forのプログラムについて
|
|
解るところから少しずつといていき、解らなくなったところでその点を重点的に勉強するスタンスをとってはどうでしょう。
1 scanf関数でキーボードから整数を読み込み、表示するだけのプログラムを書きましょう
2 0〜10までの整数をループ文を使って表示するプログラムを書きましょう
3 0〜問題1で読み込んだ整数までの整数を表示するプログラムを書きましょう。
そして・・・
・問題
キーボードから数値を入力して、その数値に10を加えた値までを表示するプログラムを作成しなさい。
こうして順番に問題をといていけばわかりやすいのではないでしょうか。
躓いたらどの辺でつまずいて、何がわからないか詳しく教えて下さい。
また、聞く前に最大限自分で調べてみて下さい。
とりあえずscanf関数の使い方がわからなければ「scanf」でぐぐれば大量に使い方説明が出てきます。
189ポイント を手に入れた。
|
|
|
|
|
Name: ラン ..ぴよぴよ(322ポイント)
Date: 2008/12/06(土) 17:03
No:25204
|
|
Title: Re:forのプログラムについて
|
|
ありがとうございます。
#include <stdio.h>
void main()
{
int ia;
scanf("%d",&ia);
for(; ia<10; ia++){
printf("%d ",ia);
}
}
ここまで作れたのですが、入力した文字から10個表示ができません。
どうすればいいですか?
135ポイント を手に入れた。
|
|
|
|
|
Name: ibis ..上級者(15,208ポイント)
Date: 2008/12/06(土) 17:25
No:25208
|
|
Title: Re:forのプログラムについて
|
|
あー。
10以下の数しか表示できないんですね。
入力された値からカウントアップするのは別の変数で行い、
その変数とiaとの差が10以下か否かをループの条件にする。
というのはどうでしょうか。
もうちょい具体的には、こんな感じでしょうかね。
int x = ia;
for(; x-ia<=10; x++){
printf("%d ",x);
}
124ポイント を手に入れた。
|
|
|
|
|
Name: ラン ..ぴよぴよ(266ポイント)
Date: 2008/12/06(土) 17:35
No:25209
|
|
Title: Re:forのプログラムについて
|
|
ありがとうございます。
でも、よくわかりません。
初心者なものですみません。
もう少しわかりやすいプログラムはありませんか?
56ポイント を落としてしまった。
|
|
|
|
|
Name: 初級者 ..入門者(2,959ポイント)
Date: 2008/12/06(土) 17:50
No:25213
|
|
Title: Re:forのプログラムについて
|
|
#include <stdio.h>
int main(void)
{
int n, i;
printf("input=");
scanf("%d", &n);
for (i = n; i <= n + 10; i++) { // iはnから(n+10)まで変化する
printf("%d ", i);
}
return 0;
}
2倍のポイントを手に入れた! 268ポイント を手に入れた。
|
|
|
|
|
Name: stack ..ぴよぴよ(310ポイント)
Date: 2008/12/06(土) 17:54
No:25217
|
|
Title: Re:forのプログラムについて
|
|
私の作成したこのプログラムはいかがでしょうか?キーボードから数値を入力する部分と、結果を出力する部分は関数化し、mainの中でそれらを呼び出すスタイルになりますが・・・・。mainの中で全部処理するなら
#include <stdio.h>
int main(void)
{
int i, num;
/* 整数のキー入力 */
printf("input = ");
scanf("%d", &num);
/* 計算結果の処理部分(ここをしっかり勉強して下さい) */
for (i = 0; i <= 10; i++) {
printf("%d ", (num + i));
}
printf("\n"); /* 最後に改行文字を出力して終了 */
return (0);
}
としてはいかがでしょうか?
207ポイント を手に入れた。
|
|
|
|
|
Name: ラン ..ぴよぴよ(315ポイント)
Date: 2008/12/06(土) 17:55
No:25218
| 解決!
|
Title: Re:forのプログラムについて
|
|
ありがとうございます。
そのプログラムを参考にオリジナルを考えてみます。
また、よろしくお願いします。
49ポイント を手に入れた。
|
|
|
|
|
Name: ibis ..上級者(15,306ポイント)
Date: 2008/12/06(土) 17:57
No:25220
|
|
Title: Re:forのプログラムについて
|
|
わかりませんでしたか。
すみません。
全文ではこうなります。
先程の断片よりはわかりやすいでしょうか?
#include <stdio.h>
void main()
{
int ia;
int x;
scanf("%d",&ia);
x = ia;
/*for(; ia<10; ia++){
printf("%d ",ia);
}*/
for(; x-ia<10; ia ++){
printf("%d ",x);
}
}
1ポイント を手に入れた。
|
|
|
|
|
Name: ラン ..ぴよぴよ(377ポイント)
Date: 2008/12/06(土) 18:00
No:25222
| 解決!
|
Title: Re:forのプログラムについて
|
|
ibisさん。
本当にありがとうございます。
すごくわかりやすいです。
初心者なもので迷惑かけてすみせん。また、よろしくお願いします。
62ポイント を手に入れた。
|
|
|
|
|
Name: ラン ..ぴよぴよ(441ポイント)
Date: 2008/12/06(土) 18:15
No:25223
|
|
Title: Re:forのプログラムについて
|
|
他のプログラムを質問します。
・問題
キーボードから数値を入力して、その数値に10を加えた値までを表示するプログラムを作成しなさい。
・出力例(4の場合)
input: 4
田中太郎
田中太郎
田中太郎
田中太郎
です。よろしくお願いします。
64ポイント を手に入れた。
|
|
|
|
|
Name: yu ..入門者(4,220ポイント)
Date: 2008/12/06(土) 18:49
No:25225
|
|
Title: Re:forのプログラムについて
|
|
最初の問題と同じような気がしますが?・・・
出力例は違いますが。
それと、一度自分でプログラムを作ってみましたか?
作ってみて分からないところがあったら教えてください。
こんなこと言ってる自分ですが、まだプログラムを始めて2か月ですorz
20ポイント を手に入れた。
|
|
|
|
|
Name: ラン ..ぴよぴよ(556ポイント)
Date: 2008/12/06(土) 19:52
No:25230
|
|
Title: Re:forのプログラムについて
|
|
すみません。
問題をうち間違えました。
・問題
キーボードから数値を入力し、その入力された数値の回数だけ自分の名前を表示するプログラムを作成しなさい。
・出力例(4の場合)
input: 4
田中太郎
田中太郎
田中太郎
田中太郎
です。プログラムを教えてください。
自分でも考えているのですが全然わからないです。
115ポイント を手に入れた。
|
|
|
|
|
Name: conio ..初心者(6,286ポイント)
Date: 2008/12/06(土) 20:00
No:25231
|
|
Title: Re:forのプログラムについて
|
|
-----------------------------
#include<stdio.h>
int main(void){
int x,i;
/*xに値を入れさせる*/
for(i = 0; i < x; i++)
/*名前を表示させる処理*/
return(0);
}
-----------------------------
こんな感じでどうでしょう?
値を入れさせる処理はscanf関数、表示させる処理はprintf関数で出来ると思います。
100ポイント を落としてしまった。
|
|
|
|
|
Name: ラン ..ぴよぴよ(572ポイント)
Date: 2008/12/06(土) 20:06
No:25232
|
|
Title: Re:forのプログラムについて
|
|
ありがとうございます。
具体的なプログラムはどうなりますか?
16ポイント を手に入れた。
|
|
|
|
|
Name: conio ..初心者(6,457ポイント)
Date: 2008/12/06(土) 20:24
No:25234
|
|
Title: Re:forのプログラムについて
|
|
上のプログラムはほぼ答えです。
もし、プログラムをどう書けばいいのか全然見当がつかない、という事であれば
printf文、scanf文を学習すれば書ける様になると思います。
とりあえず、解答です↓
---------------------------------
int main(void)
{
int x,i;
printf("値を入力してください:");
scanf("%d",&x);
for(i = 0; i < x; i++)
printf("田中太郎\n");
return 0;
}
--------------------------------
171ポイント を手に入れた。
|
|
|
|
|
Name: ラン ..ぴよぴよ(740ポイント)
Date: 2008/12/06(土) 21:16
No:25246
|
|
Title: Re:forのプログラムについて
|
|
・問題
キーボードからアルファベット小文字を1文字を入力し、その続きからzまでを表示するプログラムを作成しなさい。
・実行結果(h)を入力した場合
moji?h
i j k l m n o p q r s t u v w x y z
です。自分の作ったプログラムを貼ります。
#include <stdio.h>
void main()
{
char i,n;
printf("moji?");
scanf("%c",&n);
for(i=n+1; i<='Z'; i++){
printf("%c ",i);
}
}
です。このプログラムで動きました。
で、小文字を入力したときに大文字として出力できません。
どこを変更すればいいですか?
153ポイント を手に入れた。
|
|
|
|
|
Name: conio ..初心者(6,621ポイント)
Date: 2008/12/06(土) 22:12
No:25251
|
|
Title: Re:forのプログラムについて
|
|
上記のプログラムは、こちらでは動きませんでした。
数字文字とは違い、アルファベット文字には規則性が保証できないので、
インクリメントして表示させる方法はあまり良いとは思えません。
動かなかったので、個人的にプログラムを作りました。
大文字にしたい時はtoupper関数を使えばいいと思います。
--------------------------------------------
#include <stdio.h>
#include <ctype.h>
void main()
{
char mozi[27]="abcdefghijklmnopqrstuvwxyz";
char n,i=0;
printf("文字を入力してください:");
scanf("%c",&n);
while(n != mozi[i])
i++;
while(mozi[++i] != 0){
printf("%c",toupper(mozi[i]));
}
}
--------------------------------------------
164ポイント を手に入れた。
|
|
|
|
|
Name: 通りすがり ..中級者(13,482ポイント)
Date: 2008/12/06(土) 23:24
No:25259
|
|
Title: Re:forのプログラムについて
|
|
簡単な問題の質問トピの時だけ出てきて答えだけ書いて去っていく人どうなの?
本人気づいてないかもしれないけど、色んな方向からアドバイス試みている人に対して失礼です。
答えのプログラムだけ教えるのは適切な回答じゃない。質問者が考え方より答えを望んでいる場合は余計に。
89ポイント を手に入れた。
|
|
|
|
|
Name: ムンバ ..中級者(14,474ポイント)
Date: 2008/12/06(土) 23:36
No:25260
|
|
Title: Re:forのプログラムについて
|
|
通りすがって、ご意見だけ書いてくのも失礼だと思いますけど。私の事ですか?^^;
>本人気づいてないかもしれないけど、色んな方向からアドバイス試みている人に対して失礼です。
ごめんなさい。
102ポイント を手に入れた。
|
|
|
|
|
Name: conio ..初心者(6,731ポイント)
Date: 2008/12/06(土) 23:45
No:25261
|
|
Title: Re:forのプログラムについて
|
|
丸投げではなく、"考えた結果分からない、エラーが取れない"という事であれば、アドバイスをするのは良いと思います。
上記のstackさんibesさん初級者さんのように。
一応、自分はプログラムの一部を日本語で書く等して、そのまんまの答えを書くことは出来るだけ
避けています。
少しでも考える余地があれば、練習になると思っております。
110ポイント を手に入れた。
|
|
|
|
Name: 紅葉 ..初心者(7,692ポイント)
Date: 2008/11/26(水) 17:03
No:24608
|
|
Title: Justyさんにお尋ねしたいこと
|
|
先日はありがとうございました。
ただ解析していてどうしても理解できない点があったので質問させていただきました。
大きく2つあります。
まずメッシュの傾きについての
namespace内の
intersectInfo->pos = p + v * dist;
intersectInfo->length = dist;
の1行目はたぶん当たったら戻る位置を表していると思うのですがあっているでしょうか?
また2行目の意味がわかりません。
ボールからのレイの長さをどこでだしているのか?
2つ目は
今まで感覚でかいていたのであっているかはわかりませんが
bool Gs_CheckIntersect(GsMESH id, const VEC3 &rayPos,
const VEC3 &rayVec, const MAT &m, IntersectInfo *intersectInfo)
&rayPosなどはアドレスを渡して関数内で参照している。
IntersectInfo *intersectInfoは関数内で値を変更している
であっていますでしょうか?
PGがわけのわからない質問をしてきたので戸惑っていますw
306ポイント を手に入れた。
|
|
|
|
Name: Justy ..ハッカー(275,726ポイント)
Date: 2008/11/26(水) 21:57
No:24620
|
|
Title: Re:Justyさんにお尋ねしたいこと
|
|
>1行目はたぶん当たったら戻る位置を表していると思うのですがあっているでしょうか?
戻る位置、というよりただの交点の位置です。
>また2行目の意味がわかりません。
レイの始点から交点までの距離です。
D3DXIntersect()の第8引数の結果をそのまま代入しているだけです。
>ボールからのレイの長さをどこでだしているのか?
D3DXIntersect()に引き渡しているレイのベクトルの長さのことですか?
この関数では向きしか見ないので、長さは0でなければ何でもいいと思いますが。
distのことであれば、D3DXIntersect()が長さを求めてくれています。
>&rayPosなどはアドレスを渡して関数内で参照している。
概ねそうです。参照を渡して関数内でそれを参照しています。
constをつけているので、入力専用です。
>IntersectInfo *intersectInfoは関数内で値を変更している
そうです。
こちらは出力専用です。
610ポイント を手に入れた。
|
|
|
|
|
Name: 紅葉 ..初心者(7,961ポイント)
Date: 2008/11/27(木) 00:23
No:24644
|
|
Title: Re:Justyさんにお尋ねしたいこと
|
|
あまりにも速度を出しすぎると貫通してしまうので
if(FAILED(D3DXIntersect(lpMesh, &p, &v, &isHit, 0, 0, 0, &dist, 0, 0)))
dist = dist+2; // これではだめでした・・・
みたいなことを書いてメッシュとボールの判定する長さを少し大きくしたいです><
またメッシュの
判定外に出たら落ちるのではなく止まる?というかというのも書きたいです。
傾いていたとしても使えるメッシュの上(Y軸方向に)あたり判定的な物をつけたいです。
たとえばボールが上のほうに飛んでしまってもメッシュの端より向こうにはいかないみたいな感じです><
269ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..中級者(10,141ポイント)
Date: 2008/11/27(木) 17:26
No:24651
|
|
Title: Re:Justyさんにお尋ねしたいこと
|
|
プログラマが見つかり、おめでとうごさいます。
さて、この質問についてですが、
1 回答者を名指ししている
2 現在プログラム担当ではない紅葉さんが質問をしている
と言う点についてちょっと良くないんじゃないかと感じます。
特に2についてはプログラマの方が質問に来られるのが筋と考えます。
123ポイント を手に入れた。
|
|
|
|
|
Name: 紅葉 ..初心者(8,087ポイント)
Date: 2008/11/27(木) 18:02
No:24653
|
|
Title: 無題
|
|
lbfuvabさん
PGは見つかっていなく音信不通気味の方です・・・
この方は今日発覚したのですがポインタも使えませんでした・・・
1についてですが掲示板での質問が不適切なことは理解しています。
この掲示板を見て不快に思う方が多数でしょう。
その方々には申し訳ないと思っています。
2についてですが私が担当の音ともう一人のデザイナーさんの素材がほとんどできてしまっているので
無駄にはしたくないんですw
申し訳ありません。
ですが途中で投げ出したくはないので自分に与えられた仕事(後2工程)が終わりましたら
この同人チームから抜けようかと思います。
126ポイント を手に入れた。
|
|
|
|
|
Name: 紅葉 ..初心者(8,261ポイント)
Date: 2008/11/27(木) 18:14
No:24654
|
|
Title: Re:無題
|
|
中身などは変わってしまっていますが先日のものと大体は同じです。
現在ポリゴンごとに転がる?用に組んだのですが、Intersectで常に真下にあたりのレイを飛ばしているので
高速に回転させるとフレーム間に判定が取れずに下に落ちてしまいます。
これを回避するために今、判定をしている床の向きに線を引っ張って判定はできないでしょうか?
また、ポリゴンのない場所の上(端)にボールがあったら落ちない、みたいなことは書けないのでしょうか?
見えない壁?みたいなのをY軸に張り巡らせたいです。
添付したZIPを解凍した直下に次に添付したデータを入れていただけますと助かります><
174ポイント を手に入れた。
|
|
|
|
|
Name: 紅葉 ..初心者(8,234ポイント)
Date: 2008/11/27(木) 18:14
No:24655
|
|
Title: Re:無題
|
|
データになります。
前回限りの質問と言ったのにまた質問してしまいすいません><
27ポイント を落としてしまった。
|
|
|
|
|
Name: lbfuvab ..中級者(10,459ポイント)
Date: 2008/11/27(木) 21:51
No:24665
|
|
Title: Re:無題
|
|
>PGは見つかっていなく音信不通気味の方です・・・
>この方は今日発覚したのですがポインタも使えませんでした・・・
事情は理解しました。同情いたします。
差し出がましい口を利いてしまいすいませんでした。
110ポイント を手に入れた。
|
|
|
|
|
Name: 紅葉 ..初心者(8,269ポイント)
Date: 2008/11/27(木) 22:43
No:24666
|
|
Title: Re:無題
|
|
lbfuvabさん
全然かまいません><
むしろこの掲示板を悪い方向にしてしまっているので申し訳ないです。
ご指摘ありがとうございます。
35ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(277,082ポイント)
Date: 2008/11/28(金) 02:34
No:24670
|
|
Title: Re:無題
|
|
とりあえず、ヒントだけ。
数学的な部分やコーディングは自力で頑張って下さい。
>高速に回転させるとフレーム間に判定が取れずに下に落ちてしまいます
箱の1フレーム前のローカル座標系のボールの位置と、
今のフレームの箱のローカル座標系のボールの位置のレイで調べてれば
ある程度高速で回転させてもあたると思います。
或いはマップを回転させるのではなく、カメラを反対側に回転させてボールとマップが
回転したかのように見せ、ボールの重力方向をそれに合わせて変えてあげてもいいですね。
あとは床の向きを調べて、押し上げればいいはずです。
>ポリゴンのない場所の上(端)にボールがあったら落ちない、
>みたいなことは書けないのでしょうか
勿論できます。
その為の Gs_CheckIntersect()です。
真下に飛ばせば床があるかどうかわかるので、後はその位置には
移動しないようにするだけです。
或いはマップの方に壁となるポリゴンを追加して、その部分は不可視属性を
つけて描画しないようにするとか、表示マップとは別に壁となるポリゴンを
追加したコリジョンマップを用意してもいいですね(こっちの方が簡単かも)
>この方は今日発覚したのですがポインタも使えませんでした・
凄いですね(w
2倍のポイントを手に入れた! 1,280ポイント を手に入れた。
|
|
|
|
|
Name: 紅葉 ..初心者(8,623ポイント)
Date: 2008/12/02(火) 17:05
No:24932
|
|
Title: 遅れてしまいすいませんでした
|
|
ポインタもつかえずなぜライブラリを使えたのでしょう・・・
というかライブラリで使っているのですが・・・
やはり急激に移動させると地面との判定が崩れてしまいます。
一応Axis.Rtでマップの軸の行列でしています。
多分、移動のmoveらへんがおかしいのかも知れません。
また床との判定をしておちなくすることについてですが
真下に判定を出してもあったっているかの情報だけで
どこと当たっているかはわからなくないでしょうか?
一応、床との判定を
bool MapHitF として 処理で
MapHitF = Gs_CheckIntersect(GsMeshHang[id].lpMesh, p, v, intersectInfo,pNum);
と考えているのですが使い方が違うのでしょうか?
時間があればで構いませんので変なところを修正いただけますと助かります。
添付したものを解凍した直下にDATAの解凍したものを入れれば動きます><
制作のチームを辞められるの今月の末になってしまいました・・・
できる限りのことは頑張ってやります><
354ポイント を手に入れた。
|
|
|
|
|
Name: 紅葉 ..初心者(8,637ポイント)
Date: 2008/12/02(火) 17:05
No:24933
|
|
Title: Re:遅れてしまいすいませんでした
|
|
DATAになります
2倍のポイントを手に入れた! 14ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(281,050ポイント)
Date: 2008/12/04(木) 01:27
No:25015
|
|
Title: Re:遅れてしまいすいませんでした
|
|
>やはり急激に移動させると地面との判定が崩れてしまいます。
高速回転時の判定については、上記の通りです。
要はマップの座標系を使う或いはマップではなくカメラを回転させることで、
マップは静止している(とみなす)ようにして、ボールがどこからどこに移動しているのかを
調べれば抜けなくなるはずです。
あと本来であれば、こういうのはレイではなく"球(或いはカプセル)とマップ"でコリジョンを
とった方がいいかと思いますが、レイでやるならその開始位置は球の中心位置からではなく
レイのベクトルとは反対側に半径分だけ戻した位置からレイを飛ばすと球が半分以上めり込んだ
状態でもぶつかるはずです。
(レイの終端側も半径分伸ばしてあげるといいですね)
>真下に判定を出してもあったっているかの情報だけで
>どこと当たっているかはわからなくないでしょうか?
単純に床からはみ出して落ちなくするだけなら、真下に当たり判定がないなら、
その場所には移動しなければいい(つまり1フレーム前の床があった時の座標を使うとか
どこか別の床のあるところに移動させる)のではないでしょうか。
それでゲームの意図と合うかどうかはわかりませんが、少なくとも
はみ出して落ちなくはなります。
2倍のポイントを手に入れた! 62ポイント を手に入れた。
|
|
|
|
|
Name: 紅葉 ..中級者(9,037ポイント)
Date: 2008/12/06(土) 02:54
No:25185
|
|
Title: Re:遅れてしまいすいませんでした
|
|
>>箱の1フレーム前のローカル座標系のボールの位置と、
>>今のフレームの箱のローカル座標系のボールの位置のレイで調べてれば
いろいろな方法を試してみたのですができませんでした><
実際には下のAxis.Rtについて編集したのですがだめでした。
if((Gs_CheckIntersect(MESH, boxPos, boxV*-2.f, Axis.Rt, &intersect,pNum) ||
Gs_CheckIntersect(MESH, Ball.Pos, Ball.Move, Axis.Rt, &intersect,pNum))&&
intersect.length < ballRadius * 2.f)
>>つまり1フレーム前の床があった時の座標を使う
const VEC3 &boxPos = Ball.Pos + g + Ball.Move + boxV; // とりあえず移動先を仮定
をBall.OldPosに変更してみたのですが判定を取ってくれなくなってしまいました><
カメラを回転はもしかしたらステージが増えるかもしれないので実装しない方向で決まりました。
すいませんです><
316ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(282,851ポイント)
Date: 2008/12/06(土) 15:49
No:25197
|
|
Title: Re:遅れてしまいすいませんでした
|
|
>いろいろな方法を試してみたのですができませんでした
数学・幾何学的にきちんと考え、目標までの道筋を立ててから、
コードを書いていますか?
2Dは勿論、3Dの場合は特に理論を伴わず意味も考えず、
闇雲にコードを書くだけではいつまで経ってもできませんよ。
とりあえず、コリジョン判定の基礎から勉強し直した方がいいと思います。
少なくとも、今のままではどうしようもないでしょう。
>Ball.OldPosに変更してみたのですが判定を取ってくれなくなってしまいました
意味はよくわかりませんが、そこを OldPosにしてしまうということは
理論的に理解できていないか、プログラムが理解できていないかのどちらかです。
プログラム的に理解できていない場合は理解する以外にはどうしようもないので、
理論的だった場合について触れておきます。
簡単に書くとこういうことです。
貴方が歩いていたら前に穴が空いていたとします。
当然前に進んで、足を穴に踏み入れれば落ちていきますが、
進めば落ちることがわかった段階でその場で止まるなり、
向きを変えて穴のないところに移動すれなり(そこはゲームの仕様次第)、
すれば落ちずにすみます。
>カメラを回転はもしかしたらステージが増えるかもしれないので実装しない
カメラの回転とステージの増加との関連性は不明ですが、カメラも回転しない、
上記のように箱は動かないものみなして処理するのも無理、であれば
少しずつ動かして処理するというのもいいでしょう。
例えば、1フレームで10動くとしたら、1フレームの中で
1ずつ動かして最大 10回判定する方法です。
ボールと箱が大きく動くからすり抜けてしまうわけで、すり抜ける余地のない単位で
少しずつ動かして判定すればすり抜けません。
勿論、10でもすり抜けてしまうなら、20,30,50,100と細かくして
判定すればいつかは抜けなくなります。
562ポイント を手に入れた。
|
|
|
|
|
Name: 紅葉 ..中級者(9,711ポイント)
Date: 2008/12/06(土) 23:02
No:25257
|
|
Title: Re:遅れてしまいすいませんでした
|
|
>>Justyさん
このライブラリを使い2Dでしたら多分、殆どのことができるのですが
3Dはまったくの素人で書き方もあまり理解していません。
勉強したいのですが製作期間がないのと、私がこのチームをやめますので
期日までに作業ができないと、ウダウダ言われそうなので・・・
できるだけのことはします。
以前、進めていただいた本も読んだのですがパイプラインやテクスチャなどについての説明で
数学関係については理解できないです・・・
ただ本を読んでメッシュの法線は多分作れています。
しかし、どうしてもできないです・・・
現在は以下のような状況なのですが、いじりすぎてもう何処を触ればいいかわからなくなってきました・・・
現在の課題は
・高速で回転させると判定が取れない
・マップから落ちないようにする。
の2点です。
どうか教えていただけないでしょうか><
// 描画
// ステージ
Gs_DrawKanadeAxis(M_MAP, GRoll.Axis.Rt);
// ボール
Gs_DrawModel(GRoll.Ball.OldPos.x,GRoll.Ball.OldPos.y,GRoll.Ball.OldPos.z,M_PLAY,0.3f,0.3f,0.3f,0,0,0);
//Common.c 中身
// ボールの移動
void C_ROLL::BallMove(GsMESH MESH)
{
// 下に落ちる移動量
const VEC3 g = VEC3(0, -0.0098f/3.f, 0);
// 試しに移動させて、床にあたっているかどうかを調べる
const float ballRadius = 0.3f * 2;
/*
VEC3 v = VEC3( (PolyVt[0].x+PolyVt[1].x+PolyVt[2].x)/3,
(PolyVt[0].y+PolyVt[1].y+PolyVt[2].y)/3,
(PolyVt[0].z+PolyVt[1].z+PolyVt[2].z)/3 );
VEC3 boxV(v.x,v.y,v.z);
*/
VEC3 boxV = VEC3(Axis.Rt._21,Axis.Rt._22,Axis.Rt._23);
boxV *= ballRadius;
Ball.Normal = boxV;
const VEC3 &boxPos = Ball.Pos + g + Ball.Move + boxV; // とりあえず移動先を仮定
static DWORD pNum; // ポリゴン番号
DWORD OldpNum = pNum;
IntersectInfo intersect;
if((Gs_CheckIntersect(MESH, boxPos, boxV*-2.f, Axis.Rt, &intersect,pNum) || Gs_CheckIntersect(MESH, Ball.Pos, Ball.Move, Axis.Rt, &intersect,pNum))&& intersect.length < ballRadius * 2.f){
// ボールがめり込んでいるので補正
VEC3 move = VEC3(PolyRay.x/100000,0,PolyRay.z/100000);
Ball.OldPos = Ball.Pos;
Ball.Pos = intersect.pos + move;
// Ball.Pos = intersect.pos + boxV;
/*if(move.x * move.x < 0.001f*0.001f) move.x = 0;
if(move.z * move.z < 0.001f*0.001f) move.z = 0;
if(move.x <= 0 && move.z <= 0) f *= 0;*/
}
else
{
// ボールは中に浮いているので落下させる
Ball.Move += g;
Ball.Pos += Ball.Move;
Ball.OldPos = Ball.Pos;
}
// メッシュのポリゴン番号(pNum)における3頂点
GetVerticesOnePoly(MESH,pNum,PolyVt,Axis.Rt);
D3DXVECTOR3 v1,v2;
v1 = PolyVt[1]-PolyVt[0];
v2 = PolyVt[2]-PolyVt[0];
D3DXVec3Cross(&PolyRay,&v1,&v2); // 法線(PolyRay←C_ROLLクラス)
// 落ちすぎたらリセット
if(Ball.Pos.y < -50)
{
Ball.OldPos = Ball.Pos = VEC3(0, 5.0f, 0);
Ball.Move = VEC3(0, 0, 0);
}
D3DXMatrixTranslation(&Ball.Mat,Ball.Pos.x,Ball.Pos.y,Ball.Pos.z);
}
674ポイント を手に入れた。
|
|
|
|
Name: 荒野電 ..ぴよぴよ(2ポイント)
Date: 2008/12/06(土) 20:25
No:25235
|
|
Title: 龍神録プロジェクトが開けません
|
|
インストールして、slnファイルを開こうとしたのですが、vcprojのアプリケーションがインストールされていないと出て開けません。
C#の2005も2008もインストールしてあるのですg、どうしてでしょう?
2ポイント を手に入れた。
|
|
|
|
Name: Justy ..ハッカー(282,919ポイント)
Date: 2008/12/06(土) 20:40
No:25241
|
|
Title: Re:龍神録プロジェクトが開けません
|
|
vcprojは Visual C++がインストールされていないと開けません。
ちなみに Visual C#のプロジェクトファイルの拡張子は csprojです。
68ポイント を手に入れた。
|
|
|
|
|
Name: 荒野電 ..ぴよぴよ(38ポイント)
Date: 2008/12/06(土) 20:44
No:25243
|
|
Title: Re:龍神録プロジェクトが開けません
|
|
VisualC++も持っているのですが・・・
何かアプリケーションに問題があるのでしょうか?
36ポイント を手に入れた。
|
|
|
|
|
Name: 荒野電 ..ぴよぴよ(62ポイント)
Date: 2008/12/06(土) 20:52
No:25244
|
|
Title: Re:龍神録プロジェクトが開けません
|
|
すいませんできました。
お騒がせしました。
24ポイント を手に入れた。
|
|
|
|
Name: ざこ ..かけだし(1,426ポイント)
Date: 2008/12/05(金) 11:38
No:25119
|
|
Title: ポインタについて
|
|
char buf[10]='ABC';
char *p;
p=buf;
とすると
*pのアドレスが指す中身は"A"
*(p+1)のアドレスが指す中身は'B'だと思います。
この場合
*p自体が文字列Aを指してるのか
*p自体はアドレスでそのアドレスが指す中身がAを指しているのか
どちらなのでしょうか?
また
*p=bufというような表現もよく見かけるのですがこれはpはbuf[0]を指すという意味になると
書いてあったのですがp=bufと同じ意味ですか?
ポインタについてしっかり認識しておきたいので教えてください。
29ポイント を手に入れた。
|
|
|
|
Name: 御津凪 [URL] ..熟練のプログラマー(42,695ポイント)
Date: 2008/12/05(金) 11:53
No:25120
|
|
Title: Re:ポインタについて
|
|
"p" がアドレスを指し、
"*p" で"p"のアドレスを指している中身(文字列A)を指します。
つまり、
> *p自体が文字列Aを指してるのか
> *p自体はアドレスでそのアドレスが指す中身がAを指しているのか
"*p" が示す意味は前者の方です。
("p"は後者です)
> *p=bufというような表現もよく見かけるのですがこれはpはbuf[0]を指すという意味になると
> 書いてあったのですがp=bufと同じ意味ですか?
*p=buf ではコンパイルエラーになります。
"*p"はp[0]と同じですが、buf は buf[0] と同じ意味でなく、 p == buf (ポインタと同じ)です。
char *p=buf であればコンパイルは通ります。
このとき、"char *p"の部分は、"char *"と"p"に分かれて解釈しますので、
処理としては p=buf と同じです。
("char *"が型の名前、ということです。)
ここはよく混乱しやすいところなので、注意してください。
# char* p=buf のように'*'の位置を型の直後に移動すれば、ある程度理解しやすいかも。
244ポイント を手に入れた。
|
|
|
|
|
Name: non ..上級者(16,730ポイント)
Date: 2008/12/05(金) 12:40
No:25121
|
|
Title: Re:ポインタについて
|
|
>char buf[10]='ABC';
は char buf[10]="ABC"; ですね。
>*pのアドレスが指す中身は"A"
ここは 'A'です。細かいようですが・・・
しっかり区別しましょう。
45ポイント を手に入れた。
|
|
|
|
|
Name: ざこ ..かけだし(1,467ポイント)
Date: 2008/12/05(金) 13:09
No:25123
| 解決!
|
Title: Re:ポインタについて
|
|
やはりまだあやふやなようです。しっかり覚えます。
ありがとうございました。
41ポイント を手に入れた。
|
|
|
|
|
Name: ムンバ ..中級者(12,531ポイント)
Date: 2008/12/05(金) 22:47
No:25171
| 解決!
|
Title: Re:ポインタについて
|
|
こんばんは。お世話になります。
解決されたのに、ぶら下がりさせて頂きます。ごめんなさい。
今、ポインタの勉強をしてまして参考書の練習問題を解いている真っ最中です。
もう本当にポインタの項目飛ばしちゃおう!くらい悩んだのですが
こちらの掲示板で、何かヒントが見つからないかと拝見してたところ
ざこさんのご質問と、お二方のご解説で、少し前進できた様な感じです。ありがとうございます。
私が勘違いしていた部分を搭載させて頂きます。
コメント(// の行)が、私の勘違い部分です。
#include <stdio.h>
int main()
{
char *syou;
syou = "abcdefghijklmnopqrstuvwxyz";
//char syou[26] = "abcdefghijklmnopqrstuvwxyz";
printf("%c\n", syou[0]);
return 0;
}
私はこれで、配列syouに26個の要素が入ると勘違いしてたんですね。
char syou[26] = "abcdefghijklmnopqrstuvwxyz";
printf("%c\n", syou[0]);
で、先頭の要素(a)を表示しようとしてたんです。^^;
このスレッドを読ませて頂いて
char *syou;
syou = "abcdefghijklmnopqrstuvwxyz";
としたら、解決できました。
難しいですね。ポインタ。
練習問題、続けられそうです。^^
どうもありがとうございました。(謝
291ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(130,899ポイント)
Date: 2008/12/05(金) 23:02
No:25172
|
|
Title: Re:ポインタについて
|
|
> char syou[26] = "abcdefghijklmnopqrstuvwxyz";
> printf("%c\n", syou[0]);
>
> で、先頭の要素(a)を表示しようとしてたんです。^^;
で、結果はどうだったんですか?
できましたよね?正しいコードですから。
8ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(911,780ポイント)
Date: 2008/12/05(金) 23:08
No:25173
|
|
Title: Re:ポインタについて
|
|
う〜んと、、意味がよくわからないです・・。
後、文字列を格納する配列は終端記号を含めた要素数用意しないといけません。
それから、
char *syou;
syou = "abcdefghijklmnopqrstuvwxyz";
と
char syou[26] = "abcdefghijklmnopqrstuvwxyz";
は意味が違います。
試しに、前者のプログラムにおいて、
途中で文字列の最初の文字をaからzに変更してみたりして下さい。
(アドレスではなくデータの中身を変えようとしてみて下さい)
121ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(131,089ポイント)
Date: 2008/12/05(金) 23:19
No:25175
|
|
Title: Re:ポインタについて
|
|
こんなコードを動かしてみて、どちらも同じ結果を得ることを体感してください。
#include <stdio.h>
int main(void)
{
char s[] = "abcdefghijklmnopqrstuvwxyz";
char *p = "abcdefghijklmnopqrstuvwxyz";
printf("%c\n", s[10]); // k を出力する
printf("%c\n", p[10]); // 同じく k を出力する
return 0;
}
190ポイント を手に入れた。
|
|
|
|
|
Name: ムンバ ..中級者(13,617ポイント)
Date: 2008/12/06(土) 01:43
No:25184
|
|
Title: Re:ポインタについて
|
|
boxさん、管理人さん、ご指摘ありがとうございます。
すみません。整理させて下さい。^^;
練習問題(私が参考にさせて頂いてる本の練習問題を、そのまま引用させて頂きます。)
文字列を反転する("abcd"を"dcba"にする)関数を作り
これを利用してユーザーの入力した文字列を反転して表示するプログラムを作ってください。
ただし、文字列には2バイト文字は含まないものとします。
/* try01 */
#include <stdio.h>
#include <string.h>
//char irekae(char *str);
int main(void)
{
char syou[26] = "abcdefghijklmnopqrstuvwxyz";
char kou [26] = "zyxwvutsrqponmlkjihgfedcba";
char str [26]; // 26回以上は、やらない。
int hikaku;
while(1){
printf("a〜zの1バイト小文字をz〜a(a → z・z → aなど)に変換します。\n");
printf("半角英小文字を1(バイト)文字のみ、入力して下さい。--- ");
gets(str);
if (strcmp(str, "") == 0) // 何も入力しないでEnter押すとプログラム終了
break;
//irekae(str);
hikaku = strcmp(str, syou);
printf("\n入力された文字 = %s\n", str);
printf("strcmpで比較した値(返り値) = %d\n\n", hikaku);
}
return 0;
}
//char irekae(char *str)
//{
//char syou[26] = "abcdefghijklmnopqrstuvwxyz";
//char kou [26] = "zyxwvutsrqponmlkjihgfedcba";
//int hikaku;
//hikaku = strcmp(str, syou);
//printf("%d\n", hikaku);
//printf("%s\n", str);
//printf("%c\n", syou[0]);
//printf("%c\n", kou[0]);
//return 0;
//}
↑練習問題を解いている途中でのソースです。
どうにも、うまくいきませんでしたので
このスレッドを参考にさせて頂き、解決しました。ありがとうございました。
スレッドを拝見させて頂いて、私のソースが訳が解らないソースだと気づきました。
もう、めちゃくちゃですよね。このソース。(涙
見にくくてすみませんが、この練習問題の解答の結果を聞きたいのではありません。
(お聞きした結果、そうなるかもしれませんが。^^;)
この/* try01 */のソースを試行錯誤しながら
ソース中を
char syou[26] = "abcdefghijklmnopqrstuvwxyz";
printf("%c\n", syou[0]);
としたところ、うまく実行できなかったのです。<boxさん
うまくお伝えできないかもしれませんが
#include <stdio.h>
int main()
{
//char *syou;
//syou = "abcdefghijklmnopqrstuvwxyz";
char syou[26] = "abcdefghijklmnopqrstuvwxyz";
printf("%c\n", syou[0]);
return 0;
}
改めて、このソースを実行してみますと
syou[0]→a
syou[1]→b
と、boxさんのおっしゃる通り、うまく実行できました。
/* try01 */ のプログラム内で、このソースを実行した時に
私のミスで、思う様に実行できなかったのだと思います。
(ミスに気が付いたら、また改めてご報告させて頂きます。)
ご指摘、ありがとうございます。
>う〜んと、、意味がよくわからないです・・。
私も何が聞きたいのか言いたいのか、ごちゃごちゃですみません。(自爆
「ポインタで、必ず?つまずくっ!」って
参考書や参考HPにも、よく書かれてます。
少しお時間下さい。
ざこさん、ぶら下がり申し訳ないです。(謝
1,086ポイント を手に入れた。
|
|
|
|
|
Name: つうこうにん ..ぴよぴよ(634ポイント)
Date: 2008/12/06(土) 09:57
No:25190
|
|
Title: Re:ポインタについて
|
|
管理人さんがいっているように
>文字列を格納する配列は終端記号を含めた要素数用意しないといけません
× char s[26] = "abcdefghijklmnopqrstuvwxyz";
○ char s[27] = "abcdefghijklmnopqrstuvwxyz";
です。
要素数を省略して次のように書けば
char s[] = "abcdefghijklmnopqrstuvwxyz";
27個ぴったり確保してくれます。
また、配列の文字列と文字列リテラルの違いにも気をつけてください。
配列の文字列は変更できますが,文字列リテラルは変更できません。
// 文字列リテラルを確保した配列へコピー(初期化のときだけ)
// これは配列の文字列なので変更ができる。
char s[] = "abcdefghijklmnopqrstuvwxyz";
s[0] = 'A'; s[1] = 'B'; s[2] = 'C';
puts(s); // 変更の確認
// 文字列リテラルの先頭アドレスの代入
// 変更できない文字列を指しているだけ。
char *s = "abcdefghijklmnopqrstuvwxyz";
// 次の文も有効。あたらしい文字列リテラルを指す。
s = "Hello";
配列の文字列を指していた場合はもちろん要素の変更ができます。
char s[] = "abcdefghijklmnopqrstuvwxyz";
char *p = s;
p[0] = 'A'; p[1] = 'B'; p[2] = 'C';
// 二つの出力命令は同じ文を出力
puts(s); puts(p);
とはいえ、なかには文字列リテラルを変更できてしまう処理系もあるのですが
動作は未定義になっています。
ちなみに、どのようなタイトルの参考書を使用しているのでしょうか?
ちまたにはよくない書籍が大量に氾濫しているので気になります。
634ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(131,125ポイント)
Date: 2008/12/06(土) 13:37
No:25193
|
|
Title: Re:ポインタについて
|
|
> >文字列を格納する配列は終端記号を含めた要素数用意しないといけません
>
> × char s[26] = "abcdefghijklmnopqrstuvwxyz";
これ、必ずしも×とは言えません。
文字列終端の'\0'を前提としないコードであれば、
上記の定義で大丈夫です。
36ポイント を手に入れた。
|
|
|
|
|
Name: つうこうにん ..ぴよぴよ(723ポイント)
Date: 2008/12/06(土) 17:53
No:25216
|
|
Title: Re:ポインタについて
|
|
> > >文字列を格納する配列は終端記号を含めた要素数用意しないといけません
> >
> > × char s[26] = "abcdefghijklmnopqrstuvwxyz";
>これ、必ずしも×とは言えません。
>文字列終端の'\0'を前提としないコードであれば、
>上記の定義で大丈夫です。
C言語だと単純な文字配列として初期化されて
C++だとコンパイルできないみたいですね。
89ポイント を手に入れた。
|
|
|
|
|
Name: ムンバ ..中級者(14,112ポイント)
Date: 2008/12/06(土) 18:17
No:25224
| 解決!
|
Title: Re:ポインタについて
|
|
こんばんは。できましたっ!^^
管理人さん・boxさん・通行人さん、ご丁寧なご解説ありがとうございました。(謝
皆さんの、ご解説を参考にさせて頂きながら今できました。
参考書は「猫でもわかるC言語」、あと「C苦」というサイトを参考させて頂いてます。
(今回の練習問題は参考書のものです。)
#include <stdio.h>
#include <string.h>
char irekae(char *str, char *syou, char *kou); // 関数のプロトタイプ宣言
int main(void)
{
char syou[] = "abcdefghijklmnopqrstuvwxyz";
char kou [] = "zyxwvutsrqponmlkjihgfedcba";
//char str [26];
while(1){
char str [5] = {0}; // 配列を初期化
printf("a〜zの1バイト小文字をz〜a(a → z・z → aなど)に変換します。\n");
printf("半角英小文字を1(バイト)文字のみ、入力して下さい。--- ");
gets(str);
if (strcmp(str, "") == 0) // 何も入力しないでEnter押すとプログラム終了
break;
irekae(str, syou, kou);
printf("\n入力された文字 = %s\n", str);
printf("置換された文字 = %c\n\n", *kou);
}
return 0;
}
char irekae(char *str, char *syou, char *kou)
{
int i = 0;
while(1){
if (*str == (*syou + i)){
//printf("一致しました。\n");
break;
}
i++;
}
//*syou = *(syou + i);
*kou = *(kou + i);
return 0;
}
配列の大きさは、省略型?にしました。^^;
どうも「アドレス」というのを意識しすぎて
ごちゃごちゃになってしまったのだと思います。
これで、構造体の勉強を始められます。w
皆様、ご指導ありがとうございました。
今後とも、宜しくお願い致します。
495ポイント を手に入れた。
|
|
|
|
|
Name: non ..上級者(18,272ポイント)
Date: 2008/12/06(土) 19:36
No:25227
|
|
Title: Re:ポインタについて
|
|
よくわからないのですが、
この問題を考えていたわけではないのですね。
>練習問題(私が参考にさせて頂いてる本の練習問題を、そのまま引用させて頂きます。)
> 文字列を反転する("abcd"を"dcba"にする)関数を作り
> これを利用してユーザーの入力した文字列を反転して表示するプログラムを作ってください。
> ただし、文字列には2バイト文字は含まないものとします。
どんな問題なんでしょう?
144ポイント を手に入れた。
|
|
|
|
|
Name: ムンバ ..中級者(14,122ポイント)
Date: 2008/12/06(土) 19:38
No:25228
|
|
Title: Re:ポインタについて
|
|
こんばんは。その問題です。
もっ もしかして「文字列を反転して表示するプログラム」の部分ですか。(汗
void rev(char *str)
{
char c, *p;
p = str + strlen(str) - 1;
while (str < p) {
c = *str;
*str++ = *p;
*p-- = c;
}
return;
}
「猫でもわかる C言語プログラミング」参考書引用
(↑この1行、編集画面で追加修正させて頂きました。お騒がせしました。<謝)
こんな感じのですか?
10ポイント を手に入れた。
|
|
|
|
|
Name: ムンバ ..中級者(14,279ポイント)
Date: 2008/12/06(土) 20:43
No:25242
| 解決!
|
Title: Re:ポインタについて
|
|
nonさん、ご指摘ありがとうございました。
また何か御座いましたら、突っ込んで下さい。
宜しくお願い致します。
ぶら下らせて頂いた上に、ここまでご指導頂きどうもありがとうございました。
ざこさん、本当に申し訳御座いませんでした。
また何かにぶつかったら質問させて頂きます。
その節は、どうぞ宜しくお願い致します。
どうもありがとう御座いました。(謝
157ポイント を手に入れた。
|
|
|
|
Name: かなこ ..ぴよぴよ(81ポイント)
Date: 2008/12/06(土) 16:46
No:25202
|
|
Title: 人生ゲームを作っています
|
|
始めまして。C言語を使った簡単な人生ゲームを作っています。
ルールは、体力が0になったらゲームオーバーで、知力とセンスを足した「友達の数」が多いほうが最終的な勝者というものです。
プロローグやマスの詳細はまだ製作途中なので省略してあります。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
struct boad {
int g; //進む数
int t; //体力関係
int a; //知力関係
int s; //センス関係
int f; //友達関係
char c[50];//コメント
};
int p_power=100,a_power=100;
int p_intellect=0,a_intellect=0;
int p_sense=0,a_sense=0;
int p_friend=0,a_friend=0;
int p_iti=0,a_iti=0;
struct boad zinsei[15]={
{0,0,0,0,0,"スタート"},//0
{0,-5,0,0,0,"あいうえお"},//1
{2,3,2,2,0,"いうえお"},//2
{5,0,1,0,0,"うえおか"},//3
{2,0,2,1,0,"えおかき"},//4
{4,0,0,0,0,"おかきく"},//5
{0,-5,1,2,0,"かきくけ"},//6
{2,3,2,2,0,"きくけこ"},//7
{0,0,1,0,0,"くけこさ"},//8
{0,0,2,1,0,"けこさし"},//9
{0,0,0,0,0,"こさしす"},//10
{0,-5,1,2,0,"さしすせ"},//11
{2,3,2,2,0,"しすせそ"},//12
{0,0,1,0,0,"すせそた"},//13
{0,0,2,1,0,"せそたち"},//14
};
int main(void)
{
//題名
printf("人生ゲーム\n");
//プロローグ
printf("プロローグ\n\n");
長くなるので省略
sleep(1);
while(1){
int player=0,com=0,x=14;
while(p_iti<=x && com==0){
srand(time(NULL));
player=rand()%6+1;
printf("サイコロを振ります。エンターキーを押してください。\n");
while(getchar()!='\n'){}
printf("あなたがサイコロを振って、%dが出ました。\n",player);
p_iti += player;
printf("%s\n",zinsei[p_iti].c);
p_power += zinsei[p_iti].t;
printf("体力%d\n",p_power);
p_intellect += zinsei[p_iti].a;
printf("知力%d\n",p_intellect);
p_sense += zinsei[p_iti].s;
printf("センス%d\n",p_sense);
p_friend += zinsei[p_iti].f+p_intellect+p_sense;
printf("友達の数%d\n",p_friend);
p_iti +=zinsei[p_iti].g;
printf("あなたは現在%d/14マス目にいます。\n",p_iti);
printf("Aのターンです。エンターキーを押してください。");
while(getchar()!='\n'){}
player=0;
com=1;
}
while(a_iti<=x && player==0){
//改行
printf("\n\n");
com=rand()%6+1;
printf("Aがサイコロを振って%dがでました。\n",com);
a_iti += com;
a_iti += player;
printf("%s\n",zinsei[p_iti].c);
a_power += zinsei[a_iti].t;
printf("体力%d\n",a_power);
a_intellect += zinsei[a_iti].a;
printf("知力%d\n",a_intellect);
a_sense += zinsei[a_iti].s;
printf("センス%d\n",a_sense);
a_friend += zinsei[a_iti].f+p_intellect+p_sense;
printf("友達の数%d\n",a_iti);
a_iti += zinsei[a_iti].g;
printf("Aは現在%d/14にいます。\n",a_iti);
com=0;player=1;
//ゴールの判定
if(p_iti>=x){
p_iti=x;
}
else if(a_iti>=x){
a_iti=x;
}
else if(p_iti>=x&&a_iti<x){
printf("あなたが1番です。友達が10人増えました。\n Aは2番です。");
p_friend+=10;
break;}
else if(p_iti<x&&a_iti>=x){
printf("Aが1番です。友達が10人増えました。\n あなたは2番です。");
a_friend+=10;
break;}
//勝利判定
if(p_friend<a_friend){printf("Aの勝ち\n");return 0;}
else if(a_friend<p_friend){printf("プレイヤーの勝ち\n");return 0;}
}
}
return 0;
}
ここまでがんばって作りました。しかしこれでは15マス以上でゴールせず、おかしなことになってしまいます。
15マス以上でゴールする方法、そして体力が0になったらプレイヤーをゲームオーバーにする方法を教えて下さい。お願いします。
81ポイント を手に入れた。
|
|
|
|
Name: non ..上級者(18,128ポイント)
Date: 2008/12/06(土) 19:19
No:25226
|
|
Title: Re:人生ゲームを作っています
|
|
まず、小さなミスがあります。
コンピュータの番で
a_iti += player; が余分です。
printf("%s\n",zinsei[p_iti].c); a_iti の間違いです。
a_friend += zinsei[a_iti].f+p_intellect+p_sense; a_intellect、a_senseの間違いです。
ゲームのルールですが、かなこさんの考えでは、プレーヤーとコンピュータが交互にサイコロを
振り、片方が早く、ゴールしたときに、友人が10人増え、その後はゴールしてない方だけ
プレーが続き、両方ともゴールしたときに、終了する。または、途中でどちらかの体力が0に
なったときに終了するということでよろしいでしょうか?
それなら、
>>while(p_iti<=x && com==0){
や
>>while(a_iti<=x && player==0){
はwhileでなく、if文にすべきでしょう。
318ポイント を手に入れた。
|
|
|
|
|
Name: conio ..初心者(6,386ポイント)
Date: 2008/12/06(土) 19:49
No:25229
|
|
Title: Re:人生ゲームを作っています
|
|
15マス以上になってもゲームが終了しないのは、if文の条件やプログラムの構成自体がおかしいからです。
まず、大まかにこのプログラムは、
while(1){
■@■■■■■■■■■■■■■■■
/*"あなた"のサイコロを振る処理*/
/*"あなた"のサイコロの目の表示*/
/*"あなた"の体力、知力、センス、友達の数、現在位置の表示*/
■A■■■■■■■■■■■■■■■
/*"A"のサイコロを振る処理*/
/*"A"のサイコロの目の表示*/
/*"A"の体力、知力、センス、友達の数、現在位置の表示*/
■B■■■■■■■■■■■■■■■
/*"あなた"の位置が14以上ならば位置を14にする*/
/*"A"の位置が14以上ならば位置を14にする*/
■C■■■■■■■■■■■■■■■
/*"あなた"の位置が14以上、かつ"A"の位置が14以下の場合、"あなた"の勝ち*/
/*"A"の位置が14以上、かつ"あなた"の位置が14以下の場合、"A"の勝ち*/
}
の4段階になっています。
まず、問題なのがBの判定を最後に持ってきている所です。
この判定は、"あなたは現在%d/14マス目にいます。"と表示させる前に実行しないと意味が無いです。
"あなたは現在 18/14マスにいます"と表示をしてしまうバグの原因です。
次に、Cの判定がおかしいです。
最初にゴールに辿りつけば、その人が勝ちといのは自明の理ですので、"かつ"以降の条件は要りません。
【Cの修正版】/*"あなた"の位置が14以上なら"あなた"の勝ち*/
【Cの修正版】/*"A"の位置が14以上なら"A"の勝ち*/
また、バグの原因になります。例えば下記のようになった場合、
---------------------------------
"あなた"が15/14の位置になる
"A"が14/14の位置になる
---------------------------------
■条件■「"あなた"が14マス以上で"A"が14未満」
■条件■「"A"が14マス以上で"あなた"が14未満」
という条件は両方とも満たさないので、終了しません。
この判定も、それぞれサイコロの処理を行った後にすぐ判定させるべきです。
あと、体力が0になった時に終了させる方法は、
if(体力 == 0)
/*ゲームオーバーの処理*/
このようにすればいいと思います。
最後に、全体的に冗長な感じがするので、関数を作って簡略化、及び汎用性を持たせた方がいいと思います。
例えば、
「サイコロを振り、体力や現在位置などを表示する」
という関数を作っておけば、"A"の処理にも"あなた"の処理にも使えますし、
(プレイヤーを5人にする場合でも応用が効きます。)
この表示方法を、⇒ printf("あなたは現在%d/14マス目にいます。\n",p_iti);
printf("あなたは現在%d/%dマス目にいます。\n",p_iti,x);
という風にすれば、ゴールまでのマス数xを増やしたり減らしたりする事が出来ます。
597ポイント を手に入れた。
|
|
|
|
Name: stack ..ぴよぴよ(83ポイント)
Date: 2008/12/06(土) 17:43
No:25210
|
|
Title: C言語による画像処理プログラミング
|
|
始めまして、stackと申します。授業の一環で、以下の問題を満たすプログラムを作成していますがその方法が分かりません。どなたか専門知識をお持ちの方、ご指導宜しくお願いします。
問:以下の条件を満たすプログラムを作成しなさい。
1.ダウンロードしたサンプルイメージnumber.pgm, alphabet.pgm, zukei.pgm,
couple.pgm, f1.pgmより, ヒストグラムを調べ, それぞれどのような形になるか
表示しなさい。また, ヒストグラムから判断したしきい値を用いて, 2値画像も
作成しなさい(自分の顔画像の2値画像も作成できるとよい)。
2.先程のサンプルイメージに対して, 平均化フィルタ(移動平均操作, 重み付け移動平均操作など),
微分フィルタ(1次微分, 2次微分など)をそれぞれ適用した画像を出力せよ。
3.文字パターンイメージ(number.pgm, alphabet.pgm)から, 文字イメージを1文字ごとに切り出し,
配列または画像ファイルとして格納し, 表示せよ。
自力で作成した部分(今回の添付ファイル)は、キーボード上からpgmファイルを読み込んでその画像の画素数を出力するところまでです。プログラムは、Windows(私の場合はBorland C++)でもLinux(gcc)でも両方動作するようです。後ほど添付するpgmファイルは、http://www.gimp.org/よりgimpというソフトをインストールすれば閲覧・編集が可能です。
83ポイント を手に入れた。
|
|
|
Name: 鹿好き ..ぴよぴよ(64ポイント)
Date: 2008/12/05(金) 18:00
No:25138
|
|
Title: 1行に複数の数値のデータが書かれているtxtファイルの読み込み
|
|
初めて質問させていただきます,一応規約と注意事項を拝見さしていただきましたが
一応丸投げではないと思い投稿させてもらいます.
さて本題ですが,
1行に複数の数値のデータが書かれているtxtファイルの読み込みをするプログラムの作成を行っているのですが,
とりあえずこのようなプログラムを組んでみました.
#include <stdio.h>
#include <stdlib.h>
void main(void)
{
double x,y,z,w;
int i,N=50;
FILE *fp;
fp = fopen("test.txt","r");
fscanf(fp,"%lf %lf %lf %lf\n",&x,&y,&z,&w);
printf("%lf %lf %lf %lf\n",x,y,z,w);
fclose(fp);
}
でtxtファイルの内容が
-47.500000 86.000000 8.000000 0.000000
のときは問題ないのですが
34.500000154.000000 7.425000 0.000000
のような数値同士の間に空白が入ってない場合の読み込みがうまくいきません.
34.500000 154.000000 7.425000 0.000000
↑のようにtxtファイルのほうで空白を入れれば動くのは分かるんですが,
何とかプログラム側でがんばって読み込む方法は無いでしょうか?
(txtデータは10.6fで出力されているようです)
C言語の能力は機械工学生が基礎科目でとりあえず学んだ程度,ファイル入出力に関しては今回がほぼ初めてです.
使用コンパイラ CPad for LSI C-86
OSはウィンドウズXPです
質問がわかり難い、見にくい等あると思いますが、
どうぞよろしくお願い致します。
64ポイント を手に入れた。
|
|
|
|
Name: バグ ..ハッカー(131,072ポイント)
Date: 2008/12/05(金) 18:35
No:25140
|
|
Title: Re:1行に複数の数値のデータが書かれているtxtファイルの読み込み
|
|
1データ辺りの文字数が固定ならばなんとかなりますが、そうでないならば無理です。
23ポイント を落としてしまった。
|
|
|
|
|
Name: 御津凪 [URL] ..熟練のプログラマー(43,011ポイント)
Date: 2008/12/05(金) 19:06
No:25143
|
|
Title: Re:1行に複数の数値のデータが書かれているtxtファイルの読み込み
|
|
> (txtデータは10.6fで出力されているようです)
とあるので、'.'以降は6個の数値が固定となっているので、その点を利用すれば、何とかできそうです。
とりあえず出来る関数を書いてみました。
(習っていない部分のはずなので、できるということで参考程度にとどめて置いてください)
// str には、符号小数点値、半角文字のみが入っていると仮定
const char* get_float( float* outFloat, const char* str ){
char buf[32];
const char* p;
int len;
// 先頭の空白文字をスキップ
while(*str == ' ' || *str == '\n' || *str == '\t'){
str++;
}
p = str;
// 数値に関係ない文字('.'を除く)が出るまでスキップ
while(('0' <= *p && *p <= '9') || *p == '-'){
p++;
}
// *p が'.'ならば
if(*p == '.'){
p += 6; // 小数点以下6桁分移動
}
len = p-str; // 文字長を計算
strncpy(buf,str,len); // 一旦一時バッファにコピー
buf[len] = '\0';
*outFloat = (float)atof(buf); // float に変換
return p; // 次のデータの先頭位置を返す。
}
# コンパイルチェックしていないので正しく動くかは未定です。
316ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(911,103ポイント)
Date: 2008/12/05(金) 19:14
No:25144
|
|
Title: Re:1行に複数の数値のデータが書かれているtxtファイルの読み込み
|
|
34.500000154.000000 7.425000 0.000000
の境目が
34.500000 | 154.000000 7.425000 0.000000
だと解るのは、小数点以下が6文字だとわかっているからですよね。
その点を考えれば分けれると思います。
色々やり方はあるでしょうけど、
fgetcでループさせ、一文字ずつ取ってきて、順次文字列を格納する配列に文字データをいれていき、
「.」が見つかったら6文字取ってきて最後に終端記号をいれ、
atofで実数型に変換すればいいと思います。
33ポイント を手に入れた。
|
|
|
|
|
Name: 鹿好き ..ぴよぴよ(314ポイント)
Date: 2008/12/06(土) 17:17
No:25207
| 解決!
|
Title: Re:1行に複数の数値のデータが書かれているtxtファイルの読み込み
|
|
バグさま、御津凪さま、管理人さま、すばやい対応ありがとうございます
とりあえず御津凪さまプログラムと管理人さまのおっしゃられたやり方を参考に、
なんとかがんばってみたいと思います。
習ってないからできない、なんて堂々と言えたら楽なんですけどねw
また何か行き詰ったら知恵をお貸しいただけたらと思います。
それでは、本当にありがとうございました。
2倍のポイントを手に入れた! 250ポイント を手に入れた。
|
|
|
|
Name: RUIN ..ぴよぴよ(508ポイント)
Date: 2008/12/06(土) 13:38
No:25194
|
|
Title: アドベンチャーの履歴表示に関して
|
|
C言語ではなく、Javaなのですが、ゲームのアルゴリズム
に関する質問ということで、書き込ませて頂きます。
現在、アドベンチャーのプログラミングを行っておりますが、ベースは昔、別の人が作った物で、仕様等は殆ど変更できない(データ&プログラムのベース)状況です。それが、いろいろ問題のあるもので、なんとかベースを変えずに調整して、いろいろ書き換えているのですが、履歴取得〜描画に関して悩んでいます。
アドベンチャーの履歴表示に関して検索はしてみましたが、良いサイトが見つかりませんでした。履歴表示方法はいろいろあるとは思いますが、コマンドごとに(1文章ごと)ではなく、複数の文章(&名前)を、特定の行数分表示する必要があり、↑↓で文字数や改行で分割された状態のものをスクロールさせるので、非常に面倒な仕様となっています。元のプログラムで、そのスクロール部分にバグがあり、良くわからない組み方になっているので、取得の段階から書き換えたいと思っております。
時間もないので、簡単な手法として、シナリオデータの読み込み時に全「文章&名前」を文字数と改行コードで分割された状態で履歴用のString配列に生成してしまい、現在の進行状態を見て、履歴の表示位置だけを指定して表示してしまおうかと考えているのですが、アドベンチャーの履歴取得表示の手法としては邪道ですよね?。
その場合、String配列を2000行分程生成してヒープに確保しておくということになるのですが、危険な気がするので、やっぱり別の方法にした方が良いでしょうか?。ヒープに余裕があるわけでもないですし(3MB程)。
わかりにくい質問で申し訳ないのですが、ご意見、参考になりそうなサイト情報などありましたら、宜しくお願いします。
508ポイント を手に入れた。
|
|
|
|
Name: ibis ..上級者(15,084ポイント)
Date: 2008/12/06(土) 14:47
No:25195
|
|
Title: Re:アドベンチャーの履歴表示に関して
|
|
メモリ上に置きたくないということでしたらファイルに置いとくのが基本ですよね。
で、ファイルから必要なところだけロードする。
速度に難があるようならバッファリングもするとか。
あと、場合によってはデータ構造を変えると軽くできるかも。
例えば、
String str; //ここに文章を全部詰め込む
int ptr[2000]; //ptr[x]はx行目の開始位置が何文字目かを示す
みたいにするとか。
43ポイント を手に入れた。
|
|
|
|
Name: リュック ..ぴよぴよ(121ポイント)
Date: 2008/12/06(土) 02:59
No:25186
|
|
Title: 行列を単位行列に近づける
|
|
処理部分でもしもMatが変化していたら徐々に単位行列に近づくとif文などで書きたいのですが
できるのでしょうか?
D3DXMATRIX Mat;
D3DXMatrixIdentity(&Mat); // 起動したときのみ
//処理部分
if(Mat._11 < 1) Mat._11 += 0.01f;
if(Mat._11 > 1) Mat._11 -= 0.01f;
///
みたいな感じで書けるかとは思うのですがもう少し効率がよくは書けないでしょうか?
121ポイント を手に入れた。
|
|
|
|
Name: Justy ..ハッカー(282,289ポイント)
Date: 2008/12/06(土) 13:31
No:25192
|
|
Title: Re:行列を単位行列に近づける
|
|
>みたいな感じで書けるかとは思うのですが
ただ単に行列Aから行列Bにしたい、そしてその中間の状態については
最終的に行列Bに変化するのであれば一切気にしない、ということでしたら
その方法でも書けますね。
どういう意味での効率なのかにも依りますが、その「処理部分」というのを
関数化したり、ループ化するなりすれば効率も良くなるかもしれません。
勿論、0.01という変化量ついては再考の余地有りですが。
D3DXMATRIX 型は m[i]だとか m.m[i][j]のように配列としても書けますので、
これを forループで順繰りに処理してもいいですし。
しかし、効率云々の前にその“中間の状態については一切気にしなくていい”のでしょうか?
行列から行列への“滑らかな(位置や回転が綺麗に)補完”という意味であれば、
行列の 16個の float1つ1つを個別に対応していくこの方法ではできません。
あくまで行列は移動・回転・スケーリングなどを行った結果の状態を表すものなので、
行列そのままでは綺麗に補完することは(条件によって異なりますが)困難です。
行列の元になった移動・回転・スケーリングなどの情報を補完して行列を再構築した方が
簡単です。
例えば、(単位行列を含む)移動と回転しかしていない行列AとBがあったとして、
AからBに滑らかに補完する場合、位置と回転とを別々に考慮します。
行列しか情報がないので、その行列から位置と回転の情報を取り出します。
位置はそれぞれの行列から位置情報を取り出し、補完をした位置 Pを求めます。
回転はそれぞれの行列をクォータニオン D3DXQUATERNION 型に変換し、
D3DXQuaternionSlerp() を使って球面補完したクォータニオン Qを求めます。
後は Pと Qを行列に変換し合成すれば完了です。
効率という面で言えば、行列の元になった移動・回転などの情報を覚えていれば
わざわざ行列から取り出さなくても済みますので、そのあたりの処理は省けます。
478ポイント を手に入れた。
|
|
|
|
Name: カン ..ぴよぴよ(21ポイント)
Date: 2008/12/03(水) 22:04
No:25005
|
|
Title: 初心者なので宜しくお願いします。
|
|
・問題
1+2+3+4+・・・と数字を加算していき、加算結果が300を超えたら処理を終えるプログラムを作成しなさい。
上記の問題なのですが、よくわかりません。よろしくお願いします。
21ポイント を手に入れた。
|
|
|
|
Name: 初級者 ..入門者(2,691ポイント)
Date: 2008/12/03(水) 22:25
No:25006
|
|
Title: Re:初心者なので宜しくお願いします。
|
|
何がわからないのでしょうか。
1)問題の意味がわからない
2)問題の意味はわかるが、手で計算できない
3)問題の意味はわかり、手で計算できるが、どうプログラミングするかがわからない
4)問題の意味はわかり、手で計算でき、どうプログラミングするかもわかるが、C言語のソースが書けない
よろしくお願いします、とは、答えをくださいという意味でしょうか。
142ポイント を落としてしまった。
|
|
|
|
|
Name: 通りすがり ..中級者(13,194ポイント)
Date: 2008/12/03(水) 23:39
No:25009
|
|
Title: Re:初心者なので宜しくお願いします。
|
|
とりあえず規約くらい読みましょう。
質問の仕方がわからないならテンプレを使いましょう。
7ポイント を落としてしまった。
|
|
|
|
|
Name: conio ..初心者(5,042ポイント)
Date: 2008/12/03(水) 23:49
No:25010
|
|
Title: Re:初心者なので宜しくお願いします。
|
|
まず、プログラムがどのようになるのか考えてみましょう。
・1,2,3,4と、加算する値は1ずつ増加。
・加算結果を格納する変数が必要。
・合計が300を超えない間、加算する値を1ずつ増やし、合計に足す。(ループ)
0 + 1 = 1
1 + 2 = 3
3 + 3 = 6
6 + 4 = 10
10 + 5 = 15
プログラムにすると大体こんな感じです。(一例)
日本語で書いてある部分をプログラムにすれば完成です。
------------------------------------------------
#include<stdio.h>
int main(void){
int x = 0,sum = 0;
while(/*条件:加算結果が300以下*/){
/*sumにxを足す。(例:sum += x)*/
/*xの値を1増やす。*/
}
printf("x = %d,sum =%d\n",x,sum);
return(0);
}
---------------------------------------------------
ついでに、1〜10までの値を足すプログラムは下記の通りです。(一例)
参考にでもしてみて下さい。
-------------------------------------------------------
int main(void){
int i,sum=0;
for(i = 0; i <= 10; i++){
printf("sum(%2d) + i(%2d) =%d\n",sum,i,i + sum);
sum += i;
}
printf("0から%dまでの合計は%dです\n",i,sum);
return(0);
}
-----------------------------------------------------------
509ポイント を落としてしまった。
|
|
|
|
|
Name: 組木紙織 ..熟練のプログラマー(66,425ポイント)
Date: 2008/12/04(木) 00:21
No:25012
|
|
Title: Re:初心者なので宜しくお願いします。
|
|
質問が良く分かりませんが、
詳細は勝手に解釈して作ってみました。
int i;
int main(void)
{
++i;
return i*(i+1)/2<300?main():0;
}
91ポイント を手に入れた。
|
|
|
|
|
Name: non ..上級者(15,820ポイント)
Date: 2008/12/04(木) 09:30
No:25020
|
|
Title: Re:初心者なので宜しくお願いします。
|
|
組木紙織さん
これってあってます?mainの戻り値ってどうやって出力するんでしたっけ?
やり方教えてください。(DOSで)
return i*(i+1)/2<300?main()+i:0;
にしたいとこだけど、グローバルだからまずいんじゃないでしょうか?
一度、autoに代入しないと。
82ポイント を手に入れた。
|
|
|
|
|
Name: 組木紙織 ..熟練のプログラマー(66,466ポイント)
Date: 2008/12/04(木) 09:43
No:25021
|
|
Title: Re:初心者なので宜しくお願いします。
|
|
main()の戻り値は0ですよ。
だって何を返すのか条件はないんですから。
iはグローバルなので初期値は必ず0になります。
よって初期化は必要ないです。
main()の戻り値の出力の仕方は忘れました。
たしか、バッチファイルを作ってあげればよかったような、よくなかったような、、、、。
41ポイント を手に入れた。
|
|
|
|
|
Name: non ..上級者(15,939ポイント)
Date: 2008/12/04(木) 09:55
No:25024
|
|
Title: Re:初心者なので宜しくお願いします。
|
|
>だって何を返すのか条件はないんですから。
なるほどですね。でも、合計を出してあげれるようにしました。
int i=0;
int main(void)
{
int n=++i;
return i*(i+1)/2<=300?main1()+n:0;
}
119ポイント を手に入れた。
|
|
|
|
|
Name: non ..上級者(16,477ポイント)
Date: 2008/12/04(木) 12:19
No:25035
|
|
Title: Re:初心者なので宜しくお願いします。
|
|
このバッチで動きました。
echo %errorlevel%
15ポイント を手に入れた。
|
|
|
|
|
Name: 組木紙織 ..熟練のプログラマー(66,766ポイント)
Date: 2008/12/04(木) 19:52
No:25094
|
|
Title: Re:初心者なので宜しくお願いします。
|
|
nonさんに習って合計を返すようにしてみました。
引数渡したら正しく動きませんが、引数は意識的にしないと渡さないと思うので、
これでもいけるかと。
int main(int argc, char * argv[])
{
return argc*(argc+1)/2<=300?main(argc+1,argv)+argc:0;
}
2倍のポイントを手に入れた! 300ポイント を手に入れた。
|
|
|
|
Name: しょしょしょしんしゃ ..初心者(8,258ポイント)
Date: 2008/12/05(金) 19:44
No:25145
|
|
Title: サイコロの問題 乱数編
|
|
学校の課題です。
問題文は、
「1から6の目が等確率では出ないサイコロがあり、
それぞれの目の出る確率は以下のように、
p1=1/4,p2=1/6,p3=1/6,p4=1/6,p5=1/6,p6=1/12
piはi(i=1,2,3,4,5,6)の目がでる確率を表しています。
このようなサイコロを100回投げたときにどの目が
何回出たかを数えるプログラミングの作成。」
わたしのわからないところは、
>p1=1/4,p2=1/6,p3=1/6,p4=1/6,p5=1/6,p6=1/12
をどのように分け、乱数を使用するのでしょうか?
>100回投げたときにどの目が何回出たかを数える
case文かif文を使うのでしょうか?
自分は普通のサイコロを10回ふって、N回目にaのサイコロの目がでる。
というプログラムしか作る能力しかできませんでした。(一応書いときます)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 10
int main(void){
int i;
int a;
srand((unsigned)time(NULL));
for(i=0;i<N;i++){
a=rand()%6+1;
printf("%d回目のサイコロの目は%dです\n",i+1,a);
}
return 0;
}
たぶん これを使用して、応用すればできるような感じがします。
よろしくお願いします。
505ポイント を手に入れた。
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(911,491ポイント)
Date: 2008/12/05(金) 20:35
No:25148
|
|
Title: Re:サイコロの問題 乱数編
|
|
まず、わかることから作ってみましょう。
1/4の確率で「当たり」と。3/4の確率で「外れ」と表示するプログラムを作ってみてください。
1/5の確率で「1番」と。
2/7の確率で「2番」と、それ以外の場合「それ以外」と表示するプログラムを作ってみてください。
そうするとだんだんわかってくるのではないでしょうか。
以下ヒントです。
int r = rand()%3;
if(r ==0 )
これって1/3ですよね。
int r = rand()%3;
if( r==0 || r==1 )
これは2/3ですね。
182ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(130,688ポイント)
Date: 2008/12/05(金) 20:36
No:25149
|
|
Title: Re:サイコロの問題 乱数編
|
|
考え方のひとつを挙げてみます。
何らかの方法で0〜11の整数の乱数を発生させます。
その乱数の値が、
0,1,2のとき、サイコロの1の目が出たとみなす
3,4のとき、サイコロの2の目が出たとみなす
5,6のとき、サイコロの3の目が出たとみなす
7,8のとき、サイコロの4の目が出たとみなす
9,10のとき、サイコロの5の目が出たとみなす
11のとき、サイコロの6の目が出たとみなす
116ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..中級者(10,812ポイント)
Date: 2008/12/05(金) 20:39
No:25150
|
|
Title: Re:サイコロの問題 乱数編
|
|
int GetDice(void){
int i;
int dice[12]={1,1,1,2,2,3,3,4,4,5,5,6};//p1=1/4,p2=1/6,p3=1/6,p4=1/6,p5=1/6,p6=1/12
i=(rand()/(double)RAND_MAX)*12;
return dice[i];
}
とかですかね。
89ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(132,708ポイント)
Date: 2008/12/05(金) 20:42
No:25151
|
|
Title: Re:サイコロの問題 乱数編
|
|
とりあえず、確率の数値の分母をそろえてみて考えてみては如何でしょうか?
ソース内にコメントで書きましたが、分母をそろえると…
p1 = 3 / 12
p2 = 2 / 12
p3 = 2 / 12
p4 = 2 / 12
p5 = 2 / 12
p6 = 1 / 12
になりますよね?
ここまでくると、なんとなく見えてきませんか?
p1 = (1, 2, 3)
p2 = (4, 5)
p3 = (6, 7)
p4 = (8, 9)
p5 = (10, 11)
p6 = (12)
12個の乱数をこういう風に割り振れば、いけそうではないでしょうか?
で、更に偏りを防ぐ為に12個ではなく、120個の乱数で考えたら…というのが下記のソースです。
効率は悪いですが、分かりやすさ重視で書いてみました。
p1 = (1〜30)
p2 = (31〜50)
p3 = (51〜70)
p4 = (81〜90)
p5 = (91〜110)
p6 = (111〜120)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int i = 0, rnd = 0;
int dice[6] = {0, };
srand((unsigned)time(NULL));
// サイコロの処理
for (i = 0; i < 100; ++i)
{
rnd = rand() % 1200;
if (rnd < 300)
{
// p1 = (1 / 4) = (300 / 1200)
++dice[0];
}
else if (rnd < 500)
{
// p2 = (1 / 6) = (200 / 1200)
++dice[1];
}
else if (rnd < 700)
{
// p3 = (1 / 6) = (200 / 1200)
++dice[2];
}
else if (rnd < 900)
{
// p4 = (1 / 6) = (200 / 1200)
++dice[3];
}
else if (rnd < 1100)
{
// p5 = (1 / 6) = (200 / 1200)
++dice[4];
}
else
{
++dice[5];
}
}
// 表示
for (i = 0; i < 6; ++i)
{
printf("%d = %d\n", i + 1, dice[i]);
}
return 0;
}
2倍のポイントを手に入れた! 1,636ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(132,771ポイント)
Date: 2008/12/05(金) 20:43
No:25152
|
|
Title: Re:サイコロの問題 乱数編
|
|
>>で、更に偏りを防ぐ為に12個ではなく、120個の乱数で考えたら…というのが下記のソースです。
ゴメンなさい。120個ではなく、1200個ですね(^_^;)
63ポイント を手に入れた。
|
|
|
|
|
Name: しょしょしょしんしゃ ..初心者(8,815ポイント)
Date: 2008/12/05(金) 21:32
No:25160
|
|
Title: Re:サイコロの問題 乱数編
|
|
管理人さん 最初の問題はできましたが、
>1/5の確率で「1番」と。
>2/7の確率で「2番」と、それ以外の場合「それ以外」と表示するプログラムを作ってみてください。
は 1/5と2/7をどのように分けるのか?
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 10
int main(void){
int i;
srand((unsigned)time(NULL));
for(i=0;i<N;i++){
int r=rand()%4;
if(r==0){
printf("当たり\n");
}else{
printf("外れ\n");
}
}
return 0;
}
これは できました。
srand((unsigned)time(NULL));
for(i=0;i<N;i++){
int r=rand()%35;
if(r==0 || r==5 ){
printf("1番\n");
}else if(r==0 || r==7){
printf("2番\n");
}else{
printf("それ以外\n");
ではだめでした。
boxさん 考え方のは
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 10
int main(void){
int i;
int a;
srand((unsigned)time(NULL));
for(i=0;i<N;i++){
a=rand()%11+1;
if(a==0 || a==1 || a==2){
printf("サイコロの目は1です\n");
}else if(a==3 || a==4 ){
printf("サイコロの目は2です\n");
}else if(a==5 || a==6){
printf("サイコロの目は3です\n");
}else if(a==7 || a==8){
printf("サイコロの目は4です\n");
}else if(a==9|| a==10){
printf("サイコロの目は5です\n");
}else if(a==11){
printf("サイコロの目は6です\n");
}
}
return 0;
}
のように なりましたが どうでしょうか?
557ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(130,841ポイント)
Date: 2008/12/05(金) 21:37
No:25161
|
|
Title: Re:サイコロの問題 乱数編
|
|
> a=rand()%11+1;
11で割ったあまりは0〜10のいずれかです。
それに1を加えると1〜11のいずれかになります。0〜11にも1〜12にもなりません。
12で割ったあまりを素直に使うと0〜11の12種類の整数を得ることができ、
if文はそのまま使えます。
97ポイント を手に入れた。
|
|
|
|
|
Name: non ..上級者(17,782ポイント)
Date: 2008/12/05(金) 21:45
No:25162
|
|
Title: Re:サイコロの問題 乱数編
|
|
if(r==0 || r==5 ){ <−ここ間違い
printf("1番\n");
}else if(r==0 || r==7){ <−ここ間違い
printf("2番\n");
1/5と2/7ですから、7/35と10/35ですね。
ですから、範囲で0から6までは1番、7から16までは2番となるようにすればいいです。
89ポイント を手に入れた。
|
|
|
|
|
Name: しょしょしょしんしゃ ..初心者(8,862ポイント)
Date: 2008/12/05(金) 21:46
No:25163
|
|
Title: Re:サイコロの問題 乱数編
|
|
すみません 見落としていました。
a=rand()%12+1;
でよろしいのですか?
lbfuvabさん バグさん 回答の方 ありがとうございます。
47ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(130,891ポイント)
Date: 2008/12/05(金) 21:53
No:25165
|
|
Title: Re:サイコロの問題 乱数編
|
|
> a=rand()%12+1;
> でよろしいのですか?
自分の頭で考えるのと人に聞くのと、どちらの優先順位が高いですか?
まず自分の頭と手を使って試してみる、という発想には至りませんか?
50ポイント を手に入れた。
|
|
|
|
|
Name: しょしょしょしんしゃ ..中級者(9,182ポイント)
Date: 2008/12/05(金) 21:56
No:25166
|
|
Title: Re:サイコロの問題 乱数編
|
|
nonさん ありがとうございます
if(0<=r && r<=6 ){
printf("1番\n");
}else if(7<=r && r<=16){
printf("2番\n");
}else{
printf("それ以外\n");
と直したところ うまくいったと思います。
これを 参考にしていきたいです。
ありがとうございます。
2倍のポイントを手に入れた! 320ポイント を手に入れた。
|
|
|
|
|
Name: non ..上級者(17,796ポイント)
Date: 2008/12/05(金) 22:04
No:25167
|
|
Title: Re:サイコロの問題 乱数編
|
|
> a=rand()%12+1;
> でよろしいのですか?
よろしくないです。ですからboxさんが怒ってます。(確認してないことを)
14ポイント を手に入れた。
|
|
|
|
|
Name: しょしょしょしんしゃ ..中級者(9,348ポイント)
Date: 2008/12/05(金) 22:20
No:25168
| 解決!
|
Title: Re:サイコロの問題 乱数編
|
|
>自分の頭で考えるのと人に聞くのと、どちらの優先順位が高いですか?
まず自分の頭と手を使って試してみる、という発想には至りませんか?
>よろしくないです。ですからboxさんが怒ってます。(確認してないことを)
すみませんでした +1 を とりました。
boxさんの回答を2つも見落としていました。
自分自身で実行しないで、さぼってしまいました。
以降は 気をつけていきたいと思います。
nonさん 忠告 ありがとうございます。
皆さんの回答で、参考になりました。
上手く 実行できました。
また よろしくお願いします。
166ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(911,445ポイント)
Date: 2008/12/05(金) 22:21
No:25169
|
|
Title: Re:サイコロの問題 乱数編
|
|
イコールをどちらかにつけないほうが感覚的にわかりやすくなりますよ。
if( 0<=r && r<7 ){
printf("1番\n");
}else if( 7<=r && r<17 ){
printf("2番\n");
}else{
printf("それ以外\n");
どちらがわかりやすいかは人それぞれでしょうけど、
こっちの方が感覚的に、最初7、それから10となっているように見えないでしょうか?
113ポイント を落としてしまった。
|
|
|
|
|