C言語何でも質問掲示板


必ずお読み下さい → 規約と注意事項  アンケートはこちら  エラーで投稿できない方はこちら  過去ログ検索はこちら

 
   Windowsのメッセージが ....   
     ・[27281] toyo 
     ・[27282] dic 
     ・[27283] Mist 
     ・[27287] toyo 
     ・[27302] dic 
     ・[27310] toyo 
     ・[27311] toyo 
     ・[27318] dic 
   VB6.0のRnd関数につい ....   
     ・[27296] たいちう 
     ・[27300] バグ 
     ・[27305] Mist 
     ・[27306] バグ 
   無題。   
     ・[27256] Dixq (管理人) 
     ・[27260] 土竜谷 
     ・[27262] Dixq (管理人) 
     ・[27265] 土竜谷 
     ・[27268] Dixq (管理人) 
     ・[27273] 土竜谷 
     ・[27276] Dixq (管理人) 
   あたり判定について   
     ・[27254] Dixq (管理人) 
     ・[27263] ジャグラー 
     ・[27264] Dixq (管理人) 
     ・[27267] ジャグラー 
     ・[27271] Dixq (管理人) 
     ・[27274] ジャグラー 
     ・[27275] Dixq (管理人) 
   シューティングゲーム ....   
     ・[27190] JT 
     ・[27200] toyo 
     ・[27201] Dixq (管理人) 
     ・[27226] array 
     ・[27235] 柏 
     ・[27259] Dixq (管理人) 
   DXライブラリのジャ ....   
     ・[27240] BEMANI 
     ・[27241] Mikan 
     ・[27246] ひよこ 
   分割グラフィックの格 ....   
     ・[27089] Justy 
     ・[27095] s-rush 
     ・[27096] Justy 
     ・[27097] s-rush 
     ・[27098] Justy 
     ・[27099] Dixq (管理人) 
     ・[27100] Dixq (管理人) 
     ・[27101] kazuoni 
     ・[27102] Dixq (管理人) 
     ・[27103] Justy 
     ・[27105] s-rush 
     ・[27106] Dixq (管理人) 
     ・[27109] Dixq (管理人) 
     ・[27110] Justy 
     ・[27112] Dixq (管理人) 
     ・[27115] kazuoni 
     ・[27116] Justy 
     ・[27119] Dixq (管理人) 
     ・[27127] Justy 
     ・[27169] BEMANI 
     ・[27175] s-rush 
     ・[27177] BEMANI 
     ・[27196] s-rush 
     ・[27204] Dixq (管理人) 
     ・[27228] BEMANI 
     ・[27229] s-rush 
   行列の積について   
     ・[27210] mats 
     ・[27224] レモン 
     ・[27227] レモン 
   Pthreadについて   
     ・[27135] JT 
     ・[27136] 御津凪 
     ・[27137] JT 
     ・[27139] バグ 
     ・[27140] Haru 
     ・[27141] Haru 
     ・[27142] JT 
     ・[27143] Haru 
     ・[27144] Dixq (管理人) 
     ・[27145] JT 
     ・[27146] JT 
     ・[27147] Dixq (管理人) 
     ・[27148] Haru 
     ・[27149] バグ 
     ・[27150] JT 
     ・[27151] JT 
     ・[27152] ゆっけ 
     ・[27154] JT 
     ・[27155] Haru 
     ・[27156] JT 
     ・[27157] Dixq (管理人) 
     ・[27158] Mist 
     ・[27160] JT 
     ・[27161] たかぎ 
     ・[27162] Mikan 
     ・[27163] バグ 
     ・[27167] たかぎ 
     ・[27168] Dixq (管理人) 
     ・[27183] Mikan 
     ・[27186] バグ 
     ・[27188] 組木紙織 
     ・[27189] Mist 
     ・[27191] Haru 
     ・[27192] 御津凪 
     ・[27193] JT 
     ・[27194] バグ 
     ・[27195] s-rush 
     ・[27197] JT 
     ・[27198] Haru 
     ・[27199] Dixq (管理人) 
     ・[27203] JT 
     ・[27205] Dixq (管理人) 
     ・[27225] Mikan 
   無題   
     ・[27002] Dixq (管理人) 
     ・[27013] s-rush 
     ・[27014] nayo 
     ・[27159] JT 
     ・[27165] lbfuvab 
     ・[27166] バグ 
   14歳からはじめるシリ ....   
     ・[27138] JT 
     ・[27164] Mikan 
   if文を楽に書く   
     ・[26871] 御津凪 
     ・[26876] box 
     ・[26882] Libra 
     ・[26883] たいちう 
     ・[26884] 御津凪 
     ・[27036] TOMORONI 
     ・[27045] SCI 
     ・[27053] たいちう 
     ・[27062] lbfuvab 
     ・[27072] SCI 
     ・[27104] TOMORONI 
     ・[27107] TOMORONI 
     ・[27108] TOMORONI 
     ・[27111] TOMORONI 
     ・[27114] TOMORONI 
     ・[27125] tkmakwins15 
     ・[27153] JT 
   たびたび申し訳ありま ....   
     ・[27008] Mist 
     ・[27009] Mist 
     ・[27010] 徳竹 
     ・[27011] non 
     ・[27060] 徳竹 
     ・[27075] non 
     ・[27129] 徳竹 
     ・[27130] Mist 
     ・[27131] non 
     ・[27132] 徳竹 
   64bitOS上で32bitモジ ....   
   複数のtxtファイル ....   
     ・[26827] non 
     ・[26828] こ〜ふぃ 
     ・[26829] TOMONORI 
     ・[26835] こ〜ふぃ 
     ・[26837] non 
     ・[26838] ibis 
     ・[26839] こ〜ふぃ 
     ・[26840] non 
     ・[26842] こ〜ふぃ 
     ・[26843] こ〜ふぃ 
     ・[26844] non 
     ・[26854] こ〜ふぃ 
     ・[26857] ibis 
     ・[26859] こ〜ふぃ 
     ・[26865] non 
     ・[26869] non 
     ・[26895] ibis 
     ・[26900] こ〜ふぃ 
     ・[26902] non 
     ・[26913] こ〜ふぃ 
     ・[26915] non 
     ・[26919] non 
     ・[27126] こ〜ふぃ 
   無題   
     ・[27074] SCI 
     ・[27076] kokoro 
     ・[27078] SCI 
     ・[27079] non 
     ・[27080] box 
     ・[27082] kokoro 
     ・[27083] SCI 
     ・[27085] box 
     ・[27087] non 
     ・[27088] kokoro 
     ・[27091] non 
     ・[27092] kokoro 
   助けてください。   
     ・[27017] non 
     ・[27018] box 
     ・[27027] s-rush 
     ・[27030] non 
     ・[27031] s-rush 
     ・[27033] s-rush 
     ・[27034] lbfuvab 
     ・[27037] ももにー 
     ・[27038] array 
     ・[27039] ももにー 
     ・[27040] array 
     ・[27046] ももにー 
     ・[27047] ももにー 
     ・[27048] box 
     ・[27049] ももにー 
     ・[27050] array 
     ・[27057] non 
     ・[27081] ももにー 
   14歳からはじめるc言語 ....   
     ・[27044] kazuoni 
     ・[27051] 初心者 
     ・[27052] SCI 
     ・[27054] 初心者 
     ・[27055] 初心者 
     ・[27056] バグ 
     ・[27068] Dixq (管理人) 
     ・[27070] 初心者 
   ゲームプログラミング ....   
     ・[26997] Dixq (管理人) 
     ・[26998] jag 
     ・[26999] Dixq (管理人) 
     ・[27004] Libra 
     ・[27006] toyo 
     ・[27012] jag 
     ・[27042] ren 
     ・[27069] Dixq (管理人) 
   どなたか・・・   
     ・[27019] non 
     ・[27041] tkmakwins15 
     ・[27063] もぐりん 
   無題   
     ・[27059] Dixq (管理人) 
   インべーダーゲーム   
     ・[26899] Dixq (管理人) 
     ・[26901] ひよこ 
     ・[26903] Dixq (管理人) 
     ・[26904] ひよこ 
     ・[26905] Mist 
     ・[26906] ひよこ 
     ・[26910] lbfuvab 
     ・[26911] Dixq (管理人) 
     ・[26914] Dixq (管理人) 
     ・[26947] ひよこ 
     ・[26948] Mist 
     ・[26950] ロム 
     ・[26974] ひよこ 
     ・[26976] Mist 
     ・[26977] 御津凪 
     ・[26978] ひよこ 
     ・[26980] ロム 
     ・[26981] 御津凪 
     ・[26982] Mist 
     ・[26983] ロム 
     ・[26985] ひよこ 
     ・[26989] yu 
     ・[27000] ひよこ 
     ・[27003] Dixq (管理人) 
     ・[27005] Mist 
     ・[27020] ひよこ 
     ・[27021] lbfuvab 
     ・[27022] ひよこ 
     ・[27023] lbfuvab 
     ・[27024] ひよこ 
     ・[27025] ロム 
     ・[27026] ひよこ 
     ・[27028] Dixq (管理人) 
     ・[27029] Mist 
     ・[27032] ひよこ 
   [雑談?]自作ヘッダを ....   
     ・[26777] 組木紙織 
     ・[26778] kaiten 
     ・[26780] たかぎ 
     ・[26782] kaiten 
     ・[26784] たかぎ 
     ・[26785] たかぎ 
     ・[26872] kaiten 
     ・[26875] hoge 
     ・[26878] kaiten 
     ・[26880] たかぎ 
     ・[26996] kaiten 
   はじめまして   
     ・[26992] ロム 
     ・[26994] Dixq (管理人) 
   DrawPolygon3D関数につ ....   
     ・[26933] Dixq (管理人) 
     ・[26993] Libra 
   メイン画面からのサブ ....   
     ・[26958] ムンバ 
     ・[26986] ムンバ 
     ・[26987] つうこうにん 
     ・[26988] つうこうにん 
     ・[26991] ムンバ 
   繰り返し処理について ....   
     ・[26975] Mist 
     ・[26979] non 
     ・[26984] 徳竹 
   構造体と関数   
     ・[26609] Dixq (管理人) 
     ・[26763] BEMANI 
     ・[26764] BEMANI 
     ・[26803] s-rush 
     ・[26804] s-rush 
     ・[26806] 組木紙織 
     ・[26812] BEMANI 
     ・[26836] s-rush 
     ・[26841] BEMANI 
     ・[26863] s-rush 
     ・[26886] BEMANI 
     ・[26887] 組木紙織 
     ・[26972] s-rush 
   交通シミュレーション ....   
     ・[26918] 組木紙織 
     ・[26944] とうや 
     ・[26964] non 
     ・[26966] とうや 
     ・[26967] non 
     ・[26968] Mist 
     ・[26970] non 
     ・[26971] とうや 
   ()判定と計算の方法 ....   
     ・[26805] たいちう 
     ・[26969] 774 
   解決しました   
   はじめまして   
     ・[26924] non 
     ・[26925] バグ 
     ・[26931] Dixq (管理人) 
     ・[26954] 比奈 
     ・[26955] Dixq (管理人) 
     ・[26963] non 
   お礼   
   ファイルの追加につい ....   
     ・[26960] Dixq (管理人) 
     ・[26961] 海老天 
   どこの処理がおかしい ....   
     ・[26888] non 
     ・[26889] バグ 
     ・[26956] ぽにょ 
   TCP/IPの同期??   
     ・[26893] Mist 
     ・[26908] daburi 
     ・[26920] Mist 
     ・[26921] Mist 
     ・[26938] daburi 
     ・[26940] Mist 
     ・[26953] daburi 
   龍神録コードで実行中 ....   
     ・[26927] toyo 
     ・[26928] たかぎ 
     ・[26930] giro 
     ・[26932] Mist 
     ・[26934] 通りすがり 
     ・[26939] 御津凪 
     ・[26941] giro 
     ・[26943] Dixq (管理人) 
     ・[26946] toyo 
     ・[26949] Mist 
     ・[26952] giro 
   プログラムを拡張した ....   
     ・[26937] ibis 
     ・[26951] sasimi 
   参照を返す   
     ・[26945] バグ 
   無題   
     ・[26891] 通りすがり 
     ・[26935] やそ 
   VC2008の変換ウィザー ....   
   HTTP通信のサーバを構 ....   
   DxLibの質問   
     ・[26909] 御津凪 
     ・[26912] 紫苑 
   生年月日による運勢占 ....   
     ・[26898] Dixq (管理人) 
   球の回転について   
     ・[26861] 紅葉 
     ・[26894] 紅葉 

Name: dic  ..中級者(11,209ポイント)   Date: 2009/01/21(水) 04:19   No:27277       
Title: Windowsのメッセージが処理されない    

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, PSTR szCmdLine, int iCmdShow)
{
...
DWORD id;
gH = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)Idle_test, NULL, 0, &id );
gActive = true;

Loop();

...
}

//------------------------
bool Loop()
{
while(gActive) {
if( PeekMessage(&msg, 0, 0, 0, PM_REMOVE) ) {
if( msg.message == WM_QUIT ) {
return false;
}
}
else
{
Sleep(100);
}
}
return true;
}

上記のようにスレッドを作成し、別スレッドでゲームの処理をし、
メインスレッドでは普通のWindowsメッセージを処理しようとしているのですが、
xボタンが効かなかったり、Alt+F4が効かなかったりと Windowsのメッセージが
処理されていないようです
ゲームの処理はうまくいっているのですが、Windowsのメッセージの処理は
どこが悪いのでしょうか?


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


Name: toyo  ..上級者(23,159ポイント)   Date: 2009/01/21(水) 09:15   No:27281     
Title: Re:Windowsのメッセージが処理されない    
×ボタンをクリックして送られるメッセージは
WM_NCLBUTTONDOWN

WM_NCLBUTTONUP
です
素直にDefWindowProc( )関数にメッセージ処理してもらったほうがいいと思います。
処理後はWM_DESTROYでPostQuitMessage( )を呼べばいいでしょう。



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

Name: dic  ..中級者(11,335ポイント)   Date: 2009/01/21(水) 10:03   No:27282     
Title: Re:Windowsのメッセージが処理されない    
ウィンドウメッセージが処理されないというより
指定したウィンドウプロシージャに制御が流れてないのです
ソースを上げておきます
WM_TIMER などもメッセージを受け取ることなく流れていってしまうのです


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

Name: Mist  ..熟練のプログラマー(43,432ポイント)   Date: 2009/01/21(水) 10:16   No:27283     
Title: Re:Windowsのメッセージが処理されない    
ざくっとしか見てないけどPeekMessageでPM_REMOVEを指定しているからメッセージキューからメッセージが消えちゃってるよ。
チェックしたいだけならPM_NOREMOVEでは?


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

Name: toyo  ..上級者(23,301ポイント)   Date: 2009/01/21(水) 10:50   No:27287     
Title: Re:Windowsのメッセージが処理されない    
DefWindowProc( )を呼びたくないなら

while(gActive) {
if( PeekMessage(&msg, 0, 0, 0, PM_REMOVE) ) {
if( msg.message == WM_NCLBUTTONUP ) {
if (msg.wParam == HTCLOSE) {
DestroyWindow(hWnd);
gActive = FALSE;
}
}
}
else
{
Sleep(100);
}
}

で閉じるボタンのクリックが取得できます


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

Name: dic  ..中級者(11,211ポイント)   Date: 2009/01/21(水) 13:18   No:27302     
Title: Re:Windowsのメッセージが処理されない    
>Mistさん
PM_NOREMOVE でも PM_REMOVE でもダメみたいです

>toyoさん
閉じるは処理できますがウィンドウの最大化、最小化、ウィンドウ枠の変更などの処理が
複雑になるのでデフォルトの処理を用いたいのです

回答ありがとうございました


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

Name: toyo  ..上級者(23,431ポイント)   Date: 2009/01/21(水) 14:40   No:27310     
Title: Re:Windowsのメッセージが処理されない    
dicさんのプログラムでは

bool Loop()
{
while(GetMessage(&msg, NULL, 0, 0) ) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return true;
}

にすればいいと思いますよ。


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

Name: toyo  ..上級者(23,486ポイント)   Date: 2009/01/21(水) 14:44   No:27311     
Title: Re:Windowsのメッセージが処理されない    
上の投稿を編集したので削除しました

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

Name: dic  ..中級者(11,273ポイント)   Date: 2009/01/21(水) 17:17   No:27318 解決!     
Title: Re:Windowsのメッセージが処理されない    
>toyoさん
ありがとうございます
無事解決しました


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



Name: バグ  ..ハッカー(143,713ポイント)   Date: 2009/01/21(水) 11:19   No:27293       
Title: VB6.0のRnd関数について    
無理だとは思うんですが…

VB6.0のRnd関数で発生するのと同じパターンで、Javaで乱数を発生させたいのですが、何か方法は無いでしょうか?


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


Name: たいちう  ..上級者(22,225ポイント)   Date: 2009/01/21(水) 12:09   No:27296     
Title: Re:VB6.0のRnd関数について    
無理じゃないかもしれないけど、仮にできたとしても労力に見合わないかも。

1.
VB6の乱数のパターンを確認しましょう。
サービスパックなどによって変更があるかもしれないので、
ターゲットのバージョンも確認して同じ環境を作りましょう。

2.
必要な乱数を発生する最小限の実行ファイルを作ります。
この実行ファイルに余分な要素があると、
その分だけ次のステップが面倒になると思う。

3.
Rndはdllファイルの関数を呼んでいると思いますので、
デバッガで追いかけて、ファイル名と関数名を調べます。
VB6のデバッガでは追えないかもしれません。
その場合は、OllyDbg等のより強力なデバッガを使いましょう。
dllの関数を呼んでいなかった場合は、それに応じた対策を見つけてください。

4.
突き止めた関数をJAVAから呼びます。
直接呼ぶよりも、呼び出すための実行ファイルを用意して
間接的に呼ぶ方が簡単かもしれない。

何のために必要なのかを書けば、より良いアドバイスが得られるかも。
っていうか、板違いじゃね?


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

Name: バグ  ..ハッカー(143,752ポイント)   Date: 2009/01/21(水) 12:50   No:27300     
Title: Re:VB6.0のRnd関数について    
>>たいちうさん
返信ありがとうございます(^-^)

私の書き方がマズかったですね。
知りたい事は、VB6.0のRnd関数のアルゴリズムなんですよ。
何に使うかというと、VB6.0用のアプリを携帯電話用のアプリに移殖するのに必要なんですよ。
同じパターンでないといけないものでして…(^_^;)

VC++と同じかと思っていたら、どうも違うようなんですよね…(VC++のソースはある書籍に載っていました)

どこかで公開とかされているのを知っている、もしくはアルゴリズムを知っているという情報があれば教えていただけないかと思った訳です。

ここの掲示板は言語に関してはそんなに厳密なルールは無かったと思いますが…
まぁ、雑談程度に流しておいてくださいm(__)m


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

Name: Mist  ..熟練のプログラマー(43,697ポイント)   Date: 2009/01/21(水) 13:39   No:27305     
Title: Re:VB6.0のRnd関数について    
これかな?(ソースはCだけど)

http://support.microsoft.com/kb/231847/ja


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

Name: バグ  ..ハッカー(143,772ポイント)   Date: 2009/01/21(水) 13:51   No:27306 解決!     
Title: Re:VB6.0のRnd関数について    
>>Mistさん
ありがとうございました(^-^)
助かりましたm(__)m


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



Name: 土竜谷  ..ぴよぴよ(243ポイント)   Date: 2009/01/20(火) 23:49   No:27253       
Title: 無題。    
はじめまして、土竜谷(もぐらたに)と申します。
授業の総合学習の時間にC++でプログラムを作成することになった、ド級の新人です。

おととい昨日でいろいろとダウンロード、インストールして、DxLib.sinというサンプルプログラムをビルドして動作を確かめるところまできたのですが、
エラー 1 error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。 LIBCMTD.lib
エラー 2 fatal error LNK1120: 外部参照 1 が未解決です。 .\Debug/DxLib.exe
と表示され、うまくいきません。
書き加えたり変更したり、説明通りにやったつもりですが・・・

何か足りないのでしょうか?
分かる方がいらっしゃいましたら、ご教授願いますm(_ _)m

ちなみに、2005 Express Editionです。
うちのWindows2000は、最新版に対応していないようでしたので。


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


Name: Dixq (管理人) [URL]  ..伝説なるハッカー(960,575ポイント)   Date: 2009/01/21(水) 00:04   No:27256     
Title: Re:無題。    
そのコンパイルに使ったプログラムはどれですか?

DxLib.sinというサンプルプログラムということですが、
そのプログラムがどれかわかりません。


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

Name: 土竜谷  ..ぴよぴよ(271ポイント)   Date: 2009/01/21(水) 00:14   No:27260     
Title: Re:無題。    
DxLib_VCのサンプルプログラム実行用フォルダの中にあるものです。

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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(961,327ポイント)   Date: 2009/01/21(水) 00:19   No:27262     
Title: Re:無題。    
DxLib.sinじゃなく、DxLib.slnだと思いますが、これはC言語のサンプルプログラムではないです。
これはプロジェクトファイルなので、これをダブルクリックしたら表示されるプログラムがサンプルプログラムです。
VC++がインストールされているならこのファイルをダブルクリックしたら開けるはずです。

とりあえずソースコードが

#include

から始まっていることを確認してください。


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

Name: 土竜谷  ..ぴよぴよ(128ポイント)   Date: 2009/01/21(水) 01:06   No:27265     
Title: Re:無題。    
とりあえず、#includeから始まっているものをやってみました。

一番基本的なものはうまくいきましたが、「ウインドウモードに変更」などの文字が入るとうまくいかないようです。
まだ何か足りないんでしょうか?

参照設定の、参照の検索パスというところが未入力ですが、関係あるんでしょうか?


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(961,669ポイント)   Date: 2009/01/21(水) 01:31   No:27268     
Title: Re:無題。    
>一番基本的なものはうまくいきましたが、「ウインドウモードに変更」などの文字が入るとうまくいかないようです。

意味がよくわからないです。
「うまくいかない」という表現は大抵具体的にどうなったのかよくわからないので、
「何をしたらどうなった」と具体的に教えてもらえるとありがたいです。
コンパイルエラーになるのか、
ウィンドウが表示されてすぐ閉じてしまうのか、
何か他のトラブルなのか・・。

とりあえずどのプログラムを実行してどうなったのでしょうか?


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

Name: 土竜谷  ..ぴよぴよ(149ポイント)   Date: 2009/01/21(水) 01:56   No:27273     
Title: Re:無題。    
ゲームプログラミングの館にある、
#include "DxLib.h"

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



WaitKey() ;
DxLib_End() ;
return 0 ;
}
↑をコンパイルすると、ちゃんと真っ黒の画面が出るんですが、
「ウインドウモードに変更」などの文字が入った方をコンパイルすると、
f:\include\mmreg.h : warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
となり、何の画面も出ないままビルドが終わってしまいます。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(962,216ポイント)   Date: 2009/01/21(水) 02:55   No:27276     
Title: Re:無題。    
その「ウィンドウモードに変更などの文字」が一番知りたかったのですが、
コメントアウトしてあるなら行の最後に??/などのトライグラフでもない限り大丈夫です。

あと、その警告はエラーではありません。
警告なので、コンパイルは完了しています。

ではためしにゲームプログラミングの館13章のプログラムを実行してみて下さい。


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



Name: ジャグラー  ..ぴよぴよ(338ポイント)   Date: 2009/01/20(火) 23:28   No:27249       
Title: あたり判定について    
はじめまして、ジャグラーと申します。

ゲームプログラミングの館を見てC++を導入し、いまWriteCirclegameのようなものを作ろうとプログラムをしています。
一応紹介ページを載せておきます。
ttp://www.vector.co.jp/magazine/softnews/010317/n0103171.html

このゲームにおけるあたり判定を行う際に、私はflg[480][480]という大きな配列を取ってすべてのビットにおいてあたり判定を行っています。

たとえば
まずflg配列をすべて0に初期化しておいて、線が通ったビット位置に対応するflg配列をすべて1にセットしていきます。
線が1ビット移動するたびに自分のいる位置のflgをチェックして、1ではなかったらflgを1にセットという具合です。
逆にflgが1だったらぶつかったことになるのでゲームオーバーです。

ですが、これだと無駄が多いと感じています。
配列を動的にとるというやり方もありますがC++でのやり方がわかりません。

どうすると効率のよいあたり判定を作ることができるでしょうか?


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


Name: Dixq (管理人) [URL]  ..伝説なるハッカー(960,511ポイント)   Date: 2009/01/20(火) 23:58   No:27254     
Title: Re:あたり判定について    
いや、そのやり方でもわかりやすくていいんじゃないかと思いますよ。
20万個BYTE型の要素を用意しても0.2MBですし。
数が多くても当たり判定の計算は今いる位置を調べたらいいだけだから問題ないと思います。
もし「誰が通ったか」じゃなく純粋に「通ったか」だけの情報でよければ更にその1/8のデータ量で済みます。

あと、こんなのも使えます。
先日のDXライブラリのバージョンアップでこんな関数が増えました。

http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html
「ドット単位で画像にアクセスしたい関係」

今まさにモニタに反映しようとしている画面の画像データに直接アクセスが出来る関数です。
例えば背景が黒で、通ったところを赤で表示しているのならこれを調べてやることでそこが通ったところかどうかわかります。
ただ、毎回画面を書き換えるなら通った場所のデータを保存しておかないと、ややこしいですよね。
ん〜やっぱ最初の方法でいいと思います。


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

Name: ジャグラー  ..ぴよぴよ(806ポイント)   Date: 2009/01/21(水) 00:40   No:27263 解決!     
Title: Re:あたり判定について    
素早い回答ありがとうございます。

確かにこのやり方でも容量はたいしてとらないから大丈夫だろうなぁと思ったんですが、配列を
flg[480][640]とウィンドウサイズに合わせてとるとなぜかセグメントエラー(?)が起きたんです。
だから容量とりすぎてダメなのかなぁと思ったので質問させてもらったのです・・・が・・・

いま上の配列を取ってやってみたらなぜかエラーでませんでしたw

うーん、なぜ前はエラーが起きたのだろう、他のところで間違えていたのかな。
ありがとうございました、問題が解決できました!


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(961,536ポイント)   Date: 2009/01/21(水) 00:43   No:27264     
Title: Re:あたり判定について    

あぁローカル変数は容量に制限があるんですよ。
静的変数にするか、グローバル変数にすればいいです。

つまり・・


int main(){
BYTE flag[600][600];


}

みたいに書いてるんじゃないかとおもいます。これを

int main(){
static BYTE flag[600][600];


}

こうするか

BYTE flag[600][600];
int main(){


}

こうすればエラーが出なくなると思います。
 


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

Name: ジャグラー  ..かけだし(1,024ポイント)   Date: 2009/01/21(水) 01:31   No:27267     
Title: Re:あたり判定について    
なるほど、作り始めた時はすべての処理をmain関数で行っていましたがプログラムを発展させるために
処理を複数の関数に分けて作り直していました。
そのさい、最初はローカル変数として置いていたflgをグローバルに変更していたのでエラーがなくなったのですね。

staticにしても制限がなくなるということは、すぐに消えてしまうかもしれないデータ(ローカル変数)にたくさん容量をとってられないよ!ということですか。
ようやく謎が解けました。

本当に素早い回答ありがとうございます!非常に助かりました。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(962,107ポイント)   Date: 2009/01/21(水) 01:42   No:27271     
Title: Re:あたり判定について    
スタックサイズはデフォルトで1Mだったと思います。
640*480でスタックサイズオーバーになるということは、配列をint型で作っているのではないでしょうか?
int型は2の32乗まで数えられますが、意味がないですよね。
256まで数えられるchar型で十分だと思います。
もっと言えば、1ビット単位でフラグ立てるなら

char flag[480][640/8];

でいけると思います。
char型は8バイトですから、最大8個のフラグ管理が出来ますよね。

まぁそうするとプログラムが少々ややこしくなるので、
最初は普通にcharで[480][640]で作るといいと思います。


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

Name: ジャグラー  ..かけだし(1,260ポイント)   Date: 2009/01/21(水) 02:13   No:27274     
Title: Re:あたり判定について    
確かにint型にしていました。これだとサイズだけ大きくて無駄ですね。

char型が8バイトと書かれていますが8ビットの間違いでしょうか?
1ビットずつでフラグ管理をすればかなり効率的になりますね。
すでに簡単なゲームとしてはできあがったのでいろいろ新しい機能、条件などを追加したらこの方法によるフラグ管理もやってみたいと思います。

細かいご指摘ありがとうございます。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(962,155ポイント)   Date: 2009/01/21(水) 02:52   No:27275     
Title: Re:あたり判定について    
あ、すみません、8ビットです。

ではでは制作がんばって下さい。


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



Name: ひよこ  ..中級者(9,933ポイント)   Date: 2009/01/19(月) 21:32   No:27176       
Title: シューティングゲームの館について    
新しくなったシューティングゲームの館(http://dixq.net/s/0.html)の
0. 素材(画像と音声)のダウンロードでファイルが見つかりませんってダウンロードできません。



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


Name: JT  ..ぴよぴよ(400ポイント)   Date: 2009/01/20(火) 10:31   No:27190     
Title: Re:シューティングゲームの館について    
掲載するのをやめたんでしょう

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

Name: toyo  ..上級者(23,074ポイント)   Date: 2009/01/20(火) 13:39   No:27200     
Title: Re:シューティングゲームの館について    
「ソースとプロジェクトのダウンロード」に入っているのでこちらをダウンロードされたらいいですよ
解凍した中にあるShフォルダがそれです。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(957,396ポイント)   Date: 2009/01/20(火) 13:40   No:27201     
Title: Re:シューティングゲームの館について    
あ、リンク切れてますね。
シューティングの館には「ソースとプロジェクトのダウンロード」ってありますよね?
あれDLして解凍すると「Sh」ってフォルダありますんで、それ使ってください。

ただシューティングの館はもう消して、龍神録の館に移行したいと思っているので、
出来れば龍神録の館の方をごらんいただけると幸いです。


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

Name: array [URL]  ..熟練のプログラマー(46,060ポイント)   Date: 2009/01/20(火) 16:39   No:27226     
Title: Re:シューティングゲームの館について    
個人的にシューティングの館は今後も残してほしいです
シューティングの館はプログラミング知識も経験もない私にも理解できた・・・。
多分、基礎的な文法しか使ってなかったからだと思いますが。初心者に優しいサイトだと思います。

龍神録の館も基礎から解説されてますが、関数ポインタ(?)とかアロー演算とか、ファイル読み込みとか(1度覚えれば楽ですけど)、プログラミング初めての人には、ひとつの章に対して学ぶ量が多い気がします。

私はシューティングの館→龍神録の館がベストだと思いますよ。


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

Name:  ..上級者(16,789ポイント)   Date: 2009/01/20(火) 18:24   No:27235     
Title: Re:シューティングゲームの館について    
私もシューティングの館は出来る事なら残しておいてほしいです。

龍神録の館に比べれば色々と効率が悪かったりするのかもしれませんが、その分やはり分かりやすいです。
それこそプログラミング歴一ヶ月ぐらいならシューティングゲームの館がちょうど理解出来るくらいの範囲だと思います。
あと内容も龍神録の館より少ないので、ソースコードの全体を把握しやすく、改造もしやすいなぁと個人的に思いました。
それと、これはほぼ個人的な問ではありますが、数学・物理が苦手の私には龍神録の館の数学・物理関係が難しいですね^^;
シューティングゲームの館はとりあえず三角関数が分かれば問題ないので。。。

……とは言っても私はまだ当時龍神録の館がなかった身ですので、やはり龍神録の館から始めた方がいいのかな? とも思いますが^^;
でもやはり手軽にということを考えると残しておいてほしいとは思います。
シューティングゲームの館でやったことが龍神録の館ではどのように効率化されているのか? というのを比べたり自分で考えるのもなかなか勉強になると思います。

色々書きましたが、結果的に言いたい事は色々お忙しそうですが体調に気をつけて頑張ってくださいということです(ぇ


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(960,752ポイント)   Date: 2009/01/21(水) 00:08   No:27259     
Title: Re:シューティングゲームの館について    
皆さんありがたいお言葉感謝します><

そうですねぇ、やそさんにも閉鎖は反対されましたし、残しておきますか^^;
最初から色んなものが黒歴史になることはわかってましたし、既に後から見たらこのHPの存在自体が黒歴史かもしれませんしw

非効率なだけならいいんですが、間違いがあるんですよねぇ;
しかも途中で終わってるし^^;
まぁプログラム入門者の方が味見するようなサンプルってことにしておきましょう!




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



Name: ひよこ  ..中級者(10,378ポイント)   Date: 2009/01/20(火) 20:42   No:27239       
Title: DXライブラリのジャンプのプログラム    
DXライブラリのジャンプのプログラムでゲームプログラムの館の知識で
ソースを少し変えてみたのですが左にも右にも、ジャンプもできません。どうすればいいでしょうか。

// ジャンプ
#include "DxLib.h"
int PlayerX , PlayerY ;
int JumpPower ;
int PlayerGraph ;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
ChangeWindowMode(TRUE);
if (DxLib_Init() == -1) return -1;

char Key[256];
SetGraphMode( 640 , 480 , 16 ) ;
// 描画先画面を裏画面にセット
SetDrawScreen( DX_SCREEN_BACK ) ;
// グラフィックのロード
PlayerGraph = LoadGraph( "Player.bmp" ) ;

// キャラクターの初期データをセット
PlayerX = 0 ;
PlayerY = 0 ;
JumpPower = 0 ;

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

if (Key[KEY_INPUT_A]== 1) PlayerY -= 3; // 上を押していたら上に進む
if (Key[KEY_INPUT_B]== 1) PlayerY += 3 ; // 下を押していたら下に進む
if (Key[KEY_INPUT_C]== 1) PlayerX += 3 ; // 右を押していたら右に進む
if (Key[KEY_INPUT_D]== 1) PlayerX -= 3 ; // 左を押していたら左に進む

// 落下処理
PlayerY -= JumpPower ;

// 落下加速度を加える
JumpPower -= 1 ;

// もし地面についていたら止まる
if( PlayerY > 300 )
{
PlayerY = 300 ;
JumpPower = 0 ;
}

// ジャンプボタンを押していて、地面についていたらジャンプ
if ((Key[KEY_INPUT_A]==1) && PlayerY == 300 ) JumpPower = 20 ;

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

// プレイヤーを描画する
DrawGraph( PlayerX , PlayerY , PlayerGraph , TRUE ) ;

// 裏画面の内容を表画面に反映させる
ScreenFlip() ;
}

DxLib_End() ; // DXライブラリ使用の終了処理

return 0 ; // ソフトの終了

}


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


