C言語何でも質問掲示板


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

規約と使い方

 
   ダイアログボックスに ....   
     ・[13984] りょうちん 
   敵の出現   
     ・[13837] 管理人 
     ・[13850] chunezu 
     ・[13852] しりうす〜 
     ・[13856] 管理人 
     ・[13946] chunezu 
     ・[13952] しりうす〜 
     ・[13955] やそ 
     ・[13963] chunezu 
     ・[13968] バグ 
     ・[13970] chunezu 
   未解決の外部シンボル ....   
     ・[13965] box 
     ・[13969] たかぎ 
   この記述について   
     ・[13956] バグ 
     ・[13957] たかぎ 
   宿題教えてください。   
     ・[13887] バグ 
     ・[13890] たかぎ 
     ・[13891] やそ 
     ・[13893] keichan 
     ・[13907] tkmakwins15 
     ・[13908] tkmakwins15 
     ・[13910] たかぎ 
     ・[13911] すず 
     ・[13913] たかぎ 
     ・[13914] たかぎ 
     ・[13915] やそ 
     ・[13916] たかぎ 
     ・[13917] たかぎ 
     ・[13919] やそ 
     ・[13921] tkmakwins15 
     ・[13922] すず 
     ・[13923] やそ 
     ・[13924] たかぎ 
     ・[13925] やそ 
     ・[13926] たかぎ 
     ・[13927] たかぎ 
     ・[13953] すず 
   volatileについて   
     ・[13872] たかぎ 
     ・[13903] 青い犬 
     ・[13909] たかぎ 
     ・[13937] 青い犬 
   メインループ を入れ ....   
     ・[13878] 管理人 
     ・[13879] tny 
     ・[13880] 管理人 
     ・[13899] tny 
     ・[13930] 管理人 
   ブラックジャックのプ ....   
     ・[13896] box 
     ・[13897] YYY 
     ・[13902] box 
     ・[13904] YYY 
     ・[13905] box 
     ・[13906] YYY 
     ・[13929] 管理人 
   構造体配列の種類分け ....   
     ・[13889] Cげんが〜 
     ・[13892] やそ 
     ・[13894] Cげんが〜 
     ・[13898] box 
     ・[13900] Cげんが〜 
   VC++2005 Express でイ ....   
     ・[13877] 管理人 
     ・[13884] こよーて 
   構造体配列について   
     ・[13645] へろり 
     ・[13646] Cげんが〜 
     ・[13648] へろり 
     ・[13652] 管理人 
     ・[13654] Cげんが〜 
     ・[13712] Cげんが〜 
     ・[13714] box 
     ・[13716] Cげんが〜 
     ・[13754] やそ 
     ・[13765] 管理人 
     ・[13883] Cげんが〜 
   入門編でわからないと ....   
     ・[13836] 管理人 
     ・[13851] はっと 
     ・[13855] 管理人 
     ・[13874] はっと 
   無題   
   社会人の先輩方の意見 ....   
     ・[13867] たかぎ 
     ・[13868] バグ 
   動的なメモリの確保   
     ・[13803] box 
     ・[13804] たかぎ 
     ・[13805] にじいろもよう 
     ・[13808] にじいろもよう 
     ・[13811] box 
     ・[13841] 管理人 
     ・[13865] にじいろもよう 
   暗い場所の演出   
     ・[13785] 管理人 
     ・[13789] 管理人 
     ・[13790] 管理人 
     ・[13791] 管理人 
     ・[13809] テックウォ  
     ・[13833] tkmakwins15 
     ・[13848] parapara 
     ・[13858] parapara 
   敵を消す   
     ・[13829] バグ 
     ・[13831] prg 
     ・[13832] tkmakwins15 
     ・[13838] 管理人 
     ・[13844] prg 
     ・[13845] 管理人 
     ・[13846] prg 
     ・[13847] 管理人 
     ・[13853] prg 
   キー   
     ・[13757] やそ 
     ・[13761] 管理人 
     ・[13770] ぜt 
     ・[13774] 管理人 
     ・[13823] ぜt 
     ・[13842] 管理人 
     ・[13849] ぜt 
   str系関数とmem系関数 ....   
     ・[13843] 管理人 
   無題   
     ・[13818] box 
     ・[13819] prg 
     ・[13820] box 
     ・[13822] tkmakwins15 
     ・[13825] たかぎ 
     ・[13827] prg 
   C言語で数独の問題を ....   
     ・[13814] やそ 
     ・[13816] すけ 
     ・[13824] すけ 
   初歩的ですいません   
     ・[13626] tkmakwins15 
     ・[13637] 管理人 
     ・[13815] <kor 
   時間を使用した乱数   
     ・[13813] box 
   隣接行列プログラム   
     ・[13538] box 
     ・[13553] のん 
     ・[13738] のん 
     ・[13752] parapara 
     ・[13769] やそ 
     ・[13792] のん 
     ・[13807] parapara 
   構造体です   
     ・[13794] 管理人 
     ・[13798] tkmakwins15 
     ・[13799] たかぎ 
   メモリ使用量を抑える ....   
     ・[13719] たかぎ 
     ・[13726] nayo 
     ・[13729] たかぎ 
     ・[13730] nayo 
     ・[13731] たかぎ 
     ・[13737] nayo 
     ・[13751] tkmakwins15 
     ・[13762] 管理人 
     ・[13781] nayo 
   壁の判定   
     ・[13780] korsakov 
   無題   
     ・[13697] たかぎ 
     ・[13698] やそ 
     ・[13699] やそ 
     ・[13700] たかぎ 
     ・[13701] 管理人 
     ・[13706] 通りすがり 
     ・[13713] たかぎ 
     ・[13715] たかぎ 
     ・[13720] やそ 
     ・[13721] たかぎ 
     ・[13759] 管理人 
     ・[13768] やそ 
     ・[13779] 管理人 
   platform SDK   
     ・[13778] 管理人 
   マインスイーパ   
     ・[13764] 管理人 
   Dijkstra法とWarshall ....   
     ・[13753] parapara 
   困ってます   
     ・[13600] Hermit 
     ・[13603] たかぎ 
     ・[13612] バグ 
     ・[13632] 管理人 
     ・[13659] Hermit 
     ・[13665] 管理人 
     ・[13688] tkmakwins15 
     ・[13744] ф魔理沙ф 
   穴埋め問題についてア ....   
     ・[13586] 管理人 
     ・[13588] 管理人 
     ・[13589] 雷 
     ・[13591] 管理人 
     ・[13631] ぽん 
     ・[13634] 管理人 
     ・[13733] ぽん 
   教えてください   
     ・[13718] たかぎ 
     ・[13722] エターナル 
     ・[13724] たかぎ 
     ・[13725] tkmakwins15 
     ・[13728] たかぎ 
   アクションゲームのス ....   
     ・[13704] 管理人 
     ・[13727] アル 
   グレゴリウス暦を使っ ....   
     ・[13557] VOW 
     ・[13558] カル 
     ・[13561] たかぎ 
     ・[13562] やそ 
     ・[13563] やそ 
     ・[13568] やそ 
     ・[13573] カル 
     ・[13576] やそ 
     ・[13581] カル 
     ・[13582] やそ 
     ・[13583] カル 
     ・[13584] カル 
     ・[13587] やそ 
     ・[13590] カル 
     ・[13592] YuO 
     ・[13613] やそ 
     ・[13630] カル 
     ・[13638] 管理人 
     ・[13640] カル 
     ・[13660] カル 
     ・[13662] box 
     ・[13666] 管理人 
     ・[13667] カル 
     ・[13668] 管理人 
     ・[13671] カル 
     ・[13672] 雷 
     ・[13674] カル 
     ・[13675] 雷 
     ・[13684] カル 
     ・[13686] やそ 
     ・[13705] カル 
   無題   
     ・[13616] やそ 
     ・[13617] ぜt 
     ・[13619] tkmakwins15 
     ・[13633] 管理人 
     ・[13642] やそ 
     ・[13650] 管理人 
     ・[13655] ぜt 
     ・[13670] 木霊 
     ・[13673] 雷 
     ・[13676] バグ 
     ・[13677] やそ 
     ・[13678] ぜt 
     ・[13679] 通りすがり 
     ・[13680] ぜt 
     ・[13681] バグ 
     ・[13682] やそ 
     ・[13703] 管理人 
   当たり判定   
     ・[13685] やそ 
     ・[13702] 管理人 
   画像処理でヒストグラ ....   
     ・[13690] 管理人 
     ・[13691] 組木紙織 
     ・[13696] やそ 
   オススメの本   
   リアルタイムレンダリ ....   
   無題   
     ・[13653] 管理人 
     ・[13689] 匿名希望 
   コンパイル後にファイ ....   
     ・[13651] 管理人 
     ・[13663] 雷 
     ・[13664] Justy 
     ・[13669] 雷 
   windows.hを使ったGUI ....   
     ・[13657] 管理人 
     ・[13658] parapara 
     ・[13661] りょうちん 
   レジストリハンドルか ....   
   なぜかできない   
     ・[13609] prg 
     ・[13610] バグ 
     ・[13621] prg 
     ・[13622] バグ 
     ・[13623] prg 
     ・[13624] prg 
     ・[13625] やそ 
     ・[13628] prg 
     ・[13629] バグ 
     ・[13635] 管理人 
     ・[13641] やそ 
   無題   
     ・[13575] tkmakwins15 
     ・[13593] prg 
     ・[13594] tkmakwins15 
     ・[13595] 管理人 
     ・[13604] prg 
     ・[13605] prg 
     ・[13639] 管理人 
   シューティングの館の ....   
     ・[13636] 管理人 
   非決定性有限オートマ ....   
     ・[13618] 通りすがり 
   正規表現   
     ・[13615] バグ 

Name: りょうちん  ..入門者(3,829ポイント)   Date: 2008/02/02(土) 19:10   No:13973       
Title: ダイアログボックスについて質問    
現在、VS2005 C++ でダイアログボックスを作っているのですが、
ダイアログボックスを呼び出すと、コントロールのみが表示されて、
をれ以外の画面が表示されないのですが、原因としてはどんな事が
考えられますか?

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


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


Name: りょうちん  ..入門者(3,894ポイント)   Date: 2008/02/02(土) 22:48   No:13984 解決!     
Title: Re:自己解決しました。    
お騒がせしました。自己解決できました。

ダイアログのプロシージャにreturn FALSE; を記述してなかったのが
原因でした。

すいませんでした。


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



Name: chunezu  ..かけだし(1,129ポイント)   Date: 2008/01/27(日) 21:35   No:13830       
Title: 敵の出現    
flagを使って敵を出現させようとしているのですがなかなか上手く行きません。
質問しようにも聞くことが沢山ありすぎてしまいます。

そこで「test.gifがx320、y240に起動から3秒後に出てくる。」という設定で1つ例を示して頂けないでしょうか?この例を使って勉強したいと思います。すごく長くなっても分割しないで1ソース内に納めてくれてほしいです。

OSはXP、コンパイラはVisual C++2005です。

御回答よろしくお願いします。


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


Name: 管理人 [URL]  ..伝説のハッカー(503,235ポイント)   Date: 2008/01/28(月) 04:09   No:13837     
Title: Re:敵の出現    
敵の出現といっても、パターンが沢山ありすぎるのですが・・。
シューティングの敵やRPGの敵、他アクションの敵や格闘などの敵など・・。

RPGの敵の遭遇については、
http://dixq.net/g/#25
こちらで紹介していますが、コレではダメですか?


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

Name: chunezu  ..かけだし(1,145ポイント)   Date: 2008/01/28(月) 16:11   No:13850     
Title: Re:敵の出現    
説明不足でした。シュ−ティングの敵です。

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

Name: しりうす〜  ..入門者(2,748ポイント)   Date: 2008/01/28(月) 17:04   No:13852     
Title: Re:敵の出現    
シューティングでもRPGでも考え方は同じだと思うのだけれど。


敵構造体{
x, y; // 敵の座標
flag; // 存在フラグ
}

メインループ
{
if( 起動からの時間 == 3秒 )
{
敵構造体.x = 320;
敵構造体.y = 240;
敵構造体.flag = 1;
}

//敵構造体.flag == 1 なら敵が存在するので描画したり当たり判定したり
}


こういうことが聞きたかったの?


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

Name: 管理人 [URL]  ..伝説のハッカー(506,969ポイント)   Date: 2008/01/28(月) 18:08   No:13856     
Title: Re:敵の出現    
またこれも方法は沢山あって、用途によって様々です。
もしお遊び程度でよければシューティングの館で紹介していますので、そちらをご覧下さい。

しかし、本格的におつくりになるのならこれではダメで、エクセルなどで表を作ることになります。
私が作っているシューティングを例に出しますと、敵1体が1回の出現で持つ情報は

・いつ
・どういう移動パターンで
・どういう種類の敵が
・どこで(x座標)
・どこで(y座標)
・移動スピードはいくらで
・発射時間はいくらで
・弾幕種類は何で
・弾の色は何で
・体力はいくつで
・落とすアイテム1は何で
・落とすアイテム2は何で
・落とすアイテム3は何で
・落とすアイテム4は何で
・落とすアイテム5は何で
・落とすアイテム6は何で
・弾の種類は何で
・待機時間はいくつで

という情報が必要になります。
1面で、これが1000個位。6面で6000個位必要なわけですから、switch文やif文で書いていられません。
基本、シューティングの館を参考に、値の代入はエクセルデータなどからとってくるようにしたほうがいいと思います。


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

Name: chunezu  ..かけだし(1,800ポイント)   Date: 2008/01/31(木) 23:50   No:13946     
Title: Re:敵の出現    
ありがとうございます。
その雛型を参考に自分も作ってみました。

#include "DxLib.h"

typedef struct{
int x,y,flag,pattern;
double size;
}kou;
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウィンドウモードに変更
if( DxLib_Init() == -1 ) return -1 ; // DXライブラリ初期化処理
SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先を裏画面に設定

int GHandle;
kou nz[10];
GHandle=LoadGraph("default.jpg");

int RefreshTime;
RefreshTime = GetNowCount();

ClearDrawScreen();

int i;
for(int i=0;i<100;i++)
if(nz[i].flag==1)
if(nz[i].pattern==1)
nz[i].y=1.5;

for(i=0;i<10;i++)
if(nz[i].flag==0)
break;

int counter=0;
counter=counter+1;

switch(counter){
case 60:
case 120:
case 180:
case 240:
nz[i].flag=1; //出現フラグ
counter=0;//出現して何カウント目か測るカウンター初期化
nz[i].pattern=1; //軌道
nz[i].size=0.5;//大きさ
nz[i].x=100; //xの初期座標
nz[i].y=100; //yの初期座標
break;
default:
break;
}


for(i=0;i<100;i++)
if(nz[i].flag==1){
DrawRotaGraph((int)nz[i].x,(int)nz[i].y,nz[i].size,0,GHandle,TRUE );}


ScreenFlip();

while(GetNowCount()-RefreshTime<17);


WaitKey(); // 何かキー入力があるまで待つ
DxLib_End(); // DXライブラリ使用の終了処理
return 0; // ソフトの終了
}

このプログラムだとエラーは出てきませんでしたが、画面にも何も出てきませんでした。
どのあたりがいけないか、ご指摘お願いします。


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

Name: しりうす〜  ..入門者(2,892ポイント)   Date: 2008/02/01(金) 11:25   No:13952     
Title: Re:敵の出現    
DXLib使ったことないので、この実装が正しいのかはわかりませんけれど、
プログラムがきちっとループしていると仮定して、ループの中で

int counter = 0;

で宣言してるのでカウンターが増えてないんじゃないですか?
カウンターの数字をデバッガで追いかけるなり画面で表示するなりして確認してみてください。


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

Name: やそ  ..上級者(19,271ポイント)   Date: 2008/02/01(金) 14:54   No:13955     
Title: Re:敵の出現    
んー、ループしてますか、これ?



int counter=0;
counter=counter+1;

switch(counter){
case 60:
case 120:
case 180:
case 240:
nz[i].flag=1; //出現フラグ
counter=0;//出現して何カウント目か測るカウンター初期化
nz[i].pattern=1; //軌道




ですが、しりうすさんの指摘どおり、counterが回っていないようです。



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

Name: chunezu  ..入門者(2,532ポイント)   Date: 2008/02/02(土) 00:43   No:13963     
Title: Re:敵の出現    
ご指摘ありがとうございます。たしかにループもしてないし、カウンターも回ってませんでした。


#include "DxLib.h"

typedef struct{
int x,y,flag,pattern;
double size;
}kou;


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウィンドウモードに変更
if( DxLib_Init() == -1 ) return -1 ; // DXライブラリ初期化処理
SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先を裏画面に設定

int GHandle;
int counter=0;
kou nz[10];
GHandle=LoadGraph("default.jpg");
int White = GetColor( 255 , 255 , 255 ) ; // 白色の値を取得

int RefreshTime;

while(!ProcessMessage() && !ClearDrawScreen()){

RefreshTime = GetNowCount();

counter=counter+1;
DrawFormatString( 0, 0, White , "%d" , counter );//文字列表示



int i;
for(int i=0;i<100;i++)
if(nz[i].flag==1)
if(nz[i].pattern==1)
nz[i].y=1.5;

for(i=0;i<10;i++)
if(nz[i].flag==0)
break;

switch(counter){
case 60:
nz[i].flag=1; //出現フラグを立てる
counter=0;//出現して何カウント目か測るカウンター初期化
nz[i].pattern=1; //どういう軌道を描くか
nz[i].size=1;//敵の大きさ
nz[i].x=100; //xの初期座標
nz[i].y=100; //yの初期座標
break;
default:
break;
}


for(i=0;i<100;i++)
if(nz[i].flag==1){
DrawRotaGraph((int)nz[i].x,(int)nz[i].y,nz[i].size,0,GHandle,TRUE );}


ScreenFlip();

while(GetNowCount()-RefreshTime<17);
}


WaitKey(); // 何かキー入力があるまで待つ
DxLib_End(); // DXライブラリ使用の終了処理
return 0; // ソフトの終了
}

ちゃんとループをして、カウンターが回るようにしました。
DrawFormatString( 0, 0, White , "%d" , counter );ぐるぐると回っておりました。
しかし、またしたも肝心の画像が出てきません。

ご指摘お願いします。


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

Name: バグ  ..比類無きプログラマー(74,188ポイント)   Date: 2008/02/02(土) 08:49   No:13968     
Title: Re:敵の出現    
一応、動くように修正しましたが、構造体の配列が10個しか用意されていないのに、ループを100回している箇所がありますね。危険ですので、注意した方がいいですよ。

あと、どのループがどの処理をしているのか分かりにくいですね。メンテナンスが容易になるので、きちんと{}で括るべきです。ちなみに、この修正ソースでは、ループは1つにまとめてみました。

ただし、私の勝手な解釈で適当に修正してあるので、必要に応じて再修正を加えてください。


#include "DxLib.h"

typedef struct
{
int flag;
int pattern;
double x;
double y;
double size;
}kou;


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
ChangeWindowMode(TRUE);
if (DxLib_Init() == -1)
{
return -1;
}

SetDrawScreen(DX_SCREEN_BACK);

int GHandle = LoadGraph("default.jpg");
int counter=0;
kou nz[10]; // 構造体の中身が初期化されていないまま使用されていますが大丈夫ですか??????

while (!ProcessMessage() && !ClearDrawScreen())
{
counter++;
DrawFormatString(0, 0, GetColor(255, 255, 255), "%d", counter);

for(int i=0;i<10;i++)
{
// このif文は何を判定しているのでしょう??????
if (nz[i].flag == 1 && nz[i].pattern == 1)
{
// メンバ変数のyはint型ですが、代入されている値がdouble型です。(修正済み)
nz[i].y = 1.5;
}

// 構造体が初期化されていないので、countが60になる以前の中身が不定となりますが大丈夫でしょうか??????
// というか、この判定は必要ですか?下記のswitch〜caseで充分だとおもいますが…??????
if (nz[i].flag == 0)
{
break;
}

switch (counter)
{
case 60:
counter = 0; //出現して何カウント目か測るカウンター初期化
nz[i].flag = 1; //出現フラグを立てる
nz[i].pattern = 1; //どういう軌道を描くか
nz[i].x = 100.0; //xの初期座標
nz[i].y = 100.0; //yの初期座標
nz[i].size = 1.0; //敵の大きさ
break;
default:
break;
}

if (nz[i].flag == 1)
{
// int型をint型にキャストしてますね。意味がありません(修正済み)
DrawRotaGraph((int)nz[i].x,(int)nz[i].y,nz[i].size,0,GHandle,TRUE );
}
}

ScreenFlip();
}

WaitKey(); // 何かキー入力があるまで待つ
DxLib_End(); // DXライブラリ使用の終了処理
return 0; // ソフトの終了
}



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

Name: chunezu  ..かけだし(2,498ポイント)   Date: 2008/02/02(土) 14:58   No:13970 解決!     
Title: Re:敵の出現    
じぶんなりの形にまとめ上げることができました。

みなさん本当にありがとうございました!


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



Name: げんき  ..ぴよぴよ(51ポイント)   Date: 2008/02/02(土) 02:14   No:13964       
Title: 未解決の外部シンボルについて    
タイトルのとおりデバック中にエラーで表示されるのですがどうすればよいのでしょうか?
初心者というよりも素人なのでくだらない質問かもしれませんがアドバイスお願いします。


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


Name: box  ..ハッカー(106,117ポイント)   Date: 2008/02/02(土) 07:07   No:13965     
Title: Re:未解決の外部シンボルについて    
リンク時ではなくて、デバッグ中ですか?
仮にリンク時だとすると、エラーメッセージで
「未解決の外部シンボル」と出た関数の
スペルが正しくないことが考えられます。


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

Name: たかぎ [URL]  ..プログラマー(29,117ポイント)   Date: 2008/02/02(土) 11:40   No:13969     
Title: Re:未解決の外部シンボルについて    
環境不明なので詳しいことは全く分かりませんが、動的リンクの際にシンボルの解決に失敗したのかもしれませんね。


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



Name: バク  ..ぴよぴよ(54ポイント)   Date: 2008/02/01(金) 02:47   No:13948       
Title: この記述について    
シミュレーションを行うプログラムで
「DS_get var〜〜」みたいなのがあるんですが,これって何かの関数ですか?
知っていれば教えてください


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


Name: バグ  ..比類無きプログラマー(73,423ポイント)   Date: 2008/02/01(金) 15:13   No:13956     
Title: Re:この記述について    
これだけでは何とも答えようがありませんね。もしC言語の話だとすると、間に半角のスペースがありますし、関数の名前ではないように思えますが…?

過去スレに似たような質問がありましたが、この質問者の方はMATLABという言語のようですね。もし同じ環境であれば、『MATLAB』でネット検索してみては如何でしょうか?

http://www.play21.jp/board/formz.cgi?action=res&resno=11515&id=dixq&lognum=36&from=tree


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

Name: たかぎ [URL]  ..プログラマー(29,046ポイント)   Date: 2008/02/01(金) 16:19   No:13957     
Title: Re:この記述について    
どうでもいいことですが、「バク」さんと「バグ」さんというのは非常に紛らわしいですね。


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



Name: すず  ..入門者(3,126ポイント)   Date: 2008/01/30(水) 17:11   No:13886       
Title: 宿題教えてください。    
C言語で秀丸を使っています。その宿題は,問題:prog12f.cのプログラムを改良し,アルファベットの
全ての文字を大文字にして表示するようにせよ.但し,文字
列の長さを求めるstrlen関数は使ってはいけない.単語単位で文字列を逆順にする点などは,そのままです.
読み込むファイルは前回と同じですが,そのファイルしか
処理できないようなプログラムはダメです。prog12f.cは添付します。


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


Name: バグ  ..比類無きプログラマー(73,239ポイント)   Date: 2008/01/30(水) 17:33   No:13887     
Title: Re:宿題教えてください。    
それで、その宿題の何が分からないのでしょうか?
自分ではどこまで取り組んでみましたか?


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

Name: たかぎ [URL]  ..プログラマー(26,755ポイント)   Date: 2008/01/30(水) 17:53   No:13890     
Title: Re:宿題教えてください。    
そのまま答えを書くのも問題がありそうなので、参考までにC++で書いてみました。
#include <iostream>

#include <string>
#include <algorithm>
#include <functional>
#include <iterator>
#include <cctype>

int main()
{
std::string str;
while (std::cin >> str)
{
std::transform(str.rbegin(), str.rend(),
std::ostream_iterator<char>(std::cout),
std::ptr_fun<int, int>(&std::toupper));
std::cout << ' ';
}
return 0;
}


多分、参考にならないでしょうけど。


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

Name: やそ  ..上級者(17,354ポイント)   Date: 2008/01/30(水) 18:07   No:13891     
Title: Re:宿題教えてください。    
おおっと、重鎮が率先してお答えされているではないですか(笑)

>すずさんへ
具体的な質問内容が明記されておりませんが、何をお聞きしたいのでしょうか?

それとも答えだけ教えて欲しい「丸投げ」でしょうか。

丸投げ(お手上げ)ならばここのルールに則りその旨をきちんと明記して、自分は前回の問題「prog12f.c」はどこまで理解できているか(自分の実力はどの程度か)も明記してください。

またファイルの仕様が見えません。
前回の問題に使ったtest.txtの内容もさらしていただくか、
ファイルの仕様を公開してください。
1レコードの最大文字数や内容に関する制限(数字や記号、2バイトレコードの可否)は?

回答する側の立場に立てば、どのような質問の仕方が満足のいく回答を得られるか分かっていただけると思います。

きっと、大文字小文字の入り混じった英文なんでしょうね。
1行の文字数もそれほど長いものではなさそうですね(a[20]ですからね^^;)
1単語=1レコードでしょうかね。
ならばfscanf()で読み込んでいるのも頷けるのですけど。

また、問題文を要約すると・・・
問題:prog12f.cのプログラムを改良し,アルファベットの
全ての文字を大文字にして、単語単位に逆順に表示するようにせよ.

と言うことでしょうか?



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

Name: keichan  ..プログラマー(30,549ポイント)   Date: 2008/01/30(水) 18:17   No:13893     
Title: Re:宿題教えてください。    
>多分、参考にならないでしょうけど。
教師に各ステップで何をやっているのか聞かれたらoutでしょうね。


質問者さんへ
・なにが/どこが分からないのか具体的なポイントを提示して頂かなければ回答が付きにくいと思います
・どこがわからないのかが「わからない」場合は、ソースを書こうとせずに作業の工程を洗ってみてはどうでしょうか
 (ファイルオープン処理・ファイル読み込み処理etc)
・(バグさんも仰っていますが)ご自身でどこまで試行錯誤したかの後が見受けられれば、間違っている点や改善点を指摘しやすくなります
・頑張ってください


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

Name: tkmakwins15 [URL]  ..熟練のプログラマー(55,527ポイント)   Date: 2008/01/30(水) 23:43   No:13907     
Title: Re:宿題教えてください。    
>文字列の長さを求めるstrlen関数は使ってはいけない

ということはstrlen関数を使えば効率よく作業ができるということです。つまり類似関数を自作しちゃいましょう。

int GetStringLength(const char *string)
{
int count=0;

while(string[count]!='\0')count++;

return count;
}

まぁこれくらいは文章から分かりそうです。


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

Name: tkmakwins15 [URL]  ..熟練のプログラマー(55,592ポイント)   Date: 2008/01/31(木) 00:35   No:13908     
Title: Re:宿題教えてください。    
使うべき関数群(組み合わせは考えて下さい)

fopen
fscanf
fclose
printf
isupper
islower
tolower
toupper

関数の詳細は検索などで調べてください。


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

Name: たかぎ [URL]  ..プログラマー(27,637ポイント)   Date: 2008/01/31(木) 11:34   No:13910     
Title: Re:宿題教えてください。    
大サービスでC言語でも作ってみました。
前回もそうでしたが、面倒なので今回も標準入力からの入力にしています。
ファイルから入力したいのであれば、リダイレクトするか適当に修正してください。
#include <stdio.h>

#include <ctype.h>
#include <stdbool.h>

bool sub(void)
{
if (feof(stdin)) return false;

int c = getchar();
if (isspace(c)) return true;

bool result = sub();
putchar(toupper(c));
return result;
}

int main(void)
{
while (sub()) putchar(' ');
return 0;
}


例によって、多分参考にはならない気がします。


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

Name: すず  ..入門者(3,255ポイント)   Date: 2008/01/31(木) 11:53   No:13911     
Title: 質問が明確でなくてすいません。    
c言語のプログラミングは超初心者です。ファイルの入出力にという章でfopen,fclose,fscanf,fprintfなど基本的なことは習いました。例題で書き込んだファイルを読み込むというのもやったことがあります。でもこの宿題が出題されてお手上げ状態です。答えを教えてください。

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

Name: たかぎ [URL]  ..プログラマー(27,871ポイント)   Date: 2008/01/31(木) 12:07   No:13913     
Title: Re:質問が明確でなくてすいません。    
> 答えを教えてください。

↓これではダメでしょうか?
#include <stdio.h>

#include <ctype.h>
#include <stdbool.h>

bool sub(FILE *stream)
{
int c = fgetc(stream);
if (c == EOF) return false;
if (isspace(c)) return true;

bool result = sub(stream);
putchar(toupper(c));
return result;
}

int main(void)
{
FILE *stream = fopen("test.txt", "r");
if (stream != NULL)
{
while (sub(stream)) putchar(' ');
fclose(stream);
}
return 0;
}


元のプログラムの原型を留めていませんが、とことん改良したということにでもしてください。
ただし、何をやっているのか説明できるようにだけはしておいてください。


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

Name: たかぎ [URL]  ..プログラマー(28,117ポイント)   Date: 2008/01/31(木) 12:14   No:13914     
Title: Re:質問が明確でなくてすいません。    
一応、元のプログラムの主な問題点を指摘しておきます。
char a[20], b[20];


fscanf(fp,"%s",a);


これではバッファオーバーランが発生します。
仮にバッファオーバーランを防いでも、scanf や fgets を使ったのでは、どうしても単語の文字列長に制限が出てしまいます。
if(a[0] >= 'A' && a[0] <= 'Z')


if(b[0] >= 'a' && b[0] <= 'z')


'A'〜'Z' および 'a'〜'z' が連続であることは保証されていません。
http://www.kijineko.co.jp/tech/superstitions/A-to-Z-is-sequence.html

a[0] += 32;


b[0] -= 32;


特定のエンコーディングに依存しているようです。
今回の質問では処理系を特定していませんので、こういう書き方はできません。

先ほどの「答え」は、これらの問題点を「改良」しています。


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

Name: やそ  ..上級者(18,201ポイント)   Date: 2008/01/31(木) 13:07   No:13915     
Title: Re:質問が明確でなくてすいません。    
>たかぎさんへ

 回答のプログラムのレベルが高すぎます(苦笑)
 すずさんのレベルは・・・

 >>c言語のプログラミングは超初心者です。ファイルの入出力にという章でfopen,fclose,fscanf,fprintfなど基本的なことは習いました。例題で書き込んだファイルを読み込むというのもやったことがあります。

 と言うレベルです。
 いきなりたかぎさんの出された回答を読み解くのはキツいんじぁ・・・(再帰とか再帰とか(笑))

 すずさんは答えが欲しかったらどのような答えが欲しいのか示さないといけません。
 お手上げなのは分かりましたが、皆さんが懸念されている問題点について分かっていることはありませんか?
 
 1.そのC言語を動かしている環境。WinやMacなどのPCでしょうか?unix系でしょうか?汎用機でしょうか?その処理系によりコード体系も変わってきますので、たかぎさんの指摘する・・・【'A'〜'Z' および 'a'〜'z' が連続であることは保証されていません。】に関わります。
 2.すずさんが今までに習った関数や命令は?今回みなさんがいろいろ大サービスで提示してくださっているプログラムでそれぞれ使用されている関数は理解できますか?また今回使用しても良さそうですか?
(たかぎさんが言うように「とことん改良したんです」と言い張るにはそれらの関数や、プログラムの流れを理解して他人に説明できるようでないと、カンニングがバレてしまいます(笑))
 3.ファイル読み込み時のバッファーオーバーランの可能性については特に先生?から指示(指摘)はなかったのでしょうか?完全に「入力されてくる文字列には間違いはない!」という善意に頼った仕様でよろしいですか?

 まあ、せっかく回答が得られたのだから、それを必死に読み解いていただいてすずさんの血肉となればOKすよ。がんばってください。




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

Name: たかぎ [URL]  ..プログラマー(28,105ポイント)   Date: 2008/01/31(木) 13:17   No:13916     
Title: Re:質問が明確でなくてすいません。    
> まあ、せっかく回答が得られたのだから、それを必死に読み解いていただいてすずさんの血肉となればOKすよ。がんばってください。

要するにそういうことですね。
同じカンニングするなら、有意義なカンニングの仕方をしましょう。


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

Name: たかぎ [URL]  ..プログラマー(28,360ポイント)   Date: 2008/01/31(木) 13:26   No:13917     
Title: Re:質問が明確でなくてすいません。    
こちらにもコメント

>  1.そのC言語を動かしている環境。WinやMacなどのPCでしょうか?unix系でしょうか?汎用機でしょうか?その処理系によりコード体系も変わってきますので、たかぎさんの指摘する・・・【'A'〜'Z' および 'a'〜'z' が連続であることは保証されていません。】に関わります。

今回の宿題に関しては、(多バイト文字を扱うのでない限り)処理系に依存しなければ実装できないような要素は一つもありません。
ところで、先に示したコードはC99に対応したコンパイラでなければコンパイルできません。
処理系を特定していないので、(いつものように)現行規格に従いましたが、規格のバージョンに制約があるなら、それを指定してください。

>  2.すずさんが今までに習った関数や命令は?今回みなさんがいろいろ大サービスで提示してくださっているプログラムでそれぞれ使用されている関数は理解できますか?また今回使用しても良さそうですか?
(たかぎさんが言うように「とことん改良したんです」と言い張るにはそれらの関数や、プログラムの流れを理解して他人に説明できるようでないと、カンニングがバレてしまいます(笑))

難しい関数は一つも使ってないんですけどね。

>  3.ファイル読み込み時のバッファーオーバーランの可能性については特に先生?から指示(指摘)はなかったのでしょうか?完全に「入力されてくる文字列には間違いはない!」という善意に頼った仕様でよろしいですか?

これについては、

> 読み込むファイルは前回と同じですが,そのファイルしか
> 処理できないようなプログラムはダメです。

とあるのでダメでしょう。
バッファオーバーランは論外として、文字列の長さに制限があるのもダメですね。


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

Name: やそ  ..上級者(18,647ポイント)   Date: 2008/01/31(木) 13:52   No:13919     
Title: Re:質問が明確でなくてすいません。    
> 読み込むファイルは前回と同じですが,そのファイルしか
> 処理できないようなプログラムはダメです。

とあるのでダメでしょう。
バッファオーバーランは論外として、文字列の長さに制限があるのもダメですね。


たしかにそうでしたね。
これはたかぎさんのコードで回避可能ですね^^

文字コードについてもまあ、ASCIIコードにしたがっているのなら問題ないでしょうね。
全角(2バイト)英数OKとかでも無い限り(笑)
EBCDICをつかってたら気をつける必要ありなのかな^^;

問題文の最後に「単語単位で文字列を逆順にする点などは,そのままです.」
と有りますが、これはすずさん自身に考えてもらいましょうかね?
(っていうか、”そのままです”っていうのは結局やるの?やらないの?(笑))


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

Name: tkmakwins15 [URL]  ..熟練のプログラマー(55,904ポイント)   Date: 2008/01/31(木) 15:47   No:13921     
Title: Re:質問が明確でなくてすいません。    
ある程度は自分でやる必要もあると思います。まぁ単語を逆順に配列に配置しなおす関数を書いてみます。

void ReverseString(char *string)
{
int strsize,i;
char *temp;

strsize=GetStringLength(string);
temp=malloc((strsize+1)*sizeof(char));

temp[strsize+1]=string[strsize+1];
while(i<=strsize){
temp[i]=sizeof[strsize-i];
i++;
}
i=0;
while(i<=strsize){
string[i]=temp[i];
i++;
}
free(temp);
}

答えは出てますが、自分で考えるなら手助けします。

修正:mallocの引数が大問題だったので修正。{malloc(strsize+1*sizeof(char);→malloc((strsize+1)*sizeof(char));}


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

Name: すず  ..入門者(3,381ポイント)   Date: 2008/01/31(木) 16:11   No:13922     
Title: いろいろ回答ありがとうございます。    
C言語を動かしている環境はWindowsXPです。たかぎさんのプログラムを実行しみたら「インクルードファイルがオープンできません。」と表示されました。test.txtは添付しておきます。皆さんの使っている関数は正直理解できないのが多いですが,インターネットで調べてなんでもつかってもよいと言われています。

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

Name: やそ  ..上級者(18,735ポイント)   Date: 2008/01/31(木) 16:18   No:13923     
Title: Re:質問が明確でなくてすいません。    
tkさんもお優しいなぁ^^

このtkさんのプログラムは
Date: 2008/01/30(水) 23:43
の投稿にある
GetStringLength()もあわせて見る必要があるのだ!!(笑)
mallocの引数の計算もなんでこのような計算式が必要なのか。考えてみると非常にお勉強になってよいと思いますです^^

また、一つ目のwhileループの際にiの初期値を追加しておいたほうがいいかも^^

temp[strsize+1]=string[strsize+1];
i=0;
while(i<=strsize){
temp[i]=sizeof[strsize-i];
i++;
}





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

Name: たかぎ [URL]  ..プログラマー(28,385ポイント)   Date: 2008/01/31(木) 16:25   No:13924     
Title: Re:質問が明確でなくてすいません。    
> インターネットで調べてなんでもつかってもよいと言われています。

では、おそらくエラーが出たのであろう <stdbool.h> についても調べてみましょう。


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

Name: やそ  ..上級者(19,015ポイント)   Date: 2008/01/31(木) 16:50   No:13925     
Title: Re:質問が明確でなくてすいません。    
>インターネットで調べてなんでもつかってもよいと言われています。

というのは、「調べる技術も実力のうち」
と言う考えなのかもしれません。

ここのような掲示板で聞くことも大きく捉えればそのうちに入るかもしれませんが、
即時性は無いので、googleなりWikiなりいろいろ活用して調べるクセをつけると良いでしょう。

検索のキーワードもひとつだけに限らず、いろんな角度からやって見ましょう。

stdboolは調べればすぐに出ますよね^^
エラーになったと言うことは、それが用意されていなかったわけで、
ヘッダファイルを探して(作って)保存するなり、内容をベタ打ちしてもいいでしょう。



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

Name: たかぎ [URL]  ..プログラマー(28,467ポイント)   Date: 2008/01/31(木) 17:02   No:13926     
Title: Re:質問が明確でなくてすいません。    
> ヘッダファイルを探して(作って)保存するなり、内容をベタ打ちしてもいいでしょう。

現実にはヘッダファイルを用意しただけでは済まないんですけどね。
調べるべきキーワードは「C99」です。

ちなみに、私もWindows XPで動作確認しましたが、コンパイラはCygwin上のGCCを使いました。


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

Name: たかぎ [URL]  ..プログラマー(28,527ポイント)   Date: 2008/01/31(木) 17:05   No:13927     
Title: Re:質問が明確でなくてすいません。    
> stdboolは調べればすぐに出ますよね^^

試しにGoogleで検索してみると、更新をサボっている私のブログがトップに来るではないですか。
そこは余り参考にならないので、別のサイトを見たほうがいいです。


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

Name: すず  ..入門者(3,417ポイント)   Date: 2008/02/01(金) 11:31   No:13953 解決!     
Title: 無題    
いろいろありがとうございました。後は自分で調べるなりしてやっていきたいと思います。

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



Name: 青い犬  ..ぴよぴよ(26ポイント)   Date: 2008/01/29(火) 21:49   No:13871       
Title: volatileについて    
初めまして。volatileの効果について教えてください。
これまで、ポートやレジスタにアクセスするために以下のようにしてきました。


typedef struct tRegs {
volatile unsigned int sourceReg;
volatile unsigned int destinationReg;
volatile unsigned int lengthReg;
} Regs;

Regs *dma1Reg = (Regs *)DMA1_BASE_ADDR;

void func()
{
dmaReg->sourceReg = SOURCE_ADDR;
}



●質問1
これは、

typedef struct tRegs {
unsigned int sourceReg;
unsigned int destinationReg;
unsigned int lengthReg;
} Regs;

volatile Regs *dma1Reg = (volatile Regs *)DMA1_BASE_ADDR;
‥‥

としても同じでしょうか?

というのは、レジスタアクセス以外に
通常の変数としてもこのRegs構造体を使用したいのです。

Reg saveReg;

void func2()
{
saveReg.sourceReg = SOURCE_ADDR2;
}

しかし、このときにvolatileによって毎回メモリアクセスすることになり
処理に遅延が発生するのではないかと懸念しています。


●質問2
質問1の結果次第ではありますが、構造体を入れ子関係にした場合、
例えば、

typedef struct tRegs {
unsigned int sourceReg;
unsigned int destinationReg;
unsigned int lengthReg;
} Regs;

typedef struct tDMARegs {
Regs DMA0;
Regs DMA1;
} DMARegs;

volatile DMARegs *dmaRegs = (volatile Regs *)DMA_BASE_ADDR;
‥‥

とした場合にRegsの要素にvolatileが有効になりますか?


よりよいコーディングをしたいものの知識が乏しく困っています。
よろしくお願いいたします。


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


Name: たかぎ [URL]  ..プログラマー(26,485ポイント)   Date: 2008/01/29(火) 22:07   No:13872     
Title: Re:volatileについて    
●質問1

> volatile Regs *dma1Reg = (volatile Regs *)DMA1_BASE_ADDR;
> ‥‥
> としても同じでしょうか?

完全に同じではありませんが、同じ効果は期待できます。
どちらかといえば、volatile Regs *の方が望ましいでしょう。


●質問2

> Regsの要素にvolatileが有効になりますか?

有効です。



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

Name: 青い犬  ..ぴよぴよ(223ポイント)   Date: 2008/01/30(水) 22:49   No:13903     
Title: Re:volatileについて    
ご回答ありがとうございます。
もう少しだけ質問させてください。

●質問1
> 完全に同じではありませんが、同じ効果は期待できます。
の真意について教えていただけないでしょうか?

ひとつ気になっているのは、
Regsの要素に異なるサイズの型が混在した場合に
Regsの各要素にvolatileをつけないと
要素の並びを最適化してしまうのではないかという点です。
実際に私が実装としている今回の例では全てunsigned intなので
関係だとは思います。

的外れかもしれませんがこのことが完全に同じではないという
回答の意味でしょうか?

よろしくお願いします。


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

Name: たかぎ [URL]  ..プログラマー(27,461ポイント)   Date: 2008/01/31(木) 10:04   No:13909     
Title: Re:volatileについて    
> > 完全に同じではありませんが、同じ効果は期待できます。
> の真意について教えていただけないでしょうか?

例えば、

> Regs *dma1Reg = (Regs *)DMA1_BASE_ADDR;

の場合だと、dma1Reg の参照先そのものがvolatile修飾されているわけではありません。
そのため、

void *ptr = dma1Reg;

のような使い方をしても、警告が出ることはまずないでしょう。
一方、

> volatile Regs *dma1Reg = (volatile Regs *)DMA1_BASE_ADDR;


としておけば、先のような使い方をすれば、(処理系やコンパイルオプションにもよりますが)警告が出ることをある程度期待できます。

> Regsの要素に異なるサイズの型が混在した場合に
> Regsの各要素にvolatileをつけないと
> 要素の並びを最適化してしまうのではないかという点です。

少なくとも規格合致処理系ではそのようなことは起こりません。
構造体のメンバは、アドレスの下位から記述した順に配置されることが保証されています。
ただし、非標準処理系や非標準拡張を用いた場合はこの限りではありせん。

なお、構造体のメンバの配置を入れ替える処理系が複数実在することを知っていますが、いずれもvolatile修飾子を付けたとしてもそれを抑止することはできません。
いずれの処理系も、メンバの再配置を行うか否かは、コンパイルオプションで設定するか、#pragma指令で明示的に設定するようになっていました。


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

Name: 青い犬  ..ぴよぴよ(298ポイント)   Date: 2008/01/31(木) 21:00   No:13937 解決!     
Title: Re:volatileについて    
疑問が解決しました。
たかぎさん、ありがとうございました。

> なお、構造体のメンバの配置を入れ替える処理系が複数実在することを知っていますが、
> いずれもvolatile修飾子を付けたとしてもそれを抑止することはできません。
ずっと勘違いした認識を持っていました。
勉強になります。

それにしても、ここはよい掲示板ですね。


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



Name: tny  ..ぴよぴよ(27ポイント)   Date: 2008/01/29(火) 22:30   No:13873       
Title: メインループ を入れ子構造に    
プログラムの構造についての疑問です。

私は現在、プログラムの実行を、MainLoopと言う関数内で、TitleやGameStartと言ったゲームの中核となる関数へ(switch文でどれを実行すべきかを区別して)渡しています。
MainLoop関数は、WinMain関数内( while(ProcessMessage() == 0 && GetHitKeyStateAll(Key) == 0) のwhile文中)でのみ呼んでおり、一番上位の層で動作するものです。

void MainLoop(){
// SceneNumberの値を変えることでシーンの操作を行う
switch ( SceneNumber ){
case 0:
Title();
break;

case 1:
GameStart();
…………

と言う具合です。

ここで、TitleやGameStartと言った関数内でも、
while(ProcessMessage() == 0 && GetHitKeyStateAll(Key) == 0)
のループを用いています。
例えば、タイトル画面からメインゲーム画面へ移行したい場合、Title関数内のループを抜け、更にSceneNumber(MainLoop内で、どの関数を呼び出すかを決める変数)の値をメインゲームに対応する値に変えることで、移行を実現しています。



こういった、ループを多くの箇所で用いるやり方はまずいでしょうか?
また、どういうメリットがあり、デメリットがあるのかもお教え頂きたいと思ってます。
よろしくお願いします。


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


Name: 管理人 [URL]  ..伝説のハッカー(508,066ポイント)   Date: 2008/01/30(水) 01:22   No:13878     
Title: Re:メインループ を入れ子構造に    
プログラムの書き方は人によって千差万別で、プロとして他の人とやっていかない限りは、自分がわかりやすい我流でいいと思いますが、

基本的に、必ず行う
ProcessMessage() == 0

GetHitKeyStateAll(Key)
や、消す関数、裏画面反映関数などは「毎回必ず通る場所」に一箇所だけかくべきでしょう。

デメリットは、プログラムが長くなってくると痛感します。
いろんなところに、似たような処理がかいてあると、バグが出た時、どこがおかしいのかわからなくなったり、
します。
大きなゲームを作ろうと思ってくるとしっかりと役割分担をしないと把握が困難になってきます。
「登録部」「計算部」「描画部」が勝手にゲームの三大役割だと思っていますが、
きち〜んと、この3つにモジュールをわけてやることが、大きなゲームを作る秘訣だと思っています。

一つの関数に登録も計算も描画も行うようなことがかいてあると
どこか描画がおかしかった時、どこがおかしいか検討すらつかなくなってしまいます。

後、私の場合だと、単純に似たような処理がいくつもあると気持ち悪いですし、似たようなコードはまとめないと無駄に長くなってしまいます。
例えば極端な例ですが、

printf("1");
printf("2");
printf("3");
printf("4");
printf("5");
printf("6");

のようなプログラムがあったら纏めたいと思うでしょう。

MainLoop関数は、1秒間に60回位、処理は毎回通るのでしょうか?
また、MainLoopと言うからには、ここでループさせてるのかと思いましたが、本当にループしているのはメイン関数で、MainLoopにはループ処理は無いのでしょうか?
もし毎回メイン関数を通るのならゲームプログラミングの館のサンプルのようメインにだけ
毎回呼ぶ関数を書けばいいのではないでしょうか。


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

Name: tny  ..ぴよぴよ(86ポイント)   Date: 2008/01/30(水) 08:38   No:13879     
Title: Re:メインループ を入れ子構造に    
なるほど、まとめることが大事ですね。
まとめる様にします。
ありがとうございます。


>MainLoop関数は、1秒間に60回位、処理は毎回通るのでしょうか?
いえ、通りません。
例えば、TitleからGameStartへ移動する(タイトル画面で、ゲームスタートにカーソルを合わせて決定ボタンを押す)とき等に、一度通るような仕組みです。

>また、MainLoopと言うからには、ここでループさせてるのかと思いましたが、本当にループしているのはメイン関数で、MainLoopにはループ処理は無いのでしょうか?

WinMain中のwhile文の中にMainLoop関数を入れてる形でして、MainLoop関数の中身は、switchが1つあるだけ、という形です。


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

Name: 管理人 [URL]  ..伝説のハッカー(508,264ポイント)   Date: 2008/01/30(水) 11:21   No:13880     
Title: Re:メインループ を入れ子構造に    
それだとあちこちに同じような処理があることが予想され、いつも通る場所がかわるような仕様になっていると思いますので、複数人での開発やバグチェックにふさわしくいと思われます。

私の勝手な書き方であり、正当性の高いものかどうかはわかりませんが、
一応私が書いているメイン関数の方法はこちらで紹介しているので、よければご覧下さい。
このように、メイン関数は毎回絶対戻ってきて、基本的な処理はメイン関数でするような仕様はどうでしょうか。
大規模なプログラムになるなら、メイン関数からどこかの関数を呼んでもいいと思いますが、一応毎回戻ってくるほうがいいと思います。
http://dixq.net/g/#34


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

Name: tny  ..ぴよぴよ(134ポイント)   Date: 2008/01/30(水) 21:21   No:13899     
Title: Re:メインループ を入れ子構造に    
そういう風に改造しました。
アドバイスありがとうございます。

>基本的な処理
ProcessMessageやGetHitKeyStateAllと言った関数のことでしょうか。


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

Name: 管理人 [URL]  ..伝説のハッカー(508,838ポイント)   Date: 2008/01/31(木) 18:05   No:13930     
Title: Re:メインループ を入れ子構造に    
はい、毎回使うそれらの関数は別に書くと面倒なので、私は、ですけど、メインループのループ条件の中にいれてしまっています。

ソースを短く書くとすっきりするので、別に可読性が必要で無い所はトコトン短くしています。

http://dixq.net/g/#36

なんならSetDrawScreenもScreenFlip()も詰め込んで、無理やりこんなに短くもできるかもしれません。
(横に長いプログラムは嫌う人が多いですが、まぁここはお決まりのコードと言うことで)


#include "DxLib.h"
char Key[256];

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() || SetDrawScreen( DX_SCREEN_BACK )) return -1;
while(!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//ここに処理を書く
}
DxLib_End();
return 0;
}

 
 
実際数行しか書いて無いですが、

ウィンドウ変更();
DxLib初期化();
裏画面設定();
裏画面反映();
プロセスメッセージ処理();
裏画面削除();
キー入力状態保存();
Escapeキーが押されたら終了;
DxLib終了();

これらのいつも必ず書く関数や処理をしてくれています。


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



Name: YYY  ..初心者(5,902ポイント)   Date: 2008/01/30(水) 20:30   No:13895       
Title: ブラックジャックのプログラム    
書いたプログラムはこんな感じです。

#include <stdio.h>
#include <stdlib.h>
int a[53];
int b[55];
int z=0,s=1,player=0,computer=0,x,y,w,v,u,p=0,t,han,te=15;
void syoubu(void);
void mouichi(void);
void syuuryou(void);
void rannsuu_player(void);
void rannsuu_computer(void);
void mouii(void);
int main()
{
for(y=1;y<=52;y=y+1)
{
x=y % 13;
a[y]=x;
if(a[y]==0)
{
a[y]=10;
}
for(w=11;w<=50;w=w+13)
{
a[w]=10;
a[w+1]=10;
}
for(u=1;u<=52;u=u+1)
{
b[u]=0;
}


}
syoubu();
}

void syoubu(void)
{
printf("あなたの得点 %d 点 \n",player);
printf("もう1枚取りますか?(1)はい(2)いいえ \n");
scanf("%d",&han);
if(han==1)
{
mouichi();
}
else if(han==2)
{
mouii();
}
}

void mouichi(void)
{
rannsuu_player();
player=player+b[u];
if(player>21)
{
mouii();
}
syoubu();
}

void mouii(void)
{
if(p<1)
{
if(computer>te)
{
syuuryou();
}
if(computer<=te)
{
rannsuu_computer();
}
computer=computer+b[t];
mouii();
}
}

void syuuryou(void)
{
if(player>21)
{
player=0;
}
if(computer>21)
{
computer=0;
}
printf("あなたの点 %d \n",player);
printf("親の点 %d \n",computer);
if (player>computer)
{
printf("子の勝ち");
p++;
}
else if(player<computer)
{
printf("親の勝ち");
p++;
}
else if(player==computer)
{
printf("引き分け");
p++;
}
}

void rannsuu_player(void)
{
u=(int)(52*(rand()/32767.1)+1);
if(b[u]!=0)
{
rannsuu_player();
}
b[u]=a[u];
}

void rannsuu_computer(void)
{
t=(int)(52*(rand()/32767.1)+1);
if(b[t]!=0)
{
rannsuu_computer();
}
b[t]=a[t];
}



一見問題がないように見えますが数字を入力するところがおかしいです。
あなたの得点 0 点
もう1枚取りますか?(1)はい(2)いいえ
1
あなたの得点 1 点
もう1枚取りますか?(1)はい(2)いいえ
1
12 [main] a 552 _cygtls::handle_exceptions: Error while dumping state (prob
ably corrupted stack)
Segmentation fault (core dumped)
これが実行結果です。普通に遊べるようにするためにはどこが間違っているのか教えてください。
それと52*(rand()/32767.1)+1というのがよくわからないのですが(多分トランプのカードのことかと思いますが)rand()%51+1とは違うんでしょうか?


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


Name: box  ..ハッカー(105,747ポイント)   Date: 2008/01/30(水) 20:54   No:13896     
Title: Re:ブラックジャックのプログラム    
> 一見問題がないように見えます

現実のブラックジャックの手順を反映していますか?
確か、ディーラーとプレイヤーに2枚ずつカードを配るところから
始まるのだと思っていましたけれど。
違っていたらすみません。


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

Name: YYY  ..初心者(5,926ポイント)   Date: 2008/01/30(水) 20:59   No:13897     
Title: Re:ブラックジャックのプログラム    
すみません。それはなしです・・・。
どんどん引いていって好きなところでやめて合計が21に近い方が勝ちって感じです。
細かいルールは適応させてないので・・。


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

Name: box  ..ハッカー(105,975ポイント)   Date: 2008/01/30(水) 22:46   No:13902     
Title: Re:ブラックジャックのプログラム    
rannsuu_player関数とrannsuu_computer関数の実装に
再帰呼び出しを使う必要はありますか?

> 52*(rand()/32767.1)+1というのがよくわからない

どなたか他のかたが書かれたコードですか?


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

Name: YYY  ..初心者(6,047ポイント)   Date: 2008/01/30(水) 22:57   No:13904     
Title: Re:ブラックジャックのプログラム    
>どなたか他のかたが書かれたコードですか?

宿題の文章そのままって奴です。間違っている所を直せというやつなので・・・。

>rannsuu_player関数とrannsuu_computer関数の実装に
再帰呼び出しを使う必要はありますか?

{
rannsuu_computer();
}
これが要らないということですか?



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

Name: box  ..ハッカー(106,056ポイント)   Date: 2008/01/30(水) 23:13   No:13905     
Title: Re:ブラックジャックのプログラム    
> 宿題の文章そのままって奴です。間違っている所を直せというやつなので・・・。

ということでしたら、変数がすべて外部変数になっている点を含めて、
設計を最初からやり直す必要がありそうです。

> {
> rannsuu_computer();
> }
> これが要らないということですか?

単なるループを使うことによって同じ機能が実装できる状態で、
わざわざ再帰呼び出しを使う必要性を感じないです。私は。


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

Name: YYY  ..初心者(6,079ポイント)   Date: 2008/01/30(水) 23:20   No:13906 解決!     
Title: Re:ブラックジャックのプログラム    
分りました。後は自分でやってみます。ありがとうございました。

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

Name: 管理人 [URL]  ..伝説のハッカー(508,593ポイント)   Date: 2008/01/31(木) 17:52   No:13929     
Title: Re:ブラックジャックのプログラム    
コードを投稿する時は、
<pre>と</pre>のタグで挟んで投稿してください。(<>は半角)


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



Name: Cげんが〜  ..入門者(3,836ポイント)   Date: 2008/01/30(水) 17:34   No:13888       
Title: 構造体配列の種類分けについて    
こちらの掲示板で質問させていただいたおかげで、構造体の配列を作る事が出来ました。
本当にありがとうございました。

次のステップに移り、次は構造体配列のひとつひとつを、種類分けしようとしてるんですが、
なかなか上手く出来ません。
例えば、構造体配列 element[10]があるとしまして、そのメンバにkindがあります。
そのkindを1〜5までの好きな数字に変えたいんですが、
何かいい方法はありませんでしょうか?

現在描いたプログラムは

//マウスが範囲0≦x≦32、0≦y≦32でクリックされれば、elementの種類を4にする。
else if(IsDownMouseLeft(mouseInfo)
&& (0<mouseInfo->pos.x && mouseInfo->pos.x<=32)
&& (0<mouseInfo->pos.y && mouseInfo->pos.y<=32))
element->kind = 1;

//マウスが範囲0≦x≦32、195≦y≦220でクリックされれば、elementの種類を2にする。
if(IsDownMouseLeft(mouseInfo)
&& (0<mouseInfo->pos.x && mouseInfo->pos.x<=32)
&& (195<mouseInfo->pos.y && mouseInfo->pos.y<=220))
element->kind = 2;
         ・
         ・
         ・


としましたが、一回目のクリックでは種類分けできるものの、また、違う場所をクリックしますと、
一旦種類分けしたものまでも、また種類が変わってしまいます。

どのようにしたらよいのでしょうか?ご教授お願いします。


やりたいことのフローチャートは
 
                →→→→→→→「素子の種類は1」→→→
               ↑ ※種類1 ↓
「素子の種類defalt」→→「種類分け」        「END ※一度決められた種類は変えられない」 
               ↓ ※種類2              ↑
                →→→→→→→「素子の種類は2」→→→

です。よろしくお願いします。


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


Name: Cげんが〜  ..入門者(4,027ポイント)   Date: 2008/01/30(水) 17:37   No:13889     
Title: Re:構造体配列の種類分けについて    
すいません。フローチャートの方、上手く描けていませんでしたので、
訂正させていただきます。

                →→→→→→→「素子の種類は1」→→→
               ↑ ※種類1                   ↓
「素子の種類defalt」→→「種類分け」        「END ※一度決められた種類は変えられない」 
               ↓ ※種類2                   ↑
                →→→→→→→「素子の種類は2」→→→


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

Name: やそ  ..上級者(17,528ポイント)   Date: 2008/01/30(水) 18:12   No:13892     
Title: Re:構造体配列の種類分けについて    
再度変わってしまうことを避けたいのならば、
if文にそれを反映させればいいだけのような気が・・・

          <yes>   →→→→→→→「素子の種類は1」→→→
               ↑ ※種類1                   ↓
「素子の種類defalt」→→「種類分け」        「END ※一度決められた種類は変えられない」 
          ↓    ↓ ※種類2                   ↑
          ↓<no>   →→→→→→→「素子の種類は2」→→→
          ↓
「END ※一度決められた種類は変えられない」

でしょうかね。


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

Name: Cげんが〜  ..入門者(4,168ポイント)   Date: 2008/01/30(水) 19:18   No:13894     
Title: Re:構造体配列の種類分けについて    
返信ありがとうございます。

> 再度変わってしまうことを避けたいのならば、
>if文にそれを反映させればいいだけのような気が・・・

知識不足のため、どのようにすればよいのか分かりません。
もしよろしければ、教えていただけないでしょうか?
お願いします。




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

Name: box  ..ハッカー(105,917ポイント)   Date: 2008/01/30(水) 20:59   No:13898     
Title: Re:構造体配列の種類分けについて    

> 例えば、構造体配列 element[10]があるとしまして、そのメンバにkindがあります。

この定義だと

> element->kind = 1;

element[0].kind = 1;

のように書くのではありませんか?
違っていたらすみません。

あるいは、

> element->kind = 1;

において、変数elementは当該の構造体を指すポインタ変数として
定義しているのでしょうか?



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

Name: Cげんが〜  ..入門者(4,279ポイント)   Date: 2008/01/30(水) 21:51   No:13900 解決!     
Title: Re:構造体配列の種類分けについて    
boxさん、やそさんありがとうございます。

>element[0].kind = 1;
>のように書くのではありませんか?

のように、ひとつひとつを分けて考えてみましたら、何とかできそうです。

まだ、完璧に出来た訳ではありませんが。
これから改善がんばってみます。ありがとうございました。


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



Name: こよーて  ..ぴよぴよ(119ポイント)   Date: 2008/01/29(火) 23:31   No:13875       
Title: VC++2005 Express でインストーラは作れますか?    
現在友人と一緒にゲームのプログラムをDXライブラリの力をお借りして作らせていただいているのですが、リリース状態でビルドしてできたエグゼファイルを友人に渡したところ、エラーが出てしまって実行できませんでした。
少し調べたんですが、インストーラを作るとちゃんと実行できるらしいんですが、インストーラの作り方がよくわかりません><
インストーラの作り方を教えていただけないでしょうか?

また、インストーラなしでちゃんと実行が確認できる方法ってないでしょうか?
数人の友人はそのままのエグゼファイルを渡しただけでちゃんと実行できたみたいなのですが・・・


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


Name: 管理人 [URL]  ..伝説のハッカー(507,480ポイント)   Date: 2008/01/30(水) 01:10   No:13877     
Title: Re:VC++2005 Express でインストーラは作れますか?    
恐らくランタイムライブラリの設定がいけないのでしょう。

VS2005のメニューバーの

「プロジェクト」>「○○のプロジェクトのプロパティ」

構成プロパティ>C/C++>コード生成

で出てくる右画面の「ランタイムライブラリ」が
DLLを含むものになっていると思いますから、「マルチスレッド(/MT)」とかに変更してリビルドし、

実行ファイルを渡してあげてください。
また、これは容量を軽くし、処理速度を上げるものですが、構成マネージャーがDebugになってる場合は、Releaseでいいので、こちらに変更して渡してあげてください。
普段デバッグをするときは、Debugになってないとデバッグできません。

多分exeファイルを渡して成功したお友達はCのコンパイラをインストールしたり、していたのではないでしょうか。


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

Name: こよーて  ..ぴよぴよ(152ポイント)   Date: 2008/01/30(水) 16:08   No:13884 解決!     
Title: Re:VC++2005 Express でインストーラは作れますか?    
管理人さん、ありがとうございました!
無事解決できました。


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



Name: Cげんが〜  ..かけだし(2,051ポイント)   Date: 2008/01/23(水) 14:12   No:13644       
Title: 構造体配列について    
構造体配列をを用いて、構造体をいくつも作ります。
その構造体を初期化するために、新たな初期化関数を作成する際、
構造体を関数の引数として使う場合、下記のようになります。

typedef struct
{ int x,y;
}vector; //2次元ベクトル構造体

typedef struct
{
int is_display;
int is_dragging;
vector pos;
vector disp_pos;
}Diodo; //ダイオードの構造体

Diodo_Syokika(Diodo *diodo[])   ← 怪しい・・・
{
diodo[0]->is_display = FALSE;
diodo[0]->is_dragging = FALSE;
diodo[0]->pos.x =31.5;
diodo[0]->disp_pos.x = 5;
diodo[0]->pos.y =49;
} //初期化する為のユーザ関数

次にメイン関数内で

  Diodo diodo[5];
Diodo_Syokika(???);   ←分からないところ!!

のように呼び出して使いたいんですが、
Diodo_Syokikaを呼び出す際の引数の書き方が分からず、苦労してます。
引数に構造体配列のポインタ?を持ってくる際はどうしたらいいのでしょうか?
分かる方いらっしゃいましたらお願いします。


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


Name: へろり  ..入門者(2,541ポイント)   Date: 2008/01/23(水) 14:44   No:13645     
Title: Re:構造体配列について    
関数の仮引数の宣言では、最外周の配列に限りポインタに読み替えられます。
ですから Diodo_Syokika(Diodo *diodo[]) という関数宣言は、
構造体Diodoのポインタのポインタを引数に取る関数Diodo_Syokikaになります。

配列へのポインタを引数に取るには以下のようにします。

Diodo_Syokika(Diodo (*diodo)[5]);

呼び出す時は、Diodo_Syokika(&diodo); とします。


ですが、式の中で添え字演算子を省略し、単に変数名のみで記述した場合、それは
配列の先頭要素へのポインタを意味します。
ので、配列でなければならない絶対的な理由がないのであれば、次のようにするのが一般的です。

Diodo_Syokika(Diodo *diodo)
{
diodo[0].is_display = FALSE;
diodo[0].is_dragging = FALSE;
.
.
.
}

int main(void)
{
Diodo diodo[5];
Diodo_Syokika(diodo);

return 0;
}


ところで、Diodo_Syokika()の戻り値が無いですね。


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

Name: Cげんが〜  ..かけだし(2,211ポイント)   Date: 2008/01/23(水) 15:26   No:13646     
Title: Re:構造体配列について    
さっそくの返信ありがとうございます。
配列にし、構造体をいくつも作りたいので、配列は絶対条件なんです。
ですので、

>Diodo_Syokika(Diodo (*diodo)[5]);
>呼び出す時は、Diodo_Syokika(&diodo); とします。

を参考にさせていただきました。
やっとコンパイル出来ました。ありがとうございます。

また、
>Diodo_Syokika()の戻り値が無いですね。
は、どういう事なのでしょうか?




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

Name: へろり  ..入門者(2,607ポイント)   Date: 2008/01/23(水) 16:11   No:13648     
Title: Re:構造体配列について    
> さっそくの返信ありがとうございます。
> 配列にし、構造体をいくつも作りたいので、配列は絶対条件なんです。
> ですので、
>
配列で無ければならないというのは、Diodo_Syokika()関数の引数が、ということです。
大抵の場合は、配列の先頭要素へのポインタを渡すだけで事足りますので。


> >Diodo_Syokika()の戻り値が無いですね。
> は、どういう事なのでしょうか?
>
C言語では関数には戻り値の型を必要とします。


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

Name: 管理人 [URL]  ..伝説のハッカー(493,541ポイント)   Date: 2008/01/23(水) 17:02   No:13652     
Title: Re:構造体配列について    
やるんでしたら、こうではないでしょうか。ポインタポインタと思わなくても、
配列を宣言した時点でそれはアドレスで操作するものですから、難しく思わなくて大丈夫ですよ。
引数は普通に変数名を書き、受け取りは最初宣言した通りに書けばいいのです。

ただ今回、intであるvectorにdouble型を入れようとしているので警告が出ます。
doubleにしたいならdoubleに変更してください。

修正したのは、こんな感じです。


#include<stdio.h>

typedef struct{
int x,y;
}vector; //2次元ベクトル構造体

typedef struct{
int is_display;
int is_dragging;
vector pos;
vector disp_pos;
}Diodo; //ダイオードの構造体

void Diodo_Syokika(Diodo diodo[5]){
diodo[0].is_display = -1;
diodo[0].is_dragging = -1;
diodo[0].pos.x =31.5;
diodo[0].disp_pos.x = 5;
diodo[0].pos.y =49;
}

int main(){
Diodo diodo[5];
Diodo_Syokika(diodo);
printf("%d %d....",diodo[0].is_display,diodo[0].is_dragging);
return 0;
}

でも配列ごと渡したのに[0]しか初期化しないのはちょっと気持ち悪いので、
[0]しか要らないのならこのように個別に渡せます。
今度はポインタを意識する必要があり、
アロー演算子を使います。

#include<stdio.h>

typedef struct{
int x,y;
}vector; //2次元ベクトル構造体

typedef struct{
int is_display;
int is_dragging;
vector pos;
vector disp_pos;
}Diodo; //ダイオードの構造体

void Diodo_Syokika(Diodo *diodo){
diodo->is_display = -1;
diodo->is_dragging = -1;
diodo->pos.x =31.5;
diodo->disp_pos.x = 5;
diodo->pos.y =49;
}

int main(){
Diodo diodo[5];
Diodo_Syokika(&diodo[0]);
printf("%d %d....",diodo[0].is_display,diodo[0].is_dragging);
return 0;
}
 


>>> >Diodo_Syokika()の戻り値が無いですね。
>>> は、どういう事なのでしょうか?
>>>
>>C言語では関数には戻り値の型を必要とします。

補足しますと、関数は何らかの形で値を返します。
値を返さない場合は「なし」を意味する「void」を書きます。
main文もint mainとかvoid mainとかで始まってると思います。
参考書を見てもらっても、関数には何らかの形で型が書いてあるはずです。

void Diodo_Syokika(Diodo *diodo){
return ;
}
なら関数が終了したときに、値を返さない

int Diodo_Syokika(Diodo *diodo){

return 1;
}

なら関数が終了したときにint型である1を返す。

double Diodo_Syokika(Diodo *diodo){
return 1.3;
}

なら関数が終了したときにdouble型である1.3を返す・・・。と言ったように。
この場合、main文で

Diodo_Syokika(diodo);

の部分を

double d;

d=Diodo_Syokika(diodo);

とすれば、関数処理から戻ってきた時点で、dには1.3が入ります。
この辺「C言語 入門」でググれば沢山入門サイト出てきますのでおさらいしておいてください。
 


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

Name: Cげんが〜  ..かけだし(2,314ポイント)   Date: 2008/01/23(水) 18:10   No:13654 解決!     
Title: Re:構造体配列について    
ご指摘ありがとうございます。
さっそく参考にさせていただきます。

戻り値につきましては、まだ勉強不足でした。
また、その部分から勉強しなおさせていただきます。

ありがとうございました。
また、自身で勉強してみて、分からなかったら質問させていただくと思いますが、
その際にはお願いいたします。


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

Name: Cげんが〜  ..かけだし(2,317ポイント)   Date: 2008/01/24(木) 22:51   No:13712     
Title: Re:構造体配列について    
管理人さん、へろりさんどうもありがとうございます。
おかげ様で、戻り値について、理解できました。
これから先も是非役立てていきたいと思います。

さて、構造体配列につきましては、大変丁寧に説明していただき、
なんとか理解できる事が出来ました。
ありがとうございます。

しかし、その先の構造体配列を
forや、whileで繰り返し、構造体の初期化等を一気にしてしまおうと、
しているんですが、エラーばかり出て全く出来ません。

プログラムとしては、下記のように組んだんですが、
どこが悪いのでしょうか?
何度もすいませんが、ご指導お願いします。

struct void Diodo_Syokika{

for(Di1=0;Di1<5;Di1++)
{
diodo[Di1]->is_display = FALSE;
diodo[Di1]->is_dragging = FALSE;
diodo[Di1]->disp_pos.x=diodo[Di1]->pos.x = 5;
diodo[Di1]->disp_pos.y=diodo[Di1]->pos.y = 205;
diodo[Di1]->XD = 1;
diodo[Di1]->YD = 0;
diodo[Di1]->rad = 90;
diodo[Di1]->is_conect = FALSE;
diodo[Di1]->Lflug = FALSE;
diodo[Di1]->Rflug = FALSE;
diodo[Di1]->BD = 1;




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

Name: box  ..ハッカー(104,764ポイント)   Date: 2008/01/24(木) 23:03   No:13714     
Title: Re:構造体配列について    
何をしようとするときに(コンパイル時? 実行時?)、どんなエラーが出ますか?
また、構造体定義の最新状態と、配列diodoの定義内容も見せてください。

「こんなデータ構造を作って、こんな風に初期化しようとしたが、
こんなエラーが出てしまってうまくいかない」というのをセットにして見せてください。


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

Name: Cげんが〜  ..入門者(2,915ポイント)   Date: 2008/01/24(木) 23:28   No:13716     
Title: Re:構造体配列について    
ご指摘いただきましてすいません。

構造体は
typedef struct Diodo
{
int is_display;
int is_dragging;
vector     pos;
vector     disp_pos;
vector     drag_offset;
int rad;
int is_conect;
int Lflug;
int Rflug;
}Diodo;

ベクトル構造体は
typedef struct
{
int x, y;
} vector;


です。

初期化する為の関数は上記の通り、

struct void Diodo_Syokika{

 for(Di1=0;Di1<5;Di1++)
 {
   diodo[Di1]->is_display = FALSE;
   diodo[Di1]->is_dragging = FALSE;
   diodo[Di1]->disp_pos.x=diodo[Di1]->pos.x = 5;
   diodo[Di1]->disp_pos.y=diodo[Di1]->pos.y = 205;
   diodo[Di1]->rad = 90;
   diodo[Di1]->is_conect = FALSE;
   diodo[Di1]->Lflug = FALSE;
   diodo[Di1]->Rflug = FALSE;
   diodo[Di1]->BD = 1;

  }


です。

この2つをメイン関数の中で、呼び出す形としては

int WINAPI WinMain( HINSTANCE hCurInst, HINSTANCE hPrevInst,
LPSTR lpsCmdLine, int nCmdShow )
{ 
      ・
      ・
  Diodo diodo[5];
Diodo_Init(&diodo);
      ・
      ・
      ・


として呼び出しているんですが、
上記のようにしてコンパイルすると、
コンパイルは出来るんですが、実行画面で

DxLib :test.exe -アプリケーションエラー
  
  "0x77fcae88"の命令が"0x00000002"のメモリを参照しました。メモリが"read"になることはできません
  でした。プログラムを終了するには[OK]をクリックしてください

DxLib :test.exe -アプリケーションエラー

  例外 unknown software exception (0xc0000027)がアプリケーションの0x77ea20b0で発生しました。
  プログラムを終了するには[OK]をクリックしてください


というものが出ます。
しかし、Diodo_Syokikaの関数にfor()を付けず、ループを行わなかったら上記エラーは出ません。

初めての事なのでどうしたらよいのか分かりません。
どうか教えてください。お願いします。



 
      

     

 





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

Name: やそ  ..中級者(14,963ポイント)   Date: 2008/01/25(金) 11:06   No:13754     
Title: Re:構造体配列について    
明らかにおかしいじゃないですか((((((^_^;)


struct void Diodo_Syokika{

 for(Di1=0;Di1<5;Di1++)
 {
   diodo[Di1]->is_display = FALSE;
   diodo[Di1]->is_dragging = FALSE;
   diodo[Di1]->disp_pos.x=diodo[Di1]->pos.x = 5;
   diodo[Di1]->disp_pos.y=diodo[Di1]->pos.y = 205;
   diodo[Di1]->rad = 90;
   diodo[Di1]->is_conect = FALSE;
   diodo[Di1]->Lflug = FALSE;
   diodo[Di1]->Rflug = FALSE;
   diodo[Di1]->BD = 1;

  }


です。

この2つをメイン関数の中で、呼び出す形としては

int WINAPI WinMain( HINSTANCE hCurInst, HINSTANCE hPrevInst,
LPSTR lpsCmdLine, int nCmdShow )
{ 
      ・
      ・
  Diodo diodo[5];
Diodo_Init(&diodo);
      ・
      ・
      ・



定義段階では
struct void Diodo_Syokika
でしたよね。

それとなんで初期化用関数までstruct?
関数なんですから

void Diodo_Syokika(引数)
{

}

の形にして下さい。

落ち着いてひとつずつ見直していけばきっと分かるはず^^


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

Name: 管理人 [URL]  ..伝説のハッカー(497,627ポイント)   Date: 2008/01/25(金) 14:17   No:13765     
Title: Re:構造体配列について    
なんか、構造体なのやら関数なのやらわからないような書き方になってしまっています^^;
基礎が大事なので、もう一度入門サイトで

「関数」と「構造体」についてザっとでいいから見直されることおススメします。
・・・で、ループで初期化させたいならこういうことでしょうか。

さっきのプログラムとほとんど一緒です。色つきのとこだけ違います。
ただこれだと全部同じ値で初期化されるのですが、いいのでしょうか?


#include<stdio.h>

typedef struct{
int x,y;
}vector; //2次元ベクトル構造体

typedef struct{
int is_display;
int is_dragging;
vector pos;
vector disp_pos;
}Diodo; //ダイオードの構造体

void Diodo_Syokika(Diodo *diodo){
diodo->is_display = -1;
diodo->is_dragging = -1;
diodo->pos.x =31.5;
diodo->disp_pos.x = 5;
diodo->pos.y =49;
}

int main(){
Diodo diodo[5];
for(int i=0;i<5;i++)
Diodo_Syokika(&diodo[i]);

printf("%d %d....",diodo[0].is_display,diodo[0].is_dragging);
return 0;
}


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

Name: Cげんが〜  ..入門者(2,997ポイント)   Date: 2008/01/30(水) 14:09   No:13883 解決!     
Title: Re:構造体配列について    
大変遅くなりまして申し訳ございません。

みなさんの指導を参考に改善を重ね、なんとか、
構造体配列を作成する事が出来ました。

みなさん本当にありがとうございました。
また質問する事があると思いますが、その際にはよろしくお願いします。


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



Name: はっと  ..ぴよぴよ(151ポイント)   Date: 2008/01/28(月) 00:21   No:13834       
Title: 入門編でわからないところが    
Borlandを使用しておりプログラム入力まで終えたのですが
プロジェクト→メイクをすると

エラー E2209 インクルードファイル'DxLib.h'をオープンできない
エラー E2141 宣言の構文エラー

と出るんですがどうすればよいか教えてください
スペックは
cpu:1.66GHz
メモリ:1G
windowsVista


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


Name: 管理人 [URL]  ..伝説のハッカー(502,991ポイント)   Date: 2008/01/28(月) 04:04   No:13836     
Title: Re:入門編でわからないところが    
設定が出来ていないのだと思います。
DXライブラリの導入時の設定がきちんと出来ているか確認してください。
特にSDK関係。


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

Name: はっと  ..ぴよぴよ(221ポイント)   Date: 2008/01/28(月) 16:54   No:13851     
Title: Re:入門編でわからないところが    
>設定が出来ていないのだと思います。
5.プロジェクトへDXライブラリファイルを追加
ここが出来ていなんでしょうか?
どこにコピーするかわからなんですが・・・

>特にSDK関係。
すみません、SDKってたんですか

こんな事もわからない初心者ですが教えてください。


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

Name: 管理人 [URL]  ..伝説のハッカー(506,257ポイント)   Date: 2008/01/28(月) 18:02   No:13855     
Title: Re:入門編でわからないところが    
あ、すみません、borlandでしたね。
borlandは使ったことが無いのでよくわかりません。
もしゲームをおつくりになるのでしたらVC++をお使いになってはいかがでしょうか。

フリーで提供されています。
http://www.microsoft.com/japan/msdn/vstudio/express/

設定です。
http://homepage2.nifty.com/natupaji/DxLib/dxuse_vc2008express.html


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

Name: はっと  ..ぴよぴよ(189ポイント)   Date: 2008/01/29(火) 22:33   No:13874 解決!     
Title: Re:入門編でわからないところが    
VC++で成功しました。
これからもわからなかったらよろしくお願いします。


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



Name: やまもと  ..ぴよぴよ(954ポイント)   Date: 2008/01/29(火) 18:50   No:13870       
Title: 無題    
はじめまして、「やまもと」と言います。

現在、C言語にてウィンドウ上の表データを上下にスクロールさせるという
プログラムを作成しています。

スクロール自体はできるようになったのですが(正しいコードかどうかはわかりません・・・)
左右上下にスクロールさせていると、表示がおかしくなってしまいます。

どのようにおかしいのかは、言葉で説明する事が非常に難しいので、
添付のVC++6.0プロジェクトより実際に動作させて確認していただけないでしょうか。
おそらくそれで、どのような事が実現したいのかはご理解頂けるかと思います。

操作は、ホイールの上下で表は上下にスクロール。
シフトを押しながらホイール上下で表は左右にスクロールします。

不具合としては、
1、
 1〜2段程度上にスクロールして(隠して)から、左に全てスクロール。
 左に隠れた部分を右スクロールで再度表示させた時の、最上段のデータが
 正しくない。

2、
 ちょっとだけ左右にスクロールさせてから、上下にスクロールした時の
 一番左のセルがおかしくなる。

以上です。非常にわかりにくい文章で申し訳ありません。
一度添付のファイルで見ていただけないでしょうか。
よろしくお願いします。


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




Name: もみじ  ..ぴよぴよ(110ポイント)   Date: 2008/01/29(火) 16:30   No:13866       
Title: 社会人の先輩方の意見を聞かせてください!!    
今、大学の4年で、4月からは社会人としてSEとなることが決まっています。
そこで、現在C言語の勉強(会社からC言語を指定されています)をしています。
その一方で基礎知識としてTCP/IPなどについても勉強しているのですが、
社会人である先輩方に質問したいことがあります。
【質問】
 @C言語は入社前にどの程度まで学習し、理解しておくべきなのか??
 A新入社員に対して「これくらいのことは勉強しとけよ」と思うことは??(基礎知識等)
 B最後に一言




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


Name: たかぎ [URL]  ..プログラマー(26,440ポイント)   Date: 2008/01/29(火) 17:15   No:13867     
Title: Re:社会人の先輩方の意見を聞かせてください!!    
> C言語は入社前にどの程度まで学習し、理解しておくべきなのか??

2ヶ月あれば、基本的なことは一通り出来るようになるはずです。
実際にそれが必要かどうかはともかく、ご自身のやる気のバロメータにはなるでしょうね。

> 新入社員に対して「これくらいのことは勉強しとけよ」と思うことは??(基礎知識等)

C言語の前に日本語をマスターすること。
丸付き数字のような機種依存文字は使うべきではないということを理解すること。

> 最後に一言

学生でなければできないことは、今のうちにやっておきましょう。


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

Name: バグ  ..比類無きプログラマー(73,170ポイント)   Date: 2008/01/29(火) 18:28   No:13868     
Title: Re:社会人の先輩方の意見を聞かせてください!!    
>>C言語は入社前にどの程度まで学習し、理解しておくべきなのか??

私の場合は全く知識が無い状態でしたが、新卒ではなく28歳からのスタートでしたので、とにかく付いて行く為に必死で勉強しました。どこまでという線引きをしようとせずに貪欲に知識を吸収して、ひたすらにプログラムを書く事が大事だと思います。

私の場合は1ヶ月間の勉強で、落ち物パズルが作れる位にはなりましたよ。仕事の内容とは全く関係ありませんでしたけど(苦笑)

もちろん就職してから学んだ事の方が遥かに多いのですが、あの1ヶ月間が無ければ、すぐに辞めてしまっていたかもしれません…。


>>新入社員に対して「これくらいのことは勉強しとけよ」と思うことは??(基礎知識等)

謙虚に学ぶ姿勢です。社会に出たら何もかもが教えてもらう事だらけです。自分の中では正しいと思う事も、実際には間違っている事も多いですからね。


>>最後に一言

まぁ、どんなに短くても3ヶ月は死ぬ気で頑張ってみましょう。それでも向いてないと思ったら他の道もあります。


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



Name: にじいろもよう  ..ぴよぴよ(548ポイント)   Date: 2008/01/26(土) 13:17   No:13802       
Title: 動的なメモリの確保    
C言語について入門書を勉強した後、今はポインタについて勉強しています。
そして、動的な記憶域の確保を勉強し、
文字列の配列の動的な確保などは理解できるようになったのですが

個人的に疑問になったことがひとつあります。
「配列を使用せずにcalloc関数を用いて名前の入力・出力等は行えないのか??」
ということです。

例えば、「配列を使用せずに」
【calloc関数などを用いて確保した記憶域へ名前の入力を繰り返す】
または
【calloc関数を用いて、3文字まで・最大5人分入力し最後に出力できる】
というようなプログラムは可能でしょうか?

自分でも本や検索等で調べているのですが、わかりません。
疑問を解決したいと思っていますので、できれば助言等お願いします(><)



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


Name: box  ..ハッカー(104,945ポイント)   Date: 2008/01/26(土) 13:30   No:13803     
Title: Re:動的なメモリの確保    
calloc関数は、引数で指定した分の領域を確保し、
中身を0x00で初期化する、という機能を持っています。
入力・出力の機能はありません。

calloc関数で確保した領域は、あたかも配列であるかのように扱えます。
配列の場合と同様に、当該の領域に入力したり
当該の領域の内容を出力したりできます。


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

Name: たかぎ [URL]  ..プログラマー(25,718ポイント)   Date: 2008/01/26(土) 14:11   No:13804     
Title: Re:動的なメモリの確保    
calloc を使う場合でも、配列を全く使わずに実装するのは、難しいというより面倒ですね。
一応作ってみました。
#include <stdio.h>

#include <stdlib.h>

int main(void)
{
char *data = calloc(5, 3);
if (data == NULL)
return EXIT_FAILURE;

char *cur = data;
for (int i = 0; i < 5; i++)
{
int c;
for (int j = 0; j < 3 + 1; j++)
{
c = getchar();
if (c == EOF || c == '\n')
{
if (j == 0)
goto print;
break;
}
*cur++ = (char)c;
}
}

print:
cur = data;
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 3; j++)
{
int c = *cur++;
putchar(c);
}
putchar('\n');
}

free(data);
return EXIT_SUCCESS;
}


文字列定数も含めて、配列は全く使っていません。


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

Name: にじいろもよう  ..かけだし(1,038ポイント)   Date: 2008/01/26(土) 15:30   No:13805     
Title: Re:動的なメモリの確保    
『box ..神』さん返信ありがとうございます。

>calloc関数で確保した領域は、あたかも配列であるかのように扱えます。
>配列の場合と同様に、当該の領域に入力したり
>当該の領域の内容を出力したりできます。

「あたかも配列であるかのように・・・」という文章のお陰で
僕自身がcalloc関数に関して間違った理解をしていたことがわかりました(><)
そこで今、もう一度テキストを読み直し、プログラムを作成しています!!
作成して、また疑問が生じたらすぐに載せたいと思います。


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

Name: にじいろもよう  ..かけだし(1,817ポイント)   Date: 2008/01/26(土) 16:59   No:13808     
Title: Re:動的なメモリの確保    
『たかぎ』さんサンプルとなるソースありがとうございます。
参考にさせていただきました。

自分なり
「calloc関数でメモリを確保し、そこに名前を入力する。
 ただし、数字の7を入力すると、名前の入力も終了。そこまでの名前を出力する」
というプログラムを作成しようと試みました。

しかし、7を入力しても名前の入力は終了せず・・・(TT)
実行はされるもののそのあと「問題が発生したためstudy.exeを終了します。・・・」と出てしまいます。
以下にそのソースを示しますのでご指摘よろしくお願いします(><)

【ソース】
/**********************************************
* 入力された名前を出力するプログラム *
**********************************************/

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

int main(void)
{
char **p;
int num,i,no;

do{
printf("何人分入力しますか【1−10】:");
scanf("%d",&num);
if(num < 0 || num >10)
printf("1〜10までを入力してください。\n");
}while(num < 0 || num >10);

p =(char **)calloc(num,sizeof(char *));

if(p==NULL)
printf("記憶域の確保に失敗\n");
else
{
no = 0;
for(i=0;i<num;i++){
p[i] = (char *)calloc(1,sizeof(char));

if(p==NULL)
printf("記憶域の確保に失敗\n");
else{
printf("%d人目の名前:",i+1);
scanf("%s",p[i]);
if((int)p[i] == 7)
goto print;
no++;
}
}
}

print:
printf("\n");
printf("------出力------\n");
for(i=0;i<no;i++)
printf("%d人目の名前:%s\n",i+1,p[i]);
free(p[i]);

free(p);

return(0);
}
 


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

Name: box  ..ハッカー(105,519ポイント)   Date: 2008/01/26(土) 19:15   No:13811     
Title: Re:動的なメモリの確保    

もともとのコードに何ヶ所か手を入れてみました。
ご自分のコードと見比べてみてください。
何か不明点があれば、質問してください。


/**********************************************
* 入力された名前を出力するプログラム *
**********************************************/

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

int main(void)
{
char **p;
int num, i, no;

do {
printf("何人分入力しますか【1−10】:");
scanf("%d", &num);
if (num < 1 || num > 10)
printf("1〜10までを入力してください。\n");
else
break;
} while (1);

p = (char **) calloc(num, sizeof(char *));
if (p == NULL) {
printf("記憶域の確保に失敗\n");
exit(1);
}
else {
no = 0;
for (i = 0; i < num; i++) {
p[i] = (char *) calloc(80, sizeof(char));
if (p[i] == NULL) {
printf("記憶域の確保に失敗\n");
exit(1);
}
else {
printf("%d人目の名前:", i + 1);
scanf("%s", p[i]);
if (strcmp(p[i], "7") == 0)
goto print;
no++;
}
}
}

print:
printf("\n");
printf("------出力------\n");
for (i = 0; i < no; i++) {
printf("%d人目の名前:%s\n", i + 1, p[i]);
free(p[i]);
}
free(p);
return 0;
}


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

Name: 管理人 [URL]  ..伝説のハッカー(505,638ポイント)   Date: 2008/01/28(月) 04:50   No:13841     
Title: Re:動的なメモリの確保    
同じ投稿が2つあったようなので、片方消しておきました。
後、「神」や「入門者」などの表示は掲示板ランクでして、
過去にどれ位ここの掲示板で書き込みしたかを表すもので、名前ではありません。
ですので、「box ..神」さんではなく、「box」さんですので。

掲示板ランクについては掲示板上メニューの「昇進状態」をクリックすれば全員のランクが見れます。
別にどうでもいいこと事ですが・・。


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

Name: にじいろもよう  ..かけだし(1,728ポイント)   Date: 2008/01/29(火) 16:17   No:13865 解決!     
Title: Re:動的なメモリの確保    
boxさん返信ありがとうございました。
自分なりに調べて上に示して頂いたソースも理解でき無事にコンパイルできました。
本当にありがとうございました。

また、以前同じ投稿を2つ挙げてしまっていたので迷惑をおかけしてすみません。
マナーはしっかりと守りながらこの掲示板を活用させていただこうと思います。


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



Name: テックウォ  ..ぴよぴよ(74ポイント)   Date: 2008/01/25(金) 22:45   No:13783       
Title: 暗い場所の演出    
はじめまして
DXライブラリを使用してゲームを作っているのですが、
洞窟や、夜の館に入ると元のグラフィックだと色が鮮やか(?)すぎるので、
ちょっと暗くしようと思ったのですが、
それだけだと直接グラフィックを編集すればいいのですが
ろうそくのようなものが置いてある近くだけは明るく(元の色)にしたいのです

暗くするだけならSetDrawBrightを使えばいいとわかったのですが、
あるものの周りだけ明るくするにはどのようにすればいいのでしょうか?


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


Name: 管理人  ..伝説のハッカー(500,121ポイント)   Date: 2008/01/25(金) 23:56   No:13785     
Title: Re:暗い場所の演出    
今家がネットつながらなくて、携帯でしかうてないからサンプル作れないんですが‥。
手元にグラデーションとかが表現できる画像編集ソフトありますか?
中央が黒で、周りが白い円形グラデーション画像作って下さい。
後、減算ブレンドってわかりますか?
白い画像は減算するととても暗くなり、黒い画像は少し暗くなります。
だからこのグラデーションで表現可能です。キャラを中心に減算ブレンドし、それ以外の真っ暗な場所はブレンドしないよう、グラフィック領域から除外しましょう。
意味がわからなければネット喫茶とか行ってコード書いて来ますよ。


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

Name: 管理人 [URL]  ..伝説のハッカー(500,422ポイント)   Date: 2008/01/26(土) 00:27   No:13789     
Title: Re:暗い場所の演出    
ネット喫茶に行っても、プログラムがかけないので大学まで来て見ました。
ただ大学からはファイルがアップロード出来ないんですよね・・。
ちょっとサンプル作ってみますので少々お待ち下さい。


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

Name: 管理人 [URL]  ..伝説のハッカー(500,427ポイント)   Date: 2008/01/26(土) 01:38   No:13790     
Title: Re:暗い場所の演出    
まず、画像。

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

Name: 管理人 [URL]  ..伝説のハッカー(500,446ポイント)   Date: 2008/01/26(土) 01:39   No:13791     
Title: Re:暗い場所の演出    
移動してて遅くなりました。

こんな感じでしょうかね?
サーバーにデータあげられないのでサンプル上げられないですが、こんな感じでよければ、上の画像を減算ブレンドすれば出来ますよ。

SetDrawBlendMode( DX_BLENDMODE_SUB , 255 ) ;

を書いてから描画したものは、すでに描画されているものから、描画した明るさ分だけ引き算して描画されます。
減算し終わったら

SetDrawBlendMode( DX_BLENDMODE_NOBLEND , 0 ) ;

でブレンドモードを終了して下さい。


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

Name: テックウォ  ..ぴよぴよ(21ポイント)   Date: 2008/01/26(土) 17:54   No:13809 解決!     
Title: Re:暗い場所の演出    
レスありがとうございます
上のサンプルを使ってやってみようと思います
本当にありがとうございました


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

Name: tkmakwins15 [URL]  ..熟練のプログラマー(55,426ポイント)   Date: 2008/01/27(日) 23:51   No:13833     
Title: Re:暗い場所の演出    
滅茶苦茶つまらないですが、同じことを乗算ブレンドでもできます。白黒を反転した状態ならば、管理人さんの結果と同じ状態になります。
うーん、ブレンド機能恐るべし。


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

Name: parapara  ..上級者(16,917ポイント)   Date: 2008/01/28(月) 08:08   No:13848     
Title: Re:暗い場所の演出    
管理人さんが言ってる事は多分、1ピクセルごとにRGBそれぞれに、ビット演算子(&)を描ける事を意味しています。

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

Name: parapara  ..上級者(16,971ポイント)   Date: 2008/01/28(月) 20:43   No:13858     
Title: Re:暗い場所の演出    
↑は管理人様じゃなくて、tkさんが言ってるほうでした。
管理人さんが言ってる方は逆の事(NOを全体につけて)。


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



Name: prg  ..入門者(2,558ポイント)   Date: 2008/01/27(日) 20:32   No:13828       
Title: 敵を消す    
ダンジョンゲームで、銃で敵をうっててきを消したいのですが、消し方がわかりません。
どなたか、教えてください。


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


Name: バグ  ..比類無きプログラマー(72,767ポイント)   Date: 2008/01/27(日) 21:35   No:13829     
Title: Re:敵を消す    
質問があまりにも漠然とし過ぎです。もう少し具体的に書くべきですよ。
一番簡単な方法は背景グラフィックを上書きして、敵グラフィックを消してしまえばいいのではないでしょうか?


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

Name: prg  ..入門者(2,614ポイント)   Date: 2008/01/27(日) 23:07   No:13831     
Title: Re:敵を消す    
しかし、敵の画像を消すだけだったら、x座標、y座標のデータがまだ存在してしまっているので、
画像もなしにダメージをうけてしまいます。敵のデータ自体をけしてしまう方法はないでしょうか?


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

Name: tkmakwins15 [URL]  ..熟練のプログラマー(55,490ポイント)   Date: 2008/01/27(日) 23:40   No:13832     
Title: Re:敵を消す    
フラグの活用など、つまり、表示しているかしていないかを示す変数を用意するのです。

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

Name: 管理人 [URL]  ..伝説のハッカー(504,097ポイント)   Date: 2008/01/28(月) 04:21   No:13838     
Title: Re:敵を消す    
作りかけているゲームで、何か詰まったときに人に聞くのは難しいですよね。
こちらはコードも解らないし、かといって、提示されるには長すぎるしと・・。

ダンジョンゲームだろうと、マリオのファイアーだろうと、やってることはシューティングと同じです。
シューティングと同じ要領でやってみましょう。

簡単にコードを紹介します。


typedef struct{
int flag,cnt;
double x,y;
}bullet_t;

で、弾の情報を持った構造体を用意します。
フラグ、出現してからのカウンタ、x,y座標
は最低必要でしょう。

bullet_t bullet[100];

で、100個まで画面に一度に表示できる弾を準備します。

今の瞬間、(x,y)=(100,200)の場所から弾を発射する必要があるとしましょう。その時、


for(i=0;i<100;i++){//一度に表示できる弾の数だけ
if(bullt[i].flag==0){//使える弾があれば
bullet[i].flag=1;//フラグをたてて
bullet[i].cnt=0;//フラグをたてて
bullet[i].x=100;//フラグをたてて
bullet[i].y=200;//フラグをたてて
break;
}
}


これで弾情報の登録は終わりです。
他の関数で、常にこれを計算しましょう。
例えば、横に直線で飛んでいくなら、xを増やしていけばいいでしょう。

for(i=0;i<100;i++){//一度に表示できる弾の数だけ
if(bullt[i].flag==1){//表示中の弾があれば
bullet[i].cnt++;//出現してからのカウンタを増加
bullet[i].x+=1;//x座標計算
break;
}
}

この時、一緒に「画面外にいったら削除(bullet[i].flag=0;)」と
「○○カウンタ以上になったら削除」も
計算してやりましょう。


後は描画部で、


for(i=0;i<100;i++){//一度に表示できる弾の数だけ
if(bullt[i].flag==1){//表示中の弾があれば
DrawGraph( bullet[i].x, bullet[i].y, .................);
}
}


描画してやればOKです。
こうして、
「登録」「計算」「描画」を3つにわけてやりましょう。
ベクターとかご存知でしたらそちら使ったほうが効率的かもしれません。



 
難しく考えないで下さい。
ゲームを作るときのコツは、しっかり関数で仕事を分けてやることです。
それでは頑張ってください。


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

Name: prg  ..入門者(2,833ポイント)   Date: 2008/01/28(月) 06:00   No:13844     
Title: Re:敵を消す    
ありがとうございます。
実はまだ、銃のシステムは完成していないんです。ダンジョンとモンスターはできました。

それで、また質問なのですが、モンスターと接触したときにダメージを受けるようにしたいのですが、
kyorifという差の絶対値を取る関数を作って、8ピクセル分重なったらダメージとし、new_atari_flagと
old_atari_flagをたて、old_atari_flag==0,new_atari_flag==1ならダメージ、old_atari_flag=new_atari_flag
とし、old_atari_flag==1,new_atari_flag==1ならば、ループを抜けるとしたい(ダメージなし)としたのですが、なぜかだぁーーとHPがへってしまいます。どうすればいいのでしょうか?


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

Name: 管理人 [URL]  ..伝説のハッカー(506,687ポイント)   Date: 2008/01/28(月) 06:38   No:13845     
Title: Re:敵を消す    
敵との接触で一番大事なのが無敵時間です。
どんなゲームでも、何かにあたったら、

・あたったものが壊れて無くなる
・自分が死んでいなくなる
・無敵時間になる

のどれかになると思います。
何か障害物にあたってHPが減る機会があるなら一定の無敵時間というものを作ってみてはどうでしょうか。

無敵時間中は自機がピカピカ光ると思いますが、1/30秒消えて、1/30描いて、を繰り返すと丁度無敵時間にみえますよ。
もし、countというカウンタでループさせてるなら
if(count%2==0)
のとき、描画してやるといいと思います。


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

Name: prg  ..入門者(2,887ポイント)   Date: 2008/01/28(月) 07:09   No:13846     
Title: Re:敵を消す    
とりあえず今はモンスターにあたったら、モンスターを死亡させているのですが、
おかしくはないでしょうか?


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

Name: 管理人 [URL]  ..伝説のハッカー(506,397ポイント)   Date: 2008/01/28(月) 07:59   No:13847     
Title: Re:敵を消す    
prgさんも夜更かしなのやら早起きなのやら^^;
私は徹夜で研究室篭ってます(_ _|||)

さて、モンスターにあたったら、モンスターが死ぬのなら、無敵時間を作らなくても、モンスターがいないのにHPが減り続けるのでしょうか?
それではモンスターがいることになっているのでは・・。
ちょっとその辺はコードを見ないと解りません。
・・・と言っても、コードを読むの慣れて無いので、長いと見てもわからないかもしれませんが^^;

もしよかったら添付してもらえないでしょうか?
公開に差し支えるようなら直で私宛にメールで送ってもらってもいいですし。
もし自力で、とお思いでしたら、
もう少し詳細に教えてもらえると答えやすいです。


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

Name: prg  ..ぴよぴよ(5ポイント)   Date: 2008/01/28(月) 17:46   No:13853     
Title: Re:敵を消す    
いちおう送らせていただきました

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



Name: ぜt  ..ぴよぴよ(389ポイント)   Date: 2008/01/25(金) 11:24   No:13755       
Title: キー    
http://dixq.net/g/#33
のキー処理の部分だけ関数にして使いたいですけど、動作が速くなって使えません。
どこか加えないといけないものがあるのでしょうか?


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


Name: やそ  ..中級者(14,994ポイント)   Date: 2008/01/25(金) 12:49   No:13757     
Title: Re:キー    
while文でループさせている中で、タイマーを使ってwaitを置けばよろしいのではないでしょうか?


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

Name: 管理人 [URL]  ..伝説のハッカー(495,879ポイント)   Date: 2008/01/25(金) 13:44   No:13761     
Title: Re:キー    
恐らく裏画面処理をしていないからだと思います。
ループ処理する時は、裏画面処理をしてください。
そうしないと画面がチラチラすると思いますし、モニタのリフレッシュレートにあわせるべきでしょう。

裏画面処理については別途お読み下さい。

そして、先ほどのサンプルの中で


if( DownOshita==1 || DownPusingCounter>30){ // たった今押したか、30カウンター以上押しっぱなしなら
if(DownPusingCounter>30) // 30カウンター以上押しっぱなしならカウンターを27へ
DownPusingCounter=27; // オートの場合4回に1回下に下がる。

 
と、あったと思いますが、>30の数字を増やせば遅くなりますし、オートで動く最中の動きを遅くするには
> DownPusingCounter=27; // オートの場合4回に1回下に下がる。
この数字を小さくすれば遅くなります。


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

Name: ぜt  ..ぴよぴよ(425ポイント)   Date: 2008/01/25(金) 15:03   No:13770     
Title: Re:キー    
何処から何処までを関数に入れたらいいですか?
すいませんうまくいきませんでした。


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

Name: 管理人 [URL]  ..伝説のハッカー(498,153ポイント)   Date: 2008/01/25(金) 18:01   No:13774     
Title: Re:キー    
もし、グローバル変数を用いるなら使っている変数をグローバル変数へ、
関数へ値受け渡しをするなら任意の場所で宣言しなおしてください。
そして、メインでループしているところを任意の関数を作って置き換えてください。

その前に裏画面処理をしていないのでしたら、おつくりになっている裏画面処理をしていないプログラムを裏画面処理をするものに変更されたほうがいいと思います。


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

Name: ぜt  ..かけだし(1,223ポイント)   Date: 2008/01/27(日) 15:51   No:13823     
Title: Re:キー    
関数にしてみたけどやっぱりうまくいきません。


#include "DxLib.h"

void char_disp(int White,int y){
DrawString( 150 , y , "■" , White );
DrawString( 170 , 100 , "NEW GAME" , White );
DrawString( 170 , 120 , "CONTINUE1" , White );
DrawString( 170 , 140 , "CONTINUE2" , White );
DrawString( 170 , 160 , "CONTINUE3" , White );
DrawString( 170 , 180 , "CONTINUE4" , White );
DrawString( 170 , 200 , "CONTINUE5" , White );
DrawString( 170 , 220 , "CONTINUE6" , White );
DrawString( 170 , 240 , "LOG OUT" , White );
}

void Key(void);

int White,y=100;
char KeyBuf[ 256 ] ;

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode( TRUE ) ;

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

White = GetColor( 255 , 255 , 255 ) ;

SetDrawScreen( DX_SCREEN_BACK ) ;

while( 1 )
{
ClearDrawScreen();

GetHitKeyStateAll( KeyBuf ) ;

if( KeyBuf[ KEY_INPUT_ESCAPE ] == 1 ) break ;

char_disp(White,y);

Key();

if( ProcessMessage() == -1 ) break ;
ScreenFlip() ;
}

DxLib_End() ;
return 0 ;
}
void Key(void)
{
int DownOshita=0,NewDown=0,OldDown=0,DownPusingCounter=0;

GetHitKeyStateAll( KeyBuf ) ;

if( KeyBuf[ KEY_INPUT_DOWN ] == 1 )
NewDown=1;
else
NewDown=0;

if( OldDown==0 && NewDown==1 )
DownOshita=1;
else
DownOshita=0;

if( OldDown==1 && NewDown==1 )
DownPusingCounter++;
else
DownPusingCounter=0;

if( DownOshita==1 || DownPusingCounter>30)
{
if(DownPusingCounter>30)
DownPusingCounter=27;
y+=20;
if(y==260)
y=100;
}
OldDown=NewDown;
}


キー処理が早くなります。
どこが間違っているのでしょうか?


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

Name: 管理人 [URL]  ..伝説のハッカー(505,939ポイント)   Date: 2008/01/28(月) 04:57   No:13842     
Title: Re:キー    
<pre>
それはローカル変数が毎回0で初期化されているからです。
Key関数が呼ばれるたびに
int DownOshita=0,NewDown=0,OldDown=0,DownPusingCounter=0;
で全部0になってしまってカウントされていません。
変数の値を保存するには、グローバル変数を使うか、staticにするかなど、しないといけません。

例えばこちらを

void Key(void)
{
int DownOshita=0,NewDown=0,OldDown=0,DownPusingCounter=0;

これを

int DownOshita=0,NewDown=0,OldDown=0,DownPusingCounter=0;
void Key(void)
{

こうしてグローバル変数にするとうまくいきますよ。
なお、グローバル変数は宣言すると0で初期化されます。

後、コードを投稿するときは<pre></pre>タグで挟んで投稿してください(<>は半角)


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

Name: ぜt  ..かけだし(1,252ポイント)   Date: 2008/01/28(月) 09:14   No:13849     
Title: Re:キー    
分かりました。ありがとうございます。
今度コードを投稿するときは、気をつけます。


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



Name: TRAIN  ..ぴよぴよ(319ポイント)   Date: 2008/01/28(月) 01:15   No:13835       
Title: str系関数とmem系関数の違いについて    
初めまして。
C言語の関数について質問があるのですが、
文字列操作系関数のstr系関数(strcpy、strcmp、strncpy等)と、
mem系関数(memcpy、memcmp等)には、どういった違いがあるのでしょうか?

私が調べて出た結論は、strcpyは、
・書き込み先のサイズを知っていなければならない。
・読み込み元の値は\0で終了している。
・元の長さが先のサイズを超えてはいけない。

等の制約があり、間違えて使うとメモリを破壊する可能性があるので多様すべきではない。
なので、次数制限機能があるstrncpyを使ったほうがいい。


と言う所まで分かり、strncpy≒memcpy と言う結論に出たのですが、
問題を出して来た相手の期待している返答は『str系関数とmem系関数の違い』との事でして、
この解答では駄目だそうです。


ヒントとしては、
char str[8]に8桁の文字列を入れて、その値をコピーしようとすると、
memcpyは問題ないがstrncpyでは正常な動作をしない、との事らしいです。
(口頭でのヒントでメモも取れず、もしかしたら間違っているかも知れませんが・・・)
後は、やはりメモリ関係が答えのヒント、らしいです。



長文な上に説明力が無く、訳がわからない質問かと思われますが、
宜しければどなたかご指導お願いいたします。


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


Name: 管理人 [URL]  ..伝説のハッカー(506,472ポイント)   Date: 2008/01/28(月) 05:14   No:13843     
Title: Re:str系関数とmem系関数の違いについて    
文字列として扱う関数か、何でもいいからメモリの情報として扱う関数かの違いじゃないでしょうか。(文字列もメモリの情報ですが)
この問題は、「文字列は終端記号'\0'で終わっている」という知識が無いとわからないので、
もしその辺わからなければ、検索でもして勉強してください。

>ヒントとしては、
>char str[8]に8桁の文字列を入れて、その値をコピーしようとすると、
>memcpyは問題ないがstrncpyでは正常な動作をしない、との事らしいです。

str[8]に8桁の文字列を入れるというのは最後に終端記号を入れなかった場合ということでしょう。
しかし、strncpyを使ったら別に不具合ないはずですが。
先ほどのヒントで、

>ヒントとしては、
>char str[8]に8桁の文字列を入れて、その値をコピーしようとすると、
>memcpyは問題ないがstrcpyでは正常な動作をしない、との事らしいです。

なら意味はわかります。
memcpyもstrncpyも、指定したサイズだけコピーするのに対して、
strcpyは「終端記号が見つかるまでコピーする」という仕様ですので、最後に終端記号を書いていない場合は
ひたすら用意してない、踏み入ってはいけない領域まででもお構いなしに突き進んでひたすらコピーします。
だから最後に終端記号のない文字列をstrcpyに渡すと不具合がおきます。

関数については、そのまんま検索すればわかりやすい解説出てきますよ。

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

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

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

memcpyに書いてあるvoid *buf1というのは、「どんな型でも渡していいよ〜」という意味です。
しかしstrcpyはcharのみなので、文字列限定と言うことになります。


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



Name: prg  ..かけだし(2,470ポイント)   Date: 2008/01/26(土) 23:52   No:13817       
Title: 無題    
VC2005で、goto文を使いたいのですが、goto ラベル名 ラベル名;とやると
定義されていないラベルですと出てしまいます。
ラベルは、どのように定義するのでしょうか?


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


Name: box  ..ハッカー(105,665ポイント)   Date: 2008/01/27(日) 00:10   No:13818     
Title: Re:無題    
goto ラベル名;



ラベル名:

のペアを使ってください。


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

Name: prg  ..かけだし(2,496ポイント)   Date: 2008/01/27(日) 00:32   No:13819     
Title: Re:無題    
具体的に、どのようにラベルを宣言するのですか?(サンプルをはってくれるとうれしいです)

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

Name: box  ..ハッカー(105,740ポイント)   Date: 2008/01/27(日) 07:15   No:13820     
Title: Re:無題    

#include <stdio.h>

int main(void)
{
int n = 123;

if (n == 0)
goto label0;
else
goto label1;

label0:
printf("nは0\n");
goto end;

label1:
printf("nは0以外\n");

end:
return 0;
}


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

Name: tkmakwins15 [URL]  ..熟練のプログラマー(55,456ポイント)   Date: 2008/01/27(日) 09:42   No:13822     
Title: Re:無題    
注意する事があります。ラベルの後には必ずセミコロンのある文が必要です(要は戻り値のない関数の市場主路に飛ぶ時とかはラベルの後にセミコロンをつける必要があるということです)

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

Name: たかぎ [URL]  ..プログラマー(25,782ポイント)   Date: 2008/01/27(日) 18:46   No:13825     
Title: Re:無題    
> ラベルの後には必ずセミコロンのある文が必要です

ラベルを書くときは「ラベル付き文」でなければなりません。
文なので、必ずしもセミコロンが必要というわけではなく、複合文やif文などでもかまいません。



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

Name: prg  ..入門者(2,508ポイント)   Date: 2008/01/27(日) 20:30   No:13827     
Title: Re:無題    
ありがとうございます。

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



Name: すけ  ..ぴよぴよ(138ポイント)   Date: 2008/01/26(土) 18:46   No:13810       
Title: C言語で数独の問題をつくる    
はじめまして!
C言語初心者です。
今、数独の問題をつくるプログラムをC言語で作っています。
数独については(http://ja.wikipedia.org/wiki/%E6%95%B0%E7%8B%AC)で御覧下さい。

問題を作るには、まず解けなくてはいけないと思い、解答するプログラムをつくりました。
それで、問題作成にとりかかっているのですが、上手くできません。

考えている方法は、
1、行・列・3*3ボックスで重複しないように、ランダムに81マスを全部埋める。
2、そこから、適当なマスを空(0)にする。
3、その問題が、解答プログラムで解けたら、問題作成終了
という感じで作ろうと思っています。

そして今、1番で悩んでいます。
バックトラックという方法を見つけたのですが、それをどのように実装したらいいのかわかりません。

どなたか教えていただけないでしょうか。
初心者なので、易しく教えてください!
お願いします!



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


Name: やそ  ..上級者(16,496ポイント)   Date: 2008/01/26(土) 21:12   No:13814     
Title: Re:C言語で数独の問題をつくる    
問題を解くプログラムは出来たのですね。

まずご自分ではどのように組んで、どの辺りで詰まっているのでしょうか?


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

Name: すけ  ..ぴよぴよ(789ポイント)   Date: 2008/01/26(土) 22:33   No:13816     
Title: Re:C言語で数独の問題をつくる    
お返事ありがとうございます!

問題を解くとこまではできてます。

問題作成の部分は、下の関数で作っています。
見にくくてもうしわけないのですが...
説明は下に書いておきます。


void Rand_prob (void)
{
int rand_num = 0;
int det_count = 0;

for(;;){
i = rand() %9;
j = rand() %9;

if(Cell_[i][j].det == 0){
rand_num = rand() %9 + 1;
if(poss_Row[i][rand_num-1] == 0 && poss_Line[j][rand_num-1] == 0 && poss_Box[Cell_[i][j].Box_num][rand_num-1] == 0){
Cell_[i][j].det = rand_num;
det_count++;
poss_Row[i][rand_num-1] = 1;
poss_Line[j][rand_num-1] = 1;
poss_Box[Cell_[i][j].Box_num][rand_num-1] = 1;
}
}
if(det_count == 32) break;
}
}



Cell_[行][列]は、各マスの構造体で、detとBox_numというメンバをもっています。
detには最初、0が入っていて、ランダムに決めた数字を入れていきます。
Box_numにはそのマスのボックス番号が入っています。
ここで言うボックス番号とは、3*3のボックスを左上から順に、
0 1 2
3 4 5
6 7 8
という風にしました。

あと、poss_Row[行][数字]とposs_Line[列][数字]とposs_Box[ボックス番号][数字]は各行・列・ボックス
に[数字]が入っているかどうかを入れていきます。
最初は全て0が入っていて、その数字が行・列・ボックスに入ったら、1に変えます。

これで、32マスが埋まったら止まるのですが、解が存在しない問題が出来てしまいます。
そこで、81マス全てを埋めてから、数マスずつ空にしていく方法に変えようと思ったのですが、
どうやったら、81マス全てを埋められるのか、わからなくて質問しました。

わかりにくい説明でもうしわけありません。



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

Name: すけ  ..かけだし(1,170ポイント)   Date: 2008/01/27(日) 17:07   No:13824     
Title: Re:C言語で数独の問題をつくる    
問題作成プログラムを検索で見つけたのですが、コードを理解できません。

実行すると、問題(全て埋まった状態)が無限に出続けます。

これを1回で止めるにはどうしたら良いですか?

できればコードの意味も説明していただけると嬉しいです。

宜しくお願いします。

<pre>
#include <stdio.h>

int a[81],c[10],j,k;


o()
{
for(j=80;~j;j--)for(k=80;k>j;k--)if((j/9==k/9||j%9==k%9||(j/27==k/27&&j%9/3==k%9/3))&&a[j]==a[k]&&a[j])return 0;return 1;

}

s(n)
{
int i=80;if(a[n])s(n+1);else if(n>80){for(;~i;i--)printf("%d%c",a[i],i%9?32:10);puts("\n");}else{for(i=1;i<=9;i++)(a[n]=i,o()?s(n+1):0,a[n]=0);}
}

int main(i)
{
i=80;
o();
s(0);
}
</pre>


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



Name: <kor  ..ぴよぴよ(21ポイント)   Date: 2008/01/22(火) 18:38   No:13620       
Title: 初歩的ですいません    
初めて投稿させていただきます<korといいます。。自分は、C言語は初めてだいたい3週間くらいの初心者です。早速質問ですが、とりあえずちっちゃいノベルゲームみたいなのを作ってみて、友達に送って遊んでもらいたいいのですが、どうやったら『.exe』の形式にして保存できるのかがわかりません。
できれば中2でもわかるように説明していただけたらありがたいのですがこんなわがまま言える立場じゃないですね・・・。
こんな初心者ですいません・・・。どうかお願いします。


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


Name: tkmakwins15 [URL]  ..熟練のプログラマー(55,035ポイント)   Date: 2008/01/22(火) 22:25   No:13626     
Title: Re:初歩的ですいません    
コンパイラを持ってますか?
持ってなかったらインストールして下さい。
それでテキストのプログラムからEXEに変換します。


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

Name: 管理人 [URL]  ..伝説のハッカー(491,458ポイント)   Date: 2008/01/23(水) 04:10   No:13637     
Title: Re:初歩的ですいません    
C言語をやっていらっしゃるというからにはすでにexeファイルは作っていらっしゃると思いますが・・?
普段コードを書いてコンパイルするとき、どうしていますか?
実行するにはexeファイルを作る必要がありますから実行しているなら作っているはずです。

ノベルゲームなら誰にでも簡単に作れます。
ゲームプログラミングの館を参考にしてください。


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

Name: <kor  ..ぴよぴよ(87ポイント)   Date: 2008/01/26(土) 21:40   No:13815 解決!     
Title: Re:初歩的ですいません    
たしかにexeのファイルができてました。こんな質問に答えてくれてありがとうございます。
これからどんどん作っていきます!!


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



Name: kazuoni  ..ぴよぴよ(293ポイント)   Date: 2008/01/26(土) 20:32   No:13812       
Title: 時間を使用した乱数    
はじめまして。
c言語は始めてまだ1ヶ月弱です。
時間を利用した乱数を作っていたんですが、うまく動かないので質問させていただきます。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int rand3()

{

double ransuu;
int i;
srand((unsigned)time(NULL));
ransuu = rand()/(RAND_MAX+1.0);
i = 0;
if ( ransuu < (0.333333333333))
{
i = -1;
}

if ( ransuu >= (0.66666666666))
{
i = 1;
return i;
}
}

int main()
{
int l;
for(l=1;l<=10;l++)
{
printf("%d",rand3());
}
}

関数ひとつとメイン関数で表示して、現時刻より乱数の種の初期値を決め、-1、0、1のみを出力するという条件で書きました。
これをコンパイルすると結果は「0000000000」になってしまいます。処理する時間が短すぎるためにこうなってしまうのでしょうか?この条件を満たすためにはどうしたらよいでしょうか。
お忙しいところ申し訳ありません。ご返答よろしくお願いします。
OSはVISTA、コンパイラはVisual C++ 2008 Express Edition です。


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


Name: box  ..ハッカー(105,641ポイント)   Date: 2008/01/26(土) 20:47   No:13813     
Title: Re:時間を使用した乱数    
rand3()の中にある
return i;
の場所が正しくありません。


それから、乱数を初期化するのは、最初に一度だけで十分です。
今のコードでは、rand3()の中で毎回初期化しているため、
0000000000
1111111111
-1-1-1-1-1-1-1-1-1-1
のいずれかの結果しか得られないことでしょう。


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



Name: のん  ..初心者(6,672ポイント)   Date: 2008/01/20(日) 02:16   No:13535       
Title: 隣接行列プログラム    
隣接行列を使ったグラフ探索のプログラムを作りたいのですが。。
手も足もでません。どなたか助けていただけないでしょうか??




まずstate.txt
1
2 3

0

といったフォーマットに従った状態空間が記述された
テキストファイルを読み込んで、隣接行列を動的に作成し、
さらにその状態空間をfwrite()を用いてバイナリ形式のファイルにする。

実行時のコマンドラインは次の書式に従う。
> ./MakeGraph テキストファイル(読み込み元) 状態空間(書き込み元) 状態数 [Enter]




もうひとつは、上で作成した状態空間ファイル(バイナリ形式)をmalloc(),fread()を用いて
メモリ上に復元し、経路探索を行う。
ただし、オプション指定で縦型探索と横型探索を切り替えられるようにすること。

実行時のコマンドラインは次の書式に従う。
> ./Search [-bd] 状態空間ファイル  状態数  開始状態  終了状態 [Enter]





ちなみに、
使用例
> ./MakeGraph state.txt state.bin 4 [Enter]
> ./Search -d state.bin 4 1 0 [Enter]
> ./Search -b state.bin 4 3 3 [Enter]
> ./Search -bd state.bin 4 2 0 [Enter]


結果例
1-0 : d : 0 <- 3 <- 1
3-3 : b : 3 <- 1 <- 0 <- 3
2-0 : b : Not Found...
2-0 : d : Not Found...



これらを作るうえでのヒントのようなものもあるのですが、さっぱりで。。

状態空間をファイルから取り込むため、隣接行列で表現した状態空間のサイズは可変、
(たとえば、状態数5ならば、25個)である。したがって、メモリは動的に確保する必要がある。
また探索時に容易に扱えるようにするため、隣接行列は2次元配列であることが望ましい。
しかし、2次元の動的確保は難易度が高いので、1次元配列の動的確保を応用することで考える。
1次元配列を状態数2個確保し、2点の座標を指定することで、要求する要素へ
アクセスできるマクロCoordinates(x, y, size)を用意する。
このマクロを利用すれば、1次元配列で確保したデータを2次元として扱うことができる。

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

MakeGraph.cとSearch.cは次にあります。
ここにはのせきれなかったので。。

お手数おかけします。

http://mugen.cc.osaka-kyoiku.ac.jp/pg/







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


Name: box  ..ハッカー(104,546ポイント)   Date: 2008/01/20(日) 05:35   No:13538     
Title: Re:隣接行列プログラム    
> まずstate.txt
> 1
> 2 3
>
> 0
>
> といったフォーマットに従った状態空間が記述された
> テキストファイル

どういったフォーマットなのか、説明が不十分です。
ファイル中の 1, 2, 3, 空白行 , 0 の各々の意味を説明してください。


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

Name: のん  ..初心者(6,923ポイント)   Date: 2008/01/20(日) 22:38   No:13553     
Title: Re:隣接行列プログラム    
説明不足でごめんなさい。

これはデータ構造などででてくる有向グラフを隣接行列で示した場合、
スタート地点の状態0から状態1に(0→1)
状態1から状態2と、ゴールの状態3に(1→2、1→3)
ゴールの状態3からスタート地点の状態0に(3→0)

となっていた場合に、状態0〜3までのリンク先をあらわしたものです。
単に、机上において、隣接行列で表現すると
  0 1 2 3

0 0 1 0 0

1 0 0 1 1

2 0 0 0 0

3 1 0 0 0

となります。(線がはいっていないのでややこしいかもしれませんが。。)

これと同じ意味で、


> 1 (状態0のリンク先で、1の直後に¥n)
> 2 3 (状態1のリンク先で、2と3の間に空白、さらに3の後ろに¥n)
>   (状態2のリンク先はなにもないので、まっしろ)
> 0 (状態3のリンク先)


となっています。こういう説明で伝わっているかわかりませんが、
よろしくおねがいします!!





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

Name: のん  ..初心者(6,992ポイント)   Date: 2008/01/25(金) 02:27   No:13738     
Title: Re:隣接行列プログラム    
この問題は今までに出会った中で、一番手ごわく
なんにも進めることができません。。

どなたかお力をお貸しいただけませんでしょうか。。

みなさんにとっても難しいくらいのものと諦めたほうがよいのでしょうか。。


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

Name: parapara  ..上級者(16,311ポイント)   Date: 2008/01/25(金) 08:03   No:13752     
Title: Re:隣接行列プログラム    
>>この問題は今までに出会った中で、一番手ごわく
>>なんにも進めることができません。。
>>どなたかお力をお貸しいただけませんでしょうか。。
>>みなさんにとっても難しいくらいのものと諦めたほうがよいのでしょうか。。

隣接行列の問題は、僕にとっては簡単でしたよ。box様辺りなら鼻歌交じりで出来そうwww。
今は、かつての早稲田塾(現役生のみ&年間100万円位)の(東大・東工大)数学クラス(入れるのはごく一部の人だけ)の勘(いつも小テスト一番でした)を取り戻そうとしてるから、自分の事で精一杯なんで、box様辺りに聞いてください。やっぱり、プログラミングより数学の方が俺には得意だった。数学の本はプログラミングの本の3倍の速さで終わらせられる。
すいません、痛い文を書いてしまった。ただ、ここの教えてる人たちは少なくともプログラミングに関しては、俺より遥かに上です。

この文章に対する中傷はやめてください。


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

Name: やそ  ..上級者(15,799ポイント)   Date: 2008/01/25(金) 14:56   No:13769     
Title: Re:隣接行列プログラム    
数学は超ニガテです(笑)
計算は電卓やPCがあれば出来るじゃんってタイプですから(笑)

最近(ここ数年)数学に興味を持ち始め、深夜番組の「コマネチ大学」やN○Kの「高校講座 数学」などでお勉強中です。

ということで、行列なんてチンプンカンプンでございます。
行列に関する思い出なんてドラクエ3で徹夜で並び、高校受験の当日朝までやっていた記憶しかないです(そんなの関係ねえ!!)

駄文失礼しました。
ツッコミは大歓迎ですが、中傷には耐えられませんので、華麗にスルーでお願いします。


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

Name: のん  ..初心者(7,087ポイント)   Date: 2008/01/26(土) 01:44   No:13792     
Title: Re:隣接行列プログラム    
みなさんさまざまなコメント、ありがとうございます★
中傷なんてするどころか、なんかすごいなぁって思います。
苦手なんだといっても、余裕が感じられたり、
自分の才能をしっかりと認めているのが、
すごくうらやましい感じです。

box様、お忙しいかもしれませんが、また手があきましたら
コメントのほど、よろしくお願いします★☆


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

Name: parapara  ..上級者(16,801ポイント)   Date: 2008/01/26(土) 16:25   No:13807     
Title: Re:隣接行列プログラム    
中傷されるの覚悟(自爆テロ)で書いたのに、中傷されなかったので、助け舟を出します。

縦・横型探索はアルゴリズムの本に大抵載っていますので、説明し辛いし、そちらを参考に。
縦・横型探索は本に載ってるよりもかなり改良できるので、頑張ってみてください。
int *Allocate(const int stateSize) {
return (int *)malloc(sizeof(int)*stateSize*stateSize);
}
int Free(int *graph) {
int i;
for(i=(dMatrixSize+1)*(dMatrixSize+1)-1;i>=0;i--){
free(graph+i);
}
return(0);
}
int ReadFile(int *graph, const char *readFileName, const int stateSize) {
int i,j,n;
FILE *fpin;
char buf[4];
if((fpin=fopen(readFileName,"rb"))==NULL)return(1);
for(j=0;j<stateSize;j++){
fgets(buf,stateSize,fpin);
for(i=0;*(buf+i)!='\n';i++){
sscanf(buf+i,"%d",&n);
graph[Coordinates(j, n, stateSize)]=1;
}
}
fclose(fpin);
return(0);
}
int WriteGraph(const int *graph, char *writeFileName, const int stateSize) {
int i,j,n;
FILE *fpout;
if((fpout=fopen(readFileName,"wb"))==NULL)return(1);
for(j=0;j<stateSize;j++){
for(i=0;i<stateSize;i++){
if(graph[Coordinates(j, i, stateSize)]==1){
fprintf("%d ",i);
}
}
fprintf(fpout,"\n");
}
fclose(fpout);
return(0);
}
↑こんな感じではないでしょうか?


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



Name: ニイ  ..ぴよぴよ(378ポイント)   Date: 2008/01/25(金) 22:35   No:13782       
Title: 構造体です    
質問です。
以下のプログラムで、Inout dataの中で、"END"と入力されたら、終了する条件を追加したいんですけど、どうすればいいでしょうか?
returnを使っても、次に入力が進んでしまいます(汗)
NOT_END等を使用して、メインにアドレス返却する方法を使うみたいですけど、よく分かりませんm(_ _)m


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


#define PERSONDATA_MAX 2 /* 個人データの最大件数 */
#define NAME_MAX 19 /* 名前の最大文字数 */
#define BUF 256 /* 一時領域の大きさ */

int name(char);

typedef struct person /* 個人データ構造体の宣言 */
{
char name[NAME_MAX+1]; /* 名前 */
double height;
double weight;
double l;
double r;

}Person;

void sort_data(Person *, int);
void disp_data(Person *, int);
void input_data(Person *);

int main(void)
{
int cnt;

Person member[PERSONDATA_MAX]; /* 構造体配列の定義 */

for(cnt = 0 ; cnt < PERSONDATA_MAX ; cnt++)
{




input_data(&member[cnt]);

sort_data(&member[0], PERSONDATA_MAX);

}
disp_data(&member[0],cnt); /* 出力関数呼出し */

return 0;
}


void disp_data(Person *pmem, int max_cnt) /* 入力データ表示関数 */
{
int cnt; /* ループのカウンタ */

printf("\n********Nama***********Hi*****We***(L) Eye (R)**\n");
for(cnt = 0 ; cnt < PERSONDATA_MAX ; cnt++)
{


sort_data(&pmem[0], PERSONDATA_MAX);

printf("%-*s %5.1f %5.1f %5.3f %5.3f\n",NAME_MAX,&pmem[cnt].name[0],pmem[cnt].height,pmem[cnt].weight,pmem[cnt].l,pmem[cnt].r);
}
printf("\n");

return;
}




void input_data(Person *pmem) /* データ入力関数 */
{
char buf[BUF];

while(1)
{
printf("\nName : ");
scanf("%s",&buf[0]); /* 名前の入力 */
if(strlen(&buf[0]) <= NAME_MAX) /* 入力文字数のチェック */
{
strcpy(&pmem->name[0],&buf[0]);
break; /* メンバにコピー */
}
printf("\nSorry. Input less than %d characters.\n",
NAME_MAX+1);



}



printf("Height : ");
scanf("%lf",&pmem->height);

printf("Weight : ");
scanf("%lf",&pmem->weight);

printf("Eye(L) : ");
scanf("%lf",&pmem->l);

printf("Eye(R) : ");
scanf("%lf",&pmem->r);

return;
}

void sort_data(Person *pmem, int max_cnt)
{
int cnt1;
int cnt2;
Person temp;

for(cnt1 = 0; cnt1<max_cnt-1; cnt1++)
{
for(cnt2=cnt1+1; cnt2<max_cnt; cnt2++)
{
if( (pmem +cnt1)->height > (pmem +cnt2)->height )
{
temp = *(pmem +cnt1);
*(pmem +cnt1) = *(pmem +cnt2);
*(pmem +cnt2) = temp;
}
}
}
}


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


Name: 管理人 [URL]  ..伝説のハッカー(501,910ポイント)   Date: 2008/01/26(土) 02:42   No:13794     
Title: Re:構造体です    
それは関数に返り値を持たせてやればいいんですよ。
こんな風に。
そしてバッファオーバーする可能性のあるような文字列の入力にscanfを使ってはいけません。
というのも、scanfは用意した配列のサイズ以上の入力があってもお構いなしに書き込んでしまうからです。
つまり、違うデータが保存されている領域も侵してしまいます。
scanf("%10s")などの数字を書く方法もありますが、それならfgetsが主流でしょう。
後、方法は色々あると思いますが、今のプログラムを活かすなら、文字列を入れる配列のサイズをもう+1してやって、規定サイズをオーバーしていないかチェックしてみるといいと思います。

あと、バッファから入りきらなかった入力はバッファにたまってしまうので、入力の前にfflash(stdin)をしてバッファをクリアしておいた方がいいと思います。

そして、入力文字列には改行コードが入るので削除しておきます。

入力された文字列がENDなら-1を返し、そうでなければ0を返します。
メイン内で受け取った変数に応じて条件分岐させればメイン関数ないでも操作可能です。


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

#define NAME_MAX 16

int input_data(int a){
int i;
char buf[NAME_MAX+2];
while(1)
{
printf("\n%d回目\n",a);
printf("\nName : ");
fflush(stdin);//バッファのクリア
fgets(buf,NAME_MAX+2,stdin); /* 名前の入力 */
for(i=0;i<NAME_MAX+1;i++){//改行コード削除
if(buf[i]=='\n'){
buf[i]='\0';
break;
}
}
if(strlen(&buf[0]) <= NAME_MAX) /* 入力文字数のチェック */
{
printf("OK! [%s]の文字列を認識\n",buf);
break; /* メンバにコピー */
}
printf("\nSorry. Input less than %d characters.\n",NAME_MAX);
}
if(strcmp(buf,"END")==0)
return -1;
else
return 0;
}

int main(){
int i,get;
for ( i = 0; i < 10; i++ ) {
get = input_data(i);
if(get==-1)
break;
}
printf( "終了\n" );
return 0;
}
 


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

Name: tkmakwins15 [URL]  ..熟練のプログラマー(55,382ポイント)   Date: 2008/01/26(土) 09:12   No:13798     
Title: Re:構造体です    
>バッファから入りきらなかった入力はバッファにたまってしまうので、入力の前にfflash(stdin)をしてバッファをクリアしておいた方がいいと思います。

fflush(stdin);

は書いてはいけないコードです。未定義か不定かは分かりませんが…


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

Name: たかぎ [URL]  ..プログラマー(25,362ポイント)   Date: 2008/01/26(土) 09:25   No:13799     
Title: Re:構造体です    
> fflush(stdin);
> は書いてはいけないコードです。未定義か不定かは分かりませんが…

未定義です。
http://www.kijineko.co.jp/tech/superstitions/fflush-with-input-stream.html




Name: nayo  ..ぴよぴよ(426ポイント)   Date: 2008/01/24(木) 21:17   No:13708       
Title: メモリ使用量を抑えるには    
こんばんは、いつもお世話になっています。
この度はゲームのメモリ使用量が気になったため質問させていただきました。

そのとき使用する画像、音楽以外のメモリは解放して、とする以外にもメモリ使用量を抑える方法は
何かあるでしょうか。自分で色々試しましたがあまり変わらずで…

どなたか御願いします。


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


Name: たかぎ [URL]  ..プログラマー(25,009ポイント)   Date: 2008/01/24(木) 23:46   No:13719     
Title: Re:メモリ使用量を抑えるには    
メモリ使用量を抑える方法はいろいろありますが、どんな方法が効果があるかは、

1. どんな作りになっているのか
2. 現在どの程度メモリを使っていて、どの程度にしたいのか
3. 現在のメモリ使用量の内訳
4. コンパイラとプラットフォーム

によります。


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

Name: nayo  ..ぴよぴよ(507ポイント)   Date: 2008/01/25(金) 00:31   No:13726     
Title: 無題    
すみません

windowsで
コンパイラはBorlandC++ Compiler
現在画像、音楽無しで起動時26M程
画像、音楽を入れると一番使わない音楽1つ、画像1つのときでも70Mほどです
60M前後に抑えたいと思っています


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

Name: たかぎ [URL]  ..プログラマー(25,345ポイント)   Date: 2008/01/25(金) 00:39   No:13729     
Title: Re:無題    
いまいち状況がつかめませんが...

> 画像、音楽を入れると一番使わない音楽1つ、画像1つのときでも70Mほどです

ということは、画像と音楽の分の44M程度はどうしようもない気がします。
だとすると、26Mの方から10M分削るしかないわけですね。
プログラムはCでしょうか? それともC++でしょうか?
画像や音楽を扱うために、何か外部のライブラリを使用していますか?


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

Name: nayo  ..ぴよぴよ(550ポイント)   Date: 2008/01/25(金) 00:45   No:13730     
Title: Re:無題    
説明不足が多くてすみません
DXライブラリを使用しています

画像と音楽は二つ合わせても2M程度なのですが一気に増えるものなのでしょうか


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

Name: たかぎ [URL]  ..プログラマー(25,362ポイント)   Date: 2008/01/25(金) 00:54   No:13731     
Title: Re:無題    
> DXライブラリを使用しています
> 画像と音楽は二つ合わせても2M程度なのですが一気に増えるものなのでしょうか

なるほど。
DXライブラリを解析してみないと分かりませんね。


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

Name: nayo  ..ぴよぴよ(603ポイント)   Date: 2008/01/25(金) 02:18   No:13737     
Title: Re:無題    
どうやら音楽ファイルが異常にメモリを消費しているようです。
再生の仕方などに問題があるかもしれないので調べてみます。


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

Name: tkmakwins15 [URL]  ..熟練のプログラマー(55,287ポイント)   Date: 2008/01/25(金) 07:45   No:13751     
Title: Re:無題    
音声ファイルの形式はなんでしょうか。
もしwav形式ならば、それをmp3形式に変換して、メモリに読み込む前に、

SetCreateSoundDataType(DX_SOUNDDATATYPE_MEMPRESS);

の一行を加えてやると状況はだいぶ変わるはずです。ただし、ProcessMessage()を必ず0.2秒未満ごとに呼び出す必要があります。


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

Name: 管理人 [URL]  ..伝説のハッカー(495,946ポイント)   Date: 2008/01/25(金) 13:50   No:13762     
Title: Re:無題    
メモリについて詳しく調べたことが無いのでよくわかりませんが、
DXライブラリの内部に関するご質問は製作者様にお聞きになった方がいいかもしれません。

http://homepage2.nifty.com/natupaji/DxLib/
こちらでお聞きいただけます。


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

Name: nayo  ..ぴよぴよ(683ポイント)   Date: 2008/01/25(金) 21:14   No:13781     
Title: Re:無題    
tkmakwins15様、管理人様、有難うございます
とにかく色々試してみます

毎回毎回本当にお世話になります


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



Name: korsakov  ..かけだし(1,319ポイント)   Date: 2008/01/25(金) 02:17   No:13736       
Title: 壁の判定    
こんにちは。実は今パックマンを作ってますが、壁の判定が上手くいかず悩んでます。


環境:WindowsXp VC++ 2005 Express
ライブラリはSDLを使ってます。


W100,H100、1ブロック20ピクセルで区切ったとして
int GameMap[5][5]={ 1,1,1,1,1},
{ 1,0,0,0,1},
{ 1,0,0,0,1},
{ 1,0,0,0,1},
{ 1,1,1,1,1},};

bool Key[KEY_MAX];
void GetKey()
{
static Uint8 *keys;
for(int i=0;i<_KEY_MAX;i++)//初期化
Keys[i]=false;

keys=SDL_GetKeyState(NULL);//Key入力を読み取る
if(Key[SDLK_UP]==1)Key[_UP]=1;
if(Key[SDLK_DOWN]==1)Key[_UP]=1;
if(Key[SDLK_LEFT]==1)Key[_UP]=1;
if(Key[SDLK_RIGHT]==1)Key[_UP]=1;
}

void Move_Character(Pac *pacman)
{
static int move = 2;

if((pacman->pos.x%20==0)&&(pacman->pos.y%20==0))
if(pacman->KeyPress==true){//dst パックマンの方向
if(Keys[_UP]==true)pacman->dic=_UP;
if(Keys[_DOWN]==true)pacman->dic=_DOWN;
if(Keys[_LEFT]==true)pacman->dic=_LEFT;
if(Keys[_RIGHT]==true)pacman->dic=_RIGHT;
}
if(MapPos(pacman->pos.x,pacman->pos.y,pacman->dic)==0){//通行可能なら
if (Chara->dst==_UP)pacman->pos.y-=move;
else if(Chara->dst==_DOWN)pacman->pos.y+=move;
else if(Chara->dst==_LEFT)pacman->pos.x-=move;
else if(Chara->dst==_RIGHT)pacman->pos.x+=move;
}
}
Blit_Pac(pacman);//キャラクターイメージ描画
}
int MapPos(int x,int y,int d)//B_S = 20
{

if(d==_UP) return GameMap[(y/B_S)-1][x/B_S];
if(d==_DOWN) return GameMap[(y/B_S)+1][x/B_S];
if(d==_LEFT) return GameMap[y/B_S][(x/B_S)-1];
if(d==_RIGHT)return GameMap[y/B_S][(x/B_S)+1];
return 0;
}
void Blit_Pac(Pac *Chara)
{
SDL_BlitSurface( Chara->Img,&Chara->anime[Chara->dic%4][Chara->motion%2],Screen,&Chara->pos);
Motion(Chara);
}

typedef struct Pac{//パックマン
SDL_Surface *Img;//画像イメージ
SDL_Rect pos;//表示する座標位置 x,y,w,h
Uint8 dic;//Direction キャラクターの方向
Uint8 motion;//モーションパターン
SDL_Rect anime[4][2];
bool KeyPress;//キーが離されてるか
}pac;

キー入力が無ければ最後に入力された方向に向かって動き続けるように作りたいのですが...
何故か画面左端、画面上に到達すると(GameMap[0][...],GameMap[...][0])止まってしまい動かなくなります。(キー入力不可能になる)
それ以外の場所では特に問題なく動ける(画面右端、画面下で動きは止まるが、キー入力出来ます)


<


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


Name: korsakov  ..かけだし(1,349ポイント)   Date: 2008/01/25(金) 21:10   No:13780 解決!     
Title: Re:壁の判定    
すいません。別の方法でやったらうまくいきました。
お騒がせしました。


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



Name: TK  ..ぴよぴよ(95ポイント)   Date: 2008/01/24(木) 17:11   No:13694       
Title: 無題    
はじめまして初心者です。
車のスピードメーターを表示したいんですが、常に変化する変数などに対応してメーターも変化させるには、
どういった関数を使い、どういったプログラムの流れにしていけばいいですか?


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


Name: たかぎ [URL]  ..上級者(24,593ポイント)   Date: 2008/01/24(木) 18:45   No:13697     
Title: Re:無題    
制御方法はスピードメーターの仕様によります。

> どういった関数を使い、

普通は既存の関数ではなく、自分でハードウェアを制御することになると思います。
別の担当者が制御部分のモジュールを作っているのであれば、どんな関数を呼べばよいかはその担当者に聞いてください。


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

Name: やそ  ..中級者(14,261ポイント)   Date: 2008/01/24(木) 18:47   No:13698     
Title: Re:無題    
メータの針をスピードに対応した角度で表示してあげればいいでしょう。

Cの関数と言うよりもアルゴリズム構築の段階の質問のような気がします。

角度はラジアンで計算するといいんじゃないかな?

まずは最高速(REDZONE)を決めて、そこは角度的には何度に設定するか。
最低速度(0MPH)の時の針の角度も決めておいたほうがいいでしょう。
それで必然的に速度:角度が決まると思います。

重要なのは、いつ、どのように速度が決まるのか。じゃないでしょうか?
アクセルやブレーキ、クラッチに相当するキーがあって、アクセルベタ踏み(押しっぱなし)だと速度が上がるとかだと楽しそうですね。

がんばってください。


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

Name: やそ  ..中級者(14,310ポイント)   Date: 2008/01/24(木) 18:50   No:13699     
Title: Re:無題    
え、本当にホンモノのメーターを測定するのでしょうか?

それだと全く話は違いそうですね^^;


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

Name: たかぎ [URL]  ..上級者(24,607ポイント)   Date: 2008/01/24(木) 19:39   No:13700     
Title: Re:無題    
> え、本当にホンモノのメーターを測定するのでしょうか?

質問の文面からはそうとしか読み取れませんね。


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

Name: 管理人 [URL]  ..伝説のハッカー(494,273ポイント)   Date: 2008/01/24(木) 19:54   No:13701     
Title: Re:無題    
表示したいと言うからにはDXライブラリか何かを使ってメーター表示をしたいのでしょうけど・・。

例えば、PIを円周率とするとき、

double p;
p=PI/2;

を0kmとし、スピードメーターは200キロまであり、角度PI*3/2まである物とするとき

double speed;

に現在のスピードが入っているならば

#define MAX_SPEED 200.0
p=PI/2 + PI*3/2 * speed/MAX_SPEED;

これで角度求まると思いますよ。後はこの角度に従ってメーターの針を表示すればいいと思います。


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

Name: 通りすがり  ..初心者(6,802ポイント)   Date: 2008/01/24(木) 20:13   No:13706     
Title: 無題    
とやかくいう筋合い無いですが、いつもそのように書かれる傾向があるのでお書きしますが、
わざと質問者の意図ではない意地悪な受け取り方をした記述をするのは、質問者のみならず、周りの者からも見ていて気持ちいい物じゃないので、やめた方がいいのではないかと思いますよ。
今回、「変化する変数に従ってメーターを表示したい」と書いているのですから、どう考えたってハードウェアの話じゃないし、そんな話ここでするわけがないですしね。
質問者の言い方を直させたいなら「○○を補足してください。」と書いた方が見ている方も気分がいいです。


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

Name: たかぎ [URL]  ..上級者(24,753ポイント)   Date: 2008/01/24(木) 22:58   No:13713     
Title: Re:無題    
> とやかくいう筋合い無いですが、いつもそのように書かれる傾向があるのでお書きしますが、
> わざと質問者の意図ではない意地悪な受け取り方をした記述をするのは、質問者のみならず、周りの者からも> 見ていて気持ちいい物じゃないので、やめた方がいいのではないかと思いますよ。

そう受け取られたのなら謝ります。
決して意地悪をしているわけではなく、極力言葉通りに理解しようと努めています。

> 今回、「変化する変数に従ってメーターを表示したい」と書いているのですから、どう考えたってハードウェアの話じゃないし、そんな話ここでするわけがないですしね。

スピードメーターは何もアナログで針が動くものばかりではありません。
あまり良い例が見当たらなかったのですが、例えば
http://www.nagaidenshi.co.jp/MONITOR/4010.shtml
であれば、明らかに「表示」しています。



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

Name: たかぎ [URL]  ..上級者(24,839ポイント)   Date: 2008/01/24(木) 23:15   No:13715     
Title: Re:無題    
一点書き忘れました。

> そんな話ここでするわけがないですしね。

先ほどの
http://www.nagaidenshi.co.jp/MONITOR/4010.shtml
のページに掲載されている基本配線図にある「エンジンコンピュータ」のプログラムはC言語で記述することが多いでしょうから、ここで話をしたとしても何の不思議もありません。


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

Name: やそ  ..中級者(14,369ポイント)   Date: 2008/01/25(金) 00:03   No:13720     
Title: Re:無題    
たとえば、メモリ使用率とかをタコメーター風に表示するアクセサリとかあるじゃないですか。
私はあんな感じを想像していました^^



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

Name: たかぎ [URL]  ..プログラマー(25,088ポイント)   Date: 2008/01/25(金) 00:08   No:13721     
Title: Re:無題    
真意は質問者さんが現れないと分かりませんね。
コンパイラもOSも全く分かりませんし、プラットフォームを推測する手がかりは「車の」という部分だけですから。



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

Name: 管理人 [URL]  ..伝説のハッカー(495,260ポイント)   Date: 2008/01/25(金) 13:35   No:13759     
Title: Re:無題    
スピードメーターと言えば・・。
バイクが好きなんで、バイクの話ですが、
R1といい1000RRといい、最近のスーパースポーツバイクのメーターはほとんどデジタルです。
私はデジタルは好きじゃないんですが・・、そういう人の為に両方装備されてる奴もあります。
http://blog.goo-net.com/ts-prime/img/90/1400gtr-1.jpg

見慣れているので、デジタルのスピードメーターには全く違和感が無いんですが、
やっぱ一般的にはまだまだアナログですよね。
タコメーターまでデジタルの奴はほんと見難いんで、全部アナログでいいと思うんですが・・。

まぁ質問者さんに補足してもらわないとですね。


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

Name: やそ  ..上級者(15,439ポイント)   Date: 2008/01/25(金) 14:47   No:13768     
Title: Re:無題    
へー、最近はデジタルメーターも増えてきてるんですね^^

私はデジタルメーターと言えば『ナイトライダー』のイメージしか無かった(笑)


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

Name: 管理人 [URL]  ..伝説のハッカー(500,053ポイント)   Date: 2008/01/25(金) 20:56   No:13779     
Title: Re:無題    
最近はデジタル多いですよぉ。ネイキッドやアメリカンはアナログが多いと思いますけど。
理由あるんでしょうねぇ・・知りません;

先生も帰ってしまったし・・、帰る前に遊びで作ってみました。

メーターは欧州300km規制が入った隼辺りをイメージして・・。
若干リアリティ出すために余計なことしてるんで、ショウモナイとこ読みにくくなってますが、こんな感じでしょうか?
角度からスピード出してるんで、本来反対なんですけど、まぁイメージとして・・。


#include "DxLib.h"

#include <math.h>

#define PI 3.141592
#define MIN_ANGLE (PI/3*2)
#define MAX_ANGLE (PI/3*7)
#define ADD_SPEED (PI/220)
#define SUB_SPEED (PI/180)

double angle;
char Key[256];

void calc_angle(){
if(Key[KEY_INPUT_Z]!=0){
if(angle<MAX_ANGLE){
angle+=ADD_SPEED-ADD_SPEED*(0.97*(angle-MIN_ANGLE)/(MAX_ANGLE-MIN_ANGLE));
if(angle>=MAX_ANGLE)
angle-=ADD_SPEED*3;
}
}
else{
if(angle>MIN_ANGLE){
angle-=SUB_SPEED;
if(angle<MIN_ANGLE)
angle=MIN_ANGLE;
}
}
}

#define BUNKATU 30
void meter_graph(){
int i;
double ang=MIN_ANGLE;
for(i=0;i<=BUNKATU;i++){
DrawLine(320+210*cos(ang),280+210*sin(ang),320+180*cos(ang),280+180*sin(ang),GetColor(255,0,0));
ang+=(MAX_ANGLE-MIN_ANGLE)/BUNKATU;
}
}

void graph(){
DrawLine(320,280,320+200*cos(angle),280+200*sin(angle),GetColor(255,255,255));
DrawFormatString(300-70,380,GetColor(0,255,255),"%5.1fkm/h",(angle-MIN_ANGLE)*57.6);
}


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){

angle=MIN_ANGLE;

if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;
SetDrawScreen( DX_SCREEN_BACK );
SetFontSize(36);
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && Key[KEY_INPUT_ESCAPE]==0){
calc_angle();
meter_graph();
graph();
ScreenFlip();
}
DxLib_End();
return 0;
}
 
  


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



Name: 七氏  ..ぴよぴよ(160ポイント)   Date: 2008/01/25(金) 20:02   No:13776       
Title: platform SDK    
Windows platform SDKをダウンロードし、インストールしたところ、Windowsインストーラに、
インストールパッケージを開くことができませんでした。パッケージが存在し、アクセスできることを
確認してください。またはアプリケーション ベンダに問い合わせ、このパッケージが有効なWindowsインストーラパッケージであることを確認してくださいといわれました。
具体的にどうすればいいのでしょうか?教えてください。


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


Name: 管理人 [URL]  ..伝説のハッカー(499,007ポイント)   Date: 2008/01/25(金) 20:12   No:13778     
Title: Re:platform SDK    
よくわかりませんが、それっぽいキーワードでgoogle検索するのが一番早いと思います。

エラーメッセージを検索したり。
「インストールパッケージを開くことができませんでした。」
なら
SDKというキーワードと一緒に検索するか、長すぎるなら適当な所で切ってみてください。

後こんな記事もありました。
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=780120&SiteID=7

コンパイラはなんでしょうか?
もし2005ExpressEditionなら2008にしてはいかがでしょう・・。


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



Name: Kights of Kights  ..ぴよぴよ(83ポイント)   Date: 2008/01/24(木) 20:52   No:13707       
Title: マインスイーパ    
C言語で、OpenGLを使ったマインスイーパを作りたいのですが、非OpenGLのものは作れましたがその先へ行くことができません。参考ソースも上げていただけるとうれしいのですが…………

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


Name: 管理人 [URL]  ..伝説のハッカー(497,171ポイント)   Date: 2008/01/25(金) 14:10   No:13764     
Title: Re:マインスイーパ    
OpenGLは他と比べて参考になるサイトが少なくて困りますよね。
私は床井先生のサイトで結構勉強しました。
床井先生の本も持っています。

とりあえず、ググって出てくる所はご覧になりましたよね?
http://www.google.co.jp/search?hl=ja&q=OPENGL&lr=
あと、「OpenGL 入門」 とか。

それ以上のテクスチャとかの知識が必要なら
http://www.google.co.jp/search?hl=ja&q=OPENGL%E3%80%80%E3%83%86%E3%82%AF%E3%82%B9%E3%83%81%E3%83%A3&lr=

床井先生のサイトはかなり重いのが難点ですが・・。
かなり勉強できると思いますよ。


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



Name: hum-king  ..初心者(5,504ポイント)   Date: 2008/01/25(金) 01:58   No:13734       
Title: Dijkstra法とWarshall-Floyd法について    
それぞれの利点がいまいち分かりません。。。それぞれの利点・欠点を述べよ。という課題が出たのですがよく分かりません^^; 今の時点で自分が考えたことを書きます。間違えているかもしれませんが・・・


◎利点

・実装が簡単(ワーシャル・フロイド)

・グラフが密な場合はダイクストラよりワーシャル・フロイドの方が早い。
→でもWebなどを見ていると実行時間はダイクストラと同じと書いてありました。実際に実行してみるとワーシャル・フロイドの方が早かったです。ここがイマイチ理解しがたいところの一つです。

・逆にグラフが疎な場合はダイクストラの方が早いらしいです。
・負の閉路があっても用いれる(ワーシャル・フロイド)


●欠点

・グラフが密な場合は計算が終わらない。(ダイクストラ)
・負の閉路がある場合は使えない。(ダイクストラ)


少ないですが、今はこんなところです^^;どなたかお知恵貸して下さる方がいらっしゃったらよろしくお願いします。


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


Name: parapara  ..上級者(16,357ポイント)   Date: 2008/01/25(金) 08:07   No:13753     
Title: Re:Dijkstra法とWarshall-Floyd法について    
たった一つの事で、知ってるかもしれませんが、
ダイクストラは改良する事で、閉路の判定が出来た気がする。


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



Name: ぶたさん  ..ぴよぴよ(74ポイント)   Date: 2008/01/21(月) 21:10   No:13599       
Title: 困ってます    
皆さんこんばんわ★
恋空の映画を
無料ダウンロードの仕方や
ダウンロードできるサイトを
ご存知の方は至急教えてください
本当に困ってて
ずっと探してるので
お願いします!!!!!!!


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


Name: Hermit  ..上級者(18,801ポイント)   Date: 2008/01/21(月) 21:32   No:13600     
Title: Re:困ってます    
たぶん違法行為だと思うので、
こんな所で聞く事では無いと思います。

誰も答えてはくれないと思います (^^;


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

Name: たかぎ [URL]  ..上級者(24,326ポイント)   Date: 2008/01/21(月) 23:16   No:13603     
Title: Re:困ってます    
> 無料ダウンロードの仕方や
> ダウンロードできるサイトを
> ご存知の方は至急教えてください

質問者さんが権利を買い取って、無料ダウンロードできるサイトを作ればよいのです。
それなら、違法行為でも何でもありません。


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

Name: バグ  ..比類無きプログラマー(72,180ポイント)   Date: 2008/01/22(火) 09:56   No:13612     
Title: Re:困ってます    
C言語と全く関係無いような…(笑)

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

Name: 管理人 [URL]  ..伝説のハッカー(490,548ポイント)   Date: 2008/01/23(水) 03:09   No:13632     
Title: Re:困ってます    
ぶたさん、
きっとPCの詳しいお友達からいろんな映画や音楽を無料で手に入れることが出来るんだよ、と教えてもらったことがあるのではないでしょうか。
確かに著作権違反ではありますが、残念なことに無料で手に入れる方法は色々あります。
そのせいでCDの売り上げなどは下がる一方のようです。
この行為を行うことは法律違反で、アップロードをしなければ犯罪じゃないなど、色々と利用者の屁理屈はありますが、
とても悪いことです。簡単に手に入り、多くの人が行っていることから法律違反をしているという認識が薄いこともあり、
悪いと思って使っている人もいるでしょうが、これは本来行ってはいけない事なので、無料で手に入れることはあきらめてください。
お金を出せばいくらでも手に入るでしょう。
映画やドラマ、アニメなど、有料で配信しているサイトは沢山ありますし、
DVDとして出ているならDVDのレンタル屋さんに行けば借りられるでしょう。

どうしても他の方法を調べたいとお思いでしたら、googleで知りたいキーワードを検索すれば、色々調べることは出来ますよ、とだけ言っておきます。
ただ映画の売り上げやCDの売り上げが下がればこれらを職業にしている人は皆こまるはずです。
私も無料で手に入れる方法は存じていますが、必ずDVDレンタルショップに行ってお金を出して借りています。
24やプリズンブレイクなどのシリーズを全てみるにはかなりお金はかかりましたが、当然のことだと思っています。
人に迷惑をかけないよう、お金を払って視聴するようにしてください。


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

Name: Hermit  ..上級者(18,974ポイント)   Date: 2008/01/23(水) 20:05   No:13659     
Title: Re:困ってます    
>映画やドラマ、アニメなど、有料で配信しているサイトは沢山ありますし、
>DVDとして出ているならDVDのレンタル屋さんに行けば借りられるでしょう。

まだ、恋空は出てないと思いますが・・・


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

Name: 管理人 [URL]  ..伝説のハッカー(493,729ポイント)   Date: 2008/01/23(水) 23:58   No:13665     
Title: Re:困ってます    
すみません、邦画とか疎くて・・。
なるほど、まだ出てない映画を見たかったわけですか。失礼しました。


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

Name: tkmakwins15 [URL]  ..熟練のプログラマー(55,053ポイント)   Date: 2008/01/24(木) 15:50   No:13688     
Title: Re:困ってます    
まぁ見られるようになるまで我慢しましょう。

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

Name: ф魔理沙ф  ..ぴよぴよ(383ポイント)   Date: 2008/01/25(金) 03:07   No:13744     
Title: Re:困ってます    
記事見ていたら思ったので突然ながら書きますが、

ここに来る人ってC言語で困っている人か、「C言語?そんなのチョロいぜ〜何なら教えてやろうか?」と

思っている人が大半だと思います。管理人が「C言に関係ないことでもOKですよぉ〜♪」と公言しているとは

いえその後に、「非常識なことはダメ」みたいなことを書いてあったはずです。ちゃんと規約を守って楽しい

C言語生活を送りましょう(-^〇^-)


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



Name: ぽん  ..入門者(4,512ポイント)   Date: 2008/01/21(月) 16:47   No:13579       
Title: 穴埋め問題についてアドバイスをお願いします    
久しぶりに顔を出させてもらいます。
前回の質問ではいろいろな方に教えてもらって、なんとか完成できました。
お礼の返事を書いていなかったので、失礼ではありますがこちらで御礼申し上げます。

今回の質問ですが、穴埋め問題についてアドバイスをいただきたいんです。
ドット演算子やアロー演算子を使用するところやtypedefを使っているので、自分ではよくわかりませんでした;
演算子の使い方がいまいちわからず、困っています。
ただ、答えを教えてもらうのでは自分にとってよくないと思いますので、アドバイスというか考え方とかを教えていただけたらと思います。
よろしくお願いします。


#include<stdio.h>

#define INPUT_MAX  3 /*情報入力件数*/
#define NAME_LENGTH 19 /*最大名前文字数*/

typedef struct data /*情報構造体*/
{
int number; /*番号*/
char name[NAME_LENGTH+1]; /*名前*/
}PERSON;

void input_data(/* 1 */); /*1件分の情報を入力する関数*/
void sort_data(/* 2 */, int); /*情報を番号の昇順に並べ替える関数*/

int main (void)
{
PERSON member[INPUT_MAX];
int cnt;

for(cnt = 0 ; cnt < INPUT_MAX ; cnt++)
{
input_data(/* 3 */); /*1件分の情報を入力*/
}
sort_data(/* 4 */, INPUT_MAX); /*情報の番号を昇順に並べ替え*/

printf("\n***** MEMBERS LIST *****\n");
for(cnt = 0 ; cnt < INPUT_MAX ; cnt++)
{ /*情報出力(ドット演算子使用)*/
printf("%04d %-*s\n", /* 5 */ ,NAME_LENGTH, /* 6 */);
}
return 0;
}

void input_data(/* 7 */ pmem)
{
printf("\nInput Number : ");
scanf("%d", /* 8 */ ); /*番号入力(直接メンバに代入・アロー演算子使用)*/

printf("Input Name : ");
scanf("%s", /* 9 */); /*名前入力(直接メンバに代入・アロー演算子使用)*/

}

void sort_data(/* 10 */ pmem, int max_cnt)
{
int cnt1;
int cnt2;
/* 11 */ temp; /*一時格納領域*/

for(cnt1=0 ; cnt1 < max_cnt-1 ; cnt1++);
{
for(cnt2 = cnt1+1 ; cnt2 < max_cnt ; cnt2++)
{ /*番号を昇順に並替え(アロー演算子使用)*/
if( /* 12 */ > /* 13 */)
{ /*情報を入れ替え([]は使用しない)*/
temp = /* 14 */;
/* 15 */ = /* 16 */;
/* 17 */ = temp;
}
}
}
}

/*番号*/のところに答えを入れるようになっています。


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


Name: 管理人 [URL]  ..伝説のハッカー(489,077ポイント)   Date: 2008/01/21(月) 17:56   No:13586     
Title: Re:穴埋め問題についてアドバイスをお願いします    
こちらの問題、解らない書き方があるならそれさえ調べてしまえばとても簡単なので、力を抜いてチャレンジしてみてください。

void sort_data関数についてはこちらを
http://www.google.co.jp/search?hl=ja&q=%E3%83%90%E3%83%96%E3%83%AB%E3%82%BD%E3%83%BC%E3%83%88&lr=

input_dataについてはscanfの使い方がわかっているという前提でこちらを
http://www.google.co.jp/search?hl=ja&q=%E3%82%A2%E3%83%AD%E3%83%BC%E6%BC%94%E7%AE%97%E5%AD%90&lr=

調べて穴埋めして下さい。

main関数については、「このプログラムで何をしようとしているのか」を考えたら簡単にわかると思います。
例えば
input_data(/* 3 */);
の3に何を入れたらいいか・・。
現在何の変数にデータを入れようとしてるのでしょうか?
main関数で用意している変数は2つしかないですよね。どちらにデータを入れようとしているのか簡単にわかると思います。

と言うことは当然
sort_data(/* 4 */, INPUT_MAX);
もそのデータのわけですし、むしろINPUT_MAX個配列要素を用意している変数はひとつしか無いわけですから
他に大量に変数が用意してあろうとも、プログラムのアルゴリズムがわからなくとも、
どの変数か予測は出来ますよね。

バブルソートについては、もう決まった書き方があるので、それに準じて書き写せばいいだけですし、
後は構造体をポインタで扱うにはどのように書けばいいか、調べたらいいだけです。
がんばってください。


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

Name: 管理人 [URL]  ..伝説のハッカー(489,202ポイント)   Date: 2008/01/21(月) 18:06   No:13588     
Title: Re:穴埋め問題についてアドバイスをお願いします    
typedefの使い方がわからなければ、typedefでググって下さい。
構造体の渡し方など、わからなければ以下のサンプルコードを参考にしてください。


#include <stdio.h>
typedef struct{
int number;
char name[64];
}id_t;

void input_id(id_t *obj){
obj->number=10;
}

int main(){
id_t id[1];
input_id(&id[0]);
printf("%d\n",id[0].number);
return 0;
}

実行結果

10




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

Name:  ..上級者(20,649ポイント)   Date: 2008/01/21(月) 18:11   No:13589     
Title: Re:穴埋め問題についてアドバイスをお願いします    
>void input_data(/* 1 */); /*1件分の情報を入力する関数*/
>void sort_data(/* 2 */, int); /*情報を番号の昇順に並べ替える関数*/
これはプロトタイプ宣言についてですね〜
「;」の位置に注目ですね!

>input_data(/* 3 */); /*1件分の情報を入力*/
>sort_data(/* 4 */, INPUT_MAX); /*情報の番号を昇順に並べ替え*/
これは引数が何か!って質問です。
考え方は…何もないと関係がなくなってしまう???

>printf("%04d %-*s\n", /* 5 */ ,NAME_LENGTH, /* 6 */);
表示したいものの設定ですね〜
問題にする意図が分からんw
というか、答えも分からんw
%-*s これってなんだろ?(ぉぃ
「""」の中のものから判断しよう・・・できなかったけど。。

>void input_data(/* 7 */ pmem)
>void sort_data(/* 10 */ pmem, int max_cnt)
・・・忘れる可能性があるからかな???
型の宣言について・・・かな?

>scanf("%d", /* 8 */ ); /*番号入力(直接メンバに代入・アロー演算子使用)*/
>scanf("%s", /* 9 */); /*名前入力(直接メンバに代入・アロー演算子使用)*/
ポインタの使用の仕方について
大事ですね〜(多分w

>/* 11 */ temp; /*一時格納領域*/
型宣言(←だからどうした

if( /* 12 */ > /* 13 */)
{ /*情報を入れ替え([]は使用しない)*/
temp = /* 14 */;
/* 15 */ = /* 16 */;
/* 17 */ = temp;
}
これがプログラミングですね〜
考え方の復習かな?

まぁコンパイルして実行すればあってるかどうか分かるから、頑張ってね^^
若干愚痴は入ってるけど気にしないでね^^;A


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

Name: 管理人 [URL]  ..伝説のハッカー(489,401ポイント)   Date: 2008/01/21(月) 18:23   No:13591     
Title: Re:穴埋め問題についてアドバイスをお願いします    
>printf("%04d %-*s\n", /* 5 */ ,NAME_LENGTH, /* 6 */);
これについての書き方のうち

%-*sについてですが、これは表示の仕方を決めています。
表示フォーマットについては色々沢山の書き方があります。
まず、「マイナス」と書けば左寄せです。

%5dと書けば5つのスペースを使って右寄せですが
%-5dと書けば5つのスペースを使って左寄せです。

ここで、この「5」の部分がいつも変わるからプログラムで指定したいと言うとき、

「*」を使います。*には引数で値を渡します。

printf("%-*s",10,"12345");

これを実行してみたらわかるとおり、
「左寄せで10個のスペースを使って"12345"を表示」と言う意味になります。
わからない関数については、ググれば大抵解決します。
http://www.google.co.jp/search?hl=ja&q=printf&lr=


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

Name: ぽん  ..初心者(5,242ポイント)   Date: 2008/01/23(水) 01:10   No:13631     
Title: Re:穴埋め問題についてアドバイスをお願いします    
うあああ〜〜、ありがとうございます!
すごく助かりますv
まだちゃんと実行できてませんが・・・;
まずは・・・ググってしっかり熟読するところからやっています。
どうかな〜と思って一応埋めてはみたものの、やはり違うようですので。

ちょっと見てやってくださいませ。(埋めたところのみですが)
1:PERSON *
2:PERSON *
3:&member[cnt]
4:&member[0]
5:&PERSON.number
6:&PERSON.name[0]
7:PERSON
8:&pmem->number  
9:&pmem->name[0]
10:PERSON*
11:int
12:cnt2-1(cnt2-1ではなくてmax_cnt-1なのかとも思うんですがどうでしょうか)
13:max_cnt
14:cnt2-1
15:cnt2-1
16:max_cnt
17:max_cnt

この内容で実行すると、8,9のところで「左のオペランドが'struct'型です。'.'を使用して下さい」
というエラーが出ました。アロー演算子で答える所なのでどうなっているのかさっぱりです;
他にもエラーが出まくりでしたが・・・。
まずはやっぱり熟読熟読・・・。



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

Name: 管理人 [URL]  ..伝説のハッカー(490,948ポイント)   Date: 2008/01/23(水) 03:57   No:13634     
Title: Re:穴埋め問題についてアドバイスをお願いします    
ちょっと今日は朝から頭痛がしてまともに考えられないのですが、埋めてみました。
コンパイルしてないので違うかもしれませんが、ちょっと試してみてください・・・。
まんま答えを書いてしまうことになってしまいましたが、がんばっていらっしゃるようですので、答え合わせ程度にご覧下さい。

あと、最初のコードに大きなミスがひとつあります。

ソート関数の中の1つのfor文の最初にコロンがつけてあるのでループしません。
括弧がある前にコロンをつけるとfor文はfor文の閉じ括弧からコロンまでをループ部だと考えます。
そして閉じ括弧からコロンまでに何もないので、何もしないループ文となっています。
私のコードと見比べてどこが違うか確認してください。

>>(cnt2-1ではなくてmax_cnt-1なのかとも思うんですがどうでしょうか)

について、アルゴリズムをまず理解されたらこのような疑問はなくなると思います。
あと、すみません、バブルソートでなく、単純ソートでしたね。
単純ソート でググって下さい。全く同じソートが出てきます。

答えを見て少しでもわからないところがあれば徹底的に調べてください
「答えがあったからいいや」では次に必ず困ります。

わからないところがあれば遠慮なくどうぞ。


#include<stdio.h>

#define INPUT_MAX 3 /*情報入力件数*/
#define NAME_LENGTH 19 /*最大名前文字数*/

typedef struct data /*情報構造体*/
{
int number; /*番号*/
char name[NAME_LENGTH+1]; /*名前*/
}PERSON;

void input_data(PERSON *); /*1件分の情報を入力する関数*/
void sort_data(PERSON *, int); /*情報を番号の昇順に並べ替える関数*/

int main (void)
{
PERSON member[INPUT_MAX];
int cnt;

for(cnt = 0 ; cnt < INPUT_MAX ; cnt++)
{
input_data(&member[cnt]); /*1件分の情報を入力*/
}
sort_data(member, INPUT_MAX); /*情報の番号を昇順に並べ替え*/

printf("\n***** MEMBERS LIST *****\n");
for(cnt = 0 ; cnt < INPUT_MAX ; cnt++)
{ /*情報出力(ドット演算子使用)*/
printf("%04d %-*s\n", member[cnt].number ,NAME_LENGTH, member[cnt].name);
}
return 0;
}

void input_data(PERSON *pmem)
{
printf("\nInput Number : ");
scanf("%d", &pmem->number ); /*番号入力(直接メンバに代入・アロー演算子使用)*/

printf("Input Name : ");
scanf("%s", &pmem->name); /*名前入力(直接メンバに代入・アロー演算子使用)*/

}

void sort_data(PERSON *pmem, int max_cnt)
{
int cnt1;
int cnt2;
PERSON temp; /*一時格納領域*/

for(cnt1=0 ; cnt1 < max_cnt-1 ; cnt1++){
for(cnt2 = cnt1+1 ; cnt2 < max_cnt ; cnt2++)
{ /*番号を昇順に並替え(アロー演算子使用)*/
if( pmem[cnt1].number > pmem[cnt2].number)
{ /*情報を入れ替え([]は使用しない)*/
temp = pmem[cnt1];
pmem[cnt1] = pmem[cnt2];
pmem[cnt2] = temp;
}
}
}
}




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

Name: ぽん  ..初心者(5,644ポイント)   Date: 2008/01/25(金) 01:14   No:13733 解決!     
Title: Re:穴埋め問題についてアドバイスをお願いします    
お世話になっております!
管理人さんに直接アドバイスがいただけて嬉しい限りです。
少しずつではありますが、C言語に対して理解が進んでいるかなと思います。
ソートに関してもだいぶ理解が深まりました。
まだまだ勉強不足ではありますが、ちょびちょびと前進しております。
未熟な自分にとって、出される課題の1つ1つが難解でパンクしそうですが;

また質問させてもらいに来ると思いますが、そのときはよろしくお願いします!


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



Name: エターナル  ..ぴよぴよ(309ポイント)   Date: 2008/01/24(木) 22:33   No:13711       
Title: 教えてください    
実は次のような宿題を出されたので教えてください
次の変数pのバイト数を答えなさい。(CPUのワード長は32ビットとする)
 int ***************p;

次の変数stSample のデータサイズを答えなさい。(CPUのワード長は32ビットとする)
 struct sample {
  int a;
  char b;
  int c;
 }stSample;

次のプログラムに問題はありますか?
問題がある場合は、問題となる処理と理由も答えてください。

int *func (void)
{
int a = 10;
return &a;
}

int main (void)
{
int *a;
a = func();
return *a;
}

次のプログラムを実行した場合の出力結果を答えてください。

#include <stdio.h>

void func1()
{
printf("func1\n");
}

void func2()
{
printf("func2\n");
}

void func3()
{
printf("func3\n");
}

void func(int iNo)
{
void (*pFunc[])(void) = {func1, func2, func3};

pFunc[iNo]();
}

int main(void)
{
func(1);
}
よろしくお願いします。




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


Name: たかぎ [URL]  ..上級者(24,890ポイント)   Date: 2008/01/24(木) 23:42   No:13718     
Title: Re:教えてください    
どこかで見覚えがあると思ったら、
http://www.play21.jp/board/formz.cgi?action=res&resno=13578&page=20&lognum=&id=dixq&rln=13611
と同じではないでしょうか?


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

Name: エターナル  ..ぴよぴよ(385ポイント)   Date: 2008/01/25(金) 00:12   No:13722     
Title: Re:教えてください    
ホントですね、クラスの子かもです。

でも最初の二つはかぶってますけどほかのは違うとこなので教えてください。
あと最初の二つは環境依存って書いてありますが、ちゃんと環境の明記をしてるので、
この場合どうなるのかお願いします。


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

Name: たかぎ [URL]  ..プログラマー(25,184ポイント)   Date: 2008/01/25(金) 00:24   No:13724     
Title: Re:教えてください    
> でも最初の二つはかぶってますけどほかのは違うとこなので教えてください。

そのようですね。
3つ目の問題ですが、生存期間を終えたオブジェクトの値を参照しているので問題があります。
最後の問題は実際に動かしてみれば分かります。

> ちゃんと環境の明記をしてるので

もしかして

> CPUのワード長は32ビットとする

のことでしょうか?
これだけでは環境を明記したことにはなりません。
コンパイラとコンパイルオプションを明記してください。


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

Name: tkmakwins15 [URL]  ..熟練のプログラマー(55,249ポイント)   Date: 2008/01/25(金) 00:26   No:13725     
Title: Re:教えてください    
一つ目は4バイトとなると思います。
二つ目はやはり環境依存(パディングなしで9バイト)
三つ目は問題ありです。ローカル変数のアドレスを返してはいけません。返した後そのアドレスは無効になります。
四つ目:

func2

となります。


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

Name: たかぎ [URL]  ..プログラマー(25,463ポイント)   Date: 2008/01/25(金) 00:34   No:13728     
Title: Re:教えてください    
もう少し詳しく書いておきます。

CPUのワード長が32ビットで、仮にポインタが32ビットだとしても、char型が何ビットなのかが分かりません。
例えば、CHAR_BITが16ビットの場合、ポインタのサイズは「2バイト」ということになります。

2番目の問題に関しては、CPUのワード長が32ビットでも、int型やchar型が何ビットかは特定できません。
int型に関しては32ビットになるケースが多いのは確かですが、32ビットCPUでint型が16ビットの処理系も複数実在します。
また、char型とint型のサイズが同じであれば、struct sample型は3バイトになる可能性が高いでしょう。ただし、コンパイラによっては、構造体だというだけで強制的に特定の境界調整を要求する場合がありますので、4バイトとかになっても不思議ではありません。char型とint型のサイズが異なる場合も境界調整に完全に依存します。


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



Name: アル  ..ぴよぴよ(664ポイント)   Date: 2008/01/24(木) 17:35   No:13695       
Title: アクションゲームのスクロール    
初めまして、アルと言います。

卒業研究でアクションゲームを作成しようとしているのですが
スクロールがうまく作れず行き詰っています。
検索で掲示板内を調べたのですが、マップスクロールに関していまいち理解できませんでした。

検索したログで管理人さんの出した例題が

//
#define WINDOW_SIZE_X 640
#define WINDOW_SIZE_Y 480
#define STAGE1_END_X 10000

typedef struct{
int x,y;
}ch_t;
ch_t ch;

という環境だとすると

if(ch.x<WINDOW_SIZE_X/2){
  普段どおり背景を描画。
  普段どおりキャラを描画。
}
else if(ch.x<STAGE1_END_X-WINDOW_SIZE_X/2){
  キャラが進んだ分だけ背景を左にスクロール。
  画面中央にキャラを表示。
}
else{
  普段どおり背景を描画。
  X座標はSTAGE1_END_X-WINDOW_SIZE_Xを左原点にキャラを描画。
}
//

となっているのですが、ちょっとよくわかりません。

私の作っているアクションは、背景は無く(真っ暗)、ただブロックを置いてそこにキャラが乗れる程度です。



DXライブラリ置き場のサンプルプログラムそのまんまですが、私が作ろうとしているプログラムです。
これからどうやってキャラを中心としたマップスクロールを作っていけばいいのでしょうか?

//

マップ//

#define SCREEN_WIDTH (640) // 画面の横幅
#define SCREEN_HEIGHT (480) // 画面の縦幅
#define CHIP_SIZE (32) // 一つのチップのサイズ
#define MAP_WIDTH (SCREEN_WIDTH / CHIP_SIZE) // マップの横幅
#define MAP_HEIGHT (SCREEN_HEIGHT / CHIP_SIZE) // マップの縦幅

//キャラ
float PlX, PlY ; // プレイヤーの座標(中心座標)

//

当方は、C言語経験は1ヶ月未満です。
どうかご教授をお願いします。


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


Name: 管理人 [URL]  ..伝説のハッカー(495,086ポイント)   Date: 2008/01/24(木) 20:05   No:13704     
Title: Re:アクションゲームのスクロール    
アクションでスクロールというからには、右への横スクロールだと思っていいのでしょうか?
・・すると、横の最大の座標はいくつになりますか?
例えば画面10個分位の横スクロールだと6400位になると思いますが。

それに当たるのが

#define STAGE1_END_X 10000

でして、この場合、最大が10000であると仮定しています。

ch.xという構造体の書き方はOKですか?キャラのX座標を示しています。
わからなければ「構造体」でググって勉強してみてください。

私が書いている

#define WINDOW_SIZE_X 640
#define WINDOW_SIZE_Y 480


アルさんの書いていらっしゃる

#define SCREEN_WIDTH (640) // 画面の横幅
#define SCREEN_HEIGHT (480) // 画面の縦幅

と同じ意味です。
どうでしょう、どのへんがわかりませんか?


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

Name: アル  ..かけだし(1,728ポイント)   Date: 2008/01/25(金) 00:32   No:13727     
Title: Re:アクションゲームのスクロール    
すみません……書き方が悪かったです。

えっと、スクロールの方向ですが「左スクロール」です。

構造体は大丈夫です。

//
typedef struct{
int X,Y,img,muki,walking_flag;
}ch_t;

ch_t Grap;

//

となっています。
画面一つ分の横幅は(640)となっています。
横の最大は……考えてませんでしたが、画面10個(6400)にしたいと思います。

問題はこの管理人さんが書いたプログラムで

//以下、プログラム一部(サンプルプログラム、右スクロールから)

int i, j ;
if(Gra.X<(int)SCREEN_WIDTH/2){

// マップの描画
{
for( i = 0 ; i < MAP_HEIGHT ; i ++ )
{
for( j = 0 ; j < MAP_WIDTH ; j ++ )
{
// 1は当たり判定チップを表しているので1のところだけ描画
if( MapData[i][j] == 1 )
{
DrawBox( j * CHIP_SIZE, i * CHIP_SIZE,
j * CHIP_SIZE + CHIP_SIZE, i * CHIP_SIZE + CHIP_SIZE,
GetColor( 255, 255, 255 ), TRUE ) ;
}
}
}
}
if(Gra.muki == 1)
Gra.img=image[((int)Gra.X%16+(int)Gra.Y%16)/8 + 4]; //画像をセット

if(Gra.muki == 3)
Gra.img=image[((int)Gra.X%16+(int)Gra.Y%16)/8 + 12];

// キャラクタの描画
DrawGraph( ( int )( Gra.X - CHAR_SIZE * 0.5F ), ( int )( Gra.Y - CHAR_SIZE * 0.5F ),
Gra.img, TRUE ) ;
}
else if(Gra.X<STAGE1_END_X - SCREEN_WIDTH/2){
//キャラが進んだ分だけ背景を左にスクロール。
//画面中央にキャラを表示。
}
else{
for( i = 0 ; i < MAP_HEIGHT ; i ++ )
{
for( j = 0 ; j < MAP_WIDTH ; j ++ )
{
// 1は当たり判定チップを表しているので1のところだけ描画
if( MapData[i][j] == 1 )
{
DrawBox( j * CHIP_SIZE, i * CHIP_SIZE,
j * CHIP_SIZE + CHIP_SIZE, i * CHIP_SIZE + CHIP_SIZE,
GetColor( 255, 255, 255 ), TRUE ) ;
}
}
}
}

//
こうなっていますが

下記の部分に
else if(Gra.X<STAGE1_END_X - SCREEN_WIDTH/2){
//キャラが進んだ分だけ背景を左にスクロール。
//画面中央にキャラを表示。
}
何を入力すればいいのか分かりません。

今の状態ですと、キャラが1画面の半分を過ぎると画面が真っ暗になるだけです。
真っ暗でもマップはそのままで、キャラは動きます。
画面半分より戻ると、画面は正常な状態に戻ります。


またまた、分かりにくい書き方をしていますがどうかご教授をお願いします。


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



Name: カル  ..ぴよぴよ(266ポイント)   Date: 2008/01/20(日) 22:43   No:13556       
Title: グレゴリウス暦を使った問題です。    
はじめまして、今とある宿題を出されて悩んでいます。
OS:Windows xp
コンパイラ名とバージョン:VisualStudio2005
言語: C
C言語を勉強しだして3日たってもわからない初心者です、今は変数と演算について勉強してます
ですがこの問題がまったくわかりません

問題 グレゴリウス暦の定義を利用して、入力された日は何曜日か?
西暦1年1月はは月曜とし1年は365日、閏年は366日
4で割り切れる年は閏年、400で割り切れる年も閏年
100で割り切れる年は閏年ではない

備考
goto文は使用しない、変数名、関数名の命名規約を作成
外部変数は使用しない
途中でreturn exitは使用しない。
ツェラーの公式以外で。

今のところわかっているのは、前年までの総日数+前月までの総日数+今月の日数÷7で余った値が曜日になる
という事だけです。


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


Name: VOW  ..ぴよぴよ(76ポイント)   Date: 2008/01/21(月) 01:59   No:13557     
Title: Re:グレゴリウス暦を使った問題です。    
>西暦1年1月はは月曜とし

まったく意味がわからないです。
これでは誰も返答できないのでは?


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

Name: カル  ..ぴよぴよ(344ポイント)   Date: 2008/01/21(月) 02:15   No:13558     
Title: Re:グレゴリウス暦を使った問題です。    
ですよね・・・間違えました・・
「西暦1年1月1日は月曜日」
と書いてありました。
スイマセン。




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

Name: たかぎ [URL]  ..上級者(24,282ポイント)   Date: 2008/01/21(月) 08:13   No:13561     
Title: Re:グレゴリウス暦を使った問題です。    
↓でもよく似た質問をされている方がいます。参考にしてはいかがでしょうか?
http://okwave.jp/qa3698783.html


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

Name: やそ  ..中級者(11,530ポイント)   Date: 2008/01/21(月) 09:23   No:13562     
Title: Re:グレゴリウス暦を使った問題です。    
C言語初心者(3日レベル)に対しての問題としては、ちょっとレベルが高めの問題に感じます。
しかもツェラーの公式を使えないなんて^^;

まずは流れを考えて見ましょう。

1.曜日を知りたい日付を入力させる。
2.入力された日付を基準日から何日たっているか数える。
3.曜日判定する。
4.結果を出力する。

1.の日付入力は、とりあえずエラーチェックの類は省いたほうが簡単そうですね。
(間違った日付は入力されないのが前提ということ)
また、年、月、日は別々に入力させたほうが処理するほうは楽ですね^^

2.基準日から何日たっているか数えるところでは、ループを用いましょう。
年(前年まで)の回数分ループさせるようにして、
ループの内部ではその年がうるう年かの判定をして、
365を足すか、366を足すかを決めます。

ループ終了後、求められた日数に
(その年の1月1日から)前月までの総日数+今月の日数
を計算し、
÷7で余った値が曜日になる

です。
あとはそれを表示するだけです。

ポイントとしては、年、月は計算する際には前年、前月まで計算すると言うところです。
(理屈を理解すれば分かることですが^^)

本当はプログラムを書いて見せてあげればいいんでしょうけど、それでは勉強になりませんので、
個人的にはこのような形で返答することにしています。

がんばって下さい。






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

Name: やそ  ..中級者(11,699ポイント)   Date: 2008/01/21(月) 10:14   No:13563     
Title: Re:グレゴリウス暦を使った問題です。    
補足。

基準日の初期値はZEROでしょうか。

それによって割った際の余りの値が変わってきます。

基準日を0とした場合
余りの値 0 1 2 3 4 5 6 
曜日   月 火 水 木 金 土 日

基準日を1とした場合
余りの値 0 1 2 3 4 5 6 
曜日   日 月 火 水 木 金 土 

となると思います。


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

Name: やそ  ..中級者(11,915ポイント)   Date: 2008/01/21(月) 13:41   No:13568     
Title: Re:グレゴリウス暦を使った問題です。    
連投失礼します。

他には・・・

year という変数に年を入力するとして、
int u4=0,u100=0,u400=0;

year-b=year--; //前年

u400=year-b/400
u100=year-b/100
u4=year-b/4

でうるう年、非うるう年の回数を計算して合計することで、
ループを使わずに計算することも可能です。

まあ、こちらは理屈が分かった上での方がいいので、次の段階でしょうか?


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

Name: カル  ..ぴよぴよ(618ポイント)   Date: 2008/01/21(月) 14:47   No:13573     
Title: Re:グレゴリウス暦を使った問題です。    
たくさんのヒントありがとうございます。
とりあえずここまで考えてみました

# include <stdio.h>

int main () {

int year =0 /*年数*/
int months=0 /*月*/
int day =0 /*日数*/
int uruu =0 /*閏年*/
int days[13]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
char weekname[7]={"日", "月", "火", "水", "木", "金", "土"};

printf("西暦は何年ですか?\n");
scanf("%d",&nyear);
printf("何月ですか?\n")
scanf("%d",&nmonths);
printf"何日ですか?\n");
scanf("%d"&nday);

day=365*(year-1);

y % 4 == 0 && y % 100 != 0 || y % 400 == 0

めちゃくちゃな感じになってしまってるかもしれませんが・・・



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

Name: やそ  ..中級者(12,201ポイント)   Date: 2008/01/21(月) 15:43   No:13576     
Title: Re:グレゴリウス暦を使った問題です。    
コンパイル・・・してなさそうですね^^;

int main () {

int year =0; /*年数*/
int months=0; /*月*/
int day =0; /*日数*/
int uruu =0; /*閏年*/
int days[13]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
char weekname[7]={"日", "月", "火", "水", "木", "金", "土"};

printf("西暦は何年ですか?\n");
scanf("%d",&nyear); &nyearではなく&yearでは?
printf("何月ですか?\n")
scanf("%d",&nmonths); &nmonthsではなく&monthsでは?


printf"何日ですか?\n");
scanf("%d"&nday); &ndayではなく&dayでは?
/* うるう年チェックの優先順位をもう一度良く考えて見ましょう */
/* また、yって宣言してますか? */
day=365*(year-1);

y % 4 == 0 && y % 100 != 0 || y % 400 == 0


引き続きがんばってください^^


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

Name: カル  ..ぴよぴよ(543ポイント)   Date: 2008/01/21(月) 17:08   No:13581     
Title: Re:グレゴリウス暦を使った問題です。    
問題の訂正
4で割り切れる年は閏年、400で割り切れる年も閏年
100で割り切れる年は閏年ではない

4で割り切れる年は閏年
100で割り切れる年は閏年ではない
400で割り切れる年は閏年
でした。


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

Name: やそ  ..中級者(12,547ポイント)   Date: 2008/01/21(月) 17:30   No:13582     
Title: Re:グレゴリウス暦を使った問題です。    
んー、問題文の記述の順番が違っていたとしても、その内容は変わってませんよね?
(変わったらおかしいですが)
で、
「4で割り切れる」
「100で割り切れる」
「400で割り切れる」
と言うのは、どの順番で行ったら(チェックしたら)良いと思いますか?
と言うことを言いたかったのです。

また、
y % 4 == 0 && y % 100 != 0 || y % 400 == 0

は構文として成立していませんね。
(if文でくくりたい内容なのだとは思いますが)

たとえば2001年1月1日の曜日を検索したいとして、
まずは2000年12月31日までの日数を計算します。

で、2000を4で割ると500。余り0。
2000を100で割ると20。余り0。
2000を400で割ると5。余り0。

となります。

さてどうやってチェックしましょうか?

コレが出来たら2005年10月10日など、いろいろな年月日で検証してみると良いでしょう。


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

Name: カル  ..ぴよぴよ(847ポイント)   Date: 2008/01/21(月) 17:31   No:13583     
Title: Re:グレゴリウス暦を使った問題です。    

int main () {

int year =0; /*年数*/
int months=0; /*月*/
int day =0; /*日数*/
int uruu =0; /*閏年*/
int y
int days[13]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
char weekname[7]={"日", "月", "火", "水", "木", "金", "土"};

printf("西暦は何年ですか?\n");
printf("西暦は何年ですか?\n");
scanf("%d"&year);
printf("何月ですか?\n");
scanf("%d",&months);
printf"何日ですか?\n");
scanf("%d"&day);

uruu = year/4;
days += uruu;

/*100で割れる年*/
uruu = year/100;
days -= uruu;

/400で割れる年*/
uruu = year/400;
days += uruu;
こんな感じでしょうか・・・・


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

Name: カル  ..ぴよぴよ(862ポイント)   Date: 2008/01/21(月) 17:40   No:13584     
Title: Re:グレゴリウス暦を使った問題です。    
あ、スイマセン、考え直してきます。

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

Name: やそ  ..中級者(12,700ポイント)   Date: 2008/01/21(月) 18:03   No:13587     
Title: Re:グレゴリウス暦を使った問題です。    
一度、ご自分の思ったとおりにプログラムを組んでみて、コンパイルしてみることをオススメします。

初めから完璧なコードを書きたい気持ちは分かりますが、このようなやり取りが続くことを考えると、
完成まで何ヶ月かかるか?です。

問題文と私の助言?を基に最後の曜日の表示まで作ってみてください。

プログラム作成の基本と言うか身に付けたいなら何度もTRY&エラーを繰り返すべきです。
よほどのことがない限り、コンピュータを壊すようなことはありませんので、安心?して失敗してください。

エラーに慣れる。ことが上達の早道です^^



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

Name: カル  ..かけだし(1,150ポイント)   Date: 2008/01/21(月) 18:18   No:13590     
Title: Re:グレゴリウス暦を使った問題です。    
そうですね、一度やってみようとおもうのですが
コンパイルするにもソフトがないんです・・
ないならネットとかでDLできますかね?(世間知らずでスイマセン)
あと最後の質問なのですが
#include <stdio.h>

int main () {

int y, m, d, sum = 0;
int m_array[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
char *week[7] = {"日", "月", "火", "水", "木", "金", "土"};
printf("input (e.g. ****/**/**)\n>>");
scanf("%d/%d/%d", &y, &m, &d);

if (m > 2 && y % 4 == 0 && (y % 100 != 0 || y % 400 == 0)) {
++sum;
}

for (m -= 2; m >= 0; --m) {
sum += m_array[m];
}

--y;

sum = sum + y * 365 + y / 4 - y / 100 + y / 400 + d;
printf("%s曜日", week[sum%7]);
return 0;
}
これでなら一応完成でしょうか?



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

Name: YuO  ..上級者(17,762ポイント)   Date: 2008/01/21(月) 18:23   No:13592     
Title: Re:グレゴリウス暦を使った問題です。    
学校なりでVisual Studio 2005を使っているのであれば,
http://www.microsoft.com/japan/msdn/vstudio/express/past/2005/
から,Visual C++ 2005 Express Editionをダウンロードしてインストールするのがよいでしょう。


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

Name: やそ  ..中級者(13,189ポイント)   Date: 2008/01/22(火) 14:07   No:13613     
Title: Re:グレゴリウス暦を使った問題です。    
やそです。
コンパイラが無かったんですか。
上達の早道はたくさん書くこと、なれること。ですのでコンパイラの導入をオススメします^^

早速ですが、

#include <stdio.h>

int main () {

int y, m, d, sum ,i= 0;
int m_array[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
char *week[7] = {"日", "月", "火", "水", "木", "金", "土"};

printf("input (e.g. ****/**/**)\n>>");
scanf("%d/%d/%d", &y, &m, &d);


 ↑ここはなんで入力を纏めてしまったのでしょう?個別に聞いたほうが使用者に優しい気がしたのですが。

if (m > 2 && y % 4 == 0 && (y % 100 != 0 || y % 400 == 0)) {
++sum;
}

 ↑ここでは・・・検索する当年の月を見てうるう年かの判定をしているようですね。

for (m -= 2; m >= 0; --m) {
sum += m_array[m];
}

 ↑これ、おかしいです。初期値で既にマイナスになりえますから^^;当年の検索月の前月まで足したい処理だとは思うのですが、これでは・・・

検索月が5月なら1から4月の日数を足すわけですが、ならば
// m_array[0] ・・・1月
// m_array[1] ・・・2月
// m_array[2] ・・・3月
// m_array[3] ・・・4月
// 添え字は0から始まるので-1。更に前月までなので-1 = 検索月-2となる
for (i=0; i <= m-2; i++) {
sum += m_array[i];
}



--y;

sum = sum + y * 365 + y / 4 - y / 100 + y / 400 + d;
// 最終的な表示が曜日だけではさびしいので
printf("%d年%d月%d日は%s曜日です", ++y, m, d, week[sum%7]);
// のほうが見栄えがいいです。

printf("%s曜日", week[sum%7]);

return 0;
}


思わずコードを少し書いてしまいましたが、例によって私もコンパイルは(頭の中でしか)していないので、
きちんとコンパイルして検証することをオススメします。



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

Name: カル  ..かけだし(1,239ポイント)   Date: 2008/01/23(水) 00:46   No:13630     
Title: Re:グレゴリウス暦    
アドバイスありがとうございます
さっそくDLしてコンパイルしてみたら
#include "stdafx.h"' をソースに追加しましたか?
とエラーが出てしまいます・・・
これを追加しても同じエラーが出てしまいます


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

Name: 管理人 [URL]  ..伝説のハッカー(492,093ポイント)   Date: 2008/01/23(水) 04:24   No:13638     
Title: Re:グレゴリウス暦    
空のオブジェクト、にチェックを入れた方が解りやすいと思います。

最初はプロジェクトを作るだけでも大変ですよね。

手元に2005が無いので少し違うかもしれませんが。。

メニューから「新規作成」>「プロジェクト」

「新しいプロジェクト」のウィンドウが出てきます。
左の Win32 をチェックし、Win32コンソールアプリケーションを選択。
好きなプロジェクト名を入力して「OK」を押す
Win32アプリケーションウィザードのウィンドウが出てきます。
そこでウィンドウ左の「アプリケーションの設定」をチェックし、
「空のプロジェクト」にチェックを入れて、完了します。

すると、何もないからのプロジェクトが出来上がります。
ソリューションエクスプローラーが表示されていなければ、「表示」から指定して表示してください。
「ソースファイル」右クリックで「追加」>「新しい項目」
そして出てきたウィンドウで、
左のVc++から「コード」をチェックし右で「C++ファイル(.cpp)」を選択。好きなファイル名を書いて終了。

後は出てきたエディタ画面にコードを書いてF5キーを押せばOKです。
コンパイルエラーの場合は、エラーメッセージが下に出てきます。
とりあえずこれをコンパイルしてください。


#include<stdio.h>
void main(){
printf("Hello");
}
 
Helloと出れば成功です。
(本来int mainであり、最後にreturn (0);がいります)


・・・ところで、うちの大学の1回生用の最終課題として出した問題と全く同じなんですが、もしかして大学の課題ですか?

C歴3日とかかれているので、違うとは思いますが、もしかしたらと思いましたので・・。



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

Name: カル  ..かけだし(1,289ポイント)   Date: 2008/01/23(水) 07:23   No:13640     
Title: Re:グレゴリウス暦    
いえ、大学の方はすでに卒業しております。
今独学で学んでいまして、友人にちょくちょく教えてもらっていて課題を出されたんです。
設定の情報ありがとうございます
がんばってやってみます。


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

Name: カル  ..かけだし(1,583ポイント)   Date: 2008/01/23(水) 22:09   No:13660 解決!     
Title: Re:グレゴリウス暦    
#include <stdio.h>

int main()
int iyear, imonths,iday;
int sum,i;
int m_array[12] = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
char*cweek[7] = {"日", "月", "火", "水", "木", "金", "土"};

sum =0;
printf ("input (e.g ****/**/**\n>>");
scanf ("%d/%d/%d/%d",&iear,&imonths,&iday);
/*閏年の判定*/
if ((imonths >2) && ((iyear % 4 == 0) && ((iyear % 100 !=0 ) || (iyear % 400 == 0)))) {
sum++;    
}                  
/*前月までの日数*/
for (i = 0; i < imonths-1; i++) { 
sum += m_array[i];
}

iyear--;
/*前月と前年度と今月の日数の合計*/
sum = sum + iyear * 365+((( +iyear / 4) - (iyear / 100)) + (iyear / 400)))+ iday;
printf("%s曜日",cweek[sum%7]);
return 0;

}

色々とコードを書いて頂き、ありがとうございます、とりあえずこれでOKだそうです。コンパイルしてみましたが問題はありませんでした。


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

Name: box  ..ハッカー(104,664ポイント)   Date: 2008/01/23(水) 23:07   No:13662     
Title: Re:グレゴリウス暦    
> コンパイルしてみましたが問題はありませんでした。

こちらの環境ではエラーが頻発してコンパイルできませんでした。
特に最終形のコードを載せられる際は、エディタかどこかで
コピー&ペーストしたものを、そのまま"pre"タグと"/pre"タグではさんで
くださると、見やすくて助かります。


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

Name: 管理人 [URL]  ..伝説のハッカー(493,871ポイント)   Date: 2008/01/24(木) 00:03   No:13666     
Title: Re:グレゴリウス暦    
括弧の対応があちこちおかしいのでコンパイルできません。まずmainに括弧が無いところからして・・。
全角スペースもありますし、コピーじゃなくてみながら手入力されたのでしょうか?

後、コードを投稿するときは

<pre>と</pre>タグではさんでください。見やすくなります。(<>は半角)


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

Name: カル  ..かけだし(1,976ポイント)   Date: 2008/01/24(木) 01:35   No:13667     
Title: Re:グレゴリウス暦    

#include<stdio.h>

int main() {

int iyear,imonths,iday;
int sum,i;
int m_array[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
char*cweek[7] = {"日","月","火","水","木","金","土"};

sum =0;
printf ("input (e.g. ****/**/**)\n>>");
scanf ("%d/%d/%d",&iyear,&imonths,&iday);
/*閏年の判定*/
if ((imonths >2) && ((iyear % 4 == 0) && ((iyear % 100 !=0) || (iyear % 400 == 0)))) {
sum++;
}
/*前月までの日数*/
for (i =0; i < imonths-1; i++) {
sum += m_array[i];
}

iyear--;
/*前月と前年度と今月の日数の合計*/
sum = sum + iyear * 365 + (((iyear / 4)-(iyear / 100))+(iyear / 400))+iday;
printf("%s曜日",cweek[sum%7]);
return 0;

}

直しました、これでいけると思います、何度もスイマセンでした。やっぱりまだ慣れてないせいかミスが多いですね。あと宿題が追加されたのですが「間違った日付が入力された場合」ということなのですが
これはやそさんが言っていた「1.の日付入力は、とりあえずエラーチェックの類は省いたほうが簡単そうですね。 (間違った日付は入力されないのが前提ということ)」 これが関係しているのでしょうか?


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

Name: 管理人 [URL]  ..伝説のハッカー(494,127ポイント)   Date: 2008/01/24(木) 01:41   No:13668     
Title: Re:グレゴリウス暦    
>「間違った日付が入力された場合」
が追加されたと言うことですが、
「間違った日付が入力された場合、再入力させる仕様にする」でいいのでしょうか。
それならscanfの部分をwhile文でループにし、読み取った値が正常なものであればbreakしてぬけ、
正常でなければもう一度ループして入力させる仕様にすればいいと思います。
例えば


while(1){
printfで入力を促す
scanfで読み取る
if(読み取った値が正常値なら)
break;
else
printf("入力値が異常です。再入力してください\n");
}

 

感じとしてはこんな感じでしょうか。


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

Name: カル  ..かけだし(2,026ポイント)   Date: 2008/01/24(木) 02:27   No:13671     
Title: Re:グレゴリウス暦    
「間違った日付が入力された場合、再入力させる仕様にする」
たぶんそれですね、ヒントありがとうございます


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

Name:  ..上級者(21,101ポイント)   Date: 2008/01/24(木) 03:42   No:13672     
Title: Re:グレゴリウス暦    
どうでも良いのですが・・・<pre></pre>で囲むのはコードだけのほうが良いですよ。
文字も囲うと書いた行をそのまま表示しようとするので。

while(1){
printf(***);
scanf(***);

//これで良いか確認を取る
printf(***);
scanf(***);

//scanfで良いと判断できれば
if(***){ break; }

}

の方が僕は良いと思いますが…

因みに ***は自由に
    変数は自分でお願いします。


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

Name: カル  ..かけだし(2,097ポイント)   Date: 2008/01/24(木) 07:15   No:13674     
Title: Re:グレゴリウス暦    
コードだけですか、無知でスイマセン・・・
難しそうですね、(実際はそうでもないかもしれませんけど)
ヒントありがとうございます、やってみます!


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

Name:  ..上級者(21,419ポイント)   Date: 2008/01/24(木) 07:38   No:13675     
Title: Re:    
//これで良いか確認を取る
printf(***);
scanf(***);
のところの
printfは前のscanfの内容をそのまま表示
scanfはただの選択肢用です。

説明へたですいません^^;


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

Name: カル  ..かけだし(2,124ポイント)   Date: 2008/01/24(木) 12:27   No:13684     
Title: Re:    
("%d/%d/%d",&iyear,&imonths,&iday);
コレのことでしょうか?


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

Name: やそ  ..中級者(13,978ポイント)   Date: 2008/01/24(木) 13:49   No:13686     
Title: Re:    
話の流れから言って多分その辺の表示のことでしょう^^;

入力年月日のエラーチェックをしたいのですから、
それが正しいか、入力者に確認させるために
printf(*****);
させてるのでしょう?

管理人さんや雷さんがほぼ理想的な解答を提示してくれてますよ。
それを自分なりにアレンジして完成させるだけです。

細かく言えば、どんな入力にも対応できるように、文字(列)で入力を取得して、
入力内容が

 1.数値の範囲
 2.正常な年月日(13月とか50日とか、負数ではない)

ことを確認し、
数値に変換する。

ここまでやればパーペキね(^^)d


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

Name: カル  ..かけだし(2,126ポイント)   Date: 2008/01/24(木) 20:09   No:13705 解決!     
Title: Re:    
できました!なんかちょっぴり感動ですw
ありがとうございました。


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



Name: ぜt  ..ぴよぴよ(337ポイント)   Date: 2008/01/22(火) 14:42   No:13614       
Title: 無題    
dxライブラリを使って作品を作っているのですが、
ゲームをスタートして最初は普通に動くのですが
長くやっているとだんだん処理が遅くなりとまってしまうことがあります。
処理が重たくなる原因はどのようなものがありますか。
やっぱり画像を使っているのがいけないのでしょうか?