Name: BEMANI  ..入門者(4,609ポイント)   Date: 2009/01/20(火) 21:25   No:27240     
Title: Re:DXライブラリのジャンプのプログラム    

>if (Key[KEY_INPUT_A]== 1) PlayerY -= 3; // 上を押していたら上に進む

この部分を

>PlayerY -= 3; // 上を押していたら上に進む

こう変えると画像自体は動きますか?


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

Name: Mikan  ..かけだし(1,527ポイント)   Date: 2009/01/20(火) 21:56   No:27241     
Title: Re:DXライブラリのジャンプのプログラム    
GetHitKeyStateAll関数が入っていないので、

char Key[256];

は宣言した状態のまま中身は何も変更されていません。


char Key[ 256 ] ; //キーの押下状態を格納する変数

GetHitKeyStateAll( Key ) ;  //すべてのキーの押下状態を格納


上記の処理をしたあとで、

if (Key[KEY_INPUT_A]== 1) PlayerY -= 3; // 上を押していたら上に進む

とキーが押下状態にあるかどうかを判断し、処理をさせます。


ちなみに、

CheckHitKey( KEY_INPUT_ESCAPE ) は、

そのとき指定したキーが押下状態にあるかどうかだけ調べるだけで、

Keyの中には情報を何も残しません。

詳しくはDxLib本家のリファレンスを参照ください

http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_input.html#R5N28



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

Name: ひよこ  ..中級者(10,457ポイント)   Date: 2009/01/20(火) 22:37   No:27246 解決!     
Title: Re:DXライブラリのジャンプのプログラム    
回答ありがとうございます。GetHitKeyStateAllを見たら忘れてたなって思いました。
プログラムがちゃんと動きました。回答してくださったBEMANIさん、Mikanさん、本当にありがとうございました。


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



Name: s-rush  ..上級者(15,246ポイント)   Date: 2009/01/18(日) 19:15   No:27071       
Title: 分割グラフィックの格納    
いつもお世話になってます。
もうご存知の方が多いかと思いますが今私はポケモンのゲームを作ってます。

ゲームプログラミングの館で第17章にある”画像を分割して読み込む”というものがあったと思います。

その章を参考にして構造体の初期化の際にメンバ内に保存したいのですが、
どのようにすれば分からないんです。


typedef struct{
int number;
char name[32];
int type1;
int type2;
int image[4]; //画像イメージ

//各ステータスの種族値
int hp;
int atk;
int def;
int t_atk;
int t_def;
int speed;

//覚える技
int lv_skill[20]; //熟練度で覚える技
int secret_skill[7]; //秘伝マシンで覚える技
}poke_tag;

/*構造体宣言および初期化*/
poke_tag poke[492]={
{1,"フシギダネ",5,0,/*ここに画像イメージを格納*/,(略)},
(略)
};




画像イメージは64X64なので、(画像を添付しておきます)
LoadDivGraph( "../data/img/pokemon/フシギダネ.png" , 4 , 2 , 2 , 64 , 64 , image ) ;
というような処理をどこかに組み込めばいいと思うのですが・・・

開発環境はVC++ 2008 EEです。


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


Name: Justy  ..伝説なるハッカー(310,780ポイント)   Date: 2009/01/18(日) 20:32   No:27089     
Title: Re:分割グラフィックの格納    

>その章を参考にして構造体の初期化の際にメンバ内に保存したいのですが

 宣言と同時に初期化をする場合の話ですか?
 
 であれば、結論から言えば、いろいろややこしい問題が付きまといますが、
出来なくはないです。

 例えばこんな風に。

struct poke_tag
{
    poke_tag(int number_, const char *name_, int type1_, int type2_, const char *image_path,
            int hp_, int atk_, int def_, int t_atk_, int t_def_, int speed_)
        : number(number_), type1(type1_), type2(type2_),
            hp(hp_), atk(atk_), def(def_), t_atk(t_atk_), t_def(t_def_), speed_(speed_)
    {
        strcpy(name, name_);
        LoadDivGraph(image_path, 4, 2, 2, 64, 64, image) ;
    }

    int number;
    char name[32];
    int type1;
    int type2;
    int image[4];   //画像イメージ

    //各ステータスの種族値
    int hp;
    int atk;
    int def;
    int t_atk;
    int t_def;
    int speed;
};

poke_tag poke[]={
    poke_tag(1,"フシギダネ",5,0, "../data/img/pokemon/フシギダネ1.png", 100, 50, 20, 10, 5, 25),
    poke_tag(2,"??",5,0, "../data/img/pokemon/フシギダネ2.png", 100, 50, 20, 10, 5, 25),
};

 但し、LoadDivGraph()は DxLib_Init()されていることが前提となりますので、
poke配列が初期化される前に DxLib_Init()を呼ばなければなりません。

 これさえクリアできれば、上記の方法で可能です。


※ 後から別途ロード(LoadDivGraph)するではダメなのでしょうか?


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

Name: s-rush  ..上級者(15,523ポイント)   Date: 2009/01/18(日) 22:07   No:27095     
Title: Re:分割グラフィックの格納    
>後から別途ロード(LoadDivGraph)するではダメなのでしょうか?
というのは、どのようにすればよいのでしょうか?

poke[492]のグローバル変数(になるんでしょうか?)に
初期化するというかロードする関数
たとえば

void load_image(){
/*画像保存変数*/
int image1;
int image2;
(略)
int image492;
/*画像のロード*/
LoadDivGraph( "../data/img/pokemon/フシギダネ.png" , 4 , 2 , 2 , 64 , 64 , image1 ) ;
LoadDivGraph( "../data/img/pokemon/フシギソウ.png" , 4 , 2 , 2 , 64 , 64 , image2 ) ;
(略)
}

みたいな関数(即興で作ったものなので、エラーやおかしい部分もあると思いますが)
を作って、ゲーム起動時に読み込む
という形でいいんでしょうか?


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

Name: Justy  ..伝説なるハッカー(310,870ポイント)   Date: 2009/01/18(日) 22:27   No:27096     
Title: Re:分割グラフィックの格納    

>みたいな関数を作って、ゲーム起動時に読み込む

 (関数はちょっとおかしいですが)そうですね。
 最初は 0とか -1とかで初期化しておいて、必要になった段階で読み込みを
行えばいいかと思います。


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

Name: s-rush  ..上級者(15,713ポイント)   Date: 2009/01/18(日) 22:58   No:27097     
Title: Re:分割グラフィックの格納    
でも全部で500弱とあるのですが、もっと楽に書く方法はないでしょうか?
for文で
image[4][492]の中に画像をロードしたいと思うのですが、
ファイル名を個々に指定しないといけないような気がするのですが・・・

>最初は 0とか -1とかで初期化しておいて、必要になった段階で読み込みを行えばいいかと思います。
ということもよく分からないので、よろしければもう少し詳しく教えていただけませんか?


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

Name: Justy  ..伝説なるハッカー(311,178ポイント)   Date: 2009/01/18(日) 23:26   No:27098     
Title: Re:分割グラフィックの格納    

>でも全部で500弱とあるのですが、もっと楽に書く方法はないでしょうか?

 poke[n]の nに依存するファイル名にすれば解決しませんか?
 つまり、

    for(int n=0; n<492; ++n)
    {
        char path[0x80];
        sprintf(path, "%s%03d%s", "../data/img/pokemon/poke_", n, ".png");
        LoadDivGraph(path, 4, 2, 2, 64, 64, poke[n].image);
    }

 とか。(09/01/19 00:03 修正)


 これで、"poke_000.png"、"poke_001.png"、と連番でロードを行うことが出来ます。



>>最初は 0とか -1とかで初期化しておいて、必要になった段階で読み込みを行えばいいかと思います
>ということもよく分からないので、よろしければもう少し詳しく教えていただけませんか?

 要するに、とりあえず最初の宣言時の初期化の段階では、 image[n]は 0とか -1とか
無効な画像ハンドルにしておいて実際に画像が必要になった段階で、読み込みを行えばいい、
ということですね。

 読み込むタイミングとしては……ゲームの規模とかシステムとか判らないので、
最適かどうかはわかりませんが、ゲーム本編が始まる直前あたりで、ロードすれば
いいかと思います。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(955,510ポイント)   Date: 2009/01/18(日) 23:37   No:27099     
Title: Re:分割グラフィックの格納    
500個も画像を使うんですか?
その配列を見ると、2000個もロードすることも?

画像を分割してロードするならファイル名を個々に指定しないといけないことは無いですが、
そうではなく、500個の画像ファイルからロードしたいなら、
連番のファイル名にし、カウンタとsprintfで文字列作ればループ文で読み込めます。

しかし500個も画像が必要なことってあるんでしょうか?
そちらを見直したほうがよさそうな気がします。

今ふと思ったのですが、解らないのは、一つの配列の異なる部分に画像を分割して複数の画像を読み込みたいんでしょうか?
例えば
[0]〜[9]にはファイル1を10個に分割した画像を、
[10]〜[24]にはファイル2を15個に分割した画像を、、、、
みたいな感じで?
そうではなく?


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(955,562ポイント)   Date: 2009/01/18(日) 23:39   No:27100     
Title: Re:分割グラフィックの格納    
う、、被ってすみません^^;
この掲示板書いてる途中に投稿があったら何か通知されるシステムほしいな・・。


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

Name: kazuoni [URL]  ..熟練のプログラマー(50,115ポイント)   Date: 2009/01/18(日) 23:49   No:27101     
Title: Re:分割グラフィックの格納    
>char path[0x80]; 

>sprintf("%s%03d%s", "../data/img/pokemon/poke_", n, ".png");

こんな使い方できるのですか^^;
いやー、ビット演算系勉強しないとなぁ・・・。

管理人さんのおっしゃる通り、一気に500×4も不必要かなぁって思います。
出るんだかどうかわかんないような(○ュウ)ポケモンをずーっと読み込みっぱなしは
ちょっともったいないですね。
せめて○×タウンの周辺で出現するモンスターを
ロードするなら分かりますが。


>この掲示板書いてる途中に投稿があったら何か通知されるシステムほしいな・・。
自分は投稿前に新しいタブ開いて確認してますw


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(955,577ポイント)   Date: 2009/01/18(日) 23:58   No:27102     
Title: Re:分割グラフィックの格納    
>>Justyさん
あれ、sprintfの第一引数はpathではなくて、、、ですか?

>>kazuoniさん
これはビット演算とは関係無いのでは?

>タブ
そうすべきですね^^;


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

Name: Justy  ..伝説なるハッカー(311,263ポイント)   Date: 2009/01/19(月) 00:02   No:27103     
Title: Re:分割グラフィックの格納    

>あれ、sprintfの第一引数はpathではなくて、、、ですか?

 あー、ありがとうございます。
 直しておきます。


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

Name: s-rush  ..上級者(15,946ポイント)   Date: 2009/01/19(月) 00:07   No:27105     
Title: Re:分割グラフィックの格納    
kazuoniさんのおっしゃる通り、○×タウンの周辺で出現するモンスターをロードする、
ということも考えてはみたのですが、アルゴリズムが思い浮かばなかったので^^;

なので、管理人さんのおっしゃる通り、瞬間的?には2000も正直必要はないと思います。

それに
poke[0]にフシギダネの画像をロード
poke[1]にフシギソウの画像をロード
poke[2]にフシギバナの画像をロード

という形で、はじめに初期化しておけばエンカウントした時や、バトルシーンに突入した時など
処理が簡単になるのでは?
と思ったので、一気にロードしてみようと考えただけです。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(955,487ポイント)   Date: 2009/01/19(月) 00:08   No:27106     
Title: Re:分割グラフィックの格納    
>>Justyさん
>>あれ、sprintfの第一引数はpathではなくて、、、ですか?

>? あれ?
>合ってませんか?


あら?今直されたんじゃなくてですか?
先ほどは

あー、ですね。
直しておきます。

と書いていらっしゃいませんでした??


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(955,517ポイント)   Date: 2009/01/19(月) 00:10   No:27109     
Title: Re:分割グラフィックの格納    
あら、何か誤解があったようですね^^;
ちょっと時間を置いてから投稿するようにします;


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

Name: Justy  ..伝説なるハッカー(311,293ポイント)   Date: 2009/01/19(月) 00:10   No:27110     
Title: Re:分割グラフィックの格納    
> と書いていらっしゃいませんでした??
 すみません、ソース見て修正しているうちに、間違えた箇所を修正してしまったりと
ちょっと混乱してしまって。

 結局間違っていたので、修正しました。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(955,698ポイント)   Date: 2009/01/19(月) 00:14   No:27112     
Title: Re:分割グラフィックの格納    
>>Justyさん

あぁ、そうでしたか。
今までミス記述されたのはほとんど見たことが無いので、
何か複雑な方法で出来るのかと思ってました^^;

>>s-rushさん

多分2000個も同時にロードしたらロード時間がすごくながくなって、
使用メモリもかなりの量になってしまう気がします。
やはりある程度量が多くなったら必要ない画像は読み込まないアルゴリズムを考える必要がありそうです。
一度タスクマネージャーのプロセスでどれ位メモリ食ってるかみてみてはどうでしょう?


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

Name: kazuoni [URL]  ..熟練のプログラマー(50,201ポイント)   Date: 2009/01/19(月) 00:29   No:27115     
Title: Re:分割グラフィックの格納    
アルゴリズムでなくても外部から読み込めば
すぐにできてしまいそうですが。
マップのある出口を出たら次のタウンに行くと共に、
モンスターの更新なんて感じですかね。
そのとき以前のモンスターグラフィックは削除。
常にロードされているのは自分のパーティにいるモンスターだけでいいんじゃないですか?




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

Name: Justy  ..伝説なるハッカー(311,325ポイント)   Date: 2009/01/19(月) 00:29   No:27116     
Title: Re:分割グラフィックの格納    

# Dixq (管理人) さん
>何か複雑な方法で出来るのかと思ってました^^;

 申し訳ないです。
 あわてるとダメですね。
 つい間違ったところを直してしまったりすると、何度修正してもうまく行かなかったり・・・。
 
 修正時にプレビューがあるといいですね。



> この掲示板書いてる途中に投稿があったら何か通知されるシステムほしいな・・。

 あれ? 来ないですか?
 てっきり Dixqさんの方にメールが飛んでいるものだと思っていました。



# s-rushさん
>はじめに初期化しておけばエンカウントした時や、バトルシーンに突入した時など
処理が簡単になるのでは?

 処理は簡単になりますけど、やっぱり Dixqさんが仰っているように
ロード時間が気になるかもしれませんね。

 仮にロードに10秒かかったすると、ユーザーがその時間待たされるというのもありますが、
デバッグの際にテストで実行するたびに10秒待たされるということでもあるので
結構苦痛になるような気がします。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(956,024ポイント)   Date: 2009/01/19(月) 00:45   No:27119     
Title: Re:分割グラフィックの格納    
> あれ? 来ないですか?
> てっきり Dixqさんの方にメールが飛んでいるものだと思っていました。

あ、来るんですが、一日にこれだけ投稿があるので、通知されるメルアドは普段使わないそれ専用のものにわけてあります。
そうでないと、通知で埋まってしまうので^^;
なので、必要がある時にログインしてメールを見ることは出来るのですが、
投稿されたかどうかはわからないのです。
昔は携帯に転送してたんですが、
すぐ受信ボックスが埋まることや寝てる時や授業中でも投稿通知が来てしまうなど、問題があるのでやめました^^;


> データのロード

ロード関連はいろいろ悩みますよねぇ・・。
単純にはマルチスレッド化しても意味の無いDXライブラリの読み込み関数ですが、
いろいろと工夫してマルチスレッドするとか、そうすると同期の問題どうするかとか・・。
まぁポケモン程度ならその画面ごとに区切ってデータのロード&削除してもいいと思いますよ。
ロードの瞬間画面が止まってしまいますが、画面が切り替わる瞬間など、一瞬でいいので、戦闘突入の音楽を流したまま画面が真っ暗になる瞬間を作り、そこで読み込んだりすれば
画面が一瞬とまってもわからないので、そういう工夫をすればいいと思います。

音楽はロード中も途切れないので、こうすることで、黒い画面がコンマ何秒かあっても演出の一つに見えると思います。


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

Name: Justy  ..伝説なるハッカー(311,429ポイント)   Date: 2009/01/19(月) 02:36   No:27127     
Title: Re:分割グラフィックの格納    

>必要がある時にログインしてメールを見ることは出来るのですが、
>投稿されたかどうかはわからないのです

 あー、そうだったんですか。
 納得です。


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

Name: BEMANI  ..入門者(2,974ポイント)   Date: 2009/01/19(月) 19:41   No:27169     
Title: Re:分割グラフィックの格納    
例えば、出現ポケモン格納構造体みたいなのを仮に10個分程作成して
マサラ周辺でコラッタ・ポッポなどのポケモンデータを入れておき、
トキワ周辺になったらビードル・キャタピー等のデータに
オツキミヤマでズバットやイシツブテ・・・などのデータに上書きするとか。
そしたら、必要な場所で必要なポケモンデータのロードになるのではないかなーと。
こうしておけば、最大で10匹のポケモンのデータを読み込むだけで済みそうです。

技全部を構造体にまとめているということでしたので
もしかしたらポケモンも全部まとめてるのではないかなーと思い
こんな方法ですが思いつきました。

余談ですが、
さらにロードする時に連番で読み込みできるようにしていたり、
ポケモン図鑑の番号と一緒にしておくと後々便利になるかもしれません。


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

Name: s-rush  ..上級者(15,964ポイント)   Date: 2009/01/19(月) 21:15   No:27175     
Title: Re:分割グラフィックの格納    
やっぱり2000ものデータをロードするのは時間がかかりますか・・・
管理人さんのおっしゃる通り、メモリもだいぶ多く使用するみたいでした^^;

他に少なくともフィールド上に出現するトレーナー(人)のためにもロードする必要がありそうですし。

kazuoniさんやBEMANIさんのおっしゃるようにマップの切り替え時に
再ロードするような処理に挑戦してみようと思います。
(マップの切り替え処理をどのようにすればよいのかいまいち分からないですが^^;)

>char path[0x80];
>sprintf(path, "%s%03d%s", "../data/img/pokemon/poke_", n, ".png");
の処理の解説をお願いしてよろしいですか?
2つ目の処理は何となくわかるのですが、1つ目の”0x80”という部分が分からないです^^;


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

Name: BEMANI  ..入門者(3,109ポイント)   Date: 2009/01/19(月) 22:03   No:27177     
Title: Re:分割グラフィックの格納    
さすがに2000個ものファイルをロードするのはやめた方がいいですね;

>char path[0x80];
0xと付くものは16進数です。
普段私たちが使っている数字は10進数です。(0〜9で10になる時に桁上がりする)
16進数は16になった時に桁上がりするものです。

0x80は10進数で128と同じです。

128は(100の位*1 + 10の位*2 + 1の位*8)とそれぞれの桁がいくつ集まっているかということですよね。
0x80も同じで16進数でということですので(16の位*8 + 1の位*0)で128ということになります。
よって、path[128]と同じです。

もしお暇なら、
printf("%d", 0x80); とやってみるか、
printf("%x", 128); とやってみるかしてみて下さい^^
%dは10進数・%xは16進数です。


>sprintf(path, "%s%03d%s", "../data/img/pokemon/poke_", n, ".png");
仮に、「n」に1が入っていたとしますと、
../data/img/pokemon/poke_001.png と表示されます。
%sは文字列。
%03dではそれぞれ、「0」は0の付加・「3」は桁数・「d」は符号付きの10進数(整数)です。
nが5の場合../data/img/pokemon/poke_005.pngと表示されます。

それをpathに入れるという感じです。


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

Name: s-rush  ..上級者(16,093ポイント)   Date: 2009/01/20(火) 11:27   No:27196     
Title: Re:分割グラフィックの格納    
BEMANIさん、解説ありがとうございます。
%xで16進表記ということは知っていたのですが、
0xをつけることで16進数扱いになるということは知りませんでした^^;

となると、ファイル名を001.pngというように変えておかないといけないですね。

ちなみにロードする数が400くらいなら許容範囲ですかね?


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(957,504ポイント)   Date: 2009/01/20(火) 13:45   No:27204     
Title: Re:分割グラフィックの格納    
400でも多いのでは・・。
ただ、細かいマップチップや、キャラチップになると、どうしても数が多くなると思うので、
そういうので増えているのはいいと思います。
なので、どういう画像かによると思います。

もし全部の敵を読み込むとかだったら必要な敵だけ読み込んだほうがいいと思います。

400個ロードしたときの使用メモリはいくつになってます?


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

Name: BEMANI  ..入門者(4,271ポイント)   Date: 2009/01/20(火) 16:49   No:27228     
Title: Re:分割グラフィックの格納    
>となると、ファイル名を001.pngというように変えておかないといけないですね。
この001という数字を手当たり次第・適当に使うのではなく、
ポケモン図鑑の番号とリンクさせておくと後々便利になるかもしれません。
001 フシギダネ
002 フシギソウ



151 ミュウ


>ちなみにロードする数が400くらいなら許容範囲ですかね?
管理人さんが仰る通り、何を読み込むかによりますが、
ポケモンの画像を400読み込むというのであればかなり多いと思われます。
多分100でも多いかと;


画像をロード・・・というわけではないですが、
マップによってポケモンの名前を表示するサンプルプログラムを添付してみました。
マップが変わったら、その都度「PokeData[要素数]」を上書き(更新)しています。

こうすることで、一気に画像を読み込む必要がなくなります。
(はじめてファイルを投稿するので失敗していたらごめんなさい;)


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

Name: s-rush  ..上級者(16,253ポイント)   Date: 2009/01/20(火) 16:55   No:27229     
Title: Re:分割グラフィックの格納    
どこを見ればよいのかわからないですけど、
タスクマネージャで見てみるとこんな感じでした。
物理メモリ
合計 2044
キャッシュ済み 1106
空きメモリ 5

カーネルメモリ
合計 231
ページ 159
非ページ 72

ただ400もグラフィックを製作済みというわけではないので10個ロードで試してみました。

キャラチップやマップチップは16X16なので、使用するメモリはもうちょっと少なくなると
思うのですが・・・


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



Name: レモン  ..ぴよぴよ(384ポイント)   Date: 2009/01/20(火) 14:28   No:27209       
Title: 行列の積について    
行列の積を計算するプログラムを作っています。
A*B=Cの行列を計算するプログラムを書いたのですが、Cの値がすべて0になってしまいます。
Cの値を出すためにはどこを直したら良いのか教えていただきたいです。

C言語の知識は授業で行列式の表し方を習ったぐらいで、計算式の方は本から引用しています。
コンパイルはできました。



#include <stdio.h>

main()
{
int l,m,n,i,j,k;
double a[20][20];
double b[20][20];
double c[20][20];//配列の定義

printf("A-Row = ");
fflush(stdout);
scanf("%d",&l);
printf("A-Column B-Row = ");
fflush(stdout);
scanf("%d",&m);
printf("B-Column = ");
fflush(stdout);
scanf("%d",&n);

printf("\n");

for(i=0;i<l;i++)
{
for(j=0;j<m;j++)
{
printf(" A[ %d, %d] = ",i+1,j+1);
fflush(stdout);
scanf("%lf",&a[i][j]);
}
}

printf(" A = \n");

for(i=0;i<l;i++)
{
for(j=0;j<m;j++)
{
printf(" %5f\t",a[i][j]);
}
printf("\n");
}
printf("\n");

for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
printf(" B[ %d, %d] = ",i+1,j+1);
fflush(stdout);
scanf("%lf",&a[i][j]);
}
}

printf(" B = \n");

for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
printf(" %5f\t",a[i][j]);
}
printf("\n");
}

for(i=0;i<l;i++)
{
for(j=0;j<n;j++)
{
c[i][j] = 0;
for(k=0;k<m;k++)
{
c[i][j] = c[i][j] + a[i][k] * b[k][j];
}
}
}
printf("\n");

printf(" C = \n");

for(i=0;i<l;i++)
{
for(j=0;j<n;j++)
{
printf("%5f\t",c[i][j]);
}
printf("\n");
}

}


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


Name: mats  ..ぴよぴよ(816ポイント)   Date: 2009/01/20(火) 14:41   No:27210     
Title: Re:行列の積について    
行列Bの値を受け取るところで、行列Aに代入を行っています

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

Name: レモン  ..ぴよぴよ(531ポイント)   Date: 2009/01/20(火) 16:36   No:27224     
Title: Re:行列の積について    
ぴよぴよさんどうもありがとうございます。
今訂正してコンパイルしなおしたら
./gyouretu32.c: line 8: unexpected EOF while looking for matching ``'
./gyouretu32.c: line 90: syntax error: unexpected end of file
と出てしまい、コンパイルできなくなっていました。

この原因がわかる方がいれば、教えていただけないでしょうか?


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

Name: レモン  ..ぴよぴよ(645ポイント)   Date: 2009/01/20(火) 16:40   No:27227 解決!     
Title: Re:行列の積について    
解決しました。
コンパイルできなくなってた理由はコマンドを打ち間違えてたせいでした。

ぴよぴよさん、どうもありがとうございました。


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



Name: JT  ..ぴよぴよ(43ポイント)   Date: 2009/01/19(月) 14:54   No:27134       
Title: Pthreadについて    
一人で自社で勉強してもわからないことだらけです><どなたか東京近郊で一緒に勉強しませんか?

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


Name: JT  ..ぴよぴよ(60ポイント)   Date: 2009/01/19(月) 15:26   No:27135     
Title: 出会いを求めてるのではありません    
純粋に勉強会を行いたいのです

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

Name: 御津凪 [URL]  ..熟練のプログラマー(50,343ポイント)   Date: 2009/01/19(月) 15:50   No:27136     
Title: Re:出会いを求めてるのではありません    
北海道なので参加できませんが、
Pthread についてのレポート記事があったので張っておきます。

http://codezine.jp/article/detail/1892?p=1
(後半の記事を読むには無料の購読会員登録が必要です。)

あと、ここではダメなんでしょうかね?


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

Name: JT  ..ぴよぴよ(114ポイント)   Date: 2009/01/19(月) 16:03   No:27137     
Title: C言語の勉強    
ずっと自社にいるのでコミュニケーション能力も養いたいです 女性なので出張を控えられてるので成長できない、、、

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

Name: バグ  ..ハッカー(142,177ポイント)   Date: 2009/01/19(月) 16:22   No:27139     
Title: Re:C言語の勉強    
しかし、勉強会というからには、講師役の人も必要になるのではないでしょうか?
例えば、pthreadについて勉強するについても、参加メンバー全員が分からない人だらけでは、話が先に進みませんし…(^_^;)
かといって、それでは勉強会というよりは講習になってしまいますね…


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

Name: Haru  ..上級者(22,152ポイント)   Date: 2009/01/19(月) 16:25   No:27140     
Title: Re:C言語の勉強    
>>純粋に勉強会を行いたいのです

私も東京で同じように自社で1人で勉強中なので興味はありますが・・・
正直、講師的な存在の方がいなければ、勉強会を開いてもなかなか難しいように思えます。。
教えてくださるような方には、オンラインならともかく、
わざわざ、オフで教えてくださるメリットがない訳ですし。。。
でも、興味はあるのでもし、実現するようなら声をかけていただきたですね(^^\


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

Name: Haru  ..上級者(22,162ポイント)   Date: 2009/01/19(月) 16:26   No:27141     
Title: Re:C言語の勉強    
バグさんと被ってしまいましたね(^^;

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

Name: JT  ..ぴよぴよ(172ポイント)   Date: 2009/01/19(月) 16:29   No:27142     
Title: Re:C言語の勉強    
しかし、一人で勉強しても進歩がないのも事実です 参考書などを用いてわからないとこを学習するだけでもいいと思うのですが、、、><

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

Name: Haru  ..上級者(22,278ポイント)   Date: 2009/01/19(月) 16:37   No:27143     
Title: Re:C言語の勉強    
>>しかし、一人で勉強しても進歩がないのも事実です。
 
はい。私もその気持ちは十分わかるつもりです。
わかるつもりなんですが・・・


>>参考書などを用いてわからないとこを学習するだけでもいいと思うのですが、、、><

結局一人で勉強してるのと同じですよね?
決して否定してる訳ではないのですが・・・(^^;


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

Name: Dixq (管理人)  ..伝説なるハッカー(956,618ポイント)   Date: 2009/01/19(月) 16:38   No:27144     
Title: Re:C言語の勉強    
滋賀で開いてくれたら行きm・・(ry

ここで呼びかけてもらってもいいですけど、もし集まらなかったら大きなコミュニティサイトの
そういうコミュで呼びかけてみてはどうでしょう?
mixiとか大きなコミュあるんで、興味ある人いるんじゃ無いかと思います。
まぁ知らない人と突然会ってそれが良い結果になるかどうかわかりませんが・・。

ただ実質勉強会といっても、解らない人があつまったところで、
その会を開く事で学力的な向上は見込めないでしょうね。。。
集まってワイワイやりたいということならいいと思いますが。


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

Name: JT  ..ぴよぴよ(198ポイント)   Date: 2009/01/19(月) 16:39   No:27145     
Title: Re:C言語の勉強    
そうですね><Haruさんと勉強してみたかったです

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

Name: JT  ..ぴよぴよ(215ポイント)   Date: 2009/01/19(月) 16:41   No:27146     
Title: Re:C言語の勉強    
mixiは招待されてないので入れないです

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

Name: Dixq (管理人)  ..伝説なるハッカー(956,630ポイント)   Date: 2009/01/19(月) 16:43   No:27147     
Title: Re:C言語の勉強    
招待しましょうか?→dixqhp@gmail.com

ただ見知らぬ人と突然会うのはやめといたほうがいいと思います。


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

Name: Haru  ..上級者(22,373ポイント)   Date: 2009/01/19(月) 16:43   No:27148     
Title: Re:C言語の勉強    
>>そうですね><Haruさんと勉強してみたかったです

ありがとうございます。
私は、まだまだ勉強不足なので、きっと一緒に勉強しても
役に立ちませんよ(^^;笑

しかも、私はきっと・・・

>>集まってワイワイやりたいということならいいと思いますが

↑こうなるタイプです。笑


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

Name: バグ  ..ハッカー(142,245ポイント)   Date: 2009/01/19(月) 16:45   No:27149     
Title: Re:C言語の勉強    
例えば…ですが、自社で勉強しているというのであれば、先輩方の書かれたソースを見せてもらったりするだけでも、随分と参考になるのではないでしょうか?

まぁ、その場合は社内情報の流出に繋がってもいけませんので、ネットでの質問は出来なくなるでしょうけど…(^_^;)


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

Name: JT  ..ぴよぴよ(231ポイント)   Date: 2009/01/19(月) 16:45   No:27150     
Title: Re:C言語の勉強    
それでもいいです><→Haru

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

Name: JT  ..ぴよぴよ(274ポイント)   Date: 2009/01/19(月) 16:49   No:27151     
Title: Re:C言語の勉強    
Dixq (管理人)様 このような相談を掲示板に乗せてしまいすいません ご忠告感謝します


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

Name: ゆっけ  ..ぴよぴよ(0ポイント)   Date: 2009/01/19(月) 16:50   No:27152     
Title: Re:C言語の勉強    
勉強会というのは名目で、要は出会いが欲しいだけでしょ。

Name: JT  ..ぴよぴよ(304ポイント)   Date: 2009/01/19(月) 16:53   No:27154     
Title: Re:C言語の勉強    
違います!!!!!!!!!

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

Name: Haru  ..上級者(22,557ポイント)   Date: 2009/01/19(月) 16:53   No:27155     
Title: Re:C言語の勉強    
>>バグさん
>>例えば…ですが、自社で勉強しているというのであれば、先輩方の書かれたソースを見せてもらったりするだ>>けでも、随分と参考になるのではないでしょうか

そうですね(^^;

先輩と会う機会がありましたら、相談してみます。


>>JTさん
>>それでもいいです><

一応、私も勉強という話については興味もありますし、よかったらご連絡ください。




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

Name: JT  ..ぴよぴよ(304ポイント)   Date: 2009/01/19(月) 16:59   No:27156     
Title: Re:C言語の勉強    
Dixq (管理人) さん、ありがとうございました

Name: Dixq (管理人)  ..伝説なるハッカー(956,665ポイント)   Date: 2009/01/19(月) 17:00   No:27157     
Title: Re:C言語の勉強    
一応招待しましたが・・なんだかあぶなかしいのでお気をつけて^^;

私はバグさんと勉強会という名の飲み会したいです・・w


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

Name: Mist  ..熟練のプログラマー(42,943ポイント)   Date: 2009/01/19(月) 17:00   No:27158     
Title: Re:C言語の勉強    
バグさんの言うとおりわからない者同士が寄り集まっても解決できない可能性もあるし、リアルで会うのは移動だけでも時間の無駄だと思いますけどね。
仕事の影響で時間の調整がつけにくい社会人ならなおさらですね。
プログラミング系のメーリングリストに参加するほうがいいと思います。

余談1
こういったほぼ匿名の掲示板で、目的がどうであれいきなりリアルで勉強会しませんかと呼びかけても無理じゃないですか?
JTさんが悪い人だとは思わないけど怖いです(^-^;

余談2
出張とプログラマーとしての成長がどう関係するのかよくわかんないです。

余談3
時と場合によりますが、性別は安易に書き込まないほうがいいですよ。(特に女性の場合)
無用のトラブルを引き込むことになる場合があります。


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

Name: JT  ..ぴよぴよ(385ポイント)   Date: 2009/01/19(月) 17:04   No:27160     
Title: Re:C言語の勉強    
そうですね、安易な事はやめておきます ありがとうございました><

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

Name: たかぎ [URL]  ..比類無きプログラマー(80,017ポイント)   Date: 2009/01/19(月) 17:25   No:27161     
Title: Re:C言語の勉強    
> 滋賀で開いてくれたら行きm・・(ry

滋賀なら私も行きます。
甲賀や信楽や伊吹山とかいわれても困りますが...


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

Name: Mikan  ..ぴよぴよ(204ポイント)   Date: 2009/01/19(月) 17:53   No:27162     
Title: Re:C言語の勉強    
たまにしかカキコしないbodomcrossことMikanですw

ホームページを開設したついでにハンドルネームを変更しました^^;

見れるようになったら宣伝にきますね。

私は九州の田舎に住んでいますが、勉強できるところが少なく

こちらではVBの方が主流でCやC++の技術者が少なく
(私が出会わないだけかもしれませんが・・・

ここのホームページやMixiなどのコミュニティで情報を得たり

本屋をめぐって日々勉強しています。

でもググっても、なかなか解らないことが出てくると情報を求めたいのは事実です。

そんなときはここの掲示板のログをみたりしています。

カキコしようかと思っても大体先に投稿されてますしね^^

JTさんの気持ちよくわかります。がんばってください


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

Name: バグ  ..ハッカー(142,385ポイント)   Date: 2009/01/19(月) 17:58   No:27163     
Title: Re:C言語の勉強    
>>Mikanさん
スレ違いですが、ちょっと質問させてください。
VBが主流という事ですが、VB.NETですか?それともそれ以前のVBでしょうか?
最近、VBの勉強も少しずつ始めようかと思っているのですが、どちらを勉強した方がいいのかなぁ…と思いまして…(^_^;)

一応、環境はVB6.0とVB.NET両方揃っているので、どちらでもいいのですが、世間の流れをちょっと知りたいので、良かったら教えてください。


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

Name: たかぎ [URL]  ..比類無きプログラマー(80,046ポイント)   Date: 2009/01/19(月) 19:00   No:27167     
Title: Re:C言語の勉強    
勉強会やオフ会募集のコーナーのようなものがあってもよいのかもしれませんね。
地域別に。


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

Name: Dixq (管理人)  ..伝説なるハッカー(957,101ポイント)   Date: 2009/01/19(月) 19:12   No:27168     
Title: Re:C言語の勉強    
おぉ!そういえばたかぎさんも関西ですね。
私は大津〜草津の境に住んでます。

しかしたかぎさんが勉強会に参加されたら、完全に指導者側ですねw

そういえば先日ここの掲示板に来ていらっしゃる方とお会いしました。
聞いてみると隣の隣の市に住んでいらっしゃるようで大学祭に来てくれました。

他にも、他の方でよく行くゲーセンがあると仰るのでどこか聞いてみたら、
うちの大学付近の駅前だったり、いや〜世間は狭いなと思いましたw


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

Name: Mikan  ..ぴよぴよ(818ポイント)   Date: 2009/01/20(火) 01:56   No:27183     
Title: Re:C言語の勉強    
>スレ違いですが、ちょっと質問させてください。
>VBが主流という事ですが、VB.NETですか?それともそれ以前のVBでしょうか?
>最近、VBの勉強も少しずつ始めようかと思っているのですが、どちらを勉強した方がいいのかなぁ…と思いまして…(^_^;)

>一応、環境はVB6.0とVB.NET両方揃っているので、どちらでもいいのですが、世間の流れをちょっと知りたいので、良かったら教えてください。

バグ様

九州は大分なんですが、田舎の企業ではVB6.0とVB.NETは半々ぐらいの割合で普及しています。

私もVB6.0で開発する会社に勤めていたことがありますが、

正直、新しいものに手を出すとそれなりのリスクや期間が必要とのことで

VB6.0の開発を続けていたのだと思います。

VB6.0は作りやすいのですが、AccessやExcelのVBAで開発するのとあまり変わらないのと、

作りやすい(解りやすい)反面、オブジェクトの中身などがわかりずらく思わぬトラップに引っかかりますw
(かなり苦労させていただきました^^;)

VB.NETはオブジェクト指向の色がVB6.0より強くでているため、

オブジェクトプログラミングの経験者には扱いやすいかと思われます。

VB6.0とVB.NETは、名前だけみるとただのバージョンアップの様な感じがしますが

ぜんぜん別物でVB6.0を覚えたとしてもVB.NETを使うときには、再度勉強する必要があります。

個人的な意見として、VB6.0は過去のものなので、VB.NETを強くオススメします。


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

Name: バグ  ..ハッカー(142,909ポイント)   Date: 2009/01/20(火) 08:09   No:27186     
Title: Re:Pthreadについて    
>Mikanさん
返信ありがとうございます(^-^)
なるほど、半々ですか(^_^;)
こちらは愛媛なんですが、現場で動いているソフトを見ているとVB6.0以前の物も意外に多いんですよね。
となると、新規はVB.NETでいいとしても、メンテはVB6.0という面倒な事になりそうなんですよ。まぁ、仕方ないんでしょうけど…┐('〜`;)┌
結局は両方勉強しとくのがベストなのかな…?
そんな訳で、少しだけVB.NETを触ってみたんですが、文法の違いはあれど、.NETを使えばC#やJ#とほとんど同じですね。
うちはVC++MFCとC#.NETがメインなので、これならなんとかなりそうです(^-^)


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

Name: 組木紙織 [URL]  ..熟練のプログラマー(68,684ポイント)   Date: 2009/01/20(火) 10:08   No:27188     
Title: Re:Pthreadについて    
>現場で動いているソフトを見ているとVB6.0以前の物も意外に多いんですよね。

今のWindowsではVB6.0以前のものも動いてるけれど、次期のWindowsで動かなかったら
VB.netに一気に移行ですね。
(それとも今現在使ってるPCが壊れるまではそのままかな)
そのあたりもVB6.0を勉強するかどうかの境目になりそうです。


#勉強会は関西圏でしてくれるのなら参加してもいいかなと思っています。


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

Name: Mist  ..熟練のプログラマー(43,249ポイント)   Date: 2009/01/20(火) 10:24   No:27189     
Title: Re:Pthreadについて    
勉強会(という名のOFF会?)関西開催なら参加してみたいですね〜。

滋賀県は仕事でよく行きますね。(草津のO社)
大阪から新快速に乗って草津に行くときは気をつけないと湖西線に逝ってしまうので危険なのです(^^;

周りの人に「草津まで出張に行きます」というと大概「えっ!群馬県(草津温泉)までいかれるんですか!?」と言われる・・・


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

Name: Haru  ..上級者(22,611ポイント)   Date: 2009/01/20(火) 10:34   No:27191     
Title: Re:Pthreadについて    
管理人さんを始め、たかぎさん、Mistさん、 組木紙織さん・・・
皆さん関西圏の方ばっかりですね(^^;

関東の方って思ったよりもいないんですかね?


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

Name: 御津凪 [URL]  ..熟練のプログラマー(50,958ポイント)   Date: 2009/01/20(火) 10:44   No:27192     
Title: Re:Pthreadについて    
> 関東の方って思ったよりもいないんですかね?

私は少数派なんだなぁ(北海道)と思う今日この頃。

確かに思ったより関東の方は少なそうですね。
程よく密集している関西圏だからでしょうかね?




/*
今日は会社で(プロジェクトの都合で)貫徹だった。帰って寝たいけど外は大雪…。
どうでも良いですね。独り言です。はい。
*/



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

Name: JT  ..ぴよぴよ(416ポイント)   Date: 2009/01/20(火) 11:07   No:27193     
Title: Re:Pthreadについて    
あくまでも関東の方、限定でお願いします><

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

Name: バグ  ..ハッカー(143,631ポイント)   Date: 2009/01/20(火) 11:11   No:27194     
Title: Re:Pthreadについて    
>>今のWindowsではVB6.0以前のものも動いてるけれど、次期のWindowsで動かなかったら
>>VB.netに一気に移行ですね。
>>(それとも今現在使ってるPCが壊れるまではそのままかな)
>>そのあたりもVB6.0を勉強するかどうかの境目になりそうです。

現場では未だにXPが大人気です。
少なくとも、うちから出荷したものでVistaを指定されたお客さんはいませんでした(^_^;)
そんな感じなので、XPが入手できる間はXPでいく方向になるんじゃないかな?と感じております。

ちなみに、場所によってはMS-DOSのソフトがバリバリ現役だったりもしますし。
流石にDOS用ソフトはPCが壊れた時点で、Windows用に移殖せざるをえないでしょうが…
/* っていうか、壊れてくれれば仕事が舞い込むので、ちょっと期待しつつ…(笑) */

次世代OS(Windows7でしたっけ?)の売れ行きや仕様次第では、Linuxに移行という事にもなりかねないんですよね…。そうなると、また勉強しなおしです(苦笑)


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

Name: s-rush  ..上級者(16,085ポイント)   Date: 2009/01/20(火) 11:21   No:27195     
Title: Re:Pthreadについて    
割り込んですいません。

1人で勉強するよりも、何人かで集まって勉強するっていうのもいいかもしれませんね^^

>>滋賀で開いてくれたら行きm・・(ry
私も参加したいですね

私も滋賀県に住んでいるので。
もしかすると、管理人さんと同じ大学かもです^^;


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

Name: JT  ..ぴよぴよ(439ポイント)   Date: 2009/01/20(火) 13:17   No:27197     
Title: Re:Pthreadについて    
一人で勉強してもやっぱり見につかないよ><出向先に行きたい!!(愚痴)

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

Name: Haru  ..上級者(22,473ポイント)   Date: 2009/01/20(火) 13:34   No:27198     
Title: Re:Pthreadについて    
>>バグさん
>>次世代OS(Windows7でしたっけ?)の売れ行きや仕様次第では、Linuxに移行という事にもなりかねないんで>>すよね…。そうなると、また勉強しなおしです(苦笑)

私みたいにやっとなんとか一つずつ覚えてるものからしたら、
すべてのやる気を根こそぎとられるような出来事ですね(^^;ぇ

>>JTさん
>>一人で勉強してもやっぱり見につかないよ><出向先に行きたい!!(愚痴)

わかります!!
わからなくなると、何一つとして進まなくなりますよね(^^;・・・私だけ?




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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(957,307ポイント)   Date: 2009/01/20(火) 13:36   No:27199     
Title: Re:Pthreadについて    
>>たかぎさん
>滋賀なら私も行きます。

>>組木紙織さん
>勉強会は関西圏でしてくれるのなら参加してもいいかなと思っています。

>>Mistさん
>勉強会(という名のOFF会?)関西開催なら参加してみたいですね〜

>>s-rushさん
>私も参加したいですね

皆さんノリいいですね〜♪
では、本当に考えてみます?
マジで参加するよ!って方いらっしゃいましたら、
それについてのトピ立てて募集してみましょうか^^


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

Name: JT  ..ぴよぴよ(446ポイント)   Date: 2009/01/20(火) 13:41   No:27203 解決!     
Title: Re:Pthreadについて    
ありがとうございました

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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(957,519ポイント)   Date: 2009/01/20(火) 13:47   No:27205     
Title: Re:Pthreadについて    
あ、人のトピでごめんなさい^^;
新しくたてます。


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

Name: Mikan  ..かけだし(1,172ポイント)   Date: 2009/01/20(火) 16:39   No:27225     
Title: Re:Pthreadについて    
解決トピにカキコすみません。

>となると、新規はVB.NETでいいとしても、メンテはVB6.0という面倒な事になりそうなんですよ。まぁ、仕方ないんでしょうけど…┐('〜`;)┌
>結局は両方勉強しとくのがベストなのかな…?
>そんな訳で、少しだけVB.NETを触ってみたんですが、文法の違いはあれど、.NETを使えばC#やJ#とほとんど同じですね。
>うちはVC++MFCとC#.NETがメインなので、これならなんとかなりそうです(^-^)

バグ様

C#.NETがメインとのことなので、ほとんど同じVB.NETは特に覚える必要はないのでは?と思います。

バグ様ほどの知識をお持ちならVB6.0を少し覚えればメンテナンスは大丈夫かと^^

VB6.0は趣味ではあまり触っていないですが、手助けできそうなことがあればアドバイスさせていただきますね

がんばってください〜(*´∀`)


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



Name: 名無し  ..入門者(4,654ポイント)   Date: 2009/01/17(土) 09:15   No:27001       
Title: 無題    
C言語の初歩的なことついて書いてあるページってどこにありますか。
あったら教えてください


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


Name: Dixq (管理人)  ..伝説なるハッカー(954,622ポイント)   Date: 2009/01/17(土) 09:29   No:27002     
Title: Re:無題    
「C言語 入門」で検索してみてください。
沢山みつかりますから、気に入ったサイトをご覧下さい。


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

Name: s-rush  ..中級者(14,113ポイント)   Date: 2009/01/18(日) 00:24   No:27013     
Title: Re:無題    
私は
「苦しんで覚えるC言語」
というサイトで勉強させていただきました。
本当に初歩的なことですが^^;

個人的には分かりやすいサイトだと思います。

ちょっとした発展?めいたことも書かれていたので、
もしよければ覗いてみてはどうですか??



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

Name: nayo  ..入門者(4,732ポイント)   Date: 2009/01/18(日) 00:55   No:27014     
Title: Re:無題    
目指せプログラマー!
以前この掲示板でも紹介のあったこちらのサイト様には今でもお世話になっています
C言語以外にもアセンブラやC++、java、さらに各種アルゴリズムまで解説しているのでおススメです


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

Name: JT  ..ぴよぴよ(356ポイント)   Date: 2009/01/19(月) 17:02   No:27159     
Title: Re:無題    
http://programnet.hp.infoseek.co.jp/clangage/index.html
私も参考にしていてとてもわかりやすいです^^


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

Name: lbfuvab  ..上級者(15,022ポイント)   Date: 2009/01/19(月) 18:50   No:27165     
Title: Re:無題    
私のお薦めは基礎的な物は柴田望洋さんの「明解 C言語 入門編」ですね。(商品ページ)

後はネット上でネタを仕入れてどんどん組んでいけば良いと思います。


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

Name: バグ  ..ハッカー(142,423ポイント)   Date: 2009/01/19(月) 18:53   No:27166     
Title: Re:無題    
柴田望洋さんのHPもなかなか参考になりますよ。

http://www.bohyoh.com/


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



Name: akihito  ..ぴよぴよ(878ポイント)   Date: 2009/01/19(月) 14:44   No:27133       
Title: 14歳からはじめるシリーズ    
あとがきの自キャラを増やすときのAtariHantei関数の書き方がわかりません。
どうすればよいですか?


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


Name: JT  ..ぴよぴよ(130ポイント)   Date: 2009/01/19(月) 16:04   No:27138     
Title: Re:14歳からはじめるシリーズ    
あとがきの詳しい内容を教えてください。

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

Name: Mikan  ..ぴよぴよ(304ポイント)   Date: 2009/01/19(月) 18:04   No:27164     
Title: Re:14歳からはじめるシリーズ    
jikidataの構造体にint zankiなどの残機数をカウントする変数を用意しておき、

jikidata.zanki = 3; //プレイヤーの残機数

と残機を設定します。

自機と弾が衝突した際に

jikidata.zanki--;

if(jikidata.zanki<=0) //ゲームオーバーの処理
else //復活処理など

をすればいいかと思います。

パッと見ただけなので間違えてたらごめんなさい^^;


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



Name: 涼太  ..ぴよぴよ(16ポイント)   Date: 2009/01/13(火) 17:17   No:26862       
Title: if文を楽に書く    

if(A == 0 ||
B == 5 ||
C >= 4 ・・・) ;


みたいにいくつかの条件のうちあてはまってたら処理をする
と書くのが普通ですが


 A == 0,B == 5,C >= 4 ・・・

等のように条件を書いてソースを見やすくはできないでしょうか?
このようなやり方でなくてもソースが短く見やすく書ければ助かります。

C++ VS2005 XP



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


Name: 御津凪 [URL]  ..熟練のプログラマー(48,828ポイント)   Date: 2009/01/13(火) 18:15   No:26871     
Title: Re:if文を楽に書く    
どこまで定型的な条件になるかによって変わりますが、短くするなら、
#define IF_OR2(b1,b2)             if((b1)||(b2))

#define IF_OR3(b1,b2,b3) if((b1)||(b2)||(b3))
#define IF_OR4(b1,b2,b3,b4) if((b1)||(b2)||(b3)||(b4))
#define IF_OR5(b1,b2,b3,b4,b5) if((b1)||(b2)||(b3)||(b4)||(b5))
#define IF_OR6(b1,b2,b3,b4,b5,b6) if((b1)||(b2)||(b3)||(b4)||(b5)||(b6))


とマクロ定義(上記は6条件まで用意)して、

IF_OR3(A == 0,B == 5,C >= 4)


で出来ます。(ちょっと使いづらいと思いますが)

もし、
> A == 0,B == 5,C >= 4 ・・・

複数の箇所で同様の条件式があれば、その条件式をまとめてマクロにしてしまえば
とりあえずすっきりします。(ソースコードの解読がしにくくなりますが…)


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

Name: box  ..ハッカー(133,421ポイント)   Date: 2009/01/13(火) 21:09   No:26876     
Title: Re:if文を楽に書く    
素直に書くのが得策でありましょう。
マクロなどを使った結果、ソースコードの可読性が
低くなったのでは何にもなりません。


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

Name: Libra  ..初心者(7,510ポイント)   Date: 2009/01/13(火) 22:21   No:26882     
Title: Re:if文を楽に書く    


//条件---------------------------
bool A = ( a != 0 ) ;//aは0以外よ
bool B = ( b == 5 ) ;//bは5なんだ
bool C = ( c >= 4 ) ;//cは4以上じゃ
bool D = ・・・・・


if( A || B || C ・・・・){

・・・・・

・・・

}



こんなのはどうでしょうか?


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

Name: たいちう  ..上級者(21,177ポイント)   Date: 2009/01/14(水) 00:22   No:26883     
Title: Re:if文を楽に書く    
> 等のように条件を書いてソースを見やすくはできないでしょうか?
> このようなやり方でなくてもソースが短く見やすく書ければ助かります。

何が見やすいかは好みにもよると思うけど、
私としては御津凪さんのマクロはありえない。
ご本人も同意してくれると思いますが。

Libraさんの方法は使うことがあります。
boolの変数名はもっと条件を直接表現する名前にすることが多いです。
また個々の条件によっては、次のことを考慮しないと、
元の式と違う実行結果になります。

http://okuyama.mt.tama.hosei.ac.jp/unix/C/slide27-1.html
> 論理積については,第1オペランドが 0 ならば,第2オペランドを評価しません。
> 論理和については,第1オペランドが 0 に等しくなければ,第2オペランドを評価しません。


涼太さんが冗長に思うif文を省略せずにそのまま載せてみてはいかがですか?

if (A == 0 || B == 5 || C >= 4)
  ;

については、これ以上楽には書けないと思いますが。


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

Name: 御津凪 [URL]  ..熟練のプログラマー(49,162ポイント)   Date: 2009/01/14(水) 01:50   No:26884     
Title: Re:if文を楽に書く    
> 私としては御津凪さんのマクロはありえない。

私自身、上記で書いたマクロの使い方はまずしません。

ではなぜ書いたのかというと、マクロでどう短く出来るかなと即席で考えたものでして、
よくよく考えると、ぜんっぜん短くなってませんしね…。
(もっと短くしようとすると逆に使えないし)

と、いうわけでアレは駄目な例としておいてください^^;

後者のマクロの方法でも、使い方によってはまずいので没。
(限定的に使うのであれば大丈夫かもしれないが)

結局長くても条件文は直接書いておいた方が一番です。
バグ防止にも見やすさ的にも。


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

Name: TOMORONI  ..ぴよぴよ(16ポイント)   Date: 2009/01/18(日) 13:17   No:27036     
Title: Re:if文を楽に書く    
汎用性を保ったまま組み込みの文を改良することは、ほぼ不可能で無意味です。
質問の意図もif文そのものを改良したい訳ではないと思います。

何か目的があって初めて最適な手段が発生します。
どんなことを実現したいのか教えてください。
きっと力になれると思います。


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

Name: SCI  ..初心者(5,941ポイント)   Date: 2009/01/18(日) 16:13   No:27045     
Title: Re:if文を楽に書く    
> 涼太さん
たいちうさんも上で挙げていますが、論理積で書くと、例えば以下のようになりますか。
#include <stdio.h>


int main(void)
{
int n;

printf("数字を入力してねっ -> "), scanf("%d", &n);

/* 普通のif文 */
if (n < 0 || n == 5 || 8 < n)
{
printf("にゃんにゃん\n");
}

/* &&演算子の式評価に依存してみる */
(n < 0 || n == 5 || 8 < n) && printf("あぅあぅ\n");

return 0;
}


で、書いてみて思ったこと。大して見やすくならない(笑)
また、elseに相当する排他条件分岐ができないので、むしろ汎用性に欠けますね。
さらに、&&のあとに書けるのは式(式文ではない)のみなので、ますます限定的です。
逆に、コードのトリッキーさを競う場では使われそうです。

やっぱり普通に書くのが一番だと思いますよv


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

Name: たいちう  ..上級者(21,301ポイント)   Date: 2009/01/18(日) 16:55   No:27053     
Title: Re:if文を楽に書く    
SCIさん
> たいちうさんも上で挙げていますが、論理積で書くと、例えば以下のようになりますか。

もしかして私の意図を誤解していませんか?
誤解でなければ別に構わないのですが。

int func();として、

if (x == 1 && func() == 1) {
  ...
}

これ↑と、これ↓は、

bool a = x == 1;
bool b = func() == 1;
if (a && b) {
  ...
}

結果が異なる場合がありますよ、という意図でしたが。
一応書くと、前者の場合、x == 1の場合のみfunc()が呼ばれますが、
後者の場合は常にfunc()が呼ばれます。


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

Name: lbfuvab  ..中級者(14,938ポイント)   Date: 2009/01/18(日) 17:48   No:27062     
Title: Re:if文を楽に書く    
#define hoge(a,b,c,d)	(((a)<8 && (a)>-1) && ((b)<8 && (b)>-1) && ((c)[(a)][(b)]==(d)))


if(hoge(a,b,c,d))
puts("あーだこーだ");


こんなんですかね


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

Name: SCI  ..初心者(6,183ポイント)   Date: 2009/01/18(日) 19:17   No:27072     
Title: Re:if文を楽に書く    
たいちうさん
誤解してました(笑)

>また個々の条件によっては、次のことを考慮しないと、
>元の式と違う実行結果になります。

http://okuyama.mt.tama.hosei.ac.jp/unix/C/slide27-1.html
>> 論理積については,第1オペランドが 0 ならば,第2オペランドを評価しません。
>> 論理和については,第1オペランドが 0 に等しくなければ,第2オペランドを評価しません。

論理演算子の評価順を、ネガティブなイメージで述べていたのですね。
私はこの下の部分だけみて、評価順を利用して書くことを言っていると思っちゃいました(汗


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

Name: TOMORONI  ..ぴよぴよ(302ポイント)   Date: 2009/01/19(月) 00:06   No:27104     
Title: Re:if文を楽に書く    
なんとなく、自分も書いてみました。
カンマで区切るのが難点ですね。要素数が判らないのはつらいです。
可変長引数のプログラミングって納得のいくものが書けたことないです。
今回も書いてみたんですが、やっぱり載せられません。

しょうがないので発想を変えてboostのassignを使った有名なトリックを使ってみました。
添付しておきます。…ファイルの添付って1個ずつしかできませんよね?

添付ファイルは4つですが、内2つはboostなので持ってたらダウンロードしないで、

<boost/lambda/lambda.hpp>
<boost/assign.hpp>

をインクルードするように書き換えれば大丈夫です。
/**/使って書いてあるところは"今は書けないけどこんな意味の式なんかが入ります"
って意味です。後ろにtrueとか続いてますが、あくまで動かすためだけのものです。

(先ほど自分の名前を間違えて投稿してしまいました。すみません。チェック入れときます。)


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

Name: TOMORONI  ..ぴよぴよ(310ポイント)   Date: 2009/01/19(月) 00:08   No:27107     
Title: Re:if文を楽に書く    
main.cpp

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

Name: TOMORONI  ..ぴよぴよ(316ポイント)   Date: 2009/01/19(月) 00:10   No:27108     
Title: Re:if文を楽に書く    
assign.hpp

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

Name: TOMORONI  ..ぴよぴよ(322ポイント)   Date: 2009/01/19(月) 00:10   No:27111     
Title: Re:if文を楽に書く    
lambda.hpp

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

Name: TOMORONI  ..ぴよぴよ(446ポイント)   Date: 2009/01/19(月) 00:25   No:27114     
Title: Re:if文を楽に書く    
ってすみません。単体で貼り付けても参照元が無かったら意味ないですね。板を汚してしまいました。
本当にすみません。あの、もしboostを導入していたら使ってみて下さい。ってことで。

管理人さんもし気が付いたら上の2つの添付ファイル(main以外)を消していただけますか?
ご迷惑をおかけします。今度からちゃんとキーを設定します。


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

Name: tkmakwins15 [URL]  ..比類無きプログラマー(94,104ポイント)   Date: 2009/01/19(月) 01:18   No:27125     
Title: Re:if文を楽に書く    
C++であれば、これでよいのでは?

#include<cstdio>
using namespace std;

class Bool_op{
bool b;
Bool_op():b(false){}
Bool_op& operator,(bool op){
b=b||op;
return *this;
}
operator bool(){bool temp=b;b=false;return temp;}
}bool_expr;


int main()
{
int a,b,c;
printf("適当に整数を3個入力してください:");
scanf("%d%d%d",&a,&b,&c);//適当に整数を入力させる。
if(bool_expr,a!=0,b==5,c>=4)puts("条件に合致しました");
else puts("残念ながら、条件に合致しませんでした。");
return 0;
}

カンマ演算子(呼び方合ってるかな?)はオーバーロードできるので、適当にクラスを用意して、それとboolに対してオーバーロードしています。
1:25 少し訂正。


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

Name: JT  ..ぴよぴよ(291ポイント)   Date: 2009/01/19(月) 16:51   No:27153     
Title: Re:if文を楽に書く    
フラグを一つ立ててそれに付随したCase文を書くのはどうでしょうか?


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



Name: 徳竹  ..かけだし(2,459ポイント)   Date: 2009/01/17(土) 14:04   No:27007       
Title: たびたび申し訳ありません    
昨日do文で処理すると上手く答えが出ないという質問に対してdo文の途中で変数の値が変わっているのではないか?
という指摘を受けたものです。あの時早とちりで解決したと言ってしまいましたが、まだ少し誤りがあるようです。

もしかして一回目のループで作成した配列の値が残っているのではないかと思い、(この行為にどの程度意味があるかわかりませんが)ループの最後で今まで作成した配列にすべて0を代入したところ次元が低い問題では正確に答えが出るのですが、次元が上がると答えが違ってしまいます。

そこで質問なのですがプログラムの途中で配列を初期化の様にするにはどの様にすればいいのでしょうか?またそもそもdo文においてそんなことをする必要があるのでしょうか?同じプログラムに二度も質問してしまい大変申し訳ありません、よろしくお願いします。環境はLinux,コンパイラはgccです。


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


Name: Mist  ..熟練のプログラマー(42,094ポイント)   Date: 2009/01/17(土) 14:26   No:27008     
Title: Re:たびたび申し訳ありません    
> do文の途中で変数の値が変わっているのではないか? という指摘を受けたものです。

そんな指摘してません。
do内で使用する変数は2回目の実行前に初期状態に戻さないと同じ結果は得られないんじゃないですか、です。


> 途中で配列を初期化の様にするにはどの様にすればいいのでしょうか?

言いたいことがいまいちよくわかんないけど、プログラムの途中で宣言時のような書き方で初期化したいってことですか?

a[3] = { 1, 2, 3};

結論から言うと無理です。
初期値をセットしている配列を別に用意してmemcpyなどでコピーするのが比較的楽です。


> またそもそもdo文においてそんなことをする必要があるのでしょうか?

do文がどうとかいうことではなく、あなたがそのプログラムでどういうことをしてどういう結果を得たいかによります。
必要があるかどうかはあなたが組んだプログラムしだいです。
必要がないように考慮したコーディングであれば必要ないですし、考慮されていないコーディングであれば必要です。(つまりケースバイケース、必ず必要・不必要とは答えられません)
もう一度言いますが、同じ結果が出したいのであればdo〜while内で使用する全ての変数について、1回目の実行開始前と2回目の実行開始前で同じ値になっていることを見直してください。



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

Name: Mist  ..熟練のプログラマー(42,430ポイント)   Date: 2009/01/17(土) 14:40   No:27009     
Title: Re:たびたび申し訳ありません    
プログラムで具体的に書いてみる。

int a = 1;
int b = 0;
int loop = 2;

do {
b = a + b;
printf("b = %d\n", b);

--loop;
} while (loop);


このプログラムを実行すると
b=1
b=2
となりますね。
これは一回目の実行によってbに1という値に更新されていためです。
同じ結果にしたいのであれば

do {
b = a + b;
printf("b = %d\n", b);

b = 0;
--loop;
} while (loop);

というように、一回目の実行が終わった時点でbを元に戻しておく必要があるわけです。
で、前回提示されたプログラムは一部分しかないため判りませんでしたが、上のプログラムのように変数の再初期化が不十分であるために、2回目の実行で一回目とは異なる計算・処理が行われることによって違う結果になるのではないですか?
というのが私からの回答です。


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

Name: 徳竹  ..入門者(2,656ポイント)   Date: 2009/01/17(土) 15:27   No:27010     
Title: Re:たびたび申し訳ありません    
すばやい回答ありがとうございます。なるほど変数の再初期化ですか...。
ただそこは前回の質問の後直して今も確かめてみたのですがおそらく大丈夫でだと思われます。やはり配列など何か別の所で少し狂いが生じていると思われます。

本来ならばプログラムを全部載せてどこがいけないのでしょうかとやりたい所ですが、200行近くありさすがにそこまでお願いするわけにはいかないので自力で頑張ります。わざわざありがとうございました。


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

Name: non  ..プログラマー(29,993ポイント)   Date: 2009/01/17(土) 16:11   No:27011     
Title: Re:たびたび申し訳ありません    
200行ぐらいの短いプログラムなら、見た方がはやいけどな。
添付しちゃえば。


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

Name: 徳竹  ..かけだし(1,858ポイント)   Date: 2009/01/18(日) 17:32   No:27060     
Title: Re:たびたび申し訳ありません    
やはり自力では苦しいので、そう言って下さるのなら載せてみます。

前にも書きましたが行列Aの最大固有値に対する固有ベクトルをarnoldi法を用いて求めるプログラムを書いています。arnoldi法とはまず初期値kと初期ベクトルrをとり、グラムシュミットの正規直交化を用いて行列Aを上ヘッセンベルグk+1×kの行列Hに変換する方法です。同時に求められるn×(k+1)の行列Qk+1から最初のk列を取ってきた行列Qkとの間にAQk=Qk+1×Hの関係が成立します。

その後行列Hの行番号と列番号が等しい要素だけ1を引きそれをHnewとして特異値分解します。求めた右特異ベクトルのk列目をvとします。このvをQkの右からかけたものをqとします。今度はqを初期値として同じ操作を繰り返しHnewの特異値が十分小さくなったときのqを固有ベクトルとして採用します。

長々と書いてしまいましたが、arnoldi法の部分や特異値分解の部分は正しい値が出ているので数学的なことではなくプログラミングの問題だとおもわれます。図々しいお願いだというのは承知しているのですが、良かったらお願いします。

アルゴリズムも一応書いておきます。
arnoldi法のアルゴリズム
1:初期ベクトルqを自身の2−ノルムで割ったものをq[1]とする
2:for j=1to k
3;z=Aq[j]
4;for i=1 to j
5; h[i][j]=q[i]*z
6:z=z-h[i][j]*q[i]
7:end for
8:h[j+1][j]=zの2−norm
9:if h[j+1][j]=0,then stop
10: q[j+1]=z/h[j+1][j]
end for

その後は配列h[k+1][k]を行列H,ベクトルq(1)からq(k+1)を列とした行列をQk+1として上記の操作を行います。
まとめると

Repeat
[Qk+1,H]=arnoldi(A,q,k)
H-I~=Uσ(Vの転置行列) (但しI~は単位行列の一番下に全て要素が0の行を加えたもの)
v=Vのk列目
q=Qk*v
Until σmin(H-I~)<ε

N次元の行列Aは対角成分がすべて0、それ以外はランダムで0または1としそれを列和が1となるようした
行列をA’とし、
その行列とすべての要素が1/Nの行列をDとして、A=0.85*A’+0.15*Dとして行列Aを設定します。初期ベクトルはすべて要素が2。またk=4としました。

肝心の結果に関してなのですがn=4として読み込むと二回だ特異値が0となり,正しい値に収束します。しかしn=5とした場合
0.645457、
0.145821、
0.421368、
0.598103、
0.163837という値が得られます。
しかしこのプログラムを一回のループでbreakしさらに初期ベクトルをキーボードから読み込むようにかえます。そして初期ベクトル2を読み込み得られたベクトルを再び読み込ませると値が
0.645433、
0.185202、
0.388113、
0.557666、
0.295792となり値が異なります(ちなみにこれを繰り返すと特異値が収束して正しい答えが得られます)

一体何がマズイでしょうか?というのが質問内容です。一ヶ月程前に初めてC言語を始めネットや本を参考にして何とか書いた素人なので前回指摘していただいた点で見落としがあるかもしれません。
拙い文章で申し訳ありません、図々しい質問だとは思いますがよかったらお願いいたします。ちなみにプログラムの途中でclapackを用いました。



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

Name: non  ..プログラマー(30,588ポイント)   Date: 2009/01/18(日) 19:31   No:27075     
Title: Re:たびたび申し訳ありません    
これって、別の言語で書かれていたものを、移植している?
配列はC言語ではindexが0から始まりますが、このプログラムは1から始まるように
作られています。0を使わないでこのように作るのはよくありますが・・・

私が前のスレッドで
>2 宣言した配列の範囲を超えた場所に書き込んでいる。
> 例えば、

> for(l=1;l<=n;l++){
> w[l][j]-=h[i][j]*v[l][i];}


>などで、double w[n][n];で宣言されていたとか

って書きましたよね。

徳竹さんのプログラムはちらっとしか見ていないので、見間違いかもしれませんが
(字下げをもっとわかりやすくしましょう)

5行目 #define COL 4
74行目 k=COL; 
137行目 static double vv[COL]
142行目 for(i=1;i<=k;i++)
143行目  vv[i]=vt[-1+i*COL]

つまり、vv[0]〜vv[3]までしかないのに
vv[4]に書き込んだことになります。
C言語はエラーを出さないから、プログラマは注意が必要です。
static領域に取られたこの配列の前か後にある(処理系によるので)配列のデータを壊します。
ぱっと見ただけなので、ここだけしか発見しませんでしたが(っていうより1カ所見つければ良いかと)
他にもあるかもしれません。あとは、ご自分で。




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

Name: 徳竹  ..かけだし(2,068ポイント)   Date: 2009/01/19(月) 10:25   No:27129     
Title: Re:たびたび申し訳ありません    
見づらいプログラムで申し訳ありません。確かにVV[4]に書き込んでますね。まったく気づきませんでした。普段matlabを使っているのでその時の癖が出てしまいました。
最後にひとつだけ質問したいのですがこのような事態を避けるためにあらかじめ配列の大きさに十分な余裕を持たせておく(上の例ではvv[100]などとする)ことをしていいのでしょうか?
本当は自分で確認するべきですが、今日明日と出来る環境にいないのでそれだけ質問させてください。後は自分で頑張りますありがとうございました。


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

Name: Mist  ..熟練のプログラマー(42,649ポイント)   Date: 2009/01/19(月) 10:36   No:27130     
Title: Re:たびたび申し訳ありません    
メモリに余裕のある環境であれば許されるんじゃないでしょうか。
ただ、そういった悪い癖をつけてしまうと後々苦労しますよ。

for (i=0;i<N;i++)

こういうふうに書く癖付けたほうがいいと思いますが。


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

Name: non  ..プログラマー(31,372ポイント)   Date: 2009/01/19(月) 10:38   No:27131     
Title: Re:たびたび申し訳ありません    
メモリさえあればかまわないと思いますが、データについては、自分で把握することが必要ですね。



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

Name: 徳竹  ..かけだし(2,090ポイント)   Date: 2009/01/19(月) 12:51   No:27132 解決!     
Title: Re:たびたび申し訳ありません    
分かりました、やはり書き直してみます。いろいろとありがとうございました。


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



Name: 米粒  ..ぴよぴよ(170ポイント)   Date: 2009/01/19(月) 09:10   No:27128       
Title: 64bitOS上で32bitモジュールをデバッグ    
こんにちわ。

http://hpcgi3.nifty.com/mmgames/patio/patio.cgi?mode=view&no=1799
こちらでも質問させていただいてるのですが、既に過疎化してしかも荒れているようですし、相互リンクしていればマルチOKとのことなのであえて投稿させていただきます。

64bit Linux(RHEL4)に32bitのLinuxマシンからあるモジュールを移植しました(オプションに"-m32"を付けてコンパイルしています)。

今のところ大きな問題はなく稼動していますが、gprofでプロファイルしてみたところボトルネックが見つかりました。
これを追うためgdbでデバッグしようとしましたが、セグメンテーション違反となり、さらにsyslogdからメッセージが飛んできてデバッグできません。

syslogdからのメッセージ
--------------------------------------------------------------
Message from syslogd@hostname at Thu Jan 8 11:45:29 2009 ...
hostname kernel: invalid operand: 0000 [3] SMP
--------------------------------------------------------------

64bitOS上で32bitモジュールをデバッグする(できればgdbで)方法はあるでしょうか。

gdbのバージョンは以下の通りです。
--------------------------------------------------------------
$ gdb -version
GNU gdb Red Hat Linux (6.3.0.0-1.132.EL4rh)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
--------------------------------------------------------------

よろしくお願いします。


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




Name: こ〜ふぃ  ..かけだし(1,565ポイント)   Date: 2009/01/13(火) 08:07   No:26825       
Title: 複数のtxtファイルやcsvファイルを比較したいのですが。    
どうもこんにちわ、こ〜ふぃと申します。
早速なのですが、質問です。
現在、1ファイルあたり、小数が195個格納されているtxtファイルとcsvファイルを所持しています。
このファイルが、何十個かあり、その距離演算をして、
file01に総合的に一番距離の近いファイルを導き出すという
cプログラムを組みたいのです。

|file01|file02|・・・|file n|
-------+------+------+------+------+
第1項目| 1.13 | 2.58|・・・|
第2項目|-3.55 | 6.88|・・・|
・   ・   ・
  ・   ・   ・
  ・   ・   ・
第195項目

こんな感じのイメージで、file01の第1項目とfile02の第1項目と・・・と比較していきたいのです。
そして、第195項目まで、比較し、一番file01に距離が近いものを調べます。
#include <stdio.h>
int main(void)
{
FILE *fp;
int i;
double num;

fp = fopen( "test.txt", "r" );

for(i = 0; i <= 194; i++)
{
fscanf( fp, "%lf", &num );

printf( "%lf\n", num);
}
fclose( fp );
return 0;
}
このように、テキスト読み出しはでき、距離の計算も問題はないと思うのですが、
第1項は、file02がfile01に距離が近かった。
第2項は、file03がfile01に距離が近かったのように、
第195項までの区別は、どうやってすればよいのでしょうか?
自分の考えでは、
第1項は、file02がfile01に対して一番距離が近いので点数を付与して、
ということを第195項までして、最終的に一番点数の高いファイルを返せばできるのではないかと
思っているのですが、その点数のための引数をどうやって設定すればいいのかがわかりません。
ご指南のほどよろしくお願いします。


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


Name: non  ..プログラマー(26,738ポイント)   Date: 2009/01/13(火) 08:53   No:26827     
Title: Re:複数のtxtファイルやcsvファイルを比較したいのですが。    
ファイルの内容を最初に全部読み込んで、配列または構造体に入れてはいけないのですか?
仮にそれがOKだとしたら、あなたがわからないのは
1 ファイルから配列へのデータの読み込み。
2 配列の各行から差の最小値の求め方
どっちですか?


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

Name: こ〜ふぃ  ..かけだし(1,436ポイント)   Date: 2009/01/13(火) 09:02   No:26828     
Title: Re:複数のtxtファイルやcsvファイルを比較したいのですが。    
nonさんさっそくのご回答ありがとうございます。
私がわからないのは、
構造体や配列への入れ方もしくは、読み込みです。

配列の各行からの差の最小値の求め方は、配列の番号などを間違えなければ、
普通の引数と同じ扱いで計算できると思っています。
もし、この考えで間違っていたら、再びご教授願います。


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

Name: TOMONORI  ..ぴよぴよ(376ポイント)   Date: 2009/01/13(火) 10:01   No:26829     
Title: Re:複数のtxtファイルやcsvファイルを比較したいのですが。    
ちょっとすみません。
C言語限定ですか?C++などの他の言語は駄目ですか?


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

Name: こ〜ふぃ  ..かけだし(1,512ポイント)   Date: 2009/01/13(火) 11:45   No:26835     
Title: Re:複数のtxtファイルやcsvファイルを比較したいのですが。    
TOMONORIさん
ご回答ありがとうございます。

私は、現在C言語しか学んでおらず、ほかの言語だとまったくわからないため、
できればC言語で回答をお願いします。

勝手なことを言ってすいません。


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

Name: non  ..プログラマー(26,915ポイント)   Date: 2009/01/13(火) 12:22   No:26837     
Title: Re:複数のtxtファイルやcsvファイルを比較したいのですが。    
ファイルからの読み込みとなると、前にも他のスレッドにもありましたが、
ファイル名をどうするかという事になります。
そこで、再び質問です。
ファイル名は(拡張子はtxtとcsvということでしたが)規則性がありますか?
例えば、test01.txtなどのように一連番号がついているなど。
それとも、指定しているフォルダにあるファイル全部という事ですか?


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

Name: ibis  ..上級者(16,797ポイント)   Date: 2009/01/13(火) 12:31   No:26838     
Title: Re:複数のtxtファイルやcsvファイルを比較したいのですが。    
この規模だったらCでもC++でもほとんど差はないと思いますが・・・
C++ならstdioの代わりにiostreamを使用できますが、stdioでも十分ですし。


>構造体や配列への入れ方もしくは、読み込み

構造体の場合
scanf(フォーマット, &構造体.メンバ);

配列の場合
scanf(フォーマット, &配列[インデックス]);
または
scanf(フォーマット, 配列 + インデックス);

のような感じですね。
これで配列や構造体に直接読み込めます。


>第1項は、file02がfile01に対して一番距離が近いので点数を付与して、
>ということを第195項までして、最終的に一番点数の高いファイルを返せばできるのではないかと

ちょっと質問。
極端な例ですが、
file01が1,1,1,1,1,・・・(合計195)
file02が999,1,1,1,1,・・・(合計1193)
file03が2,2,2,2,2,・・・(合計390)
というような場合は、その比較方法ではfile03よりもfile02が近くなると思いますが、
それで大丈夫でしょうか?


比較方法が違いますが、サンプルを載せてみます。


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

Name: こ〜ふぃ  ..かけだし(1,626ポイント)   Date: 2009/01/13(火) 12:41   No:26839     
Title: Re:複数のtxtファイルやcsvファイルを比較したいのですが。    
ファイルは、最初は全てtxtだったのですが、
csvのほうは私が、EXCELで使うために書き直したものです。

そして、ファイルに格納されている195個の数字というのは、人の声の特徴量でして、
その結果、ファイル名は、人の名前になっています。
(例 hanako.csv tarou.csvなど)
ですから、csvなどで、フォルダを分けてはいるものの、フォルダ名に規則性はありません。

指定しているフォルダ全部と言ったほうがいいと思います。


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

Name: non  ..プログラマー(27,057ポイント)   Date: 2009/01/13(火) 13:09   No:26840     
Title: Re:複数のtxtファイルやcsvファイルを比較したいのですが。    
ファイル名に規則性がないとすると、方法は2つです。
一つは、ibisさんがサンプルを載せているように、ファイル名の一覧を作ることです。
これは、面倒ですが、プログラムは簡単です。
もう一つは、フォルダ内を検索することです。
これには_findfirstなどの関数を使います。(ただし、Windowsだという前提で説明してます)
ググってみてください。
例えば、
http://www5c.biglobe.ne.jp/~ecb/c/12_11.html
などです。
調べた上でわからないことを質問してください。


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

Name: こ〜ふぃ  ..かけだし(2,196ポイント)   Date: 2009/01/13(火) 13:25   No:26842     
Title: Re:複数のtxtファイルやcsvファイルを比較したいのですが。    
ibisさんありがとうございます。

このfileに格納されている数字は、人間個人の声の特徴量であるため、
そこまで突飛な量は出てこないと思うので、この比較で十分いけると思います。

私は、この全数比較は、第一段階で、
この後に分散を使った形でもあらわしたいと思っています。

全てのfileの第1項の分散を求め、分散が1以上ならば、file01第1項に±σ/2(σ=標準偏差)の範囲をとって、
その中に入るfileに得点を付与する。
例えば、
第1項の分散が3.55なら、file01第1項にたいして、±σ/2の範囲をとってfile03とfile05が入っていたらその二つのファイルに+1点とし、
第2項の分散が0.74なら、計算をせずに、第3項の計算に移り、
第3項の分散が2.77なら、file01第3項にたいして、±σ/2の範囲をとってfile03とfile04が入っていたらその二つのファイルに+1点とし、



と、繰り返し、最終的にfile03が2点を獲得し、一番得点が高いのでfile01に近いのはfile03のような結果を出したいのです。
精度は、多分速度とトレードオフになると想像がつくので、
あまり、精度は、気にしていません。
この考えでは、そこまでひどく精度が落ちることもないと思うのですが。
ただ、配列にファイル読み込みもできない人物の妄想なので、
お手をお借りできればと思っています。


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

Name: こ〜ふぃ  ..かけだし(2,382ポイント)   Date: 2009/01/13(火) 13:29   No:26843     
Title: Re:複数のtxtファイルやcsvファイルを比較したいのですが。    
nonさん回答ありがとうございます。
ワイルドカードってはじめて聞きました。
色々ググってみます。
まだ、それについてわからないことだらけなので、
なるべく調べてから質問したいと思います。


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

Name: non  ..プログラマー(27,156ポイント)   Date: 2009/01/13(火) 13:39   No:26844     
Title: Re:複数のtxtファイルやcsvファイルを比較したいのですが。    
了解です。
こ〜ふぃさんの環境がわからないので、まずはサンプルが動くか確かめてください。
場合によっては、_findfirstではなく、finfirstのように先頭のアンダーバーを取らないと
動かないコンパイラもあると思います。
BCCやVC++なら大丈夫。


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

Name: こ〜ふぃ  ..入門者(3,042ポイント)   Date: 2009/01/13(火) 15:25   No:26854     
Title: Re:複数のtxtファイルやcsvファイルを比較したいのですが。    
ibisさんのサンプルを使ってプログラムを動かしたところ、

7[main] program 8632 _cygtls::handle_exceptions: Error while dumping state
(probably corrupted stak) Segmenttation fault (core dumped)

というエラーとprogram.exe.stackdumpというファイルが生成されました。

Exception: STATUS_ACCESS_VIOLATION at eip=610EA750
eax=00000000 ebx=0022C5C8 ecx=00000000 edx=00000000 esi=611021A0 edi=0040152C
ebp=0022C598 esp=0022AFD0 program=c:\Documents and Settings\Guest\My Documents\home\speech\hmm1\hmmtxt\csv\kensaku3.exe, pid 8632, thread main
cs=001B ds=0023 es=0023 fs=003B gs=0000 ss=0023
Stack trace:
Frame Function Args
0022C598 610EA750 (0022D008, 00000000, 00403146, 0022C5C8)
0022C5B8 610E78C9 (00000000, 00403146, 0022CCD0, 0040107E)
0022CCE8 610935A8 (00000001, 6116B6F0, 006B0090, 0022CC70)
0022CD98 610060D8 (00000000, 0022CDD0, 61005450, 0022CDD0)
61005450 61004416 (0000009C, A02404C7, E8611021, FFFFFF48)
7 [main] kensaku3 8632 _cygtls::handle_exceptions: Error while dumping state (probably corrupted stack)

という中身なのですが、これは、何かアクセスしてはいけないメモリを配列で使っているということは、
調べてわかったのですが、根本的な解決策がいまだに見つかりません。
どのようにしたらよろしいのでしょうか?


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

Name: ibis  ..上級者(17,361ポイント)   Date: 2009/01/13(火) 16:09   No:26857     
Title: Re:複数のtxtファイルやcsvファイルを比較したいのですが。    
対象ファイルが無い状態で実行するとエラーでますよ。
アクセス違反だったら、多分ファイルポインタが無効なのではないかと思います。

ちなみにこちらの環境で
(bccでコンパイルして、同一フォルダに対象ファイル(区切り文字は改行)を用意して)
実行したら正常に動きました。

ループでの配列アクセスの上限と下限は定数を使ってますので、
これは環境によって変わる(エラーだったり、そうでなかったり)ということは無いと思うのですが。

まぁ動かなければ、これは無視してくださってもかまいませんよ。


>まずはサンプルが動くか確かめてください。
とありますが、これは私が挙げたサンプルではなくて、nonさんが載せてるリンク先にあるサンプルのことだと思いますよ。


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

Name: こ〜ふぃ  ..入門者(3,207ポイント)   Date: 2009/01/13(火) 17:07   No:26859     
Title: Re:複数のtxtファイルやcsvファイルを比較したいのですが。    
ibisさん回答ありがとうございます。
対応ファイルも作ってやったところ出たのが、先ほどのエラーです。
今度は、
cvsファイルを20個ほど用意し、
突っ込んでみましたが、先ほどのエラーでした。

しかし、cvsファイルを4個まで減らしたところ正常に動きました。
いったいどういうことなのでしょうか?

nonさんのサンプルも動いたのですが、
なにぶんワイルドカードがはじめて聞くものなので、試行錯誤中といったところです。
その間に、このエラーをどうにかできないものかと考えています。

あと、ファイルポインタが向こうというのはどういうことですか?


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

Name: non  ..プログラマー(27,537ポイント)   Date: 2009/01/13(火) 17:27   No:26865     
Title: Re:複数のtxtファイルやcsvファイルを比較したいのですが。    
>なにぶんワイルドカードがはじめて聞くものなので、試行錯誤中といったところです。

ワイルドカード自体はそんなに難しい話ではありませんが・・・

2つの検索種類があるので、
最初は *.txtで検索し、
次に *.csvで検索するというように2回に分けます。




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

Name: non  ..プログラマー(27,860ポイント)   Date: 2009/01/13(火) 18:04   No:26869     
Title: Re:複数のtxtファイルやcsvファイルを比較したいのですが。    
わかりやすいように無駄なモノを極力省きました。

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

char f_name[100][20];//ファイルの最大を100個、文字数を20文字までにしました。
int f_no=0;

void find_file( char *filename ){
struct _finddata_t c_file;
long hFile;

if( (hFile = _findfirst( filename, &c_file )) !=-1 ){
strcpy(f_name[f_no++],c_file.name);
while( _findnext( hFile, &c_file ) == 0 )
strcpy(f_name[f_no++],c_file.name);
_findclose( hFile );
}
}
int main(void)
{
int i;
find_file("*.txt");
find_file("*.csv");
for(i=0;i<f_no;++i)
puts(f_name[i]);
return 0;
}



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

Name: ibis  ..上級者(17,451ポイント)   Date: 2009/01/14(水) 16:30   No:26895     
Title: Re:複数のtxtファイルやcsvファイルを比較したいのですが。    
とりあえず、ちょっと改良したものを添付します。
これならどうでしょうか?

>あと、ファイルポインタが向こうというのはどういうことですか?
ファイルを開くのに失敗した場合はファイルポインタの値がNULLになります。
その為、値がNULLのファイルポインタは無効ということです。


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

Name: こ〜ふぃ  ..入門者(2,687ポイント)   Date: 2009/01/14(水) 17:13   No:26900     
Title: Re:複数のtxtファイルやcsvファイルを比較したいのですが。    
nonさん懇切丁寧な回答ありがとうございました!!
おかげで、ファイルの検索はできるようになりました。
なので、単純な全数検索でのファイル比較は解決するこ 
とができました。
どうもありがとうございました。

あとは、もうひとつの方法である分散をもちいた方法を考えています。

全てのfileの第1項の分散を求め、file01の第1項が分散が5以上ならば、file01第1項に±σ(σ=標準偏差)の範囲をとって、 その中に入るfileに得点を付与する。
例えば、
第1項の分散が5.22なら、file01第1項を中心に±σの範囲をとってfile03とfile05が入っていたらその二つのファイルに+1点とし、
第2項の分散が0.74なら、計算をせずに、第3項の計算に移り、
第3項の分散が12.45なら、file01第3項にたいして、±σ/2の範囲をとってfile03とfile04が入っていたらその二つのファイルに+1点とし、



と、繰り返し、最終的にfile03が2点を獲得し、一番得点が高いのでfile01に近いのはfile03のような結果を出したいのです。
精度は、多分計算速度とトレードオフになると想像しています。

先ほどの、全数検索で比較する方法では、

double file[195]

for(n =0 ; n<= ファイル数 ; n++){
fp = fpoen(files[n],"r");
for(i=0; i<=194;i++){
fscanf(fp,"%lf",&file);
距離計算
   }
fclose(fp);
}

みたいな感じで計算していたため、file毎の第1項同士の分散などの計算ができずに困っています。
そもそも、ファイルを2次元配列で入れ込んだほうがよいのでしょうか?



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

Name: non  ..プログラマー(28,063ポイント)   Date: 2009/01/14(水) 17:37   No:26902     
Title: Re:複数のtxtファイルやcsvファイルを比較したいのですが。    
ファイルのデータを入れる配列は
double file_data[195][f_no];
のような2次元配列にして、加工しない生データをファイルから格納し、
必要に応じて
例えば距離を入れる配列や、分散を入れる配列、得点を入れる配列を用意した方が
いいでしょう。


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

Name: こ〜ふぃ  ..入門者(3,288ポイント)   Date: 2009/01/15(木) 01:17   No:26913     
Title: Re:複数のtxtファイルやcsvファイルを比較したいのですが。    
返信遅れながら失礼します。

ibisさん
改訂版のファイルありがとうございます。
こちらは、ファイル数を増やしてもエラーが出ずに、動作しました。
このファイルを元に、各項ごとの分散(file01からfile nの第1項の分散、第2項の分散といった具合)を計算しようと、試行錯誤したのですが、できませんでした。

nonさん
アドバイスありがとうございます。
2次元配列がわからないなりに、色々調べて書いてみたのですが、ファイルが開けないなどといわれたり、coredumpというエラーが起きたりして、配列にファイルデータを格納できずに困っています。
↓が書いてみたものです。

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

const char *files[] = {"open.txt", "open_yanagawa.txt", "open_kayama.txt", "open_eiji.txt", "open_shouta.txt",

"open_okuhara.txt", "open1.txt", "open_new1.txt", "open_fuse1.txt", "open_nakamura1.txt", "open_kensei1.txt",

"open_oomori1.txt", "open_yanagawa1.txt", "open_eiji1.txt", "open_shouta1.txt", "open_okuhara1.txt"};

#define NUMBER_OF_FILES (sizeof(files) / sizeof(char*))

int main(void)
{

FILE *fp;
double file_data[195][NUMBER_OF_FILES];
int i, j, k;

// open
for(i = 0; i <= NUMBER_OF_FILES; i++)
{
fp = fopen(files[i], "r");
if(fp == NULL)
{
printf("file open failuer\n");
return 1;
}
for(j = 0; j <= 194; j++)
{
fscanf(fp, "%lf", &file_data[j][i]);
}
}

// display
for(i=0;i<NUMBER_OF_FILES;i++)
{
for(j=0;j<194;j++)
{
printf("%d番目ファイル %d項目 %lf\n",file_data[i][j]);
}
}

// close
fclose(fp);

return 0;

}





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

Name: non  ..プログラマー(28,092ポイント)   Date: 2009/01/15(木) 08:45   No:26915     
Title: Re:複数のtxtファイルやcsvファイルを比較したいのですが。    
fopenとfcloseは対で使います。
fcloseの場所を考えてください。


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

Name: non  ..プログラマー(28,886ポイント)   Date: 2009/01/15(木) 10:26   No:26919     
Title: Re:複数のtxtファイルやcsvファイルを比較したいのですが。    
サンプルとして、ファイルデータを読み込み、平均を求めて、csvファイルを出力するようにしました。
実行したら、data.csvを開いて確認してください。再度、実行するときは、data.csvを削除して行うように
しないと、このファイルも読んじゃいます。入力データのフォルダと出力データのフォルダを分けるべき
ですが、プログラムがわかりにくくなるので、自分でしてください。
現状では、すべてカレントフォルダを見に行きます。
同様な方法で、分散でも得点でもできると思います。


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

#define NUMBER_OF_FILES 100

char f_name[NUMBER_OF_FILES][20];//ファイルの最大を100個、文字数を20文字までにしました。
int f_no=0;
double file_data[195][NUMBER_OF_FILES];//生データ格納用
double ave_data[195]; //平均

void find_file( char *filename ){
struct _finddata_t c_file;
long hFile;

if( (hFile = _findfirst( filename, &c_file )) !=-1 ){
strcpy(f_name[f_no++],c_file.name);
while( _findnext( hFile, &c_file ) == 0 )
strcpy(f_name[f_no++],c_file.name);
_findclose( hFile );
}
}
void f_load(int no,char *filename)
{
FILE *fp;
int i;
fp = fopen(filename, "r");
for(i = 0; i < 195; i ++){
fscanf(fp, "%lf", &file_data[i][no]);
}
fclose(fp);

}
void ave(void)
{
int i,j;
double work;
for(i=0;i<195;i++){
work=0.0;
for(j=0;j<f_no;j++)
work+=file_data[i][j];
ave_data[i]=work/f_no;
}
}
void f_out(void)
{
FILE *fp;
int i,j;
if((fp = fopen("data.csv", "w"))==NULL){
printf("ファイルオープンエラー");
exit(1);
}
fprintf(fp,"\"項目\"");
for(i=0;i<f_no;i++)
fprintf(fp,",\"%s\"",f_name[i]);
fprintf(fp,",\"平均\"");
fprintf(fp,"\n");
for(i=0;i<195;++i){
fprintf(fp,"%d",i);
for(j=0;j<f_no;++j)
fprintf(fp,",%lf",file_data[i][j]);
fprintf(fp,",%lf",ave_data[i]);
fprintf(fp,"\n");
}
fclose(fp);
printf("data.csvに出力しました\n");
}
int main(void)
{
int i;
//ファイルの検索
find_file("*.txt");
find_file("*.csv");
//データの読み込み
for(i=0;i<f_no;++i)
f_load(i,f_name[i]);
//平均
ave();
//CSVファイル出力
f_out();
return 0;
}




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

Name: こ〜ふぃ  ..入門者(3,358ポイント)   Date: 2009/01/19(月) 02:08   No:27126     
Title: Re:複数のtxtファイルやcsvファイルを比較したいのですが。    
nonさん返信ありがとうございます。
お教えいただいたプログラムも問題なく動きました!
分散などの得点もやってみます。

タイトルの比較の部分が解決したので解決とします。
ご協力いただいた皆さんありがとうございます。
また質問した際にはよろしくお願いします


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



Name: kokoro  ..初心者(5,440ポイント)   Date: 2009/01/18(日) 19:20   No:27073       
Title: 無題    
問題文
社会、理科、英語の得点から平均点と評価を与えるプログラムである。
各個人のデータは@「出席番号」A「文系・理系の区分」B「社会」C「理科」
D「英語」E「3教科の平均」F「評価」からなる。ただし、具体的にデータとして
入れるのは@ABCDのみ。(残りはプログラムに処理させる)データは構造体で宣言する。「3教科平均」では、各人の社会・理科・英語の平均点を代入しておく。
「評価」には「文系であれば社会と英語の平均、理系であれば理科と英語の平均」に
応じて80以上はA、70〜79はB、60〜69はC、59以下はDといれる。出力はこれらを全て
埋めたものを表形式で出力する。さらに、「3教科の平均」で昇順にソートしておく。
(値の入れ替えはswap関数をつくる)
●検証用データ(変数の宣言時に代入しておく)
出席番号   文系・理系  社会  理科  英語
 0001     文系     85   32   74
 0002     理系     33   68   52
 0003     理系     69   97   83
 0004     文系     72   60   65
 0005     文系     46   72   88
 0006     文系     85   41   79
 0007     理系     77   85   52


「評価」のとこですが,3教科の平均をもとに出ているのですが、
これを「文系は国語と英語の平均」「理系は数学と英語の平均」で出すにはどうすればいいのでしょうか。
アドバイスお願いします。
プログラムは添付してあります。


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


Name: SCI  ..初心者(6,213ポイント)   Date: 2009/01/18(日) 19:29   No:27074     
Title: Re:無題    
詳しく見てないですが、文系なら0、理系なら1とかやってifで分岐すればいいのでは?
if文の使い方は分かりますか?


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

Name: kokoro  ..初心者(5,452ポイント)   Date: 2009/01/18(日) 19:39   No:27076     
Title: Re:無題    
main関数のところのif文は違いますか?

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

Name: SCI  ..初心者(6,242ポイント)   Date: 2009/01/18(日) 19:52   No:27078     
Title: Re:無題    
その前に、「社・理・英」は「国・数・英」なのですか?

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

Name: non  ..プログラマー(30,878ポイント)   Date: 2009/01/18(日) 19:55   No:27079     
Title: Re:無題    
理系の時は自分で解けてるじゃないですか。

文系のとき
double calc_average(struct person *p) {
double sum;
sum = p->score_japa + p->score_month + p->score_eng;
return sum / 3.0;
}
理系のとき
double calc_average1(struct person *p) {
double sum;
sum = p->score_month + p->score_eng;
return sum / 2.0;
}



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

Name: box  ..ハッカー(133,751ポイント)   Date: 2009/01/18(日) 20:14   No:27080     
Title: Re:無題    
> 社会、理科、英語の得点から平均点と評価を与えるプログラムである。

これは間違いないですか?だとすると、

> これを「文系は国語と英語の平均」「理系は数学と英語の平均」で出すにはどうすればいいのでしょうか。

国語と数学の点数がないので、求められないです。

それから、教科の名前とプログラム中の変数名が混乱しているようです。
教科の名前を英語で書くと、
社会:social studies
理科:science
英語:english
国語:japanese
数学:mathematics

一度、頭の中を整理してみるとよいでしょう。


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

Name: kokoro  ..初心者(5,589ポイント)   Date: 2009/01/18(日) 20:18   No:27082     
Title: Re:無題    
なんかごちゃまぜになっていますね。すみません。

もう一度添付します。

先生に提出したところ、
「評価」のとこですが,たぶんこれは3教科の平均をもとに出していると
思います.仕様をよく読んで,評価の部分を直してください。
と言われました。

どうすればいいのでしょうか?


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

Name: SCI  ..初心者(6,292ポイント)   Date: 2009/01/18(日) 20:21   No:27083     
Title: Re:無題    
平均出すところしか見てないけど、改善できてるように見えます。

つまり、「共通3教科平均」から「文理別2教科平均」に作り変えってことですよね?


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

Name: box  ..ハッカー(133,610ポイント)   Date: 2009/01/18(日) 20:28   No:27085     
Title: Re:無題    
calc_average関数で、社会と英語の平均を求めるのに
「3」で割っているのは大いにまずいでしょう。

calc_average関数とcalc_average1関数は
教科が異なるだけでロジックは同じですね。
一つにまとまりませんか?

calc_rank関数とcalc_rank1は全く同じであるように見えます。
どちらか片方があればいいのではないでしょうか。

出席番号の中身が問題文と食い違っています。


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

Name: non  ..プログラマー(30,924ポイント)   Date: 2009/01/18(日) 20:30   No:27087     
Title: Re:無題    
出力する平均は3教科の平均を出す必要があるのでは?
評価用の平均とごちゃまぜになってますね。


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

Name: kokoro  ..初心者(5,626ポイント)   Date: 2009/01/18(日) 20:32   No:27088     
Title: Re:無題    
おそらく、「評価」では「文系は社・英の平均」、「理系は、理・英の平均」
を出し、ソートでは「3教科の平均」で昇順にするということですかね…。


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

Name: non  ..プログラマー(31,326ポイント)   Date: 2009/01/18(日) 20:39   No:27091     
Title: Re:無題    
そうですね

平均の関数は
double calc_average(struct person *p) {
double sum;
sum = p->score_sha + p->score_eng + p->score_rika;
return sum / 3.0;
}
メインでは
for (i = 0; i < NUM; i++) {
date[i].score_average = calc_average(&date[i]);
if (date[i].cls == 0) {
date[i].rank = calc_rank(date[i].score_sha, date[i].score_eng);
} else {
date[i].rank = calc_rank1(date[i].score_rika, date[i].score_eng);
}
}



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

Name: kokoro  ..初心者(5,646ポイント)   Date: 2009/01/18(日) 20:45   No:27092 解決!     
Title: Re:無題    
皆さんありがとおうございました。

とても助かりました^^


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



Name: ももにー  ..ぴよぴよ(808ポイント)   Date: 2009/01/18(日) 04:12   No:27016       
Title: 助けてください。    
入力された10個の整数を小さい順に並べ替えて出力する。
1,学生番号が偶数の人は小さい順(昇順)に並べ替える。
2,学生番号が奇数の人は大きい順(降順)に並べ替える。

という課題が出されました。
ある一部分を各自作成しなくてはならないのですが、
C言語にはまったく自信がありません。
以下のプログラムが何をやっているのかさえ理解できません。
かなりの問題児ですが、よろしくお願いします。


/************
sort 10 data
*************/
#include<stdio.h>
#define MAX 10

void inputnum(int num[]);
void sortnum(int num[]);
void outputnum(int num[]);

main(){
int num[MAX];

inputnum(num);
sortnum(num);
outputnum(num);
return(0);
}
/***********************
input 10 numbers to arry
***********************/
void inputnum(int num[]){
int i;
for(i=0;i<MAX;i++){
printf("数値%d"=",i+1);
scanf("%d",&num[i]);
}
printf("数値入力完了\n");
}
/*************
sort 10 number
*************/
#define FON 1
#define FOFF 0
void sortnum(int num[]){
int i;
int sflg;/*sort flag*/
int work;/*work area for sorting*/
sflg=FON;/* sort flag on */

while(sflg){
sflg=FOFF;/*sort sflg off */
for(i=0;i<MAX-1;i++){
if(num[i]>num[i+1]){

以下からが各自考えるところです。
自分なりに作ってみましたが、さっぱりです。
手直ししていただけると嬉しいです。
work=num[n];
num[n]=num[n+1];
num[n+1]=work;
}
}

printf("並べ替え完了\n");
}
/*************************
output 10 number from arry
*************************/
void outputnum(int num[]){
int i;

for(i=0;<MAX;i++){
printf("数値%d=%d\n",i+1,num[i]);
}
printf("数値出力完了\n");
}


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


Name: non  ..プログラマー(30,129ポイント)   Date: 2009/01/18(日) 08:44   No:27017     
Title: Re:助けてください。    
>以下からが各自考えるところです。
>自分なりに作ってみましたが、さっぱりです。
>手直ししていただけると嬉しいです。

とりあえず、この部分に
sflag=FON;
と書いて、プログラムをコンパイルし、エラーをなくしてください。
その後、わからないことを質問して下さい。



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

Name: box  ..ハッカー(133,542ポイント)   Date: 2009/01/18(日) 08:51   No:27018     
Title: Re:助けてください。    
> 入力された10個の整数を小さい順に並べ替えて出力する。
> 1,学生番号が偶数の人は小さい順(昇順)に並べ替える。
> 2,学生番号が奇数の人は大きい順(降順)に並べ替える。

問題文が、仮に

入力された10個の整数を並べ替えて出力する。
1,学生番号が偶数の人は小さい順(昇順)に並べ替える。
2,学生番号が奇数の人は大きい順(降順)に並べ替える。

だったら理解できるのですが、原文だと
学生番号が奇数の人はどうすればいいかわからなくて
苦労するのではないでしょうか。


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

Name: s-rush  ..中級者(14,792ポイント)   Date: 2009/01/18(日) 12:06   No:27027     
Title: Re:助けてください。    
パッと見た感じですが、文法的にも間違いがあるようですよ。

質問前にちゃんとコンパイルしましたか?


>main(){
int main(void){

>printf("数値%d"=",i+1);
 printf("数値%d=",i+1);


>work = num[n];
>num[n] = num[n+1];
>num[n+1] = work;
 変数nが定義されていません。

>for(i=0; <MAX; i++){
for(i=0; i<MAX; i++){

期待している結果が得られるかどうかは別ですが、(このプログラムではちゃんとソートされませんが^^;)
これでエラーは外れるはずです。

boxさんのおっしゃるように原文の問題だと矛盾があるような気がします。
なので、昇順にソートするということで話を進めさせていただきます。

sortnum関数内のwhile文がありますよね??
ももにーさんの書き方だと、while文の中身は1度しか実行されません。
たとえば入力された値が
 3 2 5 4
とします。(面倒なので4入力とさせてください)

それでこのプログラムを実行させると
 2 3 5 4
となり、ちゃんとソートされていません。
while内のどこかで、
 sflag=FON;
とする必要があります。

それともう1つ。
これも実行例を示した方がいいですかね。
たとえば入力された値が
 3 4 1 5 6
とします。
同様にこのプログラムを実行させると、(上記の修正をしたとします)
3 1 4 5 6
となり、ソート不十分です。

>for(i=0;i<MAX-1;i++){
この後にもう1行for文である処理を加える必要があります。

ソートの手法としては様々なアルゴリズムがありますが、一度
“バブルソート”
でググってみてください。
調べるとおそらく何を追加しなければいけないか見えてくると思います。


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

Name: non  ..プログラマー(30,205ポイント)   Date: 2009/01/18(日) 12:25   No:27030     
Title: Re:助けてください。    
>>for(i=0;i<MAX-1;i++){
>この後にもう1行for文である処理を加える必要があります。

whileがその代わりをしています。
バブルソートに似ていますが、ちょっと違います。
名前はなんと呼ぶか知りません。


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

Name: s-rush  ..中級者(14,873ポイント)   Date: 2009/01/18(日) 12:27   No:27031     
Title: Re:助けてください。    
すいません。
大きな勘違いをしてました。
while文の条件で
>sflg = FON;
は関係ないですね^^;

ここに訂正してお詫びしますm(_ _)m

ソートのアルゴリズムが分かれば、あとは入力された値が
奇数なのか偶数なのかを判断し、それぞれに対応した処理を行うように
すればいいのではないでしょうか?


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

Name: s-rush  ..中級者(14,810ポイント)   Date: 2009/01/18(日) 12:45   No:27033     
Title: Re:助けてください。    
nonさん、ご指摘ありがとうございます。
よく考えてみれば、while文の意味がないですね^^;

sflgを切り替えるのであれば、おっしゃる通りバブルソートではないです。
すいませんでした。


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

Name: lbfuvab  ..中級者(14,799ポイント)   Date: 2009/01/18(日) 12:54   No:27034     
Title: Re:助けてください。    
qsortって使ったら駄目ですか?


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

Name: ももにー  ..ぴよぴよ(931ポイント)   Date: 2009/01/18(日) 13:30   No:27037     
Title: 無題    
みなさんこの課題に真剣に取り組んでくださって、
本当にありがとうございます。

みなさんの回答をじっくり読ませていただきましたが、
何から始めたらよいか、また、何を入力したらよいか、
わかりません(´;ω;`)

理解力が乏しいですが、根気強く教えていただけると嬉しいです。


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

Name: array [URL]  ..熟練のプログラマー(45,461ポイント)   Date: 2009/01/18(日) 13:34   No:27038     
Title: Re:助けてください。    
> 1,学生番号が偶数の人は小さい順(昇順)に並べ替える。
> 2,学生番号が奇数の人は大きい順(降順)に並べ替える。

ちなみに、この文は直接問題には関係なく、ももにーさんの学籍番号に関係するのでしょうか?
もし、そうだった場合、ももにーさんの学籍番号が奇数か偶数か示していた方が、良い気がします。


問題についていまいち理解してませんが、単純に10個の入力した数値をソートするプログラムにしてみました。

最近C言語に触れてなかったので自身は無なく、元のソートとは多分違う形式のソート方式を使ってると思います。(昇順)でソートしてます。
元のソート、プログラムではwhile文を使っていますが
今回の場合、配列要素は
#define MAX 10
で10個と定義されているのでfor文を使った形の方が良いのでは?って事でforを使って考えました。

※あまり関係ない部分は文字を小さくしています。


/************
sort 10 data
*************/
#include<stdio.h>
#define MAX 10

void inputnum(int num[]);
void sortnum(int num[]);
void outputnum(int num[]);

main(){
int num[MAX];

inputnum(num);
sortnum(num);
outputnum(num);
return(0);
}
/***********************
input 10 numbers to arry
***********************/
void inputnum(int num[]){
int i;
for(i=0;i<MAX;i++){
printf("数値%d=",i+1);
scanf("%d",&num[i]);
}
printf("数値入力完了\n");
}


/*************
sort 10 number  ソート部分
*************/
void sortnum(int num[])
{
int i,j;
int work;/*work area for sorting*/

for(i=0;i<MAX;i++) //配列[0]から比較する
{
for(j=i;j<MAX;j++) //
{
if(num[i] > num[j]) //小さければ
{
work = num[j]; //小さい値を別保存
num[j] = num[i]; //大きい値を入れ替え
num[i] = work; //小さい値を入れ変える
}
}
}

printf("並べ替え完了\n");
}

/*************************
output 10 number from arry
*************************/
void outputnum(int num[]){
int i;

for(i=0;i<MAX;i++){
printf("数値%d=%d\n",i+1,num[i]);
}
printf("数値出力完了\n");
}


------------------------------------------------

#####入力情報#####
数値1=5
数値2=6
数値3=4
数値4=2
数値5=2
数値6=3
数値7=9
数値8=1
数値9=8
数値10=7

#####実行結果#####
数値1=1
数値2=2
数値3=2
数値4=3
数値5=4
数値6=5
数値7=6
数値8=7
数値9=8
数値10=9




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

Name: ももにー  ..かけだし(1,027ポイント)   Date: 2009/01/18(日) 14:02   No:27039     
Title: Re:助けてください。    
>>arrayさん
ありがとうございます。
私の学生番号は偶数です。

arrayさんの回答を参考に入力してみましたが、
コンパイルに失敗します。
というか、みなさんに助けていただく前から、
コンパイルに失敗しています。

やっぱりコンパイルって正確に入力されないと成功しないものですよね?


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

Name: array [URL]  ..熟練のプログラマー(45,680ポイント)   Date: 2009/01/18(日) 14:10   No:27040     
Title: Re:助けてください。    
赤文字のみの修正だけではなく
プログラム全体をコピーして貼り付けてコンパイルしてみて下さい。(白文字の小文字部分)
printfに数か所ミスがあったので修正しておきました。

もしくは、赤文字の//以降を削除してから再度コンパイルしてみて下さい。
//以降はコメントです。
コンパイラ(コンパイルソフト)によって、「//」スラッシュを2個を用いるコメントが使えないものがあるみたいです。(C言語では普通は使えないみたいですけどC++コンパイラなら大丈夫だと思います)


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

Name: ももにー  ..かけだし(1,478ポイント)   Date: 2009/01/18(日) 16:15   No:27046     
Title: Re:助けてください。    
>>arrayさん
たびたびありがとうございます。

arrayさんのをコピーさせていただいて、このようになりました。


/************
sort 10 data
*************/
#include<stdio.h>
#define MAX 10

void inputnum(int num[]);
void sortnum(int num[]);
void outputnum(int num[]);

main(){
int num[MAX];

inputnum(num);
sortnum(num);
outputnum(num);
return(0);
}
/***********************
input 10 numbers to arry
***********************/
void inputnum(int num[]){
int i;
for(i=0;i<MAX;i++){
printf("数値%d=",i+1);
scanf("%d",&num[i]);
}
printf("数値入力完了\n");
}

/*************
sort 10 number
*************/
void sortnum(int num[])
{
int i,j;
int work;/*work area for sorting*/

for(i=0;i<MAX;i++)
{
for(j=i;j<MAX;j++)
{
if(num[i] > num[j])
{
work = num[j];
num[j] = num[i];
num[i] = work;
}
}
}
printf("並べ替え完了\n");

/*************************
output 10 number from arry
*************************/
void outputnum(int num[]){
int i;

for(i=0;i<MAX;i++){
printf("数値%d=%d\n",i+1,num[i]);
}
printf("数値出力完了\n");
}



ソート部分のエラーは無くなったようなのですが、
まだ出力部分にエラーがあるようでコンパイルに失敗します。

どのようにしたらよいのでしょう?


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

Name: ももにー  ..かけだし(1,571ポイント)   Date: 2009/01/18(日) 16:25   No:27047     
Title: Re:助けてください。    
>>arrayさん!!
今見なおしたらちょっと抜けてて、直したらできました(感動)!!

arrayさん
s-rushさん
lbfuvabさん
nonさん
boxさん

ご協力本当にありがとうございました。
またの機会がありましたらぜひよろしくお願いします(´;ω;`)


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

Name: box  ..ハッカー(133,557ポイント)   Date: 2009/01/18(日) 16:27   No:27048     
Title: Re:助けてください。    
sortnum関数がきちんと閉じていないことが原因です。

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

Name: ももにー  ..かけだし(1,579ポイント)   Date: 2009/01/18(日) 16:27   No:27049 解決!     
Title: Re:助けてください。    
解決です。

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

Name: array [URL]  ..熟練のプログラマー(45,866ポイント)   Date: 2009/01/18(日) 16:32   No:27050     
Title: Re:助けてください。    
コンパイル時のエラーはどんなものでしょうか?
一応こちらで確認してみたところ以下の様になっていました。

test.c(56) : error C2143: 構文エラー : ';' が '型' の前にありません。

()の中は行数を示しているので、その56行目付近が怪しいです。
エラーは自分で解決して慣れるのが一番いいと思いますが・・・・




調べてみたところ「}」が抜けてるみたいです。


/* 〜省略〜 */
}
printf("並べ替え完了\n");
}
/*************************
output 10 number from arry
*************************/
void outputnum(int num[]){
/* 〜省略〜 */




----追記----
解決してましたか♪
C言語は興味持てれば、独学でも理解できるので、ぜひこれからもC言語取得頑張って下さい^^
C言語が分かるようになれば、管理人さんが公開している、ゲームプログラミングの館を参考に
自作のゲームなどが作れて楽しいですよ^^


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

Name: non  ..プログラマー(30,283ポイント)   Date: 2009/01/18(日) 17:07   No:27057     
Title: Re:助けてください。    
ちょっとみないうちに解決した事になってますが、
課題は while(sflg)を使って解かなければいけないのでしょ!!
forの2重ループにして、選択法(だったかな?)にしてしまったらまずいでは?
一番最初に私が、言ったように、下の1行を加えて、エラーを直せばいいって言ったのに。


while(sflg){
sflg=FOFF;/*sort sflg off */
for(i=0;i<MAX-1;i++){
if(num[i]>num[i+1]){
sflg=FON;
work=num[i];
num[i]=num[i+1];
num[i+1]=work;
}
}
}


この方法は、呼び方は知らないけどアリですよ。
sflagは並び替えが行われないときはFOFFのままなので、最初から並び替えられているときは
すぐに終わる特徴があります。
通常はforの2重ループとsflagを組み合わせて、両方使いますけど。




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

Name: ももにー  ..かけだし(1,637ポイント)   Date: 2009/01/18(日) 20:18   No:27081     
Title: Re:助けてください。    
>>nonさん
わざわざありがとうございます。

折角ですので参考にさせていただきます。
本当に本当にありがとうございます。


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



Name: 初心者  ..プログラマー(27,125ポイント)   Date: 2009/01/18(日) 15:23   No:27043       
Title: 14歳からはじめるc言語ゲームプログラミング教室 Visual Studio 2008編    
この本のゲームを作り終えてこの本のゲームを改造したいと思っています。
あとがきに書いてある、「1ステージに数種類の敵を出現させる」というものに改造させたいと思っています。
ですが、あまり意味が理解できません。
どなたか簡単に説明してくれませんか?
初心者なので低レベルな質問かもしれませんが教えてください。


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


Name: kazuoni [URL]  ..熟練のプログラマー(49,882ポイント)   Date: 2009/01/18(日) 15:57   No:27044     
Title: Re:14歳からはじめるc言語ゲームプログラミング教室 Visual Studio 2008編    
回答してくださる方の中で、
この書籍を持っている人がどれぐらいいるか分かりませんが、
もっと細かく質問されてはどうですか?
「この一文がわからない」や「大まかにコードを書くとこうなるのですが・・・」
みたいに。
自分なんかはこの本が手元にないため、答えようがありません。。



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

Name: 初心者  ..プログラマー(27,216ポイント)   Date: 2009/01/18(日) 16:33   No:27051     
Title: Re:14歳からはじめるc言語ゲームプログラミング教室 Visual Studio 2008編    
すいませんコードは書いてありませんが、大まかなやり方は書いてあります。
「Enemy構造体に敵の種類を区別するメンバー変数を追加し、その値が0なら敵aの処理を実行、1なら敵bを実行」
と書いてあって、Enemy構造体の書き方なら分かりますが、
「その値が0なら敵aの処理を実行、1なら敵bを実行」
という処理の書き方が分かりません。


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

Name: SCI  ..初心者(5,988ポイント)   Date: 2009/01/18(日) 16:43   No:27052     
Title: Re:14歳からはじめるc言語ゲームプログラミング教室 Visual Studio 2008編    
条件分岐といえば、if文やswitch文ですよね。
関数ポインタを配列に入れて・・・というのもできますよ。

処理を分岐させればいいのですが、このことはその本には載っていないのでしょうか?


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

Name: 初心者  ..プログラマー(27,230ポイント)   Date: 2009/01/18(日) 16:55   No:27054     
Title: Re:14歳からはじめるc言語ゲームプログラミング教室 Visual Studio 2008編    
載っていませんね
その方法やってみたいと思います。
具体的に教えていただけませんか?


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

Name: 初心者  ..プログラマー(27,277ポイント)   Date: 2009/01/18(日) 17:01   No:27055     
Title: Re:14歳からはじめるc言語ゲームプログラミング教室 Visual Studio 2008編    
すいません
質問したいことがもう一つありました。
1つ敵のデータがありますが、どこにif文を書くといいのでしょうか。
また、どのように書くといいでしょうか?


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

Name: バグ  ..ハッカー(142,069ポイント)   Date: 2009/01/18(日) 17:04   No:27056     
Title: Re:14歳からはじめるc言語ゲームプログラミング教室 Visual Studio 2008編    
シューティングゲームの作り方が一通り載っていますので、条件分岐などは当然ながら説明されています。
あとはそれらを理解して応用する事が必要なので、最低限の事以上は宿題としているのでしょう。
個人的な意見ですが、プログラミングに必要なのは、論理的思考と応用だと思います。1から10まで他人に教えてもらっていては、いつまでたっても身につきませんよ。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(955,239ポイント)   Date: 2009/01/18(日) 18:39   No:27068     
Title: Re:14歳からはじめるc言語ゲームプログラミング教室 Visual Studio 2008編    
DXライブラリ本家なら管理人さんが本をお持ちでしょうけど、
回答者はある程度のスキルが既にある方が多いので、
入門書や基礎的な本は回答者が持っている可能性は低いと思います。
私のようにスキルは無いけど、我流でいくぜ的な人もいるでしょうし^^;

なので、もう少し一般的なことを聞くか、本家で聞いたほうがいいと思います。
また、既にあるものを改良して自分のものにするのは、1から作るより難しいことなんじゃないかと思います。
人が書いたコードを読むのは難しいことですし、なんとなくわかった気になって飛ばし読みしてる部分もあると思います。
そういうのも含めて全て自分のものとして習得するのは難しいです。
ですから、改良が難しそうならあえて1から作ったほうがいいと思います。

自分が書いたコードだから、自分が一番よくわかってるでしょうしね。
書いてるうちに何か思いつくことがあるはずですし。

なお、ここのサイトでもシューティングの作り方は紹介していますので、
そちらの質問なら答えやすいです。


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

Name: 初心者  ..プログラマー(27,259ポイント)   Date: 2009/01/18(日) 18:46   No:27070 解決!     
Title: Re:14歳からはじめるc言語ゲームプログラミング教室 Visual Studio 2008編    
はい分かりました。
皆さん、返答ありがとうございました。


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



Name: jag  ..ぴよぴよ(141ポイント)   Date: 2009/01/17(土) 00:43   No:26995       
Title: ゲームプログラミングの館の12節について    
ゲームプログラミングの館の12節の、「画像を動かす。」でサンプルプログラムをそのままコピーしたのですが、
実行すると、しばらく何も起きず突然完全に動いた後の画像が表示されてしまいます。(分かり難くてすみません)
13節では問題なく動いたので、sleep関数が原因だと思うのですが、理由がまったくわかりません。
なぜでしょうか?


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


Name: Dixq (管理人) [URL]  ..伝説なるハッカー(954,481ポイント)   Date: 2009/01/17(土) 01:04   No:26997     
Title: Re:ゲームプログラミングの館の12節について    
12章は「うまく表示できない例」を見せる為の章で、
なぜ13章のようなプログラムを書かないといけないか理解する為の章です。

「12章ではうまくいかないのに13章だとうまくいく」と思って頂けたなら
13章のプログラムのありがたみがわかって頂けたかと思います。

画面にうつす内容をモニタの書き換えのタイミングを無視して書き換えようとすると、うまくいかないのです。
そのタイミングは使っている人のモニタによって様々で、60Hzのモニタを使っている人もいれば
70や80Hzのモニタを使っている人もいます。
そこで裏画面処理といって、計算途中は描画されている表画面には反映せず、
裏画面で全て計算してしまってから、モニタのリフレッシュに合わせて表示内容を更新しよう!という試みが必要なのです。

13章のプログラムはうまくいきましたよね?
ゲームを製作される時は、13章のプログラムをお使いください。

モニタのリフレッシュはだいたい60が一般的じゃないかと思いますが、モニタが対応していれば簡単に変更可能です。
もしVistaなら
デスクトップ右クリック>画面の設定>詳細設定>モニタ 
で変更可能です。XPでも同じような手順で出来ます。
もしゲームのFPSを一定にたもつ処理をしなければ、
このリフレッシュを早くすればゲームの進行も早くなってしまうので気をつけてください。(時間を計って移動制御しているようなプログラムではおきませんが、ループ回数のカウンタを使っているような場合速さが変化します)


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

Name: jag  ..ぴよぴよ(424ポイント)   Date: 2009/01/17(土) 03:11   No:26998     
Title: Re:ゲームプログラミングの館の12節について    
しかし、12節の文で画像動いてるように見えたりチラついたりするように書かれていますが
それすらなりません。

似たようなことで、
違う話になってすみませんが、Cをつかって1文字表示して間をおいてまた1文字表示する・・・というプログラムを作りたくて下のように書いたのですが、
実行すると5秒ほどたって一気に「aaaaa」と表示するようになってしまいます。
これらはなぜおこるのでしょうか?

#include<stdio.h>
#include<windows.h>
int main(void)
{
int i;
for(i=0;i<5;i++){
printf("a");
sleep(1);
}
return 0;
}




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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(954,578ポイント)   Date: 2009/01/17(土) 08:40   No:26999     
Title: Re:ゲームプログラミングの館の12節について    
12章のプログラムは使うことが無いと思うので、正常に表示されなくていいのです。
また、しばらくしてからaaaaaが表示されるのは単にまだプロセスが実行されてないだけなのでは?
生成した実行ファイルを直に実行したらどうなりますか?


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

Name: Libra  ..初心者(7,837ポイント)   Date: 2009/01/17(土) 10:24   No:27004     
Title: Re:ゲームプログラミングの館の12節について    
文字列を勉強した際に作ったお遊びプログラムがjagさんの作りたいものの仕様に近いと思うので、添付します。

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

Name: toyo  ..上級者(23,026ポイント)   Date: 2009/01/17(土) 10:52   No:27006     
Title: Re:ゲームプログラミングの館の12節について    
Vistaをお使いではないですか
Vistaでは12章のプログラムは解説通りには動かなかったと思います
(表画面に直接描画できない)


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

Name: jag  ..ぴよぴよ(595ポイント)   Date: 2009/01/17(土) 16:24   No:27012     
Title: Re:ゲームプログラミングの館の12節について    
>toyoさん
なるほど。
Vista使ってますのでそのせいなんですね



上に書いたコードを、sleepとwindowsの最初を大文字にしてc++としてvisual studioでコンパイルするとちゃんと思うように動きました。

しかし、学校でLinuxを使ってCのプログラミングをしていて、Cで作りたいのです。
家のPCでcygwinをインストールして、gccでコンパイルして実行すると、後から一気に表示するようになってしまいます。
gccのせいなのですか?
というか、これを最初に書くべきでしたね、本当にすみませんm(_ _)m
cygwinでgccでコンパイルしたものをwindowsで実行しようとすると「cygwin1.dllが見つかりません〜」などとでて実行できません。


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

Name: ren  ..ぴよぴよ(13ポイント)   Date: 2009/01/18(日) 15:19   No:27042     
Title: Re:ゲームプログラミングの館の12節について    
混乱していた所、全く同じ質問をされている方がいらっしゃったので助かりました。
当方もOSはVistaでした。
症状は同じで、描画のループ処理が終わった後に一気に表示されるというものでした。
12節に注意書き等が有った方が良いかもしれません。
13節は正常に動作しました。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(955,204ポイント)   Date: 2009/01/18(日) 18:39   No:27069     
Title: Re:ゲームプログラミングの館の12節について    
そうですね。12章に少し注意書き書いておこうと思います。ありがとうございます。

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



Name: ジュビ  ..ぴよぴよ(395ポイント)   Date: 2009/01/18(日) 02:11   No:27015       
Title: どなたか・・・    
このプログラムの解説をしていただけませんか?
% cat test18_1.c
#include <stdio.h>

#define MAXLINE 132
#define RECORD_SIZE sizeof(struct rec)
#define STACK_SIZE 12

struct rec
{
char *string;
struct rec *left, *right;
};

struct rec *add(struct rec *root, char *line);
struct rec *install(char *line);
void print_tree(struct rec *ptr);

main(int argc, char *argv[])
{
FILE *file;
char line[MAXLINE];

struct rec *root = NULL;

if (file = fopen(argv[1], “r”))
{
while (fgets(line, MAXLINE, file))
root = add(root, line);
printf_tree(root);
}
else
printf(“csort: can’t open %s\n”,argv[1]);
}

struct rec *add(struct rec *root,char *line)
{
struct rec **prev_ptr, *ptr;

if(root)
{
ptr = root;
while (ptr)
{
if (strcmp(line, ptr->string) <= 0)
{
prev_ptr = &ptr->left;
ptr = ptr->left;
else
{
prev_ptr = &ptr->right;
ptr = ptr->right;
}
}
*prev_ptr = install(line);
return(root);
}
return(install(line));
}

struct rec *install(char *line)
{
char *malloc();
struct rec *ptr;

ptr = (struct rec *)malloc(RECORD_SIZE);
ptr->string = malloc(strlen(line) + 1);
strcpy(ptr->string, line);

ptr->left = ptr->right = NULL;
return(ptr);
}

void print_tree(struct rec *ptr)
{
int i = 0;
struct rec *stack[STACK_SIZE];

while (1)
{
while (ptr)
{
stack[i++] = ptr;
ptr = ptr->left;
}
ptr = stack[--i];
if (i < 0)
break;
printf(“%s”, ptr->string);
ptr = ptr->right;
}
}

% cat temp
ELBOW GREASE. Labour.
DISGRUNTLED. Offended, disobliged.
JILTED. Rejected by woman.
GROG. Rum and water.
NUMBSCULL. Stupid fellow.
ZANY. The jester, or merry Andrew.
GAMBS. Thin, ill-shaped legs.
KICK THE BUCKET. To die.
AGAINST THE GRAIN. Unwilling.

% cc –o csort test18_1.c
% csort temp
AGAINST THE GRAIN. Unwilling.
DISGRUNTLED. Offended, disobliged.
ELBOW GREASE. Labour.
GAMBS. Thin, ill-shaped legs.
GROG. Rum and water.
JILTED. Rejected by woman.
KICK THE BUCKET. To die.
NUMBSCULL. Stupid fellow.
ZANY. The jester, or merry Andrew.
% csort garble
csort: can’t open garble
%

% cat temp
E
D
J
G
N
Z
G
K
A
%


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


Name: non  ..プログラマー(30,154ポイント)   Date: 2009/01/18(日) 09:16   No:27019     
Title: Re:どなたか・・・    
バイナリツリーまたは二分木でググって、調べた上でわからないことを質問して下さい。


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

Name: tkmakwins15  ..比類無きプログラマー(93,969ポイント)   Date: 2009/01/18(日) 14:46   No:27041     
Title: Re:どなたか・・・    
質問ですが、そのプログラムコンパイルできましたか?
残念ですが、僕の環境(WinXP+MinGW(gcc))ではエラーが出てコンパイルすらできませんでしたよ。

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

#define MAXLINE 132
#define RECORD_SIZE sizeof(struct rec)
#define STACK_SIZE 12

struct rec
{
char *string;
struct rec *left, *right;
};

struct rec *add(struct rec *root, char *line);
struct rec *install(char *line);
void print_tree(struct rec *ptr);

main(int argc, char *argv[])
{
FILE *file;
char line[MAXLINE];

struct rec *root = NULL;

if (file = fopen(argv[1], "r"))
{
while (fgets(line, MAXLINE, file))
root = add(root, line);
print_tree(root);
}
else
printf("csort: can’t open %s\n",argv[1]);
}

struct rec *add(struct rec *root,char *line)
{
struct rec **prev_ptr, *ptr;

if(root)
{
ptr = root;
while (ptr)
{
if (strcmp(line, ptr->string) <= 0)
{
prev_ptr = &ptr->left;
ptr = ptr->left;
}
else
{
prev_ptr = &ptr->right;
ptr = ptr->right;
}
}
*prev_ptr = install(line);
return(root);
}
return(install(line));
}

struct rec *install(char *line)
{
struct rec *ptr;

ptr = (struct rec *)malloc(RECORD_SIZE);
ptr->string = malloc(strlen(line) + 1);
strcpy(ptr->string, line);

ptr->left = ptr->right = NULL;
return(ptr);
}

void print_tree(struct rec *ptr)
{
int i = 0;
struct rec *stack[STACK_SIZE];

while (1)
{
while (ptr)
{
stack[i++] = ptr;
ptr = ptr->left;
}
ptr = stack[--i];
if (i < 0)
break;
printf("%s", ptr->string);
ptr = ptr->right;
}
}


と修正してやっとコンパイルとビルドが通りました。
後、ソースコードは、その前後に、<pre></pre>とつけて投稿してください。(<>は半角で)


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

Name: もぐりん  ..ぴよぴよ(8ポイント)   Date: 2009/01/18(日) 18:02   No:27063     
Title: Re:どなたか・・・    
こちらにも、マルチ投稿してますね?

http://www2.realint.com/cgi-bin/tarticles.cgi?pointc+32793



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



Name: ogani  ..ぴよぴよ(0ポイント)   Date: 2009/01/18(日) 13:07   No:27035       
Title: 無題    
C言語について


Name: Dixq (管理人) [URL]  ..伝説なるハッカー(954,791ポイント)   Date: 2009/01/18(日) 17:27   No:27059     
Title: Re:無題    
むむ、間違えて途中で投稿してしまったとかですかね?
本当はどういう質問だったのでしょう?


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



Name: ひよこ  ..初心者(7,752ポイント)   Date: 2009/01/14(水) 16:43   No:26897       
Title: インべーダーゲーム    
インべーダーゲームをつくろうと思ったのですが敵の動きについてうまくいかないので質問します。
裏画面を使うんですが最初に真ん中からはじまって右や左に行かせるのですが、真ん中 右 真ん中 左って動かしたいんですけど、i++とかで座標を増やしたあと自然に左へ行く方法がわかりません。ifとか使うとおもうと思うのですが、指定のしかたがわかりません。どうすればいいでしょうか。


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


Name: Dixq (管理人)  ..伝説なるハッカー(952,497ポイント)   Date: 2009/01/14(水) 16:58   No:26899     
Title: Re:インべーダーゲーム    
敵がいる位置は
左 中 右
の3種類だけですか?
それとも少しずつ左に移動していき、ある程度左まで来たら右に移動するのでしょうか?

どちらにしても「現在向いている方向」なる変数を用意し、そこに方向を指す数値を入れ、
それに従って計算すればいいと思います。


#include <stdio.h>
#include <windows.h>

int main(){
int Dir=1;
int i,x=0;

while(1){
x += Dir;
if( x<0 || x>2){
x = 1;
Dir *= -1;
}
for(i=0; i<x; i++)
printf(" ");
printf("●\n");
Sleep(500);
system("cls");
}
}

実行結果



後者でもやり方は同じ

#include <stdio.h>
#include <windows.h>

int main(){
int Dir=1;
int i,x=0;

while(1){
x += Dir;
if( x<0 || x>50){
Dir *= -1;
}
for(i=0; i<x; i++)
printf(" ");
printf("*\n");
Sleep(1);
system("cls");
}
}

実行結果




 


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

Name: ひよこ  ..初心者(7,802ポイント)   Date: 2009/01/14(水) 17:35   No:26901     
Title: Re:インべーダーゲーム    
上のプログラムについてわからないところがあるんですけどint i,x=0;でiとx=0を宣言しているのはわかるのですがx += Dir;これのいみがわかりません。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(952,565ポイント)   Date: 2009/01/14(水) 19:08   No:26903     
Title: Re:インべーダーゲーム    
xは座標、Dirは方向を表す変数です。

Dirが-1の時左に進み、1の時右に進みます。
これを利用してxの値を増減させているのです。


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

Name: ひよこ  ..初心者(7,826ポイント)   Date: 2009/01/14(水) 19:31   No:26904     
Title: Re:インべーダーゲーム    
ではiは何を意味するんですか。

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

Name: Mist  ..熟練のプログラマー(40,641ポイント)   Date: 2009/01/14(水) 19:48   No:26905     
Title: Re:インべーダーゲーム    
管理人さんのソースにコメント付けたよ。


#include <stdio.h>
#include <windows.h>

int main(){
int Dir=1; // *の移動方向 1=右, -1=左
int i; // ループカウンタ
int x = 0; // *の現在位置(左端からのX座標)

while(1){
x += Dir; // *の位置を更新(移動方向を加算)
if( x<0 || x>50){ // *を0<=x<=50の範囲で移動させたいので
Dir *= -1; // 範囲を超えたときに方向を逆転させる
}
for(i=0; i<x; i++) // *の現在位置手前まで空白を入出力する
printf(" ");
printf("*\n"); // *出力
Sleep(1); // 一瞬待つ
system("cls"); // 画面クリア
}
}


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

Name: ひよこ  ..初心者(7,810ポイント)   Date: 2009/01/14(水) 19:53   No:26906     
Title: Re:インべーダーゲーム    
コメントありがとうございます。なぜか system("cls"); がプログラムに入るとMS-DOSがたくさん出てくるんですが(消えたり出たり)どうしてでしょうか

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

Name: lbfuvab  ..中級者(14,607ポイント)   Date: 2009/01/14(水) 23:12   No:26910     
Title: Re:インべーダーゲーム    
>なぜか system("cls"); がプログラムに入るとMS-DOSがたくさん出てくるんですが(消えたり出たり)どうしてでしょうか
良く分かりませんが、これではどうですか


#include <stdio.h>
#include <windows.h>

int main(){
int Dir=1; // *の移動方向 1=右, -1=左
int i; // ループカウンタ
int x = 0; // *の現在位置(左端からのX座標)

while(1){
x += Dir; // *の位置を更新(移動方向を加算)
if( x<=0 || x>=50){ // *を0<=x<=50の範囲で移動させたいので
Dir *= -1; // 範囲を超えたときに方向を逆転させる
}
printf(" \r");
for(i=0; i<x; i++) // *の現在位置手前まで空白を入出力する
printf(" ");
printf("*\r"); // *出力
Sleep(80); // 一瞬待つ
}
}


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(952,528ポイント)   Date: 2009/01/15(木) 00:01   No:26911     
Title: Re:インべーダーゲーム    
DXライブラリで実装するんですよね?
上のサンプルはコンソールでの単なるサンプルなので。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(952,734ポイント)   Date: 2009/01/15(木) 03:41   No:26914     
Title: Re:インべーダーゲーム    

for文で書くなら

if( x<=0 || x>=50){

ここにイコール必要でしたね。
 
まぁDXライブラリで使うなら関係ないと思いますが。


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

Name: ひよこ  ..初心者(8,327ポイント)   Date: 2009/01/15(木) 19:15   No:26947     
Title: Re:インべーダーゲーム    
サンプルを見て作ってみたんですがなぜか絵が絵画されません。どうすればいいでしょうか。

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

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 i,x=0;
int White = GetColor( 255 , 255 , 255 ) ; // 白色の値を取得
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されていない

for (x>0;x<=50;x++)
if(x=50){ for (x=50;x>0;x--);
}

for(i=0;i<x; i++)



ClearDrawScreen(); // 裏画面のデータを全て削除
LoadGraphScreen( x, i, "char.png" , TRUE ) ; //裏画面へ画像を描写
ScreenFlip() ;


}


// キーの入力待ち(『WaitKey』を使用)
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}


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

Name: Mist  ..熟練のプログラマー(40,969ポイント)   Date: 2009/01/15(木) 19:35   No:26948     
Title: Re:インべーダーゲーム    

for (x>0;x<=50;x++)
if(x=50){ for (x=50;x>0;x--);
}

for(i=0;i<x; i++)


この部分、間違いだらけの上に何をどうしたいのかがさっぱりわからないんですけど。


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

Name: ロム  ..ぴよぴよ(28ポイント)   Date: 2009/01/15(木) 20:00   No:26950     
Title: Re:インべーダーゲーム    
根本的に全く理解せずに書いてるのがわかります。
まず、ゲームを作るどうこうより、C言語の基本をしっかり理解する必要があるでしょう。
あてずっぽで書いたらまず期待する動作はしてくれません。


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

Name: ひよこ  ..初心者(8,493ポイント)   Date: 2009/01/16(金) 17:51   No:26974     
Title: Re:インべーダーゲーム    
まず真ん中に行くプログラムを作ったつもりなんですがなぜかエラーが出ます。どうすればいいでしょうかif( x=0 || x=10 || x=20 || x=30 || x=40 || x=50 || x=60 || x=70 || x=80 || x=90 || x=100){x=x+10;}

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

Name: Mist  ..熟練のプログラマー(41,607ポイント)   Date: 2009/01/16(金) 18:06   No:26976     
Title: Re:インべーダーゲーム    
C言語の基礎を勉強しなおす必要があると思いますが。
前のプログラムでもそうでしたがif分の条件を書く場合は「X==0」というように=を2個書かないとだめです。

> エラーが出ます。
エラーが出たならエラー内容ぐらい書きましょうよ。
規約読まれましたか?


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

Name: 御津凪 [URL]  ..熟練のプログラマー(49,668ポイント)   Date: 2009/01/16(金) 18:06   No:26977     
Title: Re:インべーダーゲーム    
その文はエラーではなくバグです。(コンパイルはちゃんと通るはずです)

条件で一致するようにする書き方は、 = 記号二つです。
その式ではxに値を代入してしまいます。

で、その文だとxは常に20になります。

素直に上の文は
if ( x <= 100 ) { x += 10; }



でいいと思いますよ。


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

Name: ひよこ  ..初心者(8,570ポイント)   Date: 2009/01/16(金) 18:21   No:26978     
Title: Re:インべーダーゲーム    
御津凪さんありがとうございます。
しかし中から右に行くようにしたいのですが、
if (x=110 x <= 209 ) { x += 10; }という意味で左のプログラムを作ったのですが、うまくいかなくて困っています。
2つの条件を表すにはどうすればいいでしょうか?


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

Name: ロム  ..ぴよぴよ(84ポイント)   Date: 2009/01/16(金) 18:48   No:26980     
Title: Re:インべーダーゲーム    
とてもアドバイス受けたいと思ってるように見えないんですが。。

とりあえず人の話聞きましょうよ(よく読みましょうよ)。

上でも書きましたが、あてずっぽで書いてもなんにもなりませんよ。


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

Name: 御津凪 [URL]  ..熟練のプログラマー(50,270ポイント)   Date: 2009/01/16(金) 18:51   No:26981     
Title: Re:インべーダーゲーム    
複数の条件を表すには、各条件の間に && あるいは || を書きます。

条件1 && 条件2 で、条件1 かつ 条件2の場合、となり、
条件1 || 条件2 で、条件1 または 条件2の場合、となります。

上記の式は 110 と x の間に何も無いのが原因ですね。
恐らく && だと思います。

あと、また = 記号が一個ですよ…。(VisualBasic使ってました?)
if ( 110 <= && x < 210 ) { x += 10; }



分かりやすく書くならこうですかね。

Mist さんの通り、規約読まれましたか?
ひよこさんがどの程度の知識を持っているのか、などがないと、
解決しにくいです。

質問を質問で返されてしまいますし、最善の答えも得られません。

詳しくは規約をよーく読んでください。



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

Name: Mist  ..熟練のプログラマー(41,636ポイント)   Date: 2009/01/16(金) 18:56   No:26982     
Title: Re:インべーダーゲーム    
> if ( 110 <= && x < 210 ) { x += 10; }

x抜けてるよ。

正しくは
if ( 110 <=x && x < 210 ) { x += 10; }


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

Name: ロム  ..ぴよぴよ(105ポイント)   Date: 2009/01/16(金) 19:03   No:26983     
Title: Re:インべーダーゲーム    
ものすごい速さで敵が動くインベーダーが出来そうだw

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

Name: ひよこ  ..中級者(9,219ポイント)   Date: 2009/01/16(金) 19:40   No:26985     
Title: Re:インべーダーゲーム    
すみませんでした。規約読んできました。
自分はインベーダーゲームの敵の動きを作りたいと思っています。自分は最近C言語を勉強しだした初心者です。
ソースはx座標をまず110まで10ずつ増やしそれから220まで11ずつ増やし220から120になるように10ずつ減らし120から11減らし109から10減らし99にして11ずつへらして0にしておなじ動きを繰り返させようと思っています。しかし途中で止まってしまうので今ここに書かせてもらってます。止まらないようにするにはどうすればいいでしょうか?
ソース

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

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 i; int x; x=0;
int White = GetColor( 255 , 255 , 255 ) ; // 白色の値を取得
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されていない
if ( x <= 100 ) { x += 10; }//xが110になるように

if ( 110 >=x && x <= 209 ) { x += 11; }//xが110から210になるように座標を11ずつ加算


if ( 210 ==x && x == 130 ) { x -= 10; }//210から120まで10ずつ座標を減らす

if ( 120 ==x ) { x -= 11; }//109にする

if ( 109 ==x ) { x -= 10; } //99にする


if ( 99==x && x ==11 ) { x -= 11; } //99から0になるように11ずつ座標を減らす
ClearDrawScreen(); // 裏画面のデータを全て削除
LoadGraphScreen( x, 10, "char.png" , TRUE ) ; //裏画面へ画像を描写
ScreenFlip() ;


}


// キーの入力待ち(『WaitKey』を使用)
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}

どうぞよろしくお願いします。


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

Name: yu  ..初心者(6,275ポイント)   Date: 2009/01/16(金) 20:24   No:26989     
Title: Re:インべーダーゲーム    

if ( 210 ==x && x == 130 )//xが210かつ130なら
if ( 99==x && x ==11 )//xが99かつ11なら


の部分ですが、xが210かつ130なら、ということになるので成り立ちませんよ。


if ( 110 >=x && x <= 209 )//xが110以上かつ209以下なら

ここで書かれているように、これと同じことをすればできると思います。


if文は もし〜が真(成立している)ならば...する ということです。

if(〜){

...

}



御津凪様が書いてくださったことをもう一度よく読んで、
理解したほうが良いと思います。


僕も3か月前までは全くプログラムが分かりませんでした。
(今も分からないことだらけですが・・・;)

プログラムは楽しくすれば早く身に付きますよ。






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

Name: ひよこ  ..中級者(9,266ポイント)   Date: 2009/01/17(土) 08:52   No:27000     
Title: Re:インべーダーゲーム    
今だぶらないように何度も実験しているのですが、x=の値を画面に出力するにはどうすればいいでしょうか

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

Name: Dixq (管理人)  ..伝説なるハッカー(954,698ポイント)   Date: 2009/01/17(土) 09:32   No:27003     
Title: Re:インべーダーゲーム    
本家HPにてリファレンスをご覧下さい。
DrawFormatString
printfDx
等を使うといいですよ。


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

Name: Mist  ..熟練のプログラマー(41,766ポイント)   Date: 2009/01/17(土) 10:42   No:27005     
Title: Re:インべーダーゲーム    
まずC言語の基本の学習から始められては?
条件式の書き方の基本も分からずにやっていても時間の無駄だと思いますけど。

以下のページの23章ぐらいまでやれば簡単なプログラムを組む分には困らないようにはなると思います。
http://www.kumei.ne.jp/c_lang/index_c.html



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

Name: ひよこ  ..中級者(9,907ポイント)   Date: 2009/01/18(日) 09:18   No:27020     
Title: Re:インべーダーゲーム    
いろいろ考えたんですけどなぜか真ん中で止まってしまうのですが。どこで値がおかしくなっているのでしょうか?

if ( x <= 100 ) { x += 10; }//xが110になるように

if ( 110 <=x && x <= 209 ) { x += 1; }//xが110から210になるように座標を11ずつ加算


//
if( 210>=x && x>=120 && x==210){ x -=-10;}
if( 210>=x && x>=120 && x==200){ x -=-10;}
if( 210>=x && x>=120 && x==190){ x -=-10;}
if( 210>=x && x>=120 && x==180){ x -=-10;}
if( 210>=x && x>=120 && x==170){ x -=-10;}
if( 210>=x && x>=120 && x==160){ x -=-10;}
if( 210>=x && x>=120 && x==150){ x -=-10;}
if( 210>=x && x>=120 && x==140){ x -=-10;}
if( 210>=x && x>=120 && x==130){ x -=-10;}

//
if( 210>=x && x>=120 && x==120){ x -=-11;}

if( 210>=x && x>=109 && x==109){ x -=-10;}

//
if( 210>=x && x>=11 && x==99){ x -=-11;}
if( 210>=x && x>=11 && x==88){ x -=-11;}
if( 210>=x && x>=11 && x==77){ x -=-11;}
if( 210>=x && x>=11 && x==66){ x -=-11;}
if( 210>=x && x>=11 && x==55){ x -=-11;}
if( 210>=x && x>=11 && x==44){ x -=-11;}
if( 210>=x && x>=11 && x==33){ x -=-11;}
if( 210>=x && x>=11 && x==22){ x -=-11;}
if( 210>=x && x>=11 && x==11){ x -=-11;}


どこがおかしいのでしょうか。


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

Name: lbfuvab  ..中級者(14,646ポイント)   Date: 2009/01/18(日) 10:00   No:27021     
Title: Re:インべーダーゲーム    
> if( 210>=x && x>=120 && x==210){ x -=-10;}

これではxが210の時しかx-=-10;が実行されませんね。

あと、x-=-10;はx+=10;と同じです。


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

Name: ひよこ  ..中級者(9,876ポイント)   Date: 2009/01/18(日) 10:26   No:27022     
Title: Re:インべーダーゲーム    
最初の2つで210になると思うのですが。
なぜか止まってしまうんです。


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

Name: lbfuvab  ..中級者(14,783ポイント)   Date: 2009/01/18(日) 10:35   No:27023     
Title: Re:インべーダーゲーム    
if(x==210)

if( 210>=x && x>=120 && x==210)
が結果的に等価であることは理解できますか?
理解できないようであれば、猫でもわかるプログラミング等でみっちり基礎から勉強しなおす事をお薦めします。


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

Name: ひよこ  ..中級者(9,888ポイント)   Date: 2009/01/18(日) 11:03   No:27024     
Title: Re:インべーダーゲーム    
結果的に等価ってなんですか?

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

Name: ロム  ..ぴよぴよ(236ポイント)   Date: 2009/01/18(日) 11:13   No:27025     
Title: Re:インべーダーゲーム    
問題はCについての知識が少ないという事じゃないと思うんですが。

まぁそれはいいとして、言葉がわからないなら辞書で調べるなりしたらどうですか。

結果的に等しいと書いてあったらわかるんでしょうか。


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

Name: ひよこ  ..中級者(9,906ポイント)   Date: 2009/01/18(日) 11:17   No:27026     
Title: Re:インべーダーゲーム    
それってxの値が変わらないってことですか?

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

Name: Dixq (管理人)  ..伝説なるハッカー(954,764ポイント)   Date: 2009/01/18(日) 12:12   No:27028     
Title: Re:インべーダーゲーム    
では、

「Xが10以上100以下であり、かつ100と等しい時」



「Xが100と等しい時」

という条件式は結果的に同じ効果をもたらすという事は理解できますか?


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

Name: Mist  ..熟練のプログラマー(42,548ポイント)   Date: 2009/01/18(日) 12:19   No:27029     
Title: Re:インべーダーゲーム    
えっとね、算数に例えると足し算も引き算も出来ないような人に面積の計算の仕方を理解させることは出来ないでしょ。
今のあなたの実力では、自らオリジナルなプログラムを書くことは無理ですからアドバイスどおり基礎の勉強から始めてください。


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

Name: ひよこ  ..中級者(9,879ポイント)   Date: 2009/01/18(日) 12:38   No:27032 解決!     
Title: Re:インべーダーゲーム    
わかりました。またわからなくなったらよろしくおねがいします。

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



Name: kaiten  ..初心者(7,083ポイント)   Date: 2009/01/12(月) 14:09   No:26776       
Title: [雑談?]自作ヘッダを公開してみる    
実力も顧みずに作ってみたので黒歴史覚悟で晒してみようということで。

内容はC++のswitch構文の真似事をするマクロです。
本家switch文だとcaseで定数しか指定できなかったり範囲指定ができなかったりでたまに不便なので作ってみた次第です。

友人に頼んで試用したりしてもらってるのですが、公開する前に皆さまに改善点やバグなどをあげていただきたいのです。
仕様などはreadmeに書いたつもりですが不足がありましたら教えてください。

zipデータ
http://dixq.net/zip/bbs/kaiten_0.zip


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


Name: 組木紙織  ..熟練のプログラマー(68,395ポイント)   Date: 2009/01/12(月) 14:47   No:26777     
Title: Re:[雑談?]自作ヘッダを公開してみる    
なんだか面白そうですね。
まだ何も見させてもらっていませんが、
2つ疑問点があります。
1:
redmeに 学校提出などで使う場合は事前に連絡ください。
とあるのですが、もし使う場合はどこへ連絡をすればよいのでしょうか?

2:
最新バージョンはどれですか?


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

Name: kaiten  ..初心者(7,186ポイント)   Date: 2009/01/12(月) 14:51   No:26778     
Title: Re:[雑談?]自作ヘッダを公開してみる    
あ…本当ですね……
1に関しては完全にミスです。メールアドレス載せたつもりが載ってないですねこれ。
2に関しても私の不手際でした。〜Typeとなっているのは亜種みたいなものなので正式な最新版はver0.214となります。
編集しておきます。


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

Name: たかぎ [URL]  ..比類無きプログラマー(79,231ポイント)   Date: 2009/01/12(月) 14:56   No:26780     
Title: Re:[雑談?]自作ヘッダを公開してみる    
こういうのはなかなか実用にはなりにくいのですが、個人的には好きです。

一応、ざっと見た範囲での問題点を指摘しておきます。

1. RUNというマクロ名は分かりにくいので、FALL_THROUGH(またはFALL、またはTHROUGH)の方がよいのでは?
2. S_ENDを忘れやすい。whileの代わりにforを使えばこれはなくせるはず。
3. SWITCHブロック内で例外が送出されると、Switch_sysがリークする。
4. SWITCHブロック内でcontinueを使うと永久ループになる(while → forで解消可能)。
5. SWITCHマクロで、型名とオブジェクト名を , で区切るのがちょっと不細工(下記で詳述)

SWITCH(int, x)ではなくSWITCH(x)で済むようにはなりませんか?
例えば、xを参照渡しする関数テンプレートを作って、その中でSWITCH_sysを生成するとか。
SWITCH_sys::conditionの扱いがやや面倒ですが、解決方法はあると思います。


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

Name: kaiten  ..初心者(7,494ポイント)   Date: 2009/01/12(月) 15:11   No:26782     
Title: Re:[雑談?]自作ヘッダを公開してみる    
たかぎさん、ご指摘ありがとうございます。
RUNは確かに解り辛いですね。FALLに変えさせていただきます。
例外によるリークは全く考えていませんでした。例外処理を使ったことがなかったので…対策考えてみます。
5なんかは私も不満のある部分でした。どうしようもないと思ってあきらめていたのですがこれも考えてみます。

それで、2と4に関して質問させてください。
バージョンは0.214で話させていただきます。
まず2の方なのですが、S_ENDはbreak処理だけでなくdelete処理や上のCASEのスコープを終了させる役目も担っているのですが、それでもなくすことは可能なのでしょうか?
続いて4なのですが、そもそもブロック内でcontinueを使う場合と言うのはどのような場合なのでしょうか?また、C_REFINEマクロではcontinueを使っているのですが、これについてはどのように対処すればよいのでしょうか?


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

Name: たかぎ [URL]  ..比類無きプログラマー(79,802ポイント)   Date: 2009/01/12(月) 15:42   No:26784     
Title: Re:[雑談?]自作ヘッダを公開してみる    
> まず2の方なのですが、S_ENDはbreak処理だけでなくdelete処理や上のCASEのスコープを終了させる役目も担っているのですが、それでもなくすことは可能なのでしょうか?

まず、breakとdeleteをなくすには、こんな感じでどうでしょうか?

#define SWITCH_SYS(type, condition) \
for (std::auto_ptr<SWITCH_sys<type> > Switch_sys(new SWITCH_sys<type>(condition)); \
Switch_sys.get() != 0; \
Switch_sys.reset()) {

CASEのブロックを閉じるのはやや面倒ですが、SWITCHブロックの末尾のブロックと対応させるようにすればどうにかなるはずです。
例えば、

#define CASE_SYS(pattern) \
} \
if(Switch_sys->Plus_condition_goto(), \
(pattern==Switch_sys->Get_condition())|| \
(Switch_sys->Get_condition_goto()==Switch_sys->Get_goto_target())) \
Switch_sys->Set_condition_default(false); {

こんな感じでしょうか? (検証していないので、細部は違っているかもしれません)

> 続いて4なのですが、そもそもブロック内でcontinueを使う場合と言うのはどのような場合なのでしょうか?

例えば、

for (;;)
{
std::cout << "1: グー, 2: チョキ, 3: パー" << std::endl;
std::cint >> x;
switch (x)
{
case 1:
case 2:
case 3:
// 勝敗判定
break;
default:
continue;
}
}

のような場合です。
どんな使い方をするかはクライアントコードまかせですので、用途を制限するのは問題があります。

> また、C_REFINEマクロではcontinueを使っているのですが、これについてはどのように対処すればよいのでしょうか?

forの第三節で、問答無用でdeleteするのではなく、何らかのフラグをもうけてはどうでしょうか?

> 5なんかは私も不満のある部分でした。どうしようもないと思ってあきらめていたのですがこれも考えてみます。

例えばこんな感じでしょうか?

template <typename T>
inline SWITCH_sys_base* SWITCH_sys_builder(T& x)
{
return new Switch_sys<T>(x);
}

生のnewを使うのではなく、このように一枚かぶせれば型ディスパッチが可能になります。
Get_conditionなどをどうすべきか、一工夫いりそうですが...


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

Name: たかぎ [URL]  ..比類無きプログラマー(79,964ポイント)   Date: 2009/01/12(月) 15:47   No:26785     
Title: Re:[雑談?]自作ヘッダを公開してみる    
{ の位置を間違いました。

#define CASE_SYS(pattern) \

} \
if(Switch_sys->Plus_condition_goto(), \
(pattern==Switch_sys->Get_condition())|| \
(Switch_sys->Get_condition_goto()==Switch_sys->Get_goto_target())) \
{ Switch_sys->Set_condition_default(false);

こんな感じです。


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

Name: kaiten  ..初心者(7,687ポイント)   Date: 2009/01/13(火) 20:21   No:26872     
Title: Re:[雑談?]自作ヘッダを公開してみる    
遅くなってしまいました。すみません。

たかぎさんの案を参考に組み替えていて思ったのですが、continueによる無限ループを回避したとしても、for文やwhile文を使っている以上ユーザー側の意図した動作にはならないのではないでしょうか?対策自体は考えたのですが、これについての見解をお聞きしたく思います。

あと、newについての工夫はこれ、デザインパターンの工場メソッドというものでしょうか?なんか昔チラと見たものに似ていた気がしましたので。


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

Name: hoge  ..入門者(2,507ポイント)   Date: 2009/01/13(火) 20:52   No:26875     
Title: Re:[雑談?]自作ヘッダを公開してみる    
そもそも、SWITCH_sysを動的に確保する理由がよく分からない。

#define SWITCH_SYS(type, condition) \
{ \
typedef type type2; \
SWITCH_sys<type2> Switch_sys(condition); \
while(true){

じゃ、ダメなの?


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

Name: kaiten  ..初心者(7,753ポイント)   Date: 2009/01/13(火) 21:36   No:26878     
Title: Re:[雑談?]自作ヘッダを公開してみる    
>hogeさん
確かにそうですね。わざわざ動的に確保している理由が見当たらない……
製作自体はだいぶ前から始めてるんで以前は意味があったのか……たぶん考え過ぎたんだと思います。


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

Name: たかぎ [URL]  ..比類無きプログラマー(80,027ポイント)   Date: 2009/01/13(火) 21:51   No:26880     
Title: Re:[雑談?]自作ヘッダを公開してみる    
> たかぎさんの案を参考に組み替えていて思ったのですが、continueによる無限ループを回避したとしても、for文やwhile文を使っている以上ユーザー側の意図した動作にはならないのではないでしょうか?対策自体は考えたのですが、これについての見解をお聞きしたく思います。

そうですね。
無限ループを回避できるだけです。
もうちょっと考えればよい方法が見つかるかもしれません。

といっても、continueがきかないループとなると、gotoかsetjmp/longjmp以外には思いつきませんが...
gotoはともかく、setjmp/longjmpは重過ぎますね。


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

Name: kaiten  ..初心者(7,806ポイント)   Date: 2009/01/17(土) 00:59   No:26996 解決!     
Title: Re:[雑談?]自作ヘッダを公開してみる    
しばらく製作ができそうもない状況なので一旦解決にしておきます。雑談に解決というのもおかしな話かもしれませんがw

皆さまありがとうございました。もっと形になったらまた持ってこようかと思います。


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



Name: zunari-  ..ぴよぴよ(111ポイント)   Date: 2009/01/16(金) 22:40   No:26990       
Title: はじめまして    
zunari-といいます。現在初めてのシューティングゲームをこちらのHPを参考に作っており、無謀にも販売したいなどと考えているのですが;;ソースコードはどの程度利用してもよいのでしょうか?
現在HPに上がっているコードの足りない部分(タイトル画面,ノベルシステムなど)を自分で補う程度ではNGでしょうか?


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


Name: ロム  ..ぴよぴよ(168ポイント)   Date: 2009/01/16(金) 23:43   No:26992     
Title: Re:はじめまして    
勘違いしていたので削除しました

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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(954,312ポイント)   Date: 2009/01/17(土) 00:37   No:26994     
Title: Re:はじめまして    
こんにちは。

龍神録のコードを使って作ったものを販売することについて、もし流用しているコードがあるなら、
龍神録プログラミングの館のコードを使っているという旨をソフトのどこかわかりやすい場所に明記、リンクをはるなどして下されば販売していただいて構いません。

なお、データファイルだけはご自分で用意されたものに差し替えてください。
また、東方を元にして製作していることをご理解頂いた上で、ご使用ください。
東方の紹介と謝辞など添えられると良いかと思います。

もしよければゲームを一度拝見させて下さい。


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



Name: Libra  ..初心者(7,636ポイント)   Date: 2009/01/15(木) 09:25   No:26917       
Title: DrawPolygon3D関数について    
DxライブラリのDrawPolygon3D関数についてです。

ポリゴンの座標を用いて描画する時、z軸方向に対して動かしたところ、収束点(?)がウィンドウの中心(ウィンドウサイズが640×480なので、(x、y)=(320,240) )になるようで、収束点を自分の作ったゲームのフレームの中心(任意の位置)に合わせたいのですが、どのようにすればいいでしょうか?


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


Name: Dixq (管理人) [URL]  ..伝説なるハッカー(953,274ポイント)   Date: 2009/01/15(木) 14:32   No:26933     
Title: Re:DrawPolygon3D関数について    
東方のように、シューティング画面の中心が左だったりする場合に困るんですよね。

これは非公開関数を使うと実現出来るようになります。

龍神録では以下の関数を呼ぶことで中心を左に寄せています。



void move_view(){
float X=640.f, Y=480.f; // ウィンドウのサイズ
float Xd=-110.f, Yd=0.f ; // 消失点の移動量
MATRIX mat;
CreateViewportMatrix(&mat, X/2.f+Xd, Y/2.f+Yd, X, Y);
SetTransformToViewport(&mat);
}
 
この関数をメインループに入る前に一度呼んであげて下さい。
するとx座標が-110した位置が中心になります。このXdとYdに好きな値を入れてやれば好きな位置が中心になります。


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

Name: Libra  ..初心者(7,793ポイント)   Date: 2009/01/17(土) 00:27   No:26993 解決!     
Title: Re:DrawPolygon3D関数について    
回答ありがとうございます。

MATRIX型というのもVERTEX_3D型と同じDxlibについてる構造体のようですね。自分が言っていたのは恐らく、注視点でしょうか?ヘッダファイルを見て、注視点の座標がマクロで定義されていないかと探して見たのですが、無かったので質問しました。まさか、非公開関数で実現できるとは(汗)
もう少しヘッダファイルの中身にある非公開関数、研究してみます。

この関数を使えば、妖々跋扈のようにスクロールしている背景のカメラ位置を変えたりいろいろ出来そうですね。


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



Name: ムンバ  ..上級者(22,780ポイント)   Date: 2009/01/16(金) 00:07   No:26957       
Title: メイン画面からのサブ画面の表示につきまして    
こんばんは。いつもお世話になります。^^
先日は画像製作ソフトを、ご紹介頂きましてどうもありがとうございました。
快適です。(謝

今、列車が線路の上を動くプログラムを作っているのですが
列車が動く動作や、線路(ポイント)を動かすソースは、添付させて頂いたソースで動いてます。
うまく説明&質問できてなかったら、すみません。<_ _>

メインソースは

#include "header.h" //←必要でしたら、ソース全て記述させて頂きます。

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
ChangeWindowMode(FALSE); //ウィンドウモードに変更する関数(TRUE:640×480 FALSE:フルスクリーン)
if (DxLib_Init() == -1) //初期化処理する関数
return -1;

Img();

T_sinkou_Ini();

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

while (GetHitKeyStateAll(Key) == 0 && ClearDrawScreen() == 0 && Key[KEY_INPUT_ESCAPE] == 0 && ProcessMessage() == 0){

BG();

LineHAITI();

/*if (Key[KEY_INPUT_C] == 1)
Cont_room();*/

T_sinkou();

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

DxLib_End(); //終了処理をする関数
return 0;
}


ここなのですが

if (Key[KEY_INPUT_C] == 1)
 Cont_room();

メイン画面で、「c」キーを押すと、関数「Cont_room」を呼び出して
Cont_room関数内で、ポイントの向きを指定できる様にしたいのです。

「T_sinkou」関数の、下記の部分

/*---ポイント分岐設定---*/
int poi_dum = 1; //ポイント7・8 --- 1:直 2:曲
int poi_sdum1 = 1; //車庫ポイント14 --- 1:直 2:曲

を、つまり・・・^^;

 メイン画面で「c」キーを押すと、Cont_room関数を呼び出し
 ポイントの向きを「1」か「2」で変更できるような表示画面を表示して
 この表示された画面から「1」か「2」を入力して、入力された値をT_sinkou関数に渡して
 poi_dum変数と、poi_sdum1変数に代入して、ポイントの方向を変更できる様な形にしたいです。

getchar や gets関数を使って色々とやってみたのですが試して実行すると
実行されたプロンプト画面が真っ黒になってしまい、慌ててタスクマネージャーを表示して終了しようとしても
プログラムが終了できない状態になってしまったので、慌てて質問させて頂きました。(汗

メイン画面から、サブメニューの様な画面を表示して
表示されたサブメニューでポイントの方向を設定して分岐を変更したいと思ってるのですが
ヒントだけでも、頂けないでしょうか?
また、ご存知の参考サイトなど御座いましたら、ご紹介お願い致します。
勉強不足で大変申し訳ないのですが、宜しくお願い致します。<_ _>


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


Name: ムンバ  ..上級者(22,826ポイント)   Date: 2009/01/16(金) 00:18   No:26958     
Title: Re:メイン画面からのサブ画面の表示につきまして    
配列のファイルを追加させて頂きます。

環境は
VC++2008
Windows VISTA
です。^^;
宜しくお願い致します。<_ _>



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

Name: ムンバ  ..上級者(22,939ポイント)   Date: 2009/01/16(金) 19:55   No:26986 解決!     
Title: Re:メイン画面からのサブ画面の表示につきまして    
こんばんはっ!

質問しておいて大変申し訳ないのですが
getchar関数とswitch関数を使って処理する方法でできるかもしれないので
少し考え直して挑戦してみたいと思います。

また何かあれば宜しくお願い致します。
お騒がせしました。
ありがとうございました。(謝


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

Name: つうこうにん  ..かけだし(1,831ポイント)   Date: 2009/01/16(金) 19:59   No:26987     
Title: Re:メイン画面からのサブ画面の表示につきまして    

int WINAPI
WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
/* 処理の分岐に使う変数(最初は0) */
int mode=0;
/*---ポイント分岐設定---*/
int poi_dum=1; //ポイント7・8 --- 1:直 2:曲
int poi_sdum=1; //車庫ポイント14 --- 1:直 2:曲

/* 初期化する(省略)*/

while(ProcessMessage() == 0){
GetHitKeyStateAll(Key);
ClearDrawScreen();

if(mode==0){
BG();
LineHAITI();
T_sinkou( poi_dum, poi_sdum ); /*毎回向きを渡して処理する*/

/*入力を処理*/
if(Key[KEY_INPUT_C]==1) mode=1;
if(Key[KEY_INPUT_ESCAPE]==1) break;
}
else if(mode==1){
switch( Cont_room() ){
case 0: mode=0; break;
case 1: poi_dum=poi_sdum=1; mode=0; break;
case 2: poi_dum=poi_sdum=2; mode=0; break;
default:break; /*なにもしない*/
}
}
ScreenFlip();
}
return DxLib_End();
}
int Cont_room()
{
/*メニューの表示(省略)*/

/*入力された番号を返す*/
if(Key[KEY_INPUT_1]==1) return 1;
if(Key[KEY_INPUT_2]==1) return 2;
if(Key[KEY_INPUT_ESCAPE]==1) return 0;
return -1;
}

このままではもちろんコンパイルできませんが参考までに。
ポイントはT_sinkou()関数に毎回向きを渡すのと
メイン画面とメニュー画面に処理を分けているところです。


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

Name: つうこうにん  ..かけだし(1,845ポイント)   Date: 2009/01/16(金) 20:04   No:26988     
Title: Re:メイン画面からのサブ画面の表示につきまして    
タイミング悪かったみたいですね;

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

Name: ムンバ  ..上級者(22,949ポイント)   Date: 2009/01/16(金) 23:16   No:26991     
Title: Re:メイン画面からのサブ画面の表示につきまして    
通行人さん、お心使いどうもありがとうございます。
参考にさせて頂きます。<_ _>

ps: 添付ファイルは、晒しといて下さい。失礼します。w


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



Name: 徳竹  ..かけだし(2,168ポイント)   Date: 2009/01/16(金) 16:11   No:26973       
Title: 繰り返し処理についての質問です    
以前こちらの掲示板で質問させていただいたものです。いま学校の数値計算の課題でアーノルディ反復法を用いて行列Aの固有ベクトルを求めるという課題をやっています。簡単にいうと行列Aがありそれに対して初期ベクトルrをとります。そしてAとrに様々な変形を施しベクトルr1を作ります。今度はAとr1を用いて同じ変形を施しベクトルr2を作ると言う作業を繰り返しある条件を満たすと繰り返しを止めるというプログラムを作りたいと思ってます。
 
そこでdo文用いたプログラムを作成したのですが上手くいきません。具体的にいうと試しにdo文を二回まわして得られるた答えと一回だけまわして得たベクトルrをもう一度読み込ませて再び一回だけまわした(これで理論的には二回まわしたのと同じだと思われます)答えが異なってしまいます。ちなみに一回ずつまわすと正しい答えが得られます。

長々と書いてしまいましたが要はdo文を用いて一気に処理しようとすると値がおかしくなってしまうのですがどんな原因が考えられるでしょうか?というのが質問内容です。プログラム全体は200行以上あるので全部は載せられないのですが、憶測、推測的なことで構わないので何卒アドバイスよろしくお願いします。

一応プログラムの一部(do文の部分)も載せておきます。



do{
for(i=1;i<=n;i++)
v[i][1]=r[i]/sqrt(innerproduct(1,n,r,r));
printf("%f\n",sqrt(innerproduct(1,n,r,r)));
printf("v1=");
for(i=1;i<=n;i++)
printf("%f\t",v[i][1]);
printf("\n");

printf("\n");
printf("%d\n",2);


for(j=1;j<=k;j++)
{
mv(n,j,j,a,v,w);
for(i=1;i<=j;i++){
h[i][j]=naiseki(n,i,j,v,w);
for(l=1;l<=n;l++){
w[l][j]-=h[i][j]*v[l][i];}}
h[j+1][j]=sqrt(naiseki(n,j,j,w,w));
if(h[j+1][j]==0)
break;
for(l=1;l<=n;l++)v[l][j+1]=w[l][j]/h[j+1][j];
printf("v%d=",j+1);
for(l=1;l<=n;l++)
printf("%f\t",v[l][j+1]);
printf("\n");}



printf("w=\n");
for(i=1;i<=n;i++){
for(j=1;j<=n;j++)printf("%f\t",a[i][j]);
printf("\n");
}



for(i=1;i<=k+1;i++){
for(j=1;j<=k;j++)if(i>j+1)h[i][j]=0;

else if(i==j) h[i][j]=h[i][j]-1;}

printf("HNEW=\n");
for(i=1;i<=k+1;i++){
for(j=1;j<=k;j++)printf("%f\t",h[i][j]);
printf("\n");
}
====================================================================================================
中略 この部分で新しくベクトルrを作ります
=====================================================================================================

kaisu++;
if(kaisu==2)
break;
}while(tokuiti>=eps);


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


Name: Mist  ..熟練のプログラマー(41,535ポイント)   Date: 2009/01/16(金) 18:01   No:26975     
Title: Re:繰り返し処理についての質問です    
do〜while間で使用する変数のうち、doより前の段階で値が設定されている変数は1回目の処理が終わった段階でdoに入る前の値に戻っていますか?
ベクトルの値は新しく作り直すことで元に戻っているかもれませんが、処理の過程で使用する変数が元の値に戻っていなかったりするのではないでしょうか?

ソースにコメントがなくて各変数の意味なども分からないので具体的にどこが間違っているかはわかりませんが。


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

Name: non  ..プログラマー(29,961ポイント)   Date: 2009/01/16(金) 18:40   No:26979     
Title: Re:繰り返し処理についての質問です    
考えられることとして・・・
1 初期値が与えられていないのはnとkですから、この2つのどちらかが省略された部分で変更されている。
2 宣言した配列の範囲を超えた場所に書き込んでいる。
 例えば、

for(l=1;l<=n;l++){
w[l][j]-=h[i][j]*v[l][i];}

などで、double w[n][n];で宣言されていたとか

細かくデバッグしていくよりないですよね。



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

Name: 徳竹  ..かけだし(2,221ポイント)   Date: 2009/01/16(金) 19:40   No:26984 解決!     
Title: Re:繰り返し処理についての質問です    
回答ありがとうございます。上手くいきました。やはりおふたりが指摘した通り変数が途中で変更されていました。本当にありがとうございました。

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



Name: s-rush  ..中級者(11,657ポイント)   Date: 2009/01/08(木) 02:24   No:26607       
Title: 構造体と関数    
いつもお世話になっています。
ポケモンのゲームを作っていて、少しわからないところがあるのでまた質問させていただきに来ました。

構造体の中に、自作の関数って組み込むことはできるのでしょうか?

今ポケモンの技のリストを作っています。
ゲームをやったことがある方はご存知かと思いますが、技の中には何%の確率でステータス以上を
起こす技があります。

たとえば、

技名 :かみなり
属性 :でんき
タイプ:とくしゅ
効果 :まひ
確率 :30%

があったとして、この”30%の確率でまひを起こす”
というのが、どのようにすればいいのか分からないのです。

ダメもとでこのようなコードを書きました。
<pre>
int effect(int status, int probability)
{
========================================
各種ステータス以上を引き起こす判定。
========================================
}

typedef struct{
int number; //識別番号
char name[32]; //技の名前
int kind; //技の種類(物理/特殊)
int power; //技の威力
int type; //技のタイプ

int effect(int status, int probability); //この技の持つステータス異常を引き起こす判定関数
}poke_skill;

バトルプログラムで技を使用した時に、effect関数を呼び出して判定する、
という感じにしたかったのですが、当然のことながらエラーが出るので
この考え方はできないようなのです。

もう1つアイデアがあるのですが、先攻後攻を決める際に少し問題が出てしまうので、
実現することが少し厳しくなりそうです。

どのように実装すればいいのでしょうか?
あまり良いアイデアというかアルゴリズムが思い浮かばないので、皆さんのお力を貸してください。


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


Name: Dixq (管理人)  ..伝説なるハッカー(947,417ポイント)   Date: 2009/01/08(木) 02:30   No:26609     
Title: Re:構造体と関数    
携帯なので具体的にかけないですが、C++の機能である「クラス」がそれです。
このキーワードで調べてみてください。


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

Name: BEMANI  ..入門者(3,031ポイント)   Date: 2009/01/12(月) 00:36   No:26763     
Title: Re:構造体と関数    
s-rushさんへ。
ポケモン仕上がることを楽しみにしています・・・
陰ながらこっそりすぎるほど、こっそりと応援させて頂きます><



構造体の中に関数を入れることは可能です。
30%の確率で麻痺する・・・というプログラムを構造体の中に入れてみました。



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


typedef struct _Sample
{
int a;

// 30%の確率でマヒする計算
void BiriBiri(void)
{
if( (a = (rand()%100)) < 30)
printf("麻痺しました。100ターン動けません。::%d\n", a);
else
printf("麻痺しませんでした。::%d\n", a);
}

}SAMPLE;




int main (void)
{
SAMPLE Sample; // SAMPLE構造体
Sample.a = 0; // 初期化
srand((unsigned)time(NULL)); // 初期化


printf(<font color="Gray">"ここから先はwhile文で永久ループです。\n"</font);
printf("何かキーを押すことで同じ処理を繰り返します。\n");
printf("抜けたければ、ウインドウを閉じてください。\n\n\n");

while(1)
{
Sample.BiriBiri(); // 30%でマヒする関数呼び出し
getch(); // 何かキーが押されるまで待つ
}

return 0;

}


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

Name: BEMANI  ..入門者(3,117ポイント)   Date: 2009/01/12(月) 00:39   No:26764     
Title: Re:構造体と関数    
すいません・・・fontタグで微妙に囲えていない所がございました。
失礼しました;;


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

Name: s-rush  ..中級者(13,131ポイント)   Date: 2009/01/12(月) 19:15   No:26803     
Title: Re:構造体と関数    
返事が遅くなってしまい申し訳ないです。
管理人さんのおっしゃる『クラス』について調べて勉強していました。

”メンバ関数”っていうんですね。
宣言の仕方や使い方は大体理解できたと思います。
だけど勉強しているともう1つ分からないことが出てきました。

技の中には、ステータス異常をもたらすもの以外に能力を変化させる技や、
HPを回復する技もあります。
ほかにも”ほえる”のようなバトルの強制終了もしくはポケモンの強制交代や
”へんしん”の相手と全く同じものをコピー?するなどの技もあります。

後々のことを考えると、やはり同じ構造体(クラス)として管理しておきたいのですが、
メンバ関数がそれぞれ違うものになってしまいそうなんです。
ステータス云々の関数は1つにまとめることはできそうですが、
技の追加効果だけはそれぞれの技に対して関数を用意してあげないとできなさそうなんです。
(単に自分のアルゴリズムや知識が悪いだけなんですが^^;)


何か良い方法はないでしょうか?


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

Name: s-rush  ..中級者(13,359ポイント)   Date: 2009/01/12(月) 19:31   No:26804     
Title: Re:構造体と関数    
BEMANIさん、回答ありがとうございます。
構造体の中にも関数を組み込むことができるんですね^^

私的にはまだ慣れないクラスを使うよりも構造体を使った方が
エラーが起きにくいと思います。

構造体の宣言内で、関数の記述をしなければいけなかったのですかね??

他に多数の関数が必要になるのですが、
なにか実行する識別番号みたいなものを設けて、それに対応する関数を実行するように
ということってできないでしょうか?



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

Name: 組木紙織  ..熟練のプログラマー(68,405ポイント)   Date: 2009/01/12(月) 19:42   No:26806     
Title: Re:構造体と関数    
出来ますよ。
関数ポインタ配列とかで


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

Name: BEMANI  ..かけだし(1,882ポイント)   Date: 2009/01/12(月) 21:39   No:26812     
Title: Re:構造体と関数    
>>構造体の宣言内で、関数の記述をしなければいけなかったのですかね??
 構造体に関数を入れることはできるのですが、
 上に書いたものですと構造体の中身が増え、後々見にくくなりますよね。
 ですので、構造体の中にプロトタイプを書いておき、
 中身は構造体の外に書くことができます。


上の物と動作は全く同じですが
構造体の中にはプロトタイプしか書いていないです。



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


// サンプル構造体
typedef struct _Sample
{
int a; // 何%か表示する変数

void BiriBiri(void); // 30%の確率でマヒする計算

}SAMPLE;




// 変わるのはここの赤い所だけです。SAMPLE構造体のメンバ関数BiriBiri
void SAMPLE::BiriBiri(void)
{
if( (a = (rand()%100)) < 30)
printf("麻痺しました。100ターン動けません。::%d\n", a);
else
printf("麻痺しませんでした。::%d\n", a);
}


// main文
int main (void)
{
SAMPLE Sample; // SAMPLE構造体
Sample.a = 0; // 初期化
srand((unsigned)time(NULL)); // 初期化

while(1)
{
Sample.BiriBiri(); // 30%でマヒする関数呼び出し
getch(); // 何かキーが押されるまで待つ
}

return 0;

}



呼び出し方が変わるものでもないので、いつも通り使えるのではないかと思います。
自分も大したこと言えないですが、
もし、自分がやるのであれば種類毎にざくっと分けてしまう感じですかね〜。


「凍り判定」や「しびれ判定」などの状態異常構造体。
「水タイプ」のわざを入れておく構造体(例えば、みずてっぽう、なみのり等)
「草タイプ」のわざを入れておく構造体(例えば、つるのむち、はっぱカッター等)
「特殊タイプ」のわざを入れておく構造体(例えば、へんしん、ほえる、じこさいせい等)

「水タイプ」のポケモンを入れておく構造体(例えば、ゼニガメ、コイキング)
「草タイプ」のポケモンを入れておく構造体(例えば、フシギダネ、マダツボミ)
「炎タイプ」のポケモンを入れておく構造体(例えば、ヒトカゲ、ガーディ)
など

こういう風に分けておけば自分の中ではわかりやすいのかな〜と思います。
(s-rushさんがどう思うかはわからないですが;)


1,235ポイント を落としてしまった。

Name: s-rush  ..中級者(13,827ポイント)   Date: 2009/01/13(火) 12:07   No:26836     
Title: Re:構造体と関数    
回答ありがとうございます。
組木紙織さん、関数ポインタですね。
ちょっと勉強してきます。

BEMANIさん、わかりやすいサンプルありがとうございます。
技の構造体をタイプ別に分けると管理はしやすいと思うのですが、
今作っている戦闘システムや技を覚えるプログラムでは
すべて技の構造体を1つとして管理、検索するようにしているので少し変えないとできないですね^^;

1つ思ったのですが、
構造体の中に複数の関数を組み込んでおいて、switch〜caseを使って対応した関数を実行する
ということを考えてみたのですが
たとえばこのような感じに

switch (type){
case 0:
/*状態異常を判定する処理の関数を実行*/
case 1:
/*ステータス変更の処理の関数を実行*/
case 2:
     ・
     ・
     ・


このように書くと実行(処理)時間は長くなってしまうのでしょうか??
今まであまり処理にかかる時間というのを気にしたことがなかったのでわからないんです。

>void SAMPLE::BiriBiri(void)
::っていうのはC++の機能なんですかね??


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

Name: BEMANI  ..かけだし(2,121ポイント)   Date: 2009/01/13(火) 13:21   No:26841     
Title: Re:構造体と関数    
>>すべて技の構造体を1つとして管理、検索するようにしているので少し変えないとできないですね^^;
「全部の技を一つの構造体にまとめてある」ということで宜しいのですよね?;
もし違ったらごめんなさい;


>>このように書くと実行(処理)時間は長くなってしまうのでしょうか??
個人的にですが、処理時間は気にするほどでもないかなーと思います。
ただ、case が沢山ある場合は if で場合分けするよりいいかと思います。


>::っていうのはC++の機能なんですかね??
::はスコープ演算子と呼ばれるもので、主にクラスにアクセスする時に使われ、C++の機能です。
詳しいことは「スコープ演算子」で調べるといいかと思います。


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

Name: s-rush  ..中級者(13,984ポイント)   Date: 2009/01/13(火) 17:23   No:26863     
Title: Re:構造体と関数    
BEMANIさん
>>「全部の技を一つの構造体にまとめてある」ということで宜しいのですよね?;
はい、そうです。
他のシステムと関連付けするつもりなので、1つの構造体にまとめておいた方が都合がいいかな
と思ったので。
ですが、まだ検討中です。

caseやifで場合分けしてもあまり変わらないんですね^^
いろいろ試してみてよさそうなのを採用したいと思います。

スコープ演算子について調べてみました。
イメージ的には構造体アクセスの->でいいんですかね?
グローバル変数へのアクセス?にも使うようですが・・・


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

Name: BEMANI  ..入門者(2,792ポイント)   Date: 2009/01/14(水) 07:16   No:26886     
Title: Re:構造体と関数    
ポケモンの技かなり量ありますよね;
ポケモンの数以上に技ってあるような気がします;

>>caseやifで場合分けしてもあまり変わらないんですね^^
 リアルタイムで動きまくるアクションで爽快感を出す!
 みたいな趣旨のゲームであれば気にした方がいいかもですが
 ポケモンなら気にしなくてもよさそうな気がします・・・

 if は、基本前から順に条件に合う条件式が見つかるまで探す。
 case は 対応した場所へジャンプする。です^^

>>イメージ的には構造体アクセスの->でいいんですかね?
>>グローバル変数へのアクセス?にも使うようですが・・・
 スコープ演算子は「どのスコープに属するものなのか」という意味がありますので
 「.」や「->」のようなイメージでいいかと思います。
 もしお時間があるのであれば、「名前空間」で調べるといいかもしれません。

スコープ演算子を使ったサンプルでも載せておきます。


int ABC = 200;

namespace Sample
{
int ABC = 1000;
}

// main文
int main (void)
{
int ABC = 300;

printf("%d\n", ::ABC); // グローバル
printf("%d\n", ABC); // ローカル
return 0;
}

実行結果はそれぞれ、200, 300となります。
「ABC = 1000」と書かれているABCを表示するためには
Sample::ABC と書けばいいです。
どこにアクセスしているかが解るかと思います。

グローバル変数が ::ABCでアクセスできるのは
名前がない空間だからです。
イメージ的に「名前がない空間に属する変数ABC」です。


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

Name: 組木紙織  ..熟練のプログラマー(68,515ポイント)   Date: 2009/01/14(水) 07:56   No:26887     
Title: Re:構造体と関数    
その説明だと勘違いしそうな部分があるので気を付けて。

グローバル空間!=無名空間

#一度C++をしたほうがよさそうと思う。


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

Name: s-rush  ..中級者(14,238ポイント)   Date: 2009/01/16(金) 14:29   No:26972 解決!     
Title: Re:構造体と関数    
一応関数ポインタ配列を使ってできました。
プログラムに慣れた人が見ると無駄が多いコードかもしれませんが・・・

答えてくださった方、本当にありがとうございました。

今はバトル場面で表示させる(HPやコマンド、グラフィックなど)
プログラムを作っています。
少しわからないことがあるので、調べた上でどうしてもわからない部分があればまた来させていただきます。

追記
一番最初の質問で漢字が間違ってた^^;


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



Name: とうや  ..かけだし(1,234ポイント)   Date: 2009/01/15(木) 08:50   No:26916       
Title: 交通シミュレーションの解析プログラム    
いつもお世話になっております。
交通のシミュレーションについて質問させていただきます。

●環境
Microsoft Visual C++ 2008 Express Edition
C言語

●交通ルール
一次元配列で考えています。
○道路配列の長さを決定
○車をランダム確率で設置
○車は右方向へある確率で進行する
○前に車がいた場合は車は進行出来ない。
○車はある確率で発生する0→1
○車はある確率で消滅する1→0

 1 = 車
 0 = 空き

○プログラム例1 時間t 消滅確率0 発生確率0 進行確率100

t   01010111
t+1   10101110
t+2 01011101
t+2   10111010

*左右の端は繋がっているものとします。

このようなプログラムを作成しました。(プログラム内では ・配列の長さ20 ・100ステップ)
動作確認していただければ幸いです。


●質問内容
これから、この車の 速度・密度・流量 を求めたいと思っています。

○密度 = 車の数 ÷ 配列の長さ 
○速度 = 動くのことの出来た車の数 ÷ 車の数
○流量 = 速度 × 密度

のプログラムを追加させたいのですが、どうすれば良いのか分かりません。
特に速度は・・・消滅、発生を加えているため、この方法でいいのかも疑問があります。
何か良い方法・アドバイスをよろしくお願いします。


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


Name: 組木紙織  ..熟練のプログラマー(68,565ポイント)   Date: 2009/01/15(木) 09:51   No:26918     
Title: Re:交通シミュレーションの解析プログラム    
まずは状況をきちんと整理して一サイクルをどのように動かすのかを決めたほうがいいと思う。

特に粒子を扱うときの速度はいくつか種類があるのでどの速度で計算するのかを決めて置く必要があります。


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

Name: とうや  ..かけだし(1,419ポイント)   Date: 2009/01/15(木) 18:33   No:26944     
Title: Re:交通シミュレーションの解析プログラム    
前回引き続きコメントありがとうございます!

>まずは状況をきちんと整理して一サイクルをどのように動かすのかを決めたほうがいいと思う。
1サイクルの動かし方は述べている文章で伝わってないでしょうか?
色々設定を行いたいのですが、やりたいことは例文のようなものです。


>特に粒子を扱うときの速度はいくつか種類があるのでどの速度で計算するのかを決めて置く必要があります。
どの速度・・・今回は 動くのことの出来た車の数 ÷ 車の数
では駄目でしょうか? 単位時間当たりの位置の変化に基づいた考え方にしたのですが・・・


よろしければどの部分が分からないかを教えていただければ幸いです。


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

Name: non  ..プログラマー(29,608ポイント)   Date: 2009/01/16(金) 09:10   No:26964     
Title: Re:交通シミュレーションの解析プログラム    
>●質問内容
>これから、この車の 速度・密度・流量 を求めたいと思っています。

>○密度 = 車の数 ÷ 配列の長さ 
>○速度 = 動くのことの出来た車の数 ÷ 車の数
>○流量 = 速度 × 密度

>のプログラムを追加させたいのですが、どうすれば良いのか分かりません。

横槍申し訳ありません。とうやさんが質問したいのは、上の方法でプログラムする方法でしょうか。
それとも、この定義で良いかということでしょうか?

この定義でよいかについては、私はさっぱりわかりません。
これは、卒論などの研究テーマでしょうから、とうやさんがモデル化することだと思います。
その式でプログラムを作れと言うのでしたらわかりますが、とうやさんがなぜプログラムが
作れないのかわかりません。
例えば、車の数は乱数発生させたり、消滅させたりしたときにカウントすればいいし、配列の長さは
NUMですし・・・
たぶん、私以外の方も、同じ理由で傍観されているのでは?






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

Name: とうや  ..かけだし(1,646ポイント)   Date: 2009/01/16(金) 10:08   No:26966     
Title: Re:交通シミュレーションの解析プログラム    
アドバイスありがとうございます!
分かりにくい説明で申し訳ありません。
定義がそのようなものにしたいということです。


その式でプログラムを作っているのですが、
特に速度についてがよく分からずにいます。
速度は発生・消滅があるため、進行しているかの判断をどのうようなものにすればよいのか・・・
ということです。

それが理由で組木紙織さんも「速度にはいくつかの種類がある」とおっしゃったんだと思います。
文章力がなく申し訳ありません。


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

Name: non  ..プログラマー(29,917ポイント)   Date: 2009/01/16(金) 10:34   No:26967     
Title: Re:交通シミュレーションの解析プログラム    
>速度は発生・消滅があるため、進行しているかの判断をどのうようなものにすればよいのか・・・

私はわかりませんが、プログラマの立場からすれば、
決めていただければプログラムはできますが・・・
例えば、前回のサークルから新しく加わった車と、消滅した車はのぞくとか。
この場合。移動を先に行ってますから、消滅した車が、移動した車かどうか知る必要があります。
そうすると、車のクラスを作るなどして、情報を持たせた方がいいような気がします。
つまり、現在は車の情報のため、1から9までの乱数による番号が付いているようですが、
(もしかしたら、もっと違う目的なのかも知れませんが)
これを一連番号のようにして、車1台1台に固有番号をつけて管理するのが楽だと思います。




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

Name: Mist  ..熟練のプログラマー(41,355ポイント)   Date: 2009/01/16(金) 11:04   No:26968     
Title: Re:交通シミュレーションの解析プログラム    
速度の部分だけ

今回発生した車は「動くのことの出来た車」に含まれないから考慮しなくていいでしょう。
問題は今回動いたけども消滅してしまった車をどうするか。

グローバル変数 int move[NUM];を追加
idou関数の最初に0クリアする。
移動できた車があれば、roadと同じ位置でmoveにも1をセットしておく。
deiri関数で消滅が発生したとき、moveをチェックして1が立っていたら0に戻す。

これでmove配列には「移動したけど消滅しなかった車」という情報ができるから速度を出せますよね。


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

Name: non  ..プログラマー(29,938ポイント)   Date: 2009/01/16(金) 12:09   No:26970     
Title: Re:交通シミュレーションの解析プログラム    
なるほど、これ以上、処理が複雑にならないなら、その方が楽ですね。


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

Name: とうや  ..かけだし(1,697ポイント)   Date: 2009/01/16(金) 12:33   No:26971     
Title: Re:交通シミュレーションの解析プログラム    
アドバイスありがとうございます!
最初はnonさんのような考えをしていたため、番号はそのような目的でつけてました。
MISTさんの方法で速度を求めてみたいと思います。






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



Name: 774  ..入門者(4,401ポイント)   Date: 2009/01/12(月) 16:36   No:26792       
Title: ()判定と計算の方法が    
すいません、手違いで昨日投稿した質問を解決にしてしまい更に、パスワードをつけるのを忘れたので新しく作らせていただきました・・・。

()の判定と入力した文字列を計算するプログラムを作っているのですが、()の中の最優先するのと計算する方法がわかりません。
()は(1+2*3)となっていたら消すことはできましたが、どうすれば()の中を最優先できるのか、char型をint型にするのは自分で探してわかりましたが、どうすれば計算させるのかがわかりません。

どういう判定をすればいいのでしょうか?
こういうソースになっています。


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

#define N 50

/*構造体の宣言*/
struct node
{
char str[N];
struct node *left;
struct node *right;
};

void print_tree(struct node *p);
struct node *kansu(char str[]);
int main(void)
{
struct node *root;
char d[N];
int i, j = 0;

/* ツリー作成 */
printf("文字列入力 ");
fgets(d, 100, stdin);
d[strlen(d) - 1] = '\0'; /* 余分な改行コードを削除 */

do
{
root = NULL; //ルートにNULLを入れる
root = kansu(d); //入力した値dをkansu関数の引値として入れてルートに入れる
print_tree(root); //rootをprint_tree関数の引地として入れる

printf("\n");
printf("文字列入力 ");
fgets(d, 100, stdin);
d[strlen(d) - 1] = '\0'; /* 余分な改行コードを削除 */
}
while(strcmp(d, "quit") != 0);

return 0;
}

//ツリー出力
void print_tree(struct node *p)
{

if(p!=NULL)
{
printf("%c", p->str[0]);
print_tree(p->left);
print_tree(p->right);
}

}

struct node *kansu(char str[])
{
int i;
char rstr[N] = { '\0' }, lstr[N] = { '\0' };
struct node *p;

if(str[0]=='(' || str[strlen(str)-1]==')') //両端が()で囲まれていたら
{
for(i=0; i<=strlen(str)-1; i++) //()を消す
{
str[i] = str[i+1];
}
}

printf("\n");

for(i=strlen(str)-1; str[i] != '+' && str[i] != '-' && i>=0; i--); //+とーを探索するループ

if(str[i] == '+' || str[i] == '-') //もしstr[i]が+かーだったら
{
p = malloc(sizeof(struct node));
p->right = NULL;
p->left = NULL;
p->str[0] = str[i];
p->str[1] = '\0';

}

else //そうでなかったら
{

for(i=strlen(str)-1; str[i] != '*' && str[i] != '/' && i>0 ; i--); //*と/を探索するループ

if(str[i] == '*' || str[i] == '/')
{
p = malloc(sizeof(struct node));
p->right = NULL;
p->left = NULL;
p->str[0] = str[i];
p->str[1] = '\0';
}

}

if(str[i] != '+' && str[i] != '-' && str[i] != '*' && str[i] != '/') //もし数字だったら
{
p = malloc(sizeof(struct node));
p->right = NULL;
p->left = NULL;
p->str[0] = str[i];
p->str[1] = '\0';
}

else //そうでなかったら
{
strcpy(rstr, str+i+1);
strncpy(lstr, str, i);
lstr[i] = '\0';

}

/* 再帰部分 */
if (rstr[0])
p->right = kansu(rstr);
if (lstr[0])
p->left = kansu(lstr);

return p;

}



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


Name: たいちう  ..上級者(21,147ポイント)   Date: 2009/01/12(月) 19:35   No:26805     
Title: Re:()判定と計算の方法が    
> どうすれば()の中を最優先できるのか、

http://smdn.invisiblefulmoon.net/ikimasshoy/cpp/polish.html


> どうすれば計算させるのかがわかりません。

nodeへのポインタを引数に取り、nodeの値を返す再帰関数があればよいでしょう。
nodeが値だった場合、その値をそのまま返し、演算子だった場合、
左右のnodeの値をそれぞれ計算し、演算の結果を返します。


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

Name: 774  ..入門者(4,336ポイント)   Date: 2009/01/16(金) 11:08   No:26969 解決!     
Title: Re:()判定と計算の方法が    
何とかできました。
ありがとうございます。
まだまだ自分でも気づけないところがあったのでもっと勉強しようと思います。
本当にありがとうございました!


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



Name: まゆ  ..ぴよぴよ(117ポイント)   Date: 2009/01/16(金) 09:43   No:26965 解決!       
Title: 解決しました    
参考にさせていただき完成することができました
みなさん本当にありがとうございました


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




Name: 比奈  ..ぴよぴよ(35ポイント)   Date: 2009/01/15(木) 12:11   No:26923       
Title: はじめまして    

大学の授業(序論)で出た問題なのですがまったく手がでないで困ってるんで教えてください。
整数nをコンソール画面から読み込んで、Zの文字を*とスペースを並べて表示する。
って問題です。
nの使い方の説明がなくてよくわかんないのですが、*の数かと思います。


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


Name: non  ..プログラマー(29,008ポイント)   Date: 2009/01/15(木) 12:21   No:26924     
Title: Re:はじめまして    
>nの使い方の説明がなくてよくわかんないのですが

本人がわからないなら、読んでるこちらは、もっとわかりません。
Zの文字の縦横サイズのことでしょうか?

n=5のとき
*****
___*_
__*__
_*___
*****
こんなふうに?


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

Name: バグ  ..ハッカー(141,851ポイント)   Date: 2009/01/15(木) 12:21   No:26925     
Title: Re:はじめまして    
問題の意味が分かりません。
整数nの読み込みというのはおそらくscanf関数などでいいのでしょうが…

そのあとの「Zの文字を*とスペースを並べて表示する」という部分と、整数nの読み込みの部分の関連が無いように思うのですが…?

こういう場合は、自分の解釈ではなく、課題の問題文を全て載せた方が話が早いですよ。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(953,033ポイント)   Date: 2009/01/15(木) 14:23   No:26931     
Title: Re:はじめまして    
比奈さんこんにちは。

多分nonさんの仰っているようなことだと思います。


#include <stdio.h>

int hantei(int x, int y, int r){
if(x*x+y*y>=r*r && x*x+y*y<(r+2)*(r+2)){
return 1;
}
else{
return 0;
}
}

int main(){
int x,y,n;
scanf("%d",&n);
for(y=-n-2; y<=n+2; y++){
for(x=-n-2; x<=n+2; x++){
if(hantei(x,y,n)==1){
printf("■");
}
else{
printf(" ");
}
}
printf("\n");
}
return 0;
}

実行結果

10
                        
        ■■■■■■■■■       
      ■■■■■■■■■■■■■     
     ■■■         ■■■    
    ■■■           ■■■   
   ■■               ■■  
  ■■■               ■■■ 
  ■■                 ■■ 
 ■■                   ■■
 ■■                   ■■
 ■■                   ■■
 ■■                   ■■
 ■■                   ■■
 ■■                   ■■
 ■■                   ■■
 ■■                   ■■
 ■■                   ■■
  ■■                 ■■ 
  ■■■               ■■■ 
   ■■               ■■  
    ■■■           ■■■   
     ■■■         ■■■    
      ■■■■■■■■■■■■■     
        ■■■■■■■■■       

#include <stdio.h>

int hantei(int x, int y, int r){
if( y<=x+1 && y>=x-1 || y<=-x+1 && y>=-x-1 ){
return 1;
}
else{
return 0;
}
}

int main(){
int x,y,n;
scanf("%d",&n);
for(y=-n-2; y<=n+2; y++){
for(x=-n-2; x<=n+2; x++){
if(hantei(x,y,n)==1){
printf("■");
}
else{
printf(" ");
}
}
printf("\n");
}
return 0;
}

実行結果

5
■■           ■■
■■■         ■■■
 ■■■       ■■■ 
  ■■■     ■■■  
   ■■■   ■■■   
    ■■■ ■■■    
     ■■■■■     
      ■■■      
     ■■■■■     
    ■■■ ■■■    
   ■■■   ■■■   
  ■■■     ■■■  
 ■■■       ■■■ 
■■■         ■■■
■■           ■■



こんな感じですよね?

プログラムを難しいもの、自分にはわからないもの・・と投げ出してはいませんか?
わからない時はわかるところから少しずつ作ってみましょう。

例えばscanfで読み取るだけならできますか?
一直線だけ書くなら出来ますか?
十字型だけならかけますか?
その線を読み取ったnの長さになら出来ますか?

少しずつやってみましょう。
もう「最初からどうせ全然わからない」じゃ全く成長しないです。
一方で、少しずつやれば必ずわかります。

もし、上のプログラムの意味がわからければ、まず解る部分から自分でプログラムを作ってみて下さい。
つまったらその都度グーグルで調べるか、投稿して添削してもらいましょう。


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

Name: 比奈  ..ぴよぴよ(201ポイント)   Date: 2009/01/15(木) 21:52   No:26954     
Title: Re:はじめまして    
皆さん返信ありがとうございます。
nonさんの仰ってる通りn=5の場合5*5だと思います。
バグs
問題が不適切なのかもしれません。
書いた通りに出題されました。
管理人s
すいません、少し他人任せになっていました。
自分なりにやってみようと思います。
因みに直線までしかできないです。十字架にするときのif文の使い方がよくわかりません、
教えて頂けると幸いです。
上の問題の斜めのところのifとprintfの関係もわかりません。
色々とすいませんが、#include<stdio.h>の後にいつも
void main()といれて初めてプロトタイプ宣言をしてやるとどうなるのかも教えてください。
注文ばかりですいません。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(954,019ポイント)   Date: 2009/01/15(木) 22:29   No:26955     
Title: Re:はじめまして    

まず、方程式を満たしたとき「*」満たさないとき「 」を出力することを考えましょう。

今、長さ10の正方形の領域で、右下がりの直線を描くことを考えてみましょう。

順にxを0から9まで増加させ、yを0から9まで増加させると、合計で格子点は100個になるのはわかりますか?

(0,0),(0,1),(0,2),(0,3)...(0,9)
(1,0),(1,1),(1,2),(1,3)...(1,9)
(2,0),(2,1),(2,2),(2,3)...(2,9)
...
(9,0),(9,1),(9,2),(9,3)...(9,9)

このように100個の点を通りますね?
このうち、y=xを満たす点は斜め右下に向かっているのがわかりますか?
中学か小学のとき、y=xの直線は右上がりになると習ったと思います。
今はyの正の向きが下なのですから、右下がりになるのはわかりますよね。

xを0から9まで変化させ、yも0から9まで変化させ、
条件を満たしたときに「*」を出力、満たさないときに「 」を出力し、
1行調べ終わったら改行すればいいのです。

この通りプログラムを書いてみて下さい。
とりあえず、直線を描くプログラムが出来ているならこれは出来ると思いますが、
初めに作ったプログラムも提示して下さい。

上のプログラムアが出来たら左下がりや、左下がりで途中から右上がりになるようなプログラム、
△を表示するプログラムなどを作って練習してみて下さい。
Zなら簡単に出来るはずです。

あと、いえで使っているコンパイラは何ですか?
それから

>void main()といれて初めてプロトタイプ宣言をしてやるとどうなるのかも教えてください。

の意味がよくわかりません。なお、void mainは間違いです。
手元に本などはありますか?
無ければググって見ましょう。
それから、わからないことがあればネット上に参考になるサイトを見て回るくせもつけましょう。
「C言語 入門」で検索すれば参考になるサイトは沢山見つかります。
 


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

Name: non  ..プログラマー(29,164ポイント)   Date: 2009/01/16(金) 08:51   No:26963     
Title: Re:はじめまして    
たぶん、課題を出した先生が期待している回答は以下のようなものだと思います。
putcharを使いましたが、printfしか習っていないならそこは書き直してください。
管理人さんのプログラムは、これが理解出来た後の方がいいでしょう。


#include<stdio.h>
int main(void)
{
int i,j,n;
printf("n=");
scanf("%d",&n);
for(i=0;i<n;i++)
putchar('*');
putchar('\n');
for(i=0;i<n-2;i++){
for(j=n-2-i;j>0;j--)
putchar(' ');
putchar('*');
putchar('\n');
}
for(i=0;i<n;i++)
putchar('*');
putchar('\n');
return 0;

}

実行例
n=5
*****
*
*
*
*****



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



Name: ゆーずぃ  ..かけだし(1,218ポイント)   Date: 2009/01/16(金) 03:55   No:26962       
Title: お礼    
私事で申し訳ありません。
“プロトタイプ関数と戻り値について”の掲示板へ書き込みをして頂いたSCI様、BEMANI様。大変遅くなりましたが、大したものではございませんが、感謝の言葉を書かさせて頂きました。過去ログの方へ移行してしまいましたが、お目通しいただければ幸いです。
またご質問をさせて頂くこともあるとは思いますが、その時はよろしくお願いいたします。

公共の場を用いてしまいまして、申し訳ありません。それでは失礼致します。


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




Name: 海老天  ..入門者(3,381ポイント)   Date: 2009/01/16(金) 00:33   No:26959       
Title: ファイルの追加について    
龍神録プログラミングの館でSTGを学ぼうと思いプロジェクトをダウンロードしました
プロジェクトは10章からだったので1章を追加しようと思ったのですが
他の章をコピーして名前を変えてもよいのでしょうか?
それともやはり一から作った方がいいのでしょうか


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


Name: Dixq (管理人) [URL]  ..伝説なるハッカー(954,053ポイント)   Date: 2009/01/16(金) 00:56   No:26960     
Title: Re:ファイルの追加について    
プロジェクトは全ての章についてあるはずですので、探してみて下さい。
DLや解凍ミスの場合、DLしなおして再度解凍してみて下さい。


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

Name: 海老天  ..入門者(3,412ポイント)   Date: 2009/01/16(金) 01:24   No:26961 解決!     
Title: Re:ファイルの追加について    
>>管理人様
再度ダウンロードし直したところすべてのファイルがありました
お手数をおかけしてすみません


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



Name: ぽにょ  ..ぴよぴよ(849ポイント)   Date: 2009/01/14(水) 06:34   No:26885       
Title: どこの処理がおかしいのでしょうか?    
スイマセン、また質問させて下さい
「10個の0以上の整数値を入力し、その中の最大値と最小値を表示。」はうまくいったのですが

「その後一つの正の整数値nを入力しn番目に入力された値を表示
また、その値が最大値か最小値の場合はその旨をひょうじすることを繰り返し行う
負の整数値が入力されたらプログラムを終了する。(←これはその後の整数値nを入力した時の終了条件)

ここの処理がうまくいかなかくて悩んでいます。
恐らく処理の位置がおかしいと思うですが・・・
続き

for(;(flag==0);) /*フラグが0の間ループ*/
{
scanf("%d",&n); /*整数値入力*/
if(n<=0)flag=1 /*負の整数が入力されたら*/
{
printf("負の整数が入力されたので終了\n");
}
else if(n>10)          /*nに入力で10以上だったら*/
{
printf("にゅうりょくされた数値では表示できません\n");
}
printf("%d\n",a[n-1]); /*n番目に入力された値*/
if(a[n-1])==max) /*値が最大値だったら*/
{
printf("この値は最大値です\n");
}
if(a[n-1])==min) /*値が最小値だったら*/
{
printf("この値は最小値です\n");
}
}
return 0;
}

変なコードでスイマセンがよろしくお願いします。


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


Name: non  ..プログラマー(27,971ポイント)   Date: 2009/01/14(水) 09:03   No:26888     
Title: Re:どこの処理がおかしいのでしょうか?    
> for(;(flag==0);) /*フラグが0の間ループ*/
> {
> scanf("%d",&n); /*整数値入力*/
> if(n<=0)flag=1 /*負の整数が入力されたら*/
flag=1の場所は下の{}の中
> {
> printf("負の整数が入力されたので終了\n");
> }
> else if(n>10)          /*nに入力で10以上だったら*/
> {
> printf("にゅうりょくされた数値では表示できません\n");
このままだと、下の実行をするので、continue;する
> }
> printf("%d\n",a[n-1]); /*n番目に入力された値*/
> if(a[n-1])==max) /*値が最大値だったら*/
()が対応していない
> {
> printf("この値は最大値です\n");
> }
> if(a[n-1])==min) /*値が最小値だったら*/
()が対応していない
> {
> printf("この値は最小値です\n");
> }
> }
> return 0;
> }
> 変なコードでスイマセンがよろしくお願いします。
>



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

Name: バグ  ..ハッカー(141,710ポイント)   Date: 2009/01/14(水) 09:09   No:26889     
Title: Re:どこの処理がおかしいのでしょうか?    
とりあえず、コンパイルエラーくらいは潰しましょう。
まず、負数の判定を行おうとしているであろうif文は明らかにおかしいですよね?
flagの値を代入している箇所もさることながら、n <= 0という判定式では、0が入力されても負数とみなされてしまいます。


これをやりたいならば…

if (n <= 0) flag = 1
{
printf("負の整数が入力されたので終了\n");
}

下記のように修正しましょう。

if (n < 0)
{
flag = 1;
printf("負の整数が入力されたので終了\n");
}


ただ、nの値は-1して、配列のインデックスとして使いたいようですので、ifブロックを下記のように修正されてはどうでしょうか?


if (n < 0) /* 負数の判定 */
{
flag = 1;
printf("負の整数が入力されたので終了\n");
}
else if(n >= 1 && n <= 10) /* 入力値が1〜10ならば表示 */
{
printf("%d番目に入力された数値は%dです\n", n, a[n - 1]);

if (a[n - 1] == max)
{
printf("この値は最大値です\n");
}
else if(a[n - 1] == min)
{
printf("この値は最小値です\n");
}
}
else
{
printf("入力された数値では表示できません\n");
}




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

Name: ぽにょ  ..ぴよぴよ(917ポイント)   Date: 2009/01/15(木) 23:02   No:26956 解決!     
Title: Re:どこの処理がおかしいのでしょうか?    
フラグを立てる場所と判定が間違っていたのですね、ありがとうございます。
()すらなかったとか・・・そりゃエラーもでますよね。
バグさんのコード、参考にさせて頂きます。
本当にありがとうございました。


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



Name: daburi  ..ぴよぴよ(62ポイント)   Date: 2009/01/14(水) 15:29   No:26892       
Title: TCP/IPの同期??    
学校の課題なのですが、問題が解決できずに困っています。
どうか助言をお願いします。

作っているのは、2台のパソコンでデータ通信を行うものなのですが、以下のような動作をします。
@パソコンAで3Dマウスの座標データを取得
ATCP/IP通信を使い、パソコンBへ座標データを転送
BパソコンBで送られてきた座標データを元に3Dグラフィックで絵を表示

また、ソースはこのような感じになっています。

<PC_A(送信側)>
main(){
while(1){
GetZahyou(); // 座標データを取得
SendZahyou(); // パソコンBに転送
}
}

<PC_B(受信側)>
main(){
CreateThread(); // 座標を受信するスレッドを作成
while(1){
Output(); // 3D座標をグラフィックで表示
}
}
Thread(){
while(1){
GetData(); // 送られてきた座標データを受け取る
}
}

通信、表示も一応動くのですが、動作が不安定でたびたび強制終了してしまいます。
また、受信側の表示は動作がカクカクでスムーズに動いているとはいえません。

思い当たる原因としていろいろ考えてみたのですが、まず、このプログラムでは送る速度と受け取る速度の調節ができていないため、カクカクになってしまうのではないかと考えています。
それ以外にも、動作の確認のためにPrintf文を数箇所に入れているのですが、受信側のPrintf文の数によってうまく動作したり、すぐに強制終了したりしてしまいます。減らせばいいというものではなく、適量のPrintf文があったほうが動作が安定することからPrintfによる割り込みのせいでちょうどよいタイミングになっているのか?などとも予想しています。

お願いしたいことは、
1.動作の同期をとるためにそれぞれのWhileループを1msでループするようにしたいのですが、その方法を教えていただけないでしょうか。
2.また、他の方法でもっと良いもの、あるいは改善した方が良い点があったら指摘していただけないでしょうか。
以上の二つです。
どうかよろしくおねがいします。


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


Name: Mist  ..熟練のプログラマー(40,442ポイント)   Date: 2009/01/14(水) 16:01   No:26893     
Title: Re:TCP/IPの同期??    
情報がなさ過ぎて答えづらいですがいくつか気になった点を。
1.サーバ側の表示スレッドと受信スレッド間のデータの受け渡しはきちんと排他制御できていますか?
  両方のスレッドから同じ共有変数に対してアクセスすると強制終了してしまう場合もありますが。
2.動的エリアの取得・解放はきちんと整理できていますか?
  例えば取得と解放を異なるタイミングで行っていて、受信等の処理タイミングによっては取得前に解放を実行してしまう場合があるとか

printfを多くすると発生しなくなるということは、両スレッドが活発に動くと発生するということだろうからスレッド間の排他制御か同期処理でバグってるのだと予想します。

> 1について
「フレームレートの固定」というようなキーワードでググってください。



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

Name: daburi  ..ぴよぴよ(229ポイント)   Date: 2009/01/14(水) 20:57   No:26908     
Title: Re:TCP/IPの同期??    
Mistさんありがとうございます。
排他制御はミューテックスを使っていたのですが、使った方が強制終了しやすくなってしまったので、コメントアウトしてしまいました。
受信側のメインとスレッドのそれぞれのループでグローバル変数に代入する前後でやってみたのですがうまくいきませんでした。
2の動的エリアの確保と開放ですが、ちょっと意味がよくわからないのですが、特に動的な確保や開放は行っていないと思います。
「フレームレートの固定」も調べてみます。ありがとうございました。



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

Name: Mist  ..熟練のプログラマー(40,645ポイント)   Date: 2009/01/15(木) 10:56   No:26920     
Title: Re:TCP/IPの同期??    
> 使った方が強制終了しやすくなってしまったので
排他制御でデッドロックしているんじゃないですか?


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

Name: Mist  ..熟練のプログラマー(40,701ポイント)   Date: 2009/01/15(木) 11:15   No:26921     
Title: Re:TCP/IPの同期??    
ソースがないのですでにそうなっているのかもしれませんが

> グローバル変数に代入する前後
排他制御はスレッド間で共有するグローバル変数にアクセス(リード・ライト両方)する部分に全て行わなければなりません。
ライト(代入)する時だけの排他制御は意味がありません。


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

Name: daburi  ..ぴよぴよ(380ポイント)   Date: 2009/01/15(木) 15:55   No:26938     
Title: Re:TCP/IPの同期??    
Mistさんなんどもありがとうございます。
変数はひとつしか使っていないのでデッドロックにはなっていないと思います。
排他制御もリード、ライトの両方にかけています。

今日調べてみたところ、どうも受信した値がときどきおかしな値になっていることがあり、それが原因で強制終了しているようでした。recvの間隔が早すぎると受信しきれないことがあるのでしょうか?
それについて受信した値がずれる原因を探してみようと思っています。


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

Name: Mist  ..熟練のプログラマー(40,850ポイント)   Date: 2009/01/15(木) 16:16   No:26940     
Title: Re:TCP/IPの同期??    
> recvの間隔が早すぎると受信しきれないことがあるのでしょうか?

間隔というのがどれぐらいの時間でどのぐらいのデータを送っているのか判りませんが、極端に短い時間(msecオーダー)の場合、必ず相手に届くと思うのは間違いです。
これはPCの性能とかプログラムのつくりとかの問題ではなくTCPの仕様です。
送信側が1msecごとに1バイトのデータを送信しているからといって、受信側が1msecごとにrecvを行ったとしても1バイトずつ受信できる保証はありません。
少し遅れたり、時には数バイトまとめて受信する場合もあります。
この辺勘違いされていませんでしょうか?


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

Name: daburi  ..ぴよぴよ(482ポイント)   Date: 2009/01/15(木) 21:48   No:26953 解決!     
Title: Re:TCP/IPの同期??    
Mistさんの言うとおり、送ったのと同じだけ受け取れると思っていたのが原因のようでした。
送られてきた値が期待する値であるかをチェックするようにしたら正しく動くようになりました。
どうもありがとうございました。とても助かりました。


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



Name: giro  ..ぴよぴよ(61ポイント)   Date: 2009/01/15(木) 13:31   No:26926       
Title: 龍神録コードで実行中OSが突然落ちる    
はじめまして。学校の課題でシューティングゲームをC++で作成しているのですが、ゲームをプレイ中にOSが落ちるというバグが発生するのですが原因わかりますか?

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


Name: toyo  ..上級者(22,953ポイント)   Date: 2009/01/15(木) 13:42   No:26927     
Title: Re:無題    
ゲームプログラムじゃなくてOSが落ちるんですか
OSが落ちるときはハードウェアの不良の可能性もありますが
ちなみにOSはなんでしょうか


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

Name: たかぎ [URL]  ..比類無きプログラマー(79,994ポイント)   Date: 2009/01/15(木) 13:52   No:26928     
Title: Re:無題    
> バグが発生するのですが原因わかりますか?

原因は「バグ」だと分かっているのでは?

どんなOSかも分かりませんし、どんなプログラムで、何をしたときに現象が起きるのかもさっぱりわかりませんので、それ以上のことはいえませんね。


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

Name: giro  ..ぴよぴよ(0ポイント)   Date: 2009/01/15(木) 14:21   No:26930     
Title: Re:無題    
OSはXPです。
シューティングゲームを作っているのですが敵に弾を撃たせたり、
敵を倒したときにOSがよく落ちる気がします。
おそらく変数の宣言等にバグがあるのだろうと思ったのですが、なかなか見つけることができず困っています。
宣言等にミスがありOSの再起動がかかることってあるのでしょうか?


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

Name: Mist  ..熟練のプログラマー(40,667ポイント)   Date: 2009/01/15(木) 14:30   No:26932     
Title: Re:無題    
たぶんポインタの制御が間違っていてアプリケーションが通常書き換えてはならんようなメモリを書き換えてしまっているのだと思いますが。


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

Name: 通りすがり  ..中級者(13,643ポイント)   Date: 2009/01/15(木) 14:41   No:26934     
Title: Re:無題    
コンパイラは何ですか?
・・・ってかこうやって何度も聞き返さないといけなくなるので規約を読んで、
ちゃんと必要なことを書くようにして下さい。


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

Name: 御津凪 [URL]  ..熟練のプログラマー(49,533ポイント)   Date: 2009/01/15(木) 16:08   No:26939     
Title: Re:無題    
一応似たような症状が以前起きたことがあったので情報としてここに書いておきます。

私の場合はテスト的にDirect3Dで3D表示をするプログラムを組んでいたときで、
カメラの座標が向いてはいけない方向(カメラ位置と注視点が重なった時)に向いた瞬間、
ブルースクリーンが出て落ちました。

恐らくGPU内で0除算したのが原因だと思います。
(多少古いグラフィックボードだったのでそう考えています)

比較的新しいOSならばアプリケーションのバグで簡単にOSが落ちることは無いはずなので、
プログラムがアクセスしているハードに問題があるかもしれません。

何はともあれ、

・パソコンの環境
・コンパイラやライブラリは何を使用しているか
・どういうところで落ちているのか

を、詳しく書いていただけるとより早く解決できるかと思います。


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

Name: giro  ..ぴよぴよ(573ポイント)   Date: 2009/01/15(木) 17:39   No:26941     
Title: Re:無題    
申し訳ございませんちゃんと利用規約を読んできました。
とりあえずテンプレで詳しく書いて見ます。
[1] 質問文
 [1.1] 自分が今行いたい事は何か
     シューティングゲームがきちん動くようにしたい。
 [1.2] どのように取り組んだか(プログラムコードがある場合記載)
     龍神録プログラミングの館を基本に少し自分でアレンジを加えて作っています。
     今、40章のアイテムを出現させたところです。
 [1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
     いきなりOSが再起動されます。再起動がなぜか起こらないPCもあり、初めてPCを変えたところでバグが見つかりました。再起動が起こるタイミングとしては、敵が弾を大量に出している状態の時がほとんどです。
 [1.4] 今何がわからないのか、知りたいのか
  今再起動している原因はプログラムによるものなのか、ハードによるものなのか。
     また、プログラムにあるとすればその原因と思われる箇所
[2] 環境  
 [2.1] OS : WindowsXP 
 [2.2] コンパイラ名 : VC++ 2008EE
[3] その他
 ・どの程度C言語を理解しているか
    C言語を扱うのは初めてで勉強しつつ作成している段階です。
 ・ライブラリを使っている場合は何を使っているか
    DXライブラリを使用しています


ハードについては、学校のもので私自身PCに詳しくないのでなのでよくわかりません
どうかよろしくお願いします。


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

Name: Dixq (管理人) [URL]  ..伝説なるハッカー(953,657ポイント)   Date: 2009/01/15(木) 18:26   No:26943     
Title: Re:無題    
回答じゃなくて申し訳ないのですが、私もそのようなことがありました。
龍神録公開前に、あらゆるパソコンで動作チェックをしました。

・自分のメインパソコン
・サブノート
・モバイル
・友達のPC
・親のPC
・研究室のPC
・ネットカフェのPC ・・・・

不具合無く動作しました。何人かに動作確認協力してもらいましたが、特に問題ありませんでした。

しかし、何故か大学のコンピュータ室にあるパソコンで動作させた時だけ、弾が大量に出てきた時OSが落ちます。
龍神録のコードに何か問題があるのかもしれませんが、弾の計算関係を見直しても特に間違いのありそうな部分は見つからず、原因が良く解りませんでした。

そのPCはコンパイラが入っていなかったので無理でしたが、もしコンパイラが入っているならデバッグしてみてはどうでしょう?

Vc++ならF5を押してコンパイル、実行すればデバッグになります。
もし突然落ちてどうしようもないのなら、何度もやってどこで落ちるのかもっと調べて限定出来ないかやってみてはどうでしょう。

後、グラフィックカードのドライバの更新をしてみると何か改善するかもしれません。


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

Name: toyo  ..上級者(22,986ポイント)   Date: 2009/01/15(木) 18:52   No:26946     
Title: Re:無題    
XPでいきなり再起動するのはハード(RAMやグラフィックカード)の不具合の可能性高いと思います


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

Name: Mist  ..熟練のプログラマー(41,210ポイント)   Date: 2009/01/15(木) 19:44   No:26949     
Title: Re:無題    
>  今再起動している原因はプログラムによるものなのか、ハードによるものなのか。
>     また、プログラムにあるとすればその原因と思われる箇所

これらを解決するためには原因を発生させることができる環境と全く同じものがないと調べようがありませんので、このような掲示板での解決はほぼ無理と思ったほうがいいです。
せめてプロジェクト一式を提示してもらえるなら「私のPCでは発生した・しなかった」程度の回答であればできるとは思いますが。

管理人さんの回答による
> 後、グラフィックカードのドライバの更新をしてみると何か改善するかもしれません。
これぐらいが限界かと思います。


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

Name: giro  ..ぴよぴよ(831ポイント)   Date: 2009/01/15(木) 21:20   No:26952 解決!     
Title: Re:無題    
私のようなc言語初心者の質問でも真面目に回答していただき本当に感謝です。
私も他の環境ではどうかと考え、さらに2台のPCで試してみたのですがきちんと起動しました。
なので、おそらく管理人さんと同じ原因ではないかと考え、龍神録プログラミングの館のプロジェクトをそのままで敵の出現のみを多くした場合で試したのですがやはり私のプロジェクトと同じ結果になりました。
これらのことよりおそらくハード面での問題だと思います。
これから学校とかけあい、皆さんのおっしゃるグラフィックカードのドライバをどうにかしていきたいと思います。皆さん本当にありがとうございます。
また、私の起動できない環境ではVC++が入っていたのでデバックモードも試してみたのですが突然落ちてしまい、また原因が絞れないかとしたのですがどのタイミングで起こるかが全くランダムだったため断念してしまいました。


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



Name: sasimi  ..ぴよぴよ(43ポイント)   Date: 2009/01/15(木) 14:44   No:26936       
Title: プログラムを拡張したい    
はじめまして、ソースプログラムは添付にあります。UNIXのfgrepのオプションを実現ためのです。コンパイル実行しますと-n,-vというコマンドが実行できます。これ以外は何にが新しいオプション付け加えたいと考えています。よろしくお願いします。

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


Name: ibis  ..上級者(17,524ポイント)   Date: 2009/01/15(木) 15:18   No:26937     
Title: Re:プログラムを拡張したい    
あと-cも使えるみたいですね。


・マクロを追加(〜Bitはユニークな数(ただし2の倍数に限る)。〜Optionはオプションの文字)
・main関数のswitchステートメントの分岐を追加(条件は〜Option。処理はoptionに〜Bitを加算)
・fpattern関数に、オプションによる処理を追加(〜Optを宣言、optionと〜Optionの論理積を代入。〜Optの値に応じて処理を変更する)

やり方は大体こんな感じです。
細部(加算とか論理積の辺り)はちょっと違いますが、これでもいけるはずです。


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

Name: sasimi  ..ぴよぴよ(0ポイント)   Date: 2009/01/15(木) 20:35   No:26951     
Title: Re:プログラムを拡張したい    
> あと-cも使えるみたいですね。
>
>
> ・マクロを追加(〜Bitはユニークな数(ただし2の倍数に限る)。〜Optionはオプションの文字)
> ・main関数のswitchステートメントの分岐を追加(条件は〜Option。処理はoptionに〜Bitを加算)
> ・fpattern関数に、オプションによる処理を追加(〜Optを宣言、optionと〜Optionの論理積を代入。〜Optの値に応じて処理を変更する)
>
> やり方は大体こんな感じです。
> 細部(加算とか論理積の辺り)はちょっと違いますが、これでもいけるはずです。
>


ご返事していただきありがどうございます。もし-helpという新しいオプションを加えたいと、どうすれば良いでしょうか?


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



Name: ざこ  ..中級者(13,384ポイント)   Date: 2009/01/15(木) 18:06   No:26942       
Title: 参照を返す    
参照を返す の概念がさっぱり理解できないんですが

#include <iostream>
using namespace std;

int &f();
int x;

int main()
{
f()=100;
cout<<x<<"\n";
return 0;
}
int &f()
{
return x;
}


f()がxへの参照を返すのでmain()関数内のf()=100;でxに100を代入していることになります
となってるのですがどうもこの概念がさっぱりです。教えて下さい。


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


Name: バグ  ..ハッカー(141,898ポイント)   Date: 2009/01/15(木) 18:48   No:26945     
Title: Re:参照を返す    
ポインタだと思えばいいですよ(^-^)
今回の場合、関数fの戻り値は、グローバル変数xへのポインタを返していると考えればいい訳です。


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



Name: KJ  ..ぴよぴよ(908ポイント)   Date: 2009/01/14(水) 12:34   No:26890       
Title: 無題    
輪郭追跡処理の意味を教えてください。
よろしくお願いします。


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


Name: 通りすがり  ..中級者(13,598ポイント)   Date: 2009/01/14(水) 12:40   No:26891     
Title: Re:無題    
まずはググりましょう。

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

Name: やそ  ..比類無きプログラマー(85,872ポイント)   Date: 2009/01/15(木) 14:41   No:26935     
Title: Re:無題    
ぐーぐる先生に聞いてみた。

ttp://homepage2.nifty.com/tsugu/sotuken/binedge/


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



Name: ブルー  ..ぴよぴよ(66ポイント)   Date: 2009/01/15(木) 13:54   No:26929       
Title: VC2008の変換ウィザードで次へボタンが表示されません    
はじめまして。ゲームプログラミングに挑戦してみようと思いDXライブラリをダウンロードしてきてslnファイルを開いたのですが、VC2008が変換ウィザードを開始しても次へボタンがどういうわけか表示されません。
再インストールしても同じ症状が出て困っています。
OSはVistaHomePremiumです。
初歩的な質問かもしれませんが出鼻をくじかれたようで困っています。わかる方いましたら教えてください。
参考になるかはわかりませんがスクショつけておきます


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




Name: じゃん  ..ぴよぴよ(43ポイント)   Date: 2009/01/15(木) 12:04   No:26922       
Title: HTTP通信のサーバを構築した際の接続状況について    
お世話になります。
表題に示した内容について、悩んでいることがあります。

現在、Javaで作成されたクライアントで、HttpClientを利用してCで作成したサーバとHTTP通信でデータのやり取りを行っています。

Cで作成したサーバでは、クライアントが送信した要求データを scanf() 関数を利用して標準入力として受け取ることができ、応答データは printf() 関数で標準出力することでクライアント側へ送信することができます。

この際、サーバから応答データを送信する際に、クライアント・サーバ間で接続が切断されていないかの確認を行いたいのですが、どういう方法で確認できるのかわからず悩んでいます。

わかる方がいらっしゃいましたら、ご教授頂けたらと思います。
よろしくお願いします。


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




Name: 紫苑  ..ぴよぴよ(929ポイント)   Date: 2009/01/14(水) 20:54   No:26907       
Title: DxLibの質問    
DxLibのことでですが。向こうの方も読ませていただいたんですが。(読みがあまかった?)DxLib_VC2008_and_2005用.slnのファイルが動作しないんです...。そのファイルをクリックしても動かなく、何回も何回もクリックしてもできず(泣
この掲示板に質問させていただきました。しょうもないことですみません。

行ったやり方
VC++用のDxLibをダウンロード
解凍をして、サンプルプログラム実行用フォルダをダブルクリック
DxLib_VC2008_and_2005用.slnをダブルクリック
動かない...。
という状況です。
プロパティを開いて試してみたんですが、Microsoft Visual Studio Version Selectorというの?になってました。
何回よんでもわかりませんでした...。

あと、前わ本当にありがとうございました。おかげでC、C++を楽しんでやっております^^


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


Name: 御津凪 [URL]  ..熟練のプログラマー(49,193ポイント)   Date: 2009/01/14(水) 21:11   No:26909     
Title: Re:DxLibの質問    
VC++ を起動して、DxLib_VC2008_and_2005用.sln をVC++のウインドウに
ドラッグアンドドロップすれば開くはずです。


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

Name: 紫苑  ..ぴよぴよ(939ポイント)   Date: 2009/01/15(木) 00:06   No:26912     
Title: Re:DxLibの質問    
なるほど、試してみます^^

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



Name: 学生 (by 管理人)  ..ぴよぴよ(58ポイント)   Date: 2009/01/14(水) 16:43   No:26896       
Title: 生年月日による運勢占いのプログラム    
(わけあって、管理人が質問者の代わりに質問文を書いています)

生年月日による運勢占いのプログラムの作り方を教えて下さい。


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


Name: Dixq (管理人)  ..伝説なるハッカー(952,185ポイント)   Date: 2009/01/14(水) 16:47   No:26898     
Title: Re:生年月日による運勢占いのプログラム    

先ほどリアルで口頭で説明したのですが、
コードが無いと解りにくい&メルアドが不明&データを持ち歩く物が無いということで、
代わりにこちらで回答しています。
先ほど説明したプログラムはこちらです。
色々と改善した方が良い部分はありますが、
最低限これで動きます。
余力があれば、もっと付加機能をつけたり、エラー処理をしたりしてみて下さい。


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

void Kuji( char addBuffer[] ){

int Born; //生年月日のデータをint型として入れるもの
int Kekka; //占い結果を入れるもの

Born = atoi( addBuffer ); //文字列としての数値データをint型の数値データに変換

srand( Born ); //乱数の初期化。初期値が同じならrandの結果は同じ

Kekka = rand() % 5; //膨大な数の乱数を5種類に分ける

if( Kekka == 0 ){
printf("大吉!\n");
}
if( Kekka == 1 ){
printf("吉!\n");
}
if( Kekka == 2 ){
printf("中吉!\n");
}
if( Kekka == 3 ){
printf("小吉!\n");
}
if( Kekka == 4 ){
printf("凶\n");
}
}

int main(){
char addBuffer[128] = "19881012";

Kuji( addBuffer );

return 0;
}

実行結果

中吉!


クライアントで
「19881012」
このように年月日で入力させると、addBufferにこの文字列が入ってくるのでそれを使いましょう。
 


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



Name: 紅葉  ..中級者(10,632ポイント)   Date: 2009/01/13(火) 17:11   No:26860       
Title: 球の回転について    
マウスでオブジェクトの回転を行っているのですが
クリックを話した後も暫くは地球儀のように回転させたいです。
ただマウスを離したらのAngを初期化する仕様で何とか動作しているので
回転が止まってしまいます。

添付はソースです。
次の添付は素材となっています。
お互い解凍した直下に入れてください。



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


Name: 紅葉  ..中級者(10,642ポイント)   Date: 2009/01/13(火) 17:11   No:26861     
Title: Re:球の回転について    
データです。

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

Name: 紅葉  ..中級者(10,652ポイント)   Date: 2009/01/14(水) 16:23   No:26894     
Title: Re:球の回転について    
すいません><
自己解決しました


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




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +