C言語何でも質問掲示板


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

規約と使い方

 
   ポインタを使った文字 ....   
     ・[7588] なぎ 
     ・[7589] 管理人 
     ・[7619] taku 
     ・[7621] 管理人 
     ・[7623] 管理人 
   Visual C++ 2005 Expr ....   
     ・[7587] 管理人 
     ・[7600] yukiya 
     ・[7602] yukiya 
     ・[7616] 管理人 
   C#なのですが…   
     ・[7574] YuO 
     ・[7575] バグ 
     ・[7576] Justy 
     ・[7577] バグ 
     ・[7578] Justy 
     ・[7606] バグ 
     ・[7609] Justy 
     ・[7611] バグ 
     ・[7612] Justy 
   質問です   
     ・[7605] YuO 
     ・[7607] なぎ 
     ・[7608] いさご 
   C言語の偶数をあらわ ....   
     ・[7565] YuO 
     ・[7566] えりこ 
     ・[7567] YuO 
     ・[7568] えりこ 
     ・[7590] 管理人 
   文字列の比較について   
     ・[7563] miyaza 
     ・[7572] taku 
     ・[7583] なぎ 
     ・[7584] なぎ 
     ・[7585] taku 
   無題   
     ・[7546] Justy 
     ・[7571] aniy 
   テンプレート化できま ....   
     ・[7543] Justy 
     ・[7544] Justy 
     ・[7547] 組木紙織 
     ・[7548] Justy 
     ・[7551] YuO 
     ・[7569] 組木紙織 
   加減剰除のプログラム   
     ・[7167] @とんぷぅ〜 
     ・[7168] box 
     ・[7169] keichan 
     ・[7170] keichan 
     ・[7171] @とんぷぅ〜 
     ・[7172] box 
     ・[7173] @とんぷぅ〜 
     ・[7177] @とんぷぅ〜 
     ・[7196] @とんぷぅ〜 
     ・[7198] box 
     ・[7199] @とんぷぅ〜 
     ・[7200] box 
     ・[7201] @とんぷぅ〜 
     ・[7274] @とんぷぅ〜 
     ・[7276] box 
     ・[7452] @とんぷぅ〜 
     ・[7460] box 
     ・[7467] しっぽ 
     ・[7490] @とんぷぅ〜 
     ・[7561] @とんぷぅ〜 
   Visual C++ CLR フォ ....   
     ・[7536] バグ 
     ・[7556] keichan 
   ドメイン??   
     ・[7541] ひろゆき 
     ・[7550] 管理人 
     ・[7555] asd 
   リストについて質問で ....   
     ・[7539] 組木紙織 
     ・[7553] いさご 
   最小二乗円   
     ・[7287] box 
     ・[7289] noel  
     ・[7290] noel  
     ・[7292] box 
     ・[7294] 組木紙織 
     ・[7296] 管理人 
     ・[7299] noel 
     ・[7443] 組木紙織 
     ・[7533] しっぽ 
   質問ですが   
     ・[7531] 管理人 
     ・[7532] lion 
   アクションRPGに必要な ....   
     ・[7498] 管理人 
     ・[7512] sin 
     ・[7516] 管理人 
     ・[7520] Justy 
     ・[7522] 管理人 
     ・[7525] Justy 
     ・[7528] 管理人 
     ・[7529] sin 
   またまた質問です   
     ・[7507] Justy 
     ・[7508] 管理人 
     ・[7509] はね 
     ・[7518] 管理人 
     ・[7521] はね 
     ・[7523] 管理人 
   質問   
     ・[7517] 管理人 
   警告について   
     ・[7511] 雷 
     ・[7513] フリオ 
     ・[7515] 管理人 
   画像のレイヤー化   
     ・[7487] 管理人 
     ・[7488] 管理人 
     ・[7504] 夏天 
     ・[7505] 管理人 
   質問です   
     ・[7474] 管理人 
     ・[7475] Justy 
     ・[7476] さい 
     ・[7477] さい 
     ・[7478] Justy 
     ・[7479] 管理人 
     ・[7482] さい 
     ・[7483] 管理人 
     ・[7501] さい 
     ・[7503] 管理人 
   構造体リスト、配列、 ....   
     ・[7499] 管理人 
     ・[7500] box 
     ・[7502] 困ったさん 
   ヘッダファイルの中に ....   
     ・[7430] しっぽ 
     ・[7432] 大根おろし 
     ・[7435] 大根おろし 
     ・[7436] miyaza 
     ・[7437] miyaza 
     ・[7438] miyaza 
     ・[7441] 大根おろし 
     ・[7462] しっぽ 
     ・[7468] 大根おろし 
     ・[7481] 大根おろし 
     ・[7489] フリオ 
     ・[7497] しっぽ 
   画像処理について。   
     ・[7492] keichan 
     ・[7493] YuO 
     ・[7494] らんえぼ 
   警告が・・・   
     ・[7453] 管理人 
     ・[7484] 夏天 
     ・[7485] 夏天 
   モンテカルロ積分   
     ・[7445] 組木紙織 
     ・[7447] カルマ 
     ・[7470] 組木紙織 
     ・[7480] カルマ 
   教えてください   
     ・[7332] 管理人 
     ・[7334] 管理人 
     ・[7335] 管理人 
     ・[7336] 管理人 
     ・[7337] 管理人 
     ・[7338] 管理人 
     ・[7339] 管理人 
     ・[7340] 管理人 
     ・[7341] 管理人 
     ・[7472] 管理人 
   メモリが確保できてい ....   
     ・[7469] box 
     ・[7471] KJ 
   多重積分   
     ・[7455] 管理人 
     ・[7461] box 
     ・[7463] シナ 
     ・[7464] box 
     ・[7465] シナ 
   フルパスの記述につい ....   
     ・[7451] 組木紙織 
     ・[7454] やっかい者 
     ・[7456] 管理人 
     ・[7459] やっかい者 
   ダメージ計算   
     ・[7442] Justy 
     ・[7458] 管理人 
   RPGサンプルプログラム ....   
     ・[6295] 風鈴 
     ・[6296] 管理人 
     ・[6297] 管理人 
     ・[6298] 風鈴 
     ・[6299] 管理人 
     ・[6300] 風鈴 
     ・[6301] 管理人 
     ・[6302] 管理人 
     ・[6306] 管理人 
     ・[6307] 風鈴 
     ・[6309] 管理人 
     ・[6311] 風鈴 
     ・[6314] 管理人 
     ・[6316] 管理人 
     ・[6322] Hermit 
     ・[6325] 管理人 
     ・[6326] Hermit 
     ・[6327] Justy 
     ・[6328] 管理人 
     ・[6329] Justy 
     ・[6330] Justy 
     ・[6331] 管理人 
     ・[6332] 管理人 
     ・[6333] 風鈴 
     ・[6334] 管理人 
     ・[6336] Hermit 
     ・[6341] Justy 
     ・[6357] 風鈴 
     ・[6364] 管理人 
     ・[6365] 管理人 
     ・[6366] 風鈴 
     ・[6371] 管理人 
     ・[6375] 風鈴 
     ・[6376] Justy 
     ・[6377] 管理人 
     ・[6392] 管理人 
     ・[6414] 風鈴 
     ・[6429] 管理人 
     ・[6440] 雷 
     ・[6449] Justy 
     ・[6458] 管理人 
     ・[6465] 雷 
     ・[6498] 管理人 
     ・[6514] 管理人 
     ・[6517] 管理人 
     ・[6518] 風鈴 
     ・[6521] 管理人 
     ・[6522] BAZZ 
     ・[6537] 管理人 
     ・[6557] 管理人 
     ・[6591] 管理人 
     ・[6626] 管理人 
     ・[6763] 風鈴 
     ・[6764] 管理人 
     ・[6766] バグ 
     ・[6767] 管理人 
     ・[6768] バグ 
     ・[6769] 管理人 
     ・[6935] parapara 
     ・[6942] 管理人 
     ・[6976] 管理人 
     ・[7457] 管理人 
   USBの信号検知につ ....   
     ・[7023] なぎ 
     ・[7062] やっかい者 
     ・[7085] なぎ 
     ・[7089] やっかい者 
     ・[7449] やっかい者 
   ちょっとしたことです ....   
     ・[7429] box 
     ・[7431] しっぽ 
     ・[7448] Justy 
   課題の一部なんですが   
     ・[7439] 中吉 
     ・[7440] mj 
   英単語をソート   
     ・[7416] miyaza 
     ・[7418] toku 
     ・[7420] box 
     ・[7421] miyaza 
     ・[7425] toku 
   正常終了   
     ・[7409] しっぽ 
     ・[7410] 夏天 
     ・[7411] しっぽ 
     ・[7412] 夏天 
     ・[7413] しっぽ 
     ・[7414] 夏天 
     ・[7417] しっぽ 
     ・[7424] 夏天 
   キャラクターのジャン ....   
     ・[7369] Justy 
     ・[7371] はね 
     ・[7372] Justy 
     ・[7374] はね 
     ・[7375] Justy 
     ・[7377] はね 
     ・[7378] Justy 
     ・[7385] はね 
     ・[7390] Justy 
     ・[7391] はね 
     ・[7393] Justy 
     ・[7394] Justy 
     ・[7395] はね 
     ・[7404] Justy 
     ・[7407] はね 
     ・[7419] はね 
     ・[7422] Justy 
     ・[7423] はね 
   何度もすいません・・ ....   
     ・[7162] なぎ 
     ・[7165] なぎ 
     ・[7174] なぎ 
     ・[7277] sub 
     ・[7406] sub 
   質問です   
     ・[7405] 管理人 
   制限時間について   
     ・[7396] バグ 
     ・[7400] 夏天 
   画像の表示方法につい ....   
     ・[7352] かずお 
     ・[7353] 管理人 
     ・[7354] バグ 
     ・[7355] 管理人 
     ・[7357] バグ 
     ・[7382] かずお 
     ・[7384] 管理人 
     ・[7386] バグ 
     ・[7397] かずお 
     ・[7399] かずお 
   SRPGについて   
     ・[7367] Justy 
     ・[7370] jugS 
     ・[7373] Justy 
     ・[7376] jugS 
     ・[7383] 管理人 
     ・[7388] jugS 
   ポインター   
     ・[7368] box 
   押しボタンについて   
     ・[7347] バグ 
     ・[7348] 管理人 
     ・[7358] 夏天 
     ・[7359] バグ 
     ・[7361] 管理人 
     ・[7362] 夏天 
     ・[7363] 管理人 
   教えてください   
     ・[7343] box 
     ・[7346] 管理人 
     ・[7350] black 
     ・[7351] black 
     ・[7356] 管理人 
     ・[7360] black 
   またまたすいません   
     ・[7303] 管理人 
     ・[7304] Lbfuvab 
     ・[7306] 管理人 
     ・[7318] Lbfuvab 
     ・[7319] Lbfuvab 
     ・[7320] box 
     ・[7328] 管理人 
     ・[7345] Lbfuvab 
   Cからの移行   
     ・[7270] 大工 
     ・[7271] Justy 
     ・[7285] ひろゆき 
     ・[7288] Justy 
     ・[7297] 管理人 
     ・[7316] ひろゆき 
     ・[7317] バグ 
     ・[7321] Justy 
     ・[7325] 通りすがり 
     ・[7329] 管理人 
     ・[7330] ひろゆき 
     ・[7331] 管理人 
     ・[7333] ひろゆき 
   サンプルプログラムに ....   
     ・[7302] 管理人 
     ・[7305] 管理人 
     ・[7307] 管理人 
     ・[7308] 管理人 
     ・[7309] Justy 
     ・[7310] 管理人 
     ・[7311] Justy 
     ・[7312] 管理人 
     ・[7313] Justy 
     ・[7314] 夏天 
     ・[7315] box 
     ・[7322] 管理人 
     ・[7323] 管理人 
     ・[7326] 夏天 
     ・[7327] 管理人 
   さらに課題研究にて   
     ・[7279] バグ 
     ・[7280] 夏天 
     ・[7281] box 
     ・[7282] バグ 
     ・[7283] バグ 
     ・[7284] 夏天 
     ・[7298] 管理人 
   2整数の大小比較   
     ・[7258] box 
     ・[7259] ☆ 
     ・[7260] ☆ 
     ・[7261] ☆ 
     ・[7262] box 
     ・[7263] box 
     ・[7264] ☆ 
     ・[7265] ☆ 
     ・[7266] ☆ 
     ・[7267] box 
     ・[7268] ☆ 
     ・[7273] フリオ 
     ・[7275] ☆ 
   関数の作り方   
     ・[6831] 管理人 
     ・[6832] ★ 
     ・[6833] 管理人 
     ・[6834] 管理人 
     ・[6835] 管理人 
     ・[6836] ★ 
     ・[6838] 管理人 
     ・[6839] ★ 
     ・[6840] ★ 
     ・[6841] ★ 
     ・[6843] 管理人 
     ・[6844] ★ 
     ・[6845] ★ 
     ・[6853] 管理人 
     ・[6875] ★ 
     ・[6881] 管理人 
     ・[7013] ★ 
     ・[7074] 管理人 
     ・[7104] ★ 
     ・[7105] 管理人 
     ・[7257] ☆ 
   課題研究にて   
     ・[7254] バグ 
     ・[7256] 夏天 
   質問です   
     ・[7176] クルス 
     ・[7182] クルス 
     ・[7205] 管理人 
     ・[7246] クルス 
     ・[7252] 管理人 
   ソフトが消せない(T_ ....   
     ・[7163] 雷 
     ・[7180] ダッシュ 
     ・[7183] box 
     ・[7189] 雷 
     ・[7192] 管理人 
     ・[7197] keichan 
     ・[7245] ダッシュ 
     ・[7247] バグ 
     ・[7249] ダッシュ 
     ・[7250] 管理人 
   二次元配列の関数   
     ・[7194] なぎ 
     ・[7220] 管理人 
     ・[7241] Sena 
     ・[7244] 管理人 

Name: taku  ..ぴよぴよ(642ポイント)   Date: 2007/05/15(火) 13:42   No:7586       
Title: ポインタを使った文字列の連結、コピー    
すみません、またわからない問題にあたってしまいました><
私はC言語レベル4〜5?くらいなんですが、この問題を教えてほしいのです。
#include <stdio.h>

int main(void){
char strA[]="Hello!!";
char strB[]="Good!";
char strC[]="1234567890123456789"

printf("%s\n",strC);

return(0);
};
はっきりいってポインタがよくわからないのです;;
表示では"Hello!!Good!"のようにしたいのです。
strA、strBの文字数の和はstrCの文字数のように少ないと定義しています。
strCにたくさんの数字が入っているのは仕様です。
普通にstrAとstrBを連結させるのは何とかできそうなのですが「ポインタを使った」
でひっかかってしまいます・・・orz
よくわからない*や&の記号を使ってtうくるのでしょうか@@?
char strCとprintfの間にプログラムを書きのですがわかる方おっしゃったらよろしくお願いします<(_ _)>


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


Name: なぎ  ..上級者(22,993ポイント)   Date: 2007/05/15(火) 14:06   No:7588     
Title: Re:ポインタを使った文字列の連結、コピー    
ひとつの回答としては……。

まず、「普通に連結」というのを作ってみてください。
多分、配列を使った操作ですよね。
そして、それができたら、

strA[なんとか] を、*(strA + なんとか)
strB[なんとか] を、*(strB + なんとか)
strC[なんとか] を、*(strC + なんとか)

に置き換えると、まずは、「ポインタを使った」ことになります。
多分、模範解答は、そこから、もうちょっといじる必要がありますが。



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

Name: 管理人 [URL]  ..伝説のハッカー(315,242ポイント)   Date: 2007/05/15(火) 14:11   No:7589     
Title: Re:ポインタを使った文字列の連結、コピー    
strCに入れたいのですか?
ポインタをわざわざ使って連結する意味がないように思いますけど、練習と言うことでしたらそれでもいいかもしれません。

#include <stdio.h>

void main(){
int a=2;
int *p;
p=&a;
printf("%d",*p);
}


まず、ポインタを利用したいのでしたら、ポインタの基礎がわかっているかどうかが重要です。
上記プログラムの意味がわからなければ、先に進めないでしょう。
上記プログラムの意味を説明できますか?
また、アドレスとポインタの違いは説明出来ますか?


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

Name: taku  ..ぴよぴよ(881ポイント)   Date: 2007/05/15(火) 23:40   No:7619     
Title: Re:ポインタを使った文字列の連結、コピー    
↑のプログラムはわかると思います。
ポインタ変数pを宣言してその変数のなかにint型で宣言したaのアドレスを代入することになると
思うのでprintf関数で表示されるのはポインタ変数pの中に入っているアドレスの中身、つまり2が表示される
ようなことは少しあいまいかもしれませんが理解はできます。
まぁ説明しろといわれると厳しいかもしれません;
ん〜難しいorz
できればソースを書いていただけるとありがたいのですが・・・
期限があるもので@@;わがままなことをいってすみません<(_ _)>


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

Name: 管理人 [URL]  ..伝説のハッカー(316,993ポイント)   Date: 2007/05/16(水) 06:44   No:7621     
Title: Re:ポインタを使った文字列の連結、コピー    
答えは下に書いておきました。
他にも沢山方法はあるでしょうし、strCは動的に配列の大きさを確保した方がいいように思いますが、
今回はstrCは十分に大きいと言うことのようですので、そのままにしておきました。

ただ、ここで「答えを教えて」はダメだという規約にしてあります。

しかし「課題の期限が迫っていてどうしようもない・・」という状況はとても理解出来ます。
とにかくどうにかしたいですよね。
しかし、課題だけ解いて終わりにしてもらいたくないのです。

今回規約違反をして答えをお伝えしてしまった変わりに、宿題を出すのでやってみてください。

先ほどの私の質問で、質問者さんがポインタの基礎は理解していらっしゃるようでしたので、
ポインタが何かは省略します。

文字列はアドレスを利用して様々な方法が取れます。


#include <stdio.h>

void main(void){

char strA[]="Hello!!";

putchar(*strA);

}

 
 
*strAの示す部分を1文字表示したら何が表示されるか予測できますね?

それでは

課題

strA[]="Hey!!Hello!!";
strC[]="0123456789012345678901234567890";
 
上記のような2つの文字列があります。

課題1
strCにおいて、6番目の配列要素をアドレス操作を意識して表示させてください。

課題2
strCにおいて、偶数番目にある配列要素をアドレス操作を意識して表示させてください。

課題3
strCの偶数の文字(0,2,4.....)をstrAにポインタを利用してコピーする関数を作ってください。
あふれないように気をつけて、あふれたものは切り捨てます。


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

Name: 管理人 [URL]  ..伝説のハッカー(317,729ポイント)   Date: 2007/05/16(水) 07:01   No:7623     
Title: Re:ポインタを使った文字列の連結、コピー    


#include <stdio.h>

void strcopy(char *st1, const char *st2 , const char *st3){
while (*st2 != '\0')
*st1++ = *st2++;
while (*st3 != '\0')
*st1++ = *st3++;
*st1 = '\0';
}


void main(void){
char strA[]="Hello!!";
char strB[]="Good!";
char strC[]="1234567890123456789012345";

strcopy(strC,strA,strB);

printf("%s",strC);

}


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



Name: yukiya  ..ぴよぴよ(99ポイント)   Date: 2007/05/14(月) 21:34   No:7570       
Title: Visual C++ 2005 Express Edition 設定通りのはずなのですが…    
はじめまして。
「ゲームプログラミングの館」を今日知り、
実際にやってみようと入門編から手順を追って行っていたのですが躓いてしまったため質問させて下さい。

http://freepg.fc2web.com/cpp/topic_vce_001.html
↑こちらのサイトの手順通りに
「Visual C++ 2005 Express Editionのインストール」
          ↓
「Windows Platform SDKのインストールと設定」

ここまでは設定できているはずなのですが、
「Win32アプリケーションの生成と実行」の項目の3つ目の画像の部分
「[Windows アプリケーション]を選択し」の、チェック部が有効になっておらず
「コンソールアプリケーション」と「スタティックライブラリ」しか選択出来ません。
プロジェクト作成時の「ソリューションディレクトリを作成」のチェックを外してもダメでした。

ですが、「ゲームプログラミングの館」入門編0.(導入)の
「サンプルプログラム実行用フォルダ」→「DxLib.sln」→「F5」
では一応動作は確認出来ました。

「***.dll' を読み込みました。シンボルが読み込まれていません。」
というログが大量に出ているのですがこれで普通なのでしょうか…。

初期段階過ぎる質問ばかりで申し訳ありません。。。


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


Name: 管理人 [URL]  ..伝説のハッカー(315,035ポイント)   Date: 2007/05/15(火) 14:06   No:7587     
Title: Re:Visual C++ 2005 Express Edition 設定通りのはずなのですが…    
設定の説明どおりに行ってもコンパイルがきちんとできないようでしたら
本家で聞いてみてください。
http://hpcgi2.nifty.com/natupaji/aska.cgi
こちらDXライブラリの作者様の掲示板です。


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

Name: yukiya  ..ぴよぴよ(226ポイント)   Date: 2007/05/15(火) 16:44   No:7600 解決!     
Title: Re:Visual C++ 2005 Express Edition 設定通りのはずなのですが…    
本家様の掲示板にて同じ症状の方がいらっしゃいまして
そこのやり取りを見て解決出来ました。
(このスレッドです↓)
http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=447

紹介して頂きありがとうございました。
次からはプログラムに関する質問が出来るよう励んで来ます。


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

Name: yukiya  ..ぴよぴよ(239ポイント)   Date: 2007/05/15(火) 17:08   No:7602     
Title: Re:Visual C++ 2005 Express Edition 設定通りのはずなのですが…    
アイコンを間違えていました、汗

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

Name: 管理人 [URL]  ..伝説のハッカー(316,959ポイント)   Date: 2007/05/15(火) 20:49   No:7616     
Title: Re:Visual C++ 2005 Express Edition 設定通りのはずなのですが…    
解決報告ありがとうございます。
解決されてよかったです☆


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



Name: バグ  ..プログラマー(39,821ポイント)   Date: 2007/05/14(月) 22:27   No:7573       
Title: C#なのですが…    
ディレクトリの一括削除を行うクラスを作っているのですが、あまりにも遅いんで、何か高速で行う方法は無いものかと思い、質問させてもらいます。

いまのやり方は、下記を使用しております。

Directory.Delete(szPath, true);

1つや2つの小容量ファイルならばいいのですが、100を超えたり、容量も何百メガになる事もあるので、できる限り高速で処理したいので、何か別の良い方法がありましたら、教えていただけないでしょうか?

ちなみに、総合計約2000の空のテキストファイル&フォルダを消すのに、50秒弱掛かっています。


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


Name: YuO  ..ぴよぴよ(934ポイント)   Date: 2007/05/14(月) 22:45   No:7574     
Title: Re:C#なのですが…    
基本的に,それより早くなることはないでしょう。

可能性があるとすると,全部をC/C++で書いてP/Invokeでしょうか。
manage/unmanageのモード遷移が減る可能性があるので,若干早くなるかもしれません。


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

Name: バグ  ..プログラマー(39,893ポイント)   Date: 2007/05/14(月) 22:53   No:7575 解決!     
Title: Re:C#なのですが…    
そうですか…残念です。
ソフトの仕様上、あまり長い間処理を占有する訳にもいかないので、苦肉の策ではありますが、別スレッドでいくつかファイルを削除する度に処理を中断するように作り変えようと思います。

返信、ありがとうございましたm(__)m


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

Name: Justy  ..比類無きプログラマー(99,955ポイント)   Date: 2007/05/14(月) 22:57   No:7576     
Title: Re:C#なのですが…    
 これって Directory.Deleteを"1回だけ"使っての全削除ですか?

・ 普通にエキスプローラ上から削除
・ C++で書いた削除ツールで削除
・ bat(バッチ)で削除

 と比べてどれくらい遅いのでしょうか?


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

Name: バグ  ..熟練のプログラマー(40,069ポイント)   Date: 2007/05/14(月) 23:11   No:7577     
Title: Re:C#なのですが…    
年・月・日がそれぞれフォルダになってまして、指定された日数を過ぎたフォルダを削除するというものなんです。

2007→05→14

こんな感じで、全検査していきまして、削除対象のフォルダのみを削除するようにしています。

エキスプローラーから一括削除した場合は一瞬ですね。ただ、削除するかしないかの検索処理を行っていないので、比較対象にはならないと思います…(^_^;)


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

Name: Justy  ..ハッカー(100,059ポイント)   Date: 2007/05/14(月) 23:27   No:7578     
Title: Re:C#なのですが…    
 なるほど。
 実際のところ、削除処理で時間を消費しているのかどうか、それだとちょっとわからないですね。

 ボトルネックをきちんと特定した方がいいかと思います。
 各処理のパフォーマンスを測定するとか、デバッガで処理が重そうな時に止めてみてどこで止まるかを
見てみる、とか。
(特に文字列を扱っていたりすると、気をつけないと激重になっている可能性があったりします)


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

Name: バグ  ..熟練のプログラマー(40,198ポイント)   Date: 2007/05/15(火) 18:37   No:7606     
Title: Re:C#なのですが…    
削除部分を無効にして、検索のみを有効にしてみたところ、1秒程で処理が終了しました。
やはり、削除部分で時間わくっているようです。
一通り見直したのですが、文字列に関する処理にかなり無駄な部分があったので、組み直してみると、50秒掛かっていた処理が45秒に縮まりました。
Justyさんの言われたとおり、文字列の処理を多用するのはよくないみたいですね(;^_^A
まぁ、どちらにせよ、ファイル検索&削除に一度に使用しても良い時間は最大1秒なので、結局は分割処理にせざるをえないんですけどね(^^ゞ


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

Name: Justy  ..ハッカー(100,405ポイント)   Date: 2007/05/15(火) 19:32   No:7609     
Title: Re:C#なのですが…    
>やはり、削除部分で時間わくっているようです
 そうですか。
 結構 Directory.Delete()をコールする回数が多い、ってことでしょうか。
(日付で削除なら数十・数百のディレクトリを削除ってこともありますよね)

 となるとまぁ普通に考えて、削除処理を丸ごとスレッド化ですかね。
 あるいは別の手段で高速な削除ツールを作れるなら、そっちに任せてしまうとか。


>文字列の処理を多用するのはよくないみたいですね
 最初の頃、C#の stringは C++の std::stringとは違うということに気付かなくて、
全部 stringで組んでいたのですが、StringBuilderによる文字列の構築に
切り換えたら30秒以上かかっていた処理が1〜2秒で終わった、なんてことがありました。
 もう唖然としましたよ(w


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

Name: バグ  ..熟練のプログラマー(40,247ポイント)   Date: 2007/05/15(火) 19:54   No:7611     
Title: Re:C#なのですが…    
えっ!?std::stringと同じだと思って、stringしか使ってなかったです(^^ゞ
また見直してみます(;^_^A


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

Name: Justy  ..ハッカー(100,518ポイント)   Date: 2007/05/15(火) 20:00   No:7612     
Title: Re:C#なのですが…    
 stringは 文字列を扱うということでもちろん使うのですが、その
文字列の構築・・・というか文字列の連結にはStringBuilderを使うと
高速になります。
 特に大量の文字列処理をするときは必須とも言えます。

 で、使うときは StringBuilderから stringに変換する、と。


文字列処理を高速に行う: .NET Tips: C#, VB.NET, Visual Studio
http://dobon.net/vb/dotnet/string/stringbuilder.html

C# の StringBuilder と += による文字列連結の速度比較
http://sonic64.com/2005-11-30.html


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



Name: いさご  ..かけだし(2,047ポイント)   Date: 2007/05/15(火) 18:02   No:7604       
Title: 質問です    
またリストについて質問です・・・。度々すみません。

呼び出した関数内で動かしたノードをMainに返したいのですが、やり方がわかりません。
試してもエラーばかりで困ってます。ポインタがよく理解できてなくて・・・。
どなたか教えていただけませんか?お願いします。

簡単に書くと今こんな感じになってます。

typedef struct NodeT {
int data;
struct NodeT * next;
} Node;

int main();
  Node *current;
current=Check(current);
return(0);
}

int Check(Node *current){
//いろいろ動かしてから
return(current);
}



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


Name: YuO  ..ぴよぴよ(981ポイント)   Date: 2007/05/15(火) 18:34   No:7605     
Title: Re:質問です    
エラーを書いてもらえると,問題点がわかるかもしれません。

とりあえず,Check関数の戻り値の型はNode *にしないといけません。


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

Name: なぎ  ..上級者(23,293ポイント)   Date: 2007/05/15(火) 18:39   No:7607     
Title: Re:質問です    

ここに書かれたコードを見た範囲では、単に、Check() の返値の型が、(本来は、struct NodeT * なのに) int になっているのでエラーになっているのではないかなと思います。

あと、関数は(関数に限りませんが)宣言してから使うことになります。

普通は、

NodeT *Check()
{ .... }

int main()
{ .... }

の順番の方が良いと思います。

この順番で不都合が起こる場合、プロトタイプ宣言が必要になります。

NodeT *Check(NodeT *current);

int main()
{ .... }

NodeT *Check(NodeT *current)
{ .... }

こんな感じ。
プロトタイプ宣言は、ヘッダファイルのほうに入っていることも多々あります。

関数の返値が int の場合、Cではプロトタイプ宣言が省略できることもありますが(C99 ではできなかったはず)、返値が int でない場合、プロトタイプ宣言がないと、確実にこけます(または、関数の2重定義だというエラーが出ます)


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

Name: いさご  ..かけだし(2,117ポイント)   Date: 2007/05/15(火) 19:06   No:7608 解決!     
Title: Re:質問です    
回答してくださった方々、ありがとうございます!
Check関数の返値を変更したらエラーでなくなりました。
関数が何を返すかに合わせなきゃいけなかったんですね・・・!
ひとつ覚えました。ありがとうございます。



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



Name: えりこ  ..ぴよぴよ(201ポイント)   Date: 2007/05/14(月) 19:59   No:7564       
Title: C言語の偶数をあらわすプログラムについて    
C言語を勉強しているのですが、わからないところが
あるので教えていただけませんでしょうか?


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


Name: YuO  ..ぴよぴよ(611ポイント)   Date: 2007/05/14(月) 20:02   No:7565     
Title: Re:C言語の偶数をあらわすプログラムについて    
偶数であるかどうかは,2で割りきれるかどうかに等しいです。
つまり,ある整数xについて,
if (x % 2 == 0)

{
/* 偶数 */
}
else
{
/* 奇数 */
}
となります。


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

Name: えりこ  ..ぴよぴよ(339ポイント)   Date: 2007/05/14(月) 20:25   No:7566     
Title: Re:C言語の偶数をあらわすプログラムについて    
なんとなくわかりました。
他にも何かあればお願い致します。


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

Name: YuO  ..ぴよぴよ(847ポイント)   Date: 2007/05/14(月) 20:32   No:7567     
Title: Re:C言語の偶数をあらわすプログラムについて    
まずは自分で実行したり考えたりしてみてはどうでしょうか。

とりあえず間違いを列挙すると,
・mainの定義
・if文の条件式
・elseの位置
・printf文の書式指定と引数が違う
・表示のタイミング
というところでしょうか。
# ぱっと見なので,ほかにもあるかも。


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

Name: えりこ  ..ぴよぴよ(352ポイント)   Date: 2007/05/14(月) 20:43   No:7568     
Title: Re:C言語の偶数をあらわすプログラムについて    
わかりました。いろいろありがとうございました。

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

Name: 管理人 [URL]  ..伝説のハッカー(315,402ポイント)   Date: 2007/05/15(火) 14:16   No:7590     
Title: Re:C言語の偶数をあらわすプログラムについて    
おそらくえりこさんの投稿文に
「解らないことがある」
としか書かれていないので、上記回答で既に的確な回答をなさっていますけど、Yuoさんもどのように回答すればいいかお困りに成ると思います。
概念的な部分を知りたいのか、それとも全くの初心者でmain文の書き方からわからないのか、
サンプルがほしいのかなど、現在の自分の状況を詳しく説明したほうが、自分の希望する回答が返って来ると思いますよ。
またつまったら聞いてくださいね。


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



Name: taku  ..ぴよぴよ(237ポイント)   Date: 2007/05/14(月) 18:20   No:7562       
Title: 文字列の比較について    
今文字列の比較にかんするプログラムを作っているのですがもう1歩?の所で指摘をうけてしまいます。
ちなみにC言語の知識はさほどありません、初めて半年くらいです。
#include<stdio.h>

int main(void){
char mojiA[]="HELP";
char mojiB[]="HELP";

int flag;
int i;

flag=0;//flagの値が0のとき不一致

i=0;
while(mojiA[i]!='\0'&&mojiB[i]!='\0'){
if(mojiA[i]==mojiB[i]){
flag=1;
}
else
flag=0;
i++;
}
if(flag){
printf("Match!\n");
}
return(0);
}
このようなプログラムなんですが気をつけたことはmojiAとBの文字の長さがかわった時に文字の短いところで
ループが終了するようにしていると思うんですが例えばmojiBの値を'H'だけにした場合でもMatch!になって
しまいます。ループの条件がやはりわるいのでしょうか?
調べてみたのですがstrcmpのようなのはまだ教わっていないのでi=0;と初期化した
後のwhile分からできるだけ難しい関数?を使わないで教えてもらいたいです。
長文、駄文ですみませんがよろしくお願いします。


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


Name: miyaza  ..中級者(9,239ポイント)   Date: 2007/05/14(月) 19:09   No:7563     
Title: Re:文字列の比較について    
なぜ、mojiBが"H"のときMatch!が出るのか、その理由だけ書きます。
mijiAに"HELP"が入っていてmojiBに"H"入っているとき、まずこのプログラムは先頭の文字Hを比較しますこのとき条件を満たしているので、flagが1になります。そして次にwhile()の判定が来たときmojiBの中身は'\0'となっています。
したがってループを抜けます。
そしてif(flag)の部分でflagが1のためMatch!が表示されます。


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

Name: taku  ..ぴよぴよ(264ポイント)   Date: 2007/05/14(月) 21:55   No:7572     
Title: Re:文字列の比較について    
言っていることは知っていました。
だいたい解決しましたのでありがとうございました。


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

Name: なぎ  ..上級者(22,665ポイント)   Date: 2007/05/15(火) 12:30   No:7583     
Title: Re:文字列の比較について    
ちょっとしたテクニックとしては、「終わってからもう一回比較する」というのがあります。
while(mojiA[i]!='\0' && mojiB[i]!='\0')
{
if(mojiA[i] != mojiB[i]) break;
i++;
}

// ここでループが終わったのはなぜか?(2つのケースが考えられる)
if (mojiA[i] == mojiB[i]) 文字列は等しい
else 文字列は等しくない

これだと、フラグも不要です。



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

Name: なぎ  ..上級者(22,939ポイント)   Date: 2007/05/15(火) 12:36   No:7584     
Title: Re:文字列の比較について    
もうひとつ、flag の使い方で。
flag は、
・初期設定でどちらかにセット
・処理の中では、その反対側にセットのみ(初期値と同じセットはしない)
というのが鉄則です。
しかも、
・and 条件でセット

今回の場合、「1文字でも違えばアウト」
なので、「違う」ほうが and 条件になります。
ですから、フラグの処理としては、

・「マッチ」を表す状態に初期化
・「アンマッチ」が検出されたところで、「アンマッチ」の状態に変更
・「マッチ」が検出されても、フラグはいじらない
という操作になります。

最初のソースだと、多分、"HELP" と "AAAP" でもマッチしてしまうと思います。
(未チェック)


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

Name: taku  ..ぴよぴよ(312ポイント)   Date: 2007/05/15(火) 13:23   No:7585 解決!     
Title: Re:文字列の比較について    
なぎさん返答ありがとうございました。
自分もなぎさんと同じようにできました〜。
flagの使い方の説明は参考になりました^^
ありがとうございます、


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



Name: aniy  ..ぴよぴよ(224ポイント)   Date: 2007/05/13(日) 20:33   No:7545       
Title: 無題    
初歩的な質問かと思いますが、サンプルのシューティングゲームプログラムにて、敵が連射弾を発射中に敵を倒すと敵が画面から消えているのに弾だけは発射され続けています。
その現象を改善するために色々とプログラムをいじってみたのですが、なかなかうまく動いてくれません。

例えば ショットパターン2にて、敵が4発目を撃った後に撃破したら5発目以降の弾を描画させたくない

という事を正常に動かすためには、ショットパターン2の関数の中で、for(int j=0;j<10;j++)
の次に敵がまだ表示中か判定して、表示中ならば以下のif(EnemyShot[i].counter==20*j) に進む。
表示中でないならばfor(int j=0;j<10;j++) のfor文を抜ける
という処理にすればいいのだと考えているのですがうまくいきません。

他にもやり方を色々考えてみたのですが、うまくいくような処理が思いつきませんでした。
書きたいことがうまく書けずにこのような文章になってしまいましたが、良い方法がありましたらご助言をお願いいたします。


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


Name: Justy  ..比類無きプログラマー(99,615ポイント)   Date: 2007/05/13(日) 21:52   No:7546     
Title: Re:無題    
という処理にすればいいのだと考えているのですがうまくいきません

 for分を抜けてはだめなんじゃないでしょうか?
 それだと発射済みのものまで処理がスキップされてしまいそうなので、
敵が倒されていたら初期化だけをスキップする、ようにすればいいかと思います。


 例えばショットパターン2だったら
    if(EnemyShot[i].counter==20*j){
    if(enemy[i].flag && EnemyShot[i].counter==20*j){

にするとか。


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

Name: aniy  ..ぴよぴよ(277ポイント)   Date: 2007/05/14(月) 21:35   No:7571 解決!     
Title: Re:無題    
アドバイス通りに実行してみたところ、正常に動くようになりました。
Justyさんありがとうございました。

また質問させていただくと思いますが、よろしくお願いします。


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



Name: 組木紙織  ..中級者(14,675ポイント)   Date: 2007/05/13(日) 18:54   No:7542       
Title: テンプレート化できません    
簡単な行列計算のプログラムを作ったのですが、テンプレートをしようとしたらどうしても
コンパイルできなくて困ったのでこちらに書き込みをします。

ソースは添付してあるzipにテンプレートしていないもの<nontemplate.cpp>と(こちらは問題ないです)
自分で出来るとこまでテンプレート化してあるもの<template.cpp>を入れてあります。

適当に作ったので色々とコメントがあると思いますので、そちらもお願いします。


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


Name: Justy  ..比類無きプログラマー(99,297ポイント)   Date: 2007/05/13(日) 20:08   No:7543     
Title: Re:テンプレート化できません    
 このあたりは最初にテンプレートをやろうとしたときに誰もが引っかかるところです。
 慣れてきた今でも付け忘れてしまうことがあるくらいに。


 結論からいいますとエラーとなっているところに typenameをつけると解決します。

typename は何故必要か
http://ray.sakura.ne.jp/template/typename.html

C++ Labyrinth
http://www.fides.dti.ne.jp/~oka-t/cpplab-template-4.html


 一応修正したソースもつけておきました。diffで修正箇所を確認してみて下さい。


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

Name: Justy  ..比類無きプログラマー(99,307ポイント)   Date: 2007/05/13(日) 20:28   No:7544     
Title: Re:テンプレート化できません    
 あ、ちなみに添付したソースでのリンクエラーの方はそのままにしてあります。


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

Name: 組木紙織  ..中級者(14,809ポイント)   Date: 2007/05/13(日) 21:53   No:7547     
Title: Re:テンプレート化できません    
typename の使い方ありがとうございます。
なんとなくでしかわかっていないところが分かりました。

> あ、ちなみに添付したソースでのリンクエラーの方はそのままにしてあります。

一番やって欲しいものはリンクエラーを直すことだったので、リンクエラーもお願いできませんでしょうか?


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

Name: Justy  ..比類無きプログラマー(99,917ポイント)   Date: 2007/05/13(日) 22:30   No:7548     
Title: Re:テンプレート化できません    
friend std::ostream &operator<< (std::ostream &stream, Matrix<T> ob)

 ご存じだと思いますが、friendをつけた上でこのように書いた場合、
friendとなる対象はメンバ関数ではなく普通の関数になります。

 だからこそ実装側で

template<typename T>

std::ostream &operator<<(std::ostream &stream, Matrix<T> ob)
{
....
}

 のように関数として書いたのだと思いますが、肝心の friend指定の方と定義が一致しません。
 なので、

template<typename T>

class Matrix
{
....
template <typenameT>
friend std::ostream &operator<<(std::ostream &stream, Matrix<T> ob);
....
};


 とすれば一致してリンクエラーは消えるはずです。


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

Name: YuO  ..ぴよぴよ(532ポイント)   Date: 2007/05/13(日) 23:44   No:7551     
Title: Re:テンプレート化できません    
非常にややこしいところなのですが……。

クラステンプレートが,同一のテンプレート引数利用する関数テンプレートをfriendにしたい場合,
template <typename T> class C;

template <typename T> void func (const C<T>&);

template <typename T> class C
{
/* ... */
friend void func <T> (const c<t>&);
/* ... */
};
のように書きます。

細かいことは,Justyさんがあげられていた,C++ Labyrinthテンプレートあれこれ (1) -- template と friendを参照してください。

今回の場合,
template <typename T> class Matrix;

template <typename T> std::ostream & operator << (std::ostream & stream, Matrix<T> obj);

template <typename T> class Matrix
{
/* ... */
friend std::ostream & operator << <T> (std::ostream & stream, Matrix<T> obj);
/* ... */
};
とやることになります。
# イディオムとして覚えておくのが一番かと。
個人的に考える一番の正解は,クラステンプレートのfriendはインラインで書け,ですが……。


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

Name: 組木紙織  ..中級者(14,651ポイント)   Date: 2007/05/14(月) 21:32   No:7569 解決!     
Title: Re:テンプレート化できません    
出来ました。

コメントをくれたJustyさんYuOさんありがとうございます。

c++のテンプレート機能は私がまだなれていないだけかもしれませんが、
強力な割りに結構使いにくい感じがします。
もっと使いやすく改良をしてくれれば、c++を使う人が増えると思うのに。。

私はその強力で使いにくいことがc++を好きな理由なのですが。


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



Name: @とんぷぅ〜  ..入門者(3,631ポイント)   Date: 2007/04/26(木) 16:05   No:7166 解決!       
Title: 加減剰除のプログラム    
こんにちは。@とんぷぅ〜です。
質問間隔が短くてすみません(笑)

今回は上記タイトルのプログラムを作成していて、過去ログも
参考にコーディングしてみたのですが、疑問点があるので
質問させていただくことにしました。

記述したコードはこんな感じです。

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

* *

* NAME 【jyoujyo.c】 *

* SYNOPSIS【jyoujyo start enzansi end】 *

* *

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

#pragma warning ( disable : 4996 )

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

int main ( int argc, char *argv[] )
{
int start; // 最初に入力する値(引数1)
int end; // 最後に入力する値(引数3)
int kekka; // 計算結果を格納

char enzansi; // 入力する演算子(引数2)
char str [512]; // 格納用の配列を宣言(start用)
char str1[512]; // 格納用の配列を宣言(end用)

/* 引数の個数チェック */
if ( argc != 4 ) {
printf ( "usage : %s start enzansi end\n", argv[0] );
exit ( 0 );
}

/* 引数を取得して整数型に変換 */
start = atoi ( argv[1] );
end = atoi ( argv[3] );

/* 引数の取得 */
enzansi = ( argv[2][0] );

sprintf ( str, "%d", start ); // strに値を格納

/* strとargv[1]による文字列の比較 */
if ( strcmp ( str, argv[1] ) ) {
printf ( "error : 整数を入力して下さい。\n" );
exit ( 0 );
}

sprintf ( str1, "%d", end ); // str1に値を格納

/* str1とargv[3]による文字列の比較 */
if ( strcmp ( str1, argv[3] ) ) {
printf ( "error : 整数を入力して下さい。\n" );
exit ( 0 );
}

/* 入力された演算子の条件ごとに計算 */
if ( enzansi == '+' ) {
kekka = start + end; // '+'が入力された場合の計算式
} else if ( enzansi == '-' ) {
kekka = start - end; // '-'が入力された場合の計算式
} else if ( enzansi == '*' ) {
kekka = start * end; // '*'が入力された場合の計算式
} else if ( enzansi == '/' ) {

/* 0による除算を行おうとした場合 */
if ( start == 0 || end == 0 ) {
printf ( "error : 0による除算は禁止です。\n" );
exit ( 0 );
}

/* 割り算でstartとendを逆に入力した場合 */
if ( start < end ) {
printf ( "error : startにendより大きい値を入力して下さい。\n" );
exit ( 0 );
}

kekka = start / end; // '/'が入力された場合の計算式

/* 入力された演算子が異なる場合 */
} else {
printf ( "error : 正しい演算子を入力して下さい。\n" );
exit ( 0 );
}

/* 数値1 演算子 数値2 = 演算結果の形式で出力する */
printf ( "%d %c %d = %d", start, enzansi, end, kekka);
exit ( 0 );
}

ifばかりで大変汚いコードですが、お許し下さい。
上記コードのenzansi = ( argv[2][0] );という部分で、引数の2番目に
演算子を格納するのですが、なぜ( argv[2] )では駄目なのでしょうか?

それと、除算の結果を余りを含めて表示することは可能なんでしょうか?
例えば5/2 = 2余り1といった具合に表示することです。

よろしくお願いします。



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


Name: @とんぷぅ〜  ..入門者(3,655ポイント)   Date: 2007/04/26(木) 16:20   No:7167     
Title: Re:加減剰除のプログラム    
すみません。マークが解決になってました。
質問ですのでよろしくお願いします。


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

Name: box  ..比類無きプログラマー(63,960ポイント)   Date: 2007/04/26(木) 16:29   No:7168     
Title: Re:加減剰除のプログラム    
> 上記コードのenzansi = ( argv[2][0] );という部分で、引数の2番目に
> 演算子を格納するのですが、なぜ( argv[2] )では駄目なのでしょうか?

argv[2]は、演算子の内容を格納している文字列へのポインタです。
argv[2]には、"+", "-", "*", "/" というまっとうな内容以外に
"+$%&#" とか ";012vu*&" なんかも与えることができます。
今回は、argv[2]の先頭文字を四則演算子として採用したいらしいので、
argv[2]が指している文字列の先頭文字であるargv[2][0]を参照しています。

> それと、除算の結果を余りを含めて表示することは可能なんでしょうか?
> 例えば5/2 = 2余り1といった具合に表示することです。

もちろんできます。
割り算の際、%演算子で余りを求めて、それがゼロかどうかによって
出力のやり方を変えればよいのです。


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

Name: keichan  ..上級者(22,027ポイント)   Date: 2007/04/26(木) 16:37   No:7169     
Title: Re:加減剰除のプログラム    
>上記コードのenzansi = ( argv[2][0] );という部分で、引数の2番目に
>演算子を格納するのですが、なぜ( argv[2] )では駄目なのでしょうか?
enzansi は char型で宣言されています。(char* 型でないことに注意)
char型は'一文字'を格納するスペースしか持ち合わせていません。

argv[2][0] とすると argv[2]配列中の先頭文字([0])のみを取得し、
argv[2] とすると argv[2]配列の先頭アドレスを指定することになります。


>それと、除算の結果を余りを含めて表示することは可能なんでしょうか?
剰余を行いたい場合は %演算子 を用います。
例) 12 % 5 = 2
   12 % 6 = 0
つまり、剰余を行った結果、0以外が返ってきた場合に"余り・・・"と出力することで可能です。


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

Name: keichan  ..上級者(22,040ポイント)   Date: 2007/04/26(木) 16:38   No:7170     
Title: Re:加減剰除のプログラム    
完全にかぶったorz

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

Name: @とんぷぅ〜  ..入門者(3,863ポイント)   Date: 2007/04/26(木) 17:07   No:7171 解決!     
Title: Re:加減剰除のプログラム    
boxさん。お世話になっております。
大変分かり易い回答ありがとうございました。

keichanさん初めまして。
ありがとうございました。やはり配列とポインタに
ついてもっと勉強しなければならないですね。
まだまだ未熟ですがよろしくお願いします。

お二人とも本当にありがとうございました。


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

Name: box  ..比類無きプログラマー(64,035ポイント)   Date: 2007/04/26(木) 17:15   No:7172     
Title: Re:加減剰除のプログラム    
割り算に関して細かいことを申しますと、
ある数をゼロで割ることはできませんが、ゼロをゼロ以外で割ることはできます。
今の仕様ですと
C:\> hoge 0 / 3 <Enter>
のように実行したとき、「error : 0による除算は禁止です。」と
出力するようですが、実際には計算できて、答はもちろんゼロです。


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

Name: @とんぷぅ〜  ..入門者(4,051ポイント)   Date: 2007/04/26(木) 17:34   No:7173     
Title: Re:加減剰除のプログラム    
boxさんありがとうございました。

/* startの値を0で除算する場合 */
if ( end == 0 ) {
printf ( "error : 0による除算は禁止です。\n" );
exit ( 0 );
}

/* 割り算でstartとendを逆に入力した場合 */
if ( start < end && start != 0 ) {
printf ( "error : startにendより大きい値を入力して下さい。\n" );
exit ( 0 );
}

こんな感じで大丈夫でしょうか?


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

Name: @とんぷぅ〜  ..入門者(4,704ポイント)   Date: 2007/04/26(木) 18:55   No:7177     
Title: Re:加減剰除のプログラム    
皆さんの意見を参考に一通りコーディングしてみました。
ただあまりに読みにくくなってしまったので、ココを
こうした方がいいなどのご指摘をよろしくお願いしますm(_ _)m

以下コードになります。
/****************************************

* *

* NAME 【jyoujyo.c】 *

* SYNOPSIS【jyoujyo start enzansi end】 *

* *

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

#pragma warning ( disable : 4996 )

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

int main ( int argc, char *argv[] )
{
int start; // 最初に入力する値(引数1)
int end; // 最後に入力する値(引数3)
int kekka; // 計算結果を格納
int amari; // 除算の余りを格納

char enzansi; // 入力する演算子(引数2)
char str [512]; // 格納用の配列を宣言(start用)
char str1[512]; // 格納用の配列を宣言(end用)

/* 引数の個数チェック */
if ( argc != 4 ) {
printf ( "usage : %s start enzansi end\n", argv[0] );
exit ( 0 );
}

/* 引数を取得して整数型に変換 */
start = atoi ( argv[1] );
end = atoi ( argv[3] );

/* 引数の取得 */
enzansi = ( argv[2][0] );

sprintf ( str, "%d", start ); // strに値を格納

/* strとargv[1]による文字列の比較 */
if ( strcmp ( str, argv[1] ) ) {
printf ( "error : 整数を入力して下さい。\n" );
exit ( 0 );
}

sprintf ( str1, "%d", end ); // str1に値を格納

/* str1とargv[3]による文字列の比較 */
if ( strcmp ( str1, argv[3] ) ) {
printf ( "error : 整数を入力して下さい。\n" );
exit ( 0 );
}

/* 入力された演算子の条件ごとに計算 */
if ( enzansi == '+' ) {
kekka = start + end;
} else if ( enzansi == '-' ) {
kekka = start - end;
} else if ( enzansi == '*' ) {
kekka = start * end;
} else if ( enzansi == '/' ) {

/* startの値を0で除算する場合 */
if ( end == 0 ) {
printf ( "error : 0による除算は禁止です。\n" );
exit ( 0 );
}

/* 割り算でstartとendを逆に入力した場合 */
if ( start < end && start != 0 ) {
printf ( "error : startにendより大きい値を入力して下さい。\n" );
exit ( 0 );
}

kekka = start % end;

/* 割り算の結果として余りが出なかった場合 */
if ( kekka == 0 ) {
kekka = start / end;
printf ( "%d %c %d = %d", start, enzansi, end, kekka);
exit ( 0 );
}

/* 割り算の結果として余りが出た場合 */
if ( kekka != 0 ) {
kekka = start / end;
amari = start % end;
printf ( "%d %c %d = %d余り%d", start, enzansi, end, kekka, amari );
exit ( 0 );
}

/* 入力された演算子が異なる場合 */
} else {
printf ( "error : 正しい演算子を入力して下さい。\n" );
exit ( 0 );
}

/* 数値1 演算子 数値2 = 演算結果の形式で出力する */
printf ( "%d %c %d = %d", start, enzansi, end, kekka);
exit ( 0 );
}


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

Name: @とんぷぅ〜  ..初心者(5,454ポイント)   Date: 2007/04/27(金) 15:38   No:7196     
Title: Re:加減剰除のプログラム    
お世話になります。@とんぷぅ〜です。問題点を
解消したくて質問させていただきました。

1.( )を含む計算
1 + -5 = -4は出来るのですが、1 + (-5) = 等の計算ができません。

2.演算子に続けて演算子を入力した場合
1 ++ 5 = 6、1 *///// 6 = 6という風にも計算出来てしまいます。

3.限界値について
前もってint型の最小値、最大値を決めておき
それを超える値になる場合計算出来ないようにしたいです。

意味不明な部分があるかもしれませんがよろしくお願いします。
以下がソースです。

#pragma warning ( disable : 4996 )

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

int main ( int argc, char *argv[] )
{
int start; // 最初に入力する値(引数1)
int end; // 最後に入力する値(引数3)
int kekka = 0; // 計算結果を格納
int amari; // 除算の余りを格納

char enzansi; // 入力する演算子(引数2)
char str1[512]; // 格納用の配列を宣言(start用)
char str2[512]; // 格納用の配列を宣言(end用)

/* 引数の個数チェック */
if ( argc != 4 ) {
printf ( "usage : %s start enzansi end\n", argv[0] );
exit ( 0 );
}

/* 引数を取得して整数型に変換 */
start = atoi ( argv[1] );
end = atoi ( argv[3] );

/* 引数の取得 */
enzansi = ( argv[2][0] );

sprintf ( str1, "%d", start ); // str1に値を格納
sprintf ( str2, "%d", end ); // str2に値を格納

/* str1とargv[1]による文字列の比較 */
if ( strcmp ( str1, argv[1] ) ) {
printf ( "error : 整数を入力して下さい。\n" );
exit ( 0 );
}

/* str2とargv[3]による文字列の比較 */
if ( strcmp ( str2, argv[3] ) ) {
printf ( "error : 整数を入力して下さい。\n" );
exit ( 0 );
}

/* 入力された演算子の条件ごとに計算 */
if ( enzansi == '+' ) {
kekka = start + end;
} else if ( enzansi == '-' ) {
kekka = start - end;
} else if ( enzansi == '*' ) {
kekka = start * end;
} else if ( enzansi == '/' ) {

/* startの値を0で除算する場合 */
if ( end == 0 ) {
printf ( "error : 0による除算は禁止です。\n" );
exit ( 0 );
}

kekka = start % end;

/* 割り算の結果として余りが出なかった場合 */
if ( kekka == 0 ) {
kekka = start / end;
printf ( "%d %c %d = %d", start, enzansi, end, kekka);
exit ( 0 );
}

/* 割り算の結果として余りが出た場合 */
if ( kekka != 0 ) {
kekka = start / end;
amari = start % end;
printf ( "%d %c %d = %d余り%d", start, enzansi, end, kekka, amari );
exit ( 0 );
}

/* 入力された演算子が異なる場合 */
} else {
printf ( "error : '+' '-' '*' '/'のいずれかの演算子を入力して下さい。\n" );
exit ( 0 );
}

/* 数値1 演算子 数値2 = 演算結果の形式で出力する */
printf ( "%d %c %d = %d", start, enzansi, end, kekka);
exit ( 0 );
}








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

Name: box  ..比類無きプログラマー(64,246ポイント)   Date: 2007/04/27(金) 16:28   No:7198     
Title: Re:加減剰除のプログラム    
> 1.( )を含む計算
> 1 + -5 = -4は出来るのですが、1 + (-5) = 等の計算ができません。

どんな風に計算できませんか?
何かエラーメッセージが出ますか?

また、カッコの中には、どの程度複雑な式を入れたいですか?それによっては、
データ構造やアルゴリズムを一から見直す必要があります。
カッコ付きの式をちゃんと扱おうとすると、けっこう奥が深いですよ。

例えば、2 * (1 + 3) を計算するという、人間にとっては何ということもない式でも、
今のプログラムでは全く歯が立たないことがおわかりになると思います。

> 2.演算子に続けて演算子を入力した場合
> 1 ++ 5 = 6、1 *///// 6 = 6という風にも計算出来てしまいます。

argv[2] の長さが2以上のとき、しかるべきメッセージを出力して
計算させないようにすればよいと思います。

> 3.限界値について
> 前もってint型の最小値、最大値を決めておき
> それを超える値になる場合計算出来ないようにしたいです。

限界値の具体的な値は、いくらですか?


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

Name: @とんぷぅ〜  ..初心者(5,695ポイント)   Date: 2007/04/27(金) 16:40   No:7199     
Title: Re:加減剰除のプログラム    
>1.についてはデバッグした際に以下の部分で終了します。
/* str1とargv[1]による文字列の比較 */
if ( strcmp ( str1, argv[1] ) ) {
printf ( "error : 整数を入力して下さい。\n" );
exit ( 0 );
}

/* str2とargv[3]による文字列の比較 */
if ( strcmp ( str2, argv[3] ) ) {
printf ( "error : 整数を入力して下さい。\n" );
exit ( 0 );
}
最終的に(-5) - (-5) = 0などの計算まで出来るようにしたいです。
つまり1、3番目の引数にカッコを含んでいても整数であるなら計算
出来るようにしたいということです。ちなみにカッコとは別ですが、
-5 - -5 = 0は通りますが、+5 + +5 = は計算できません。

>2.についてはなんとか出来そうです。

>3.は-2147483648〜2147483647を扱いたいです。
その値を超えるような計算は出来ないようにしたいです。

文章が分かりにくいかもしれませんがよろしくお願いします。


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

Name: box  ..比類無きプログラマー(64,420ポイント)   Date: 2007/04/27(金) 17:29   No:7200     
Title: Re:加減剰除のプログラム    
> 最終的に(-5) - (-5) = 0などの計算まで出来るようにしたいです。
> つまり1、3番目の引数にカッコを含んでいても整数であるなら計算
> 出来るようにしたいということです。

argv[1]とargv[3]の内容を1文字ずつ解析して、
正負の符号と数字だけから成る、
正しく数値と認識できる要素を取り出す必要があります。

厳密な仕様を求めるなら、
 ・開きカッコと閉じカッコの対応が合っているかどうかを判定する
 ・正負の符号が2つ以上あったらエラーにする
 ・整数に限定するなら、小数点があったらエラーにする
というようなロジックを組み込む必要があります。

> >3.は-2147483648〜2147483647を扱いたいです。
> その値を超えるような計算は出来ないようにしたいです。

計算した結果がlong型の範囲に収まらず、変な値を出力してしまったので、
「あ〜、やっぱりダメだったか」と後からわかる、ということはあるのですが、
計算する前にわかる方法があるかどうか、よくわからないです。


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

Name: @とんぷぅ〜  ..初心者(5,823ポイント)   Date: 2007/04/27(金) 17:40   No:7201     
Title: Re:加減剰除のプログラム    
<argv[1]とargv[3]の内容を1文字ずつ解析して、
正負の符号と数字だけから成る、
正しく数値と認識できる要素を取り出す必要があります。

難しそうですね〜。調べてみます。

<2.についてはboxさんに教えていただき、上手くいきました。

<3.についてはカッコの問題が終わり次第考えていきたいと思います。

いつもご回答ありがとうございます。


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

Name: @とんぷぅ〜  ..初心者(5,834ポイント)   Date: 2007/05/01(火) 09:26   No:7274     
Title: Re:加減剰除のプログラム    
お世話になっております。
今、問題点で()の部分を考えているのですが、1文字ずつ
解析するといったことがよくわかりません。

よろしくお願いします。


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

Name: box  ..比類無きプログラマー(65,519ポイント)   Date: 2007/05/01(火) 15:29   No:7276     
Title: Re:加減剰除のプログラム    
いくつかの状態を定義して、ある状態が成立するには
他のどの状態(複数の場合あり)が成立している必要があるか、について
考えてみるとよいかもしれません。

初期状態は「状態なし」(下記の状態すべてがOFF)
'('を読み取ったら「開きカッコ状態」をON
')'を読み取ったら「閉じカッコ状態」をON
'+'を読み取ったら「+符号状態」をON
'-'を読み取ったら「-符号状態」をON
'0'〜'9'を読み取ったら「数字状態」をON

解析の例
・"()"のように、開きカッコの後ろに+-の符号も数字もなくて
 いきなり閉じカッコが来るとエラー
・"(-5()"のように、開きカッコと閉じカッコの数が一致しなければエラー
・"-96+"のように、+-の符号が混在するとエラー
他にも、エラーとするパターンはたくさんあります。

なお、もっと簡単に解析できる方法があるかもしれません。


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

Name: @とんぷぅ〜  ..初心者(5,934ポイント)   Date: 2007/05/07(月) 08:41   No:7452     
Title: Re:加減剰除のプログラム    
boxさん。レスが遅れて申し訳ありません。

1字解析とはトークンを取得するということなんでしょうか?
このプログラムを作成するにあたり、足りない知識は何なのでしょうか?
こんなことが出来れば良い。といったアドバイス等があればよろしくお願いします。


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

Name: box  ..比類無きプログラマー(66,710ポイント)   Date: 2007/05/07(月) 11:04   No:7460     
Title: Re:加減剰除のプログラム    
先日の回答で挙げた各状態について、2次元の表を作って、
 ・Aの状態からはBの状態へ移れる
 ・Cの状態からDの状態へは移れない(エラー)
 ・Eの状態からFの状態へ移ることはない
という内容を管理してみてはいかがでしょうか。

()や正負の符号を含む可能性があるargv[1]とargv[3]について、
内容を1文字ずつ読む際に「今、どの状態にあるからこの文字が来ていいのか、
それともダメなのか」を逐次みていくと、
数値を正しく取得できるのではないかと思います。


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

Name: しっぽ  ..初心者(6,900ポイント)   Date: 2007/05/07(月) 19:37   No:7467     
Title: Re:加減剰除のプログラム    
私が今作りたいものの中でインタープリンタもどきが必要でなので、丁度今調べて
いるところです。参考になればと書いておきます。

解析する順番としては、字句解析して構文解析を行います。私が今不足している知識は
構文解析で使う(使わない方法もあるのでしょうが)オートマンです。box さんが言う
「2次元の表」とはオートマンの状態遷移表なのでしょう。

これらのことを行うCコードを生成するプログラム(lex + yacc)も存在してます。
でも結構手強いのとGNUなので、自力でやるか頼っちゃおうか迷ってます。

キーワードとして 字句解析, 構文解析, lex, flex, yacc, byacc, bison で調べると
いろいろ出てきます。


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

Name: @とんぷぅ〜  ..初心者(6,055ポイント)   Date: 2007/05/09(水) 13:01   No:7490     
Title: Re:加減剰除のプログラム    
boxさん、しっぽさんありがとうございました。
取り合えず、現段階では難しそうなので
次にしたいと思います。本当にありがとうございました。

もう一点問題があるのですが、扱える数字の限界値を超えて
計算出来ないようにしたいのです。ちなみに扱える範囲は
-2147483648〜2147483647です。

limitsなどのライブラリを使い、上記の数を指定すれば
よいのでしょうか?よろしくお願いします。


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

Name: @とんぷぅ〜  ..中級者(10,171ポイント)   Date: 2007/05/14(月) 18:03   No:7561     
Title: Re:加減剰除のプログラム    
上記問題をなんとかクリアして、今度は関数化にチャレンジしているのですが、
いかんせん関数を作るということに抵抗がありまして、なかなか上手くいきません。

一応自分で少しだけ関数化してみたのですが、あまり意味がない関数化のような気もします。
エラーチェックなどをまとめる関数等を作成してmain関数をスッキリさせたいと思っています。
関数の使い方も正しいのかはっきり分かりません。ソースコードを記載しますので
ここが駄目といった部分やこうした方がいい等の助言よろしくお願いします。

#pragma warning ( disable : 4996 )

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <limits.h>
#include <math.h>

int overflow_check1();
int overflow_check2();
int overflow_check3();
int overflow_check4();

int lop; // 左のオペランドに入力する値
int rop; // 右のオペランドに入力する値
int result; // 計算結果
int mod; // 除算の余り
int max = INT_MAX; // 表現可能な最大値
int min = INT_MIN; // 表現可能な最小値

char *check; // 文字列中に変換不可能な文字があった場合の格納場所
char op; // 入力する演算子

int main ( int argc, char *argv[] )
{
/* 引数の個数チェック */
if ( argc != 4 ) {
printf ( "usage : %s lop op rop\n", argv[0] );
exit ( 0 );
}

/* 引数を取得して整数型に変換 */
lop = atoi ( argv[1] );
rop = atoi ( argv[3] );

/* 引数の取得 */
op = ( argv[2][0] );

/* startが整数であるか文字であるかのチェック */
lop = strtol ( argv[1], &check, 10 );
if ( errno != ERANGE ) {
if ( *check != '\0' ) {
printf ( "error : 整数を入力して下さい。\n" );
exit ( -1 );
}

/* startに範囲を超えた値を入力した場合 */
} else {
printf( "error : 整数型の範囲を超えました。\n" );
exit( -1 );
}

/* endが整数であるか文字であるかのチェック */
rop = strtol ( argv[3], &check, 10 );
if ( errno != ERANGE ) {
if ( *check != '\0' ) {
printf ( "error : 整数を入力して下さい。\n" );
exit ( -1 );
}

/* endに範囲を超えた値を入力した場合 */
} else {
printf( "error : 整数型の範囲を超えました。\n" );
exit( -1 );
}

/* argv[2]が2文字以上の場合 */
if ( strlen ( argv[2] ) >= 2 ) {
printf ( "error : 演算子を正しく入力して下さい。\n" );
exit ( -1 );
}

/* argv[2]に入力された演算子が'+'の場合 */
switch ( op ) {
case '+':
overflow_check1();
result = lop + rop;
break;

/* argv[2]に入力された演算子が'-'の場合 */
case '-' :
overflow_check2();
result = lop - rop;
break;

/* argv[2]に入力された演算子が'*'の場合 */
case '*':
overflow_check3();
result = lop * rop;
break;

/* argv[2]に入力された演算子が'/'の場合 */
case '/' :

/* 0による除算 */
if ( rop == 0 ) {
printf ( "error : 0による除算は禁止です。\n" );
exit ( -1 );
}
overflow_check4();
result = lop % rop; // 剰余を求める
break;

default:
printf ( "error : '+' '-' '*' '/'のいずれかの演算子を入力して下さい。\n" );
exit ( -1 );
}

/* 割り算の結果として余りが出なかった場合 */
if ( result == 0 ) {
result = lop / rop;
printf ( "%d %c %d = %d", lop, op, rop, result );
exit ( 0 );

/* 割り算の結果として余りが出た場合 */
} else {
result = lop / rop;
mod = lop % rop;
printf ( "%d %c %d = %d余り%d", lop, op, rop, result, mod );
exit ( 0 );
}

/* 数値1 演算子 数値2 = 演算結果の形式で出力する */
printf ( "%d %c %d = %d", lop, op, rop, result );
exit ( 0 );
}

int overflow_check1 ()
{
/* オーバーフローのチェック */
if ( lop > 0 && rop > 0 ) {
if ( lop > max - rop ) {
printf ( "error : オーバーフローが起こります。\n" );
exit ( 0 );
}
}

/* オーバーフローのチェック */
if ( lop < 0 && rop < 0 ) {
if ( lop < min - rop ) {
printf ( "error : オーバーフローが起こります。\n" );
exit ( 0 );
}
}
return 0;
}

int overflow_check2 ()
{
/* オーバーフローのチェック */
if ( lop > 0 && rop < 0 ) {
if ( lop > max + rop ) {
printf ( "error : オーバーフローが起こります。\n" );
exit ( 0 );
}
}

/* オーバーフローのチェック */
if ( lop < 0 && rop > 0 ) {
if ( lop < min + rop ) {
printf ( "error : オーバーフローが起こります。\n" );
exit ( 0 );
}
}
return 0;
}

int overflow_check3 ()
{
/* オーバーフローのチェック */
if ( lop > max / rop ) {
printf ( "error : オーバーフローが起こります。\n" );
exit ( -1 );
}

/* オーバーフローのチェック */
if ( rop < max / lop ) {
printf ( "error : オーバーフローが起こります。\n" );
exit ( 0 );
}
return 0;
}

int overflow_check4 ()
{
/* オーバーフローのチェック */
if ( ( lop == min ) && ( rop == -1 ) ) {
printf ( "error : オーバーフローが起こります。\n" );
exit ( -1 );
}
return 0;
}


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



Name: t.s  ..ぴよぴよ(20ポイント)   Date: 2007/05/12(土) 21:22   No:7534       
Title: Visual C++ CLR フォームアプリケーションにおいて    
Picture Boxとbutton1をフォームに貼り付けて、button1をクリックするとプログラムしておいた式が時系列グラフ化され表示されるようにはできたのですが、そのグラフの各点の値を数字として、picureBoxもしくは新しくTextboxを作ってそこに表示されるようにしたいのですが、どのような手順でできるのでしょうか??

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


Name: バグ  ..プログラマー(39,627ポイント)   Date: 2007/05/12(土) 23:10   No:7536     
Title: Re:Visual C++ CLR フォームアプリケーションにおいて    
文字を表示するだけならば…

int nVal = 100;
textBox1->Text = nVal.ToString();

こんな感じでいかがでしょうか?
テキストボックスのメンバであるTextへ、intのメンバのToStringを使って整数から文字列へ変換した値を格納しています。これで、テキストボックスへの数値の表示ができるかと思います。


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

Name: keichan  ..上級者(22,004ポイント)   Date: 2007/05/14(月) 11:46   No:7556     
Title: Re:Visual C++ CLR フォームアプリケーションにおいて    
pictureBox に直接書き込みたい場合は、pictureBoxのPaintイベント内で


System::Drawing::Drawing2D::GraphicsPath^ gp = gcnew System::Drawing::Drawing2D::GraphicsPath();
gp->AddString(L"test", gcnew FontFamily(L"Arial"), 0, 15, gcnew Point(0, 0), StringFormat.GenericDefault);
graphic->FillPath(Brushes.White, gp);
gp->Dispose();


と書くことでpictureBoxに表示させることが可能です。


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



Name: BAZZ  ..かけだし(1,051ポイント)   Date: 2007/05/13(日) 13:26   No:7540       
Title: ドメイン??    
ドメインとやらを
取得できたらしいんですが
これはいったい何の意味があるんでしょうか??www

04WebserverとDiCEとかいうのをいじっていまして・・・




・・・なんか半分荒らしみたいだな


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


Name: ひろゆき  ..ぴよぴよ(229ポイント)   Date: 2007/05/13(日) 18:17   No:7541     
Title: Re:ドメイン??    
まぁ、荒らしには違いないですが助言を・・・。

ドメインというのは.comや.co.jpです。大体年間1000円ぐらいで所得できます。


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

Name: 管理人 [URL]  ..伝説のハッカー(312,972ポイント)   Date: 2007/05/13(日) 23:21   No:7550     
Title: Re:ドメイン??    
例えば、私が利用しているドメインは「huu.cc」です。「l」がユーザー名です。
極力短いユーザー名で取得できるドメインが無いかとず〜〜〜っと探しているうちにここに
たどり着きました。
「l」より短く見えるユーザー名は他に無いでしょ?w

独自ドメインなら年間料金が要ります。
独自ドメインを取得すれば好きなだけメールアドレスが作れます。
.comとかの有名なドメインは料金が高いですね。
後、.jpとかの短いドメインも。
ちょっと長めのやつとか有名じゃないやつだと安いです。
前、.ccを独自ドメインで取得していましたけど、年間3000円位でした。

まぁ、独自ドメイン取得しなくても普通のレンタルでいいような気がします。


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

Name: asd  ..初心者(5,316ポイント)   Date: 2007/05/14(月) 11:18   No:7555     
Title: Re:ドメイン??    
ドメインだけ取ったとしても、固定IPアドレスもセットで取得するか、DDNSサービスでIPアドレスを登録しないとあまり意味はないかと思います。

DiCEが出てきているからDDNSの話だと思いますけど^^;

自宅のサーバーなどを外部に公開する際にはIPアドレスをみんなに教える必要があります。
(例:Yahoo!の例 203.216.247.249)
このアドレスを持つPCでWebサービスが動いていればそのIPアドレスをブラウザから指定するとWebページが見られます。
例:Yahoo! http://203.216.247.249/

でも、数字の羅列だと覚えてもらえないしパッと見で何のページだか分からないですよね?
そこでドメインを使ってこんな対応表を作って見ます。

www.yahoo.co.jp <--> 203.216.247.249

つまりwww.yahoo.co.jpっていうドメインが指定されたらIPアドレスで203.216.247.249を指定したものとして処理されるんですね。
(実際にhttp://www.yahoo.co.jp/ でも http://203.216.247.249/ でも同じYahoo!のページが出ます)

なので、IPアドレスが付与されているマシンなら外からアクセスできるけれど、
IPアドレスだと語呂が悪いし覚えにくいということで、分かりやすさのために使うのがドメインってわけです。

*全然関係ない話だったらゴメンナサイ。


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



Name: いさご  ..かけだし(2,112ポイント)   Date: 2007/05/13(日) 00:39   No:7538       
Title: リストについて質問です    
お久しぶりです。いさごです。
学校からリスト構造のプログラムを渡され、挿入を末尾に加えていく形式に変えろと言われました。
ループでリンクがNULLの所を探せばいいのかと思いましたが、繋ぎ方がよくわかりません。
どなたか教えてください・・・。お願いします。

以下は渡されてそのままのプログラムです。

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

typedef struct NodeT {
int data;
struct NodeT * next;
} Node;

typedef struct ListT {
Node * head;
Node * foot;
} List;

List * makeNewList ();

void insertAtHead (List *list, int newItem);

int main (int argc, char ** argv) {
List *list = makeNewList();

insertAtHead (list, 5);
insertAtHead (list, 4);
insertAtHead (list, 3);
insertAtHead (list, 2);
insertAtHead (list, 1);
return (0);
}

List * makeNewList () {
List * l = (List*) malloc (sizeof(List));
assert (l);
l->head = NULL;
l->foot = NULL;
return (l);
}

void insertAtHead (List *list, int newItem) {
Node * node = (Node *) malloc (sizeof(Node));
assert (node);
node->data = newItem;
assert (list);
node->next = list->head;
list->head = node;

if (list->foot == NULL) {
list->foot = node;
}
}


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


Name: 組木紙織  ..中級者(14,513ポイント)   Date: 2007/05/13(日) 07:32   No:7539     
Title: Re:リストについて質問です    
これ純粋な?リンクリストでは無いと思います。
List構造体で先頭と、最後ののーどを管理しているからです。
なのでリンクがNULLのノードを探さなくても、最後のノードの場所が分かります。

そのことに気づけば簡単に、繋げます。
以下のソースはリストの中身を表示する部分です。
つないだ後の確認にどうぞ。


void showListData(List * list)
{
Node * now;
now = list->head;

while(now){
printf("%d\n",now->data);
now = now->next;
}
}


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

Name: いさご  ..かけだし(2,154ポイント)   Date: 2007/05/14(月) 02:44   No:7553 解決!     
Title: Re:リストについて質問です    
回答ありがとうございます。
言われてみて初めてわかりました。(苦笑)
やっと何とかなりました。お世話かけました!


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



Name: noel  ..ぴよぴよ(20ポイント)   Date: 2007/05/01(火) 20:17   No:7286       
Title: 最小二乗円    
円の輪郭を示す、ランダムな座標群(Xi,Yi)がある時に、その座標を用いて、最小二乗法で、円の半径や中心を求める方法はありませんか?
よろしくお願いいたします。


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


Name: box  ..比類無きプログラマー(65,820ポイント)   Date: 2007/05/01(火) 23:54   No:7287     
Title: Re:最小二乗円    

座標群(Xi,Yi)は、必ず円周上にあるのですか?
また、どうしても最小二乗法を使わないとダメですか?

もし、3点以上から成る座標群が必ず円周上にあって、
最小二乗法を使わなくてもよいのであれば、
座標群から任意の2点を2組取り出し、各2点の垂直二等分線の交点から
中心座標が求まり、座標群の任意の点と中心座標との距離が円の半径となります。
ご存じだとは思いますけれども。

最小二乗法を今回の問題にどう適用すればよいかは、よくわかりません。
他の方からの回答をお待ちください。


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

Name: noel  ..ぴよぴよ(48ポイント)   Date: 2007/05/02(水) 08:53   No:7289     
Title: Re:最小二乗円    
比類無きプログラマーさん、ありがとうございます。

必ず円周上にあるわけではなく、円周周辺にランダムにあります。
しかも、一部角度の座標は、欠落している場合もあります。
そこでそれらの点群からベストフィットする円を求めたいのです。
なので最小二乗法が良いのかと?思っています。
特に最小二乗法にこだわるわけではありません、ベストフィットする円を求めたいだけなのです。
よろしくお願いいたします。


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

Name: noel  ..ぴよぴよ(80ポイント)   Date: 2007/05/02(水) 08:55   No:7290     
Title: Re:最小二乗円    
すみません、お名前を間違えてしましました。
boxさん、ありがとうございます。


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

Name: box  ..比類無きプログラマー(65,990ポイント)   Date: 2007/05/02(水) 09:33   No:7292     
Title: Re:最小二乗円    
> 必ず円周上にあるわけではなく、円周周辺にランダムにあります。

それはそうですよね。
円の周辺にある、ばらつきを持った点の集まりをもとに、
いちばんフィットする円を見つけ出すのが最小二乗法の目的ですものね。

今回の場合はXもYも2次式ですからね。
どういう風にすれば最小二乗法(あるいはその他の方法)を使って
答えが求まるか、ちょっと見当がつかないです。
申し訳ありません。


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

Name: 組木紙織  ..中級者(13,721ポイント)   Date: 2007/05/02(水) 12:39   No:7294     
Title: Re:最小二乗円    
携帯から失礼します。
詳しく書けませんが、
円を与えて、その円との差を考えてみてください。
多変量解析の辺りが参考になると思います。


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

Name: 管理人 [URL]  ..伝説のハッカー(303,239ポイント)   Date: 2007/05/02(水) 13:45   No:7296     
Title: Re:最小二乗円    
全ての組み合わせで2点の直線を作り、その出てきた交点の中心を取ったのではだめなんでしょうかね・・。
すみません、よくわかりませんが。


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

Name: noel  ..ぴよぴよ(189ポイント)   Date: 2007/05/02(水) 17:36   No:7299     
Title: Re:最小二乗円    
回答ありがとうございます。
円周上の座標が正確な場所と微妙に不正確な座標があり、正確な場所の数の方が多いのですが、不正確な座標に足を引っ張られるケースが多いのです。
ですので、最小二乗法などを使うとベストフィットするのでは???と考えたしだいであります。
きっと組木紙織さまの言われる「円を与えて、その円との差を考えてみてください。」と考え方は同じになるのかな?なんて思っています。
でも 円の最小二乗法のやり方を思いつきません…


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

Name: 組木紙織  ..中級者(14,013ポイント)   Date: 2007/05/06(日) 22:15   No:7443     
Title: Re:最小二乗円    
少し考えてみたのですが、かなり難しいです。
いや考え方は難しくはないのですが、式がかなり複雑になるので計算が大変でした。

一番単純な
「中心が原点にある場合」
をやってみます。

与えられた座標を(x_i,y_i)とします。
中心からその点までの距離をd',円の半径をr,円から点までの距離をdとします。

d' = sqrt((x_i)^2 + (y_i)^2)
d =|d' - r|

よって、
d^2 = (x_i)^2 + (y_i)^2 - 2r*sqrt((x_i)^2 + (y_i)^2) + r^2

総和を考えて
sig(d^2) = sig((x_i)^2 + (y_i)^2 - 2r*sqrt((x_i)^2 + (y_i)^2) + r^2)

この式の最小値を取るrの値が、この場合の答えです。

微分して考えるのが一番楽なのかな。
これは原点に中心がある場合なのでrで微分すれば話を進められるのですが、
中心の場所が分からない場合はそれぞれの変数で偏微分して考えないと解けないと思う。

大学(数学科?)レベルの問題ですね。

今はこのくらいまでですが、自分が気になるのでもう少し考えてみます。


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

Name: しっぽ  ..初心者(7,328ポイント)   Date: 2007/05/12(土) 21:17   No:7533     
Title: Re:最小二乗円    
こんなのでどうでしょうか。

1.座標を配列にし、解析しやすいように変形する。
 座標の配列をX座標でソートする
 座標をX座標で3領域(A,B,C)に分割する

2.3つの座標から円の中心座標を求める。
 座標の3領域から1点づつ選び出す(A[j], B[j], C[j])

3.おおまかな円の中心座標を探す。
 2の操作を(座標数 / 3)点行い、中心座標の候補を配列に保存する
 上記配列のX座標のメディアン値を円の中心座標の探索初期値とする
 Y座標にについても同様の処理をする

4.中心座標の探索初期値に対して、2乗誤差が最も小さくなる半径を
 半径の探索初期値とする

5.あとは
 探索初期値の中心座標を初期の否探査領域とし、非探査領域を囲むく領域と
 比較する



言葉で書くと何のこっちゃ!言葉は難しいです。コードで語りたいのですが

▼【エラー】 申し訳ありません。メッセージが長すぎます。

だそうです。


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



Name: lion  ..ぴよぴよ(483ポイント)   Date: 2007/05/12(土) 12:38   No:7530       
Title: 質問ですが    
はじめまして。このサイトを見て新たにvc(dxlib)をやり始めたものです。ところで、自分は(http://lets-go.hp.infoseek.co.jp/c_setting09.html)のページからvcexpressをインストールし、dxlibをダウンロード&ビルドしてみたところ、
1>test.cpp
1>c:\program files\dxlib_vc\dxlib_vc\サンプルプログラム実行用フォルダ\dxlib.h(40) : fatal error C1083: include ファイルを開けません。'windows.h': No such file or directory
1>ブラウザ情報ファイルを作成しています...
1>Microsoft Browse Information Maintenance Utility Version 8.00.50727
1>Copyright (C) Microsoft Corporation. All rights reserved.
1>BSCMAKE: error BK1506 : : No such file or directory
1>ビルドログは "file://c:\Program Files\DxLib_VC\DxLib_VC\サンプルプログラム実行用フォルダ\Debug\BuildLog.htm" に保存されました。
1>DxLib - エラー 2、警告 0
以下のようなエラーが表示されビルドできませんでした。
どのようにすればエラーがでなくなるのでしょうか?つまらない質問ですが、ご返答お願いします。


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


Name: 管理人 [URL]  ..伝説のハッカー(312,779ポイント)   Date: 2007/05/12(土) 18:24   No:7531     
Title: Re:質問ですが    
フリー版では設定が必要で、ここに詳しく書いてありますので参考にしてください。

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


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

Name: lion  ..ぴよぴよ(512ポイント)   Date: 2007/05/12(土) 19:32   No:7532 解決!     
Title: Re:質問ですが    
実行することができました。
大変ありがとうございました。


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



Name: sin  ..ぴよぴよ(262ポイント)   Date: 2007/05/09(水) 18:34   No:7496       
Title: アクションRPGに必要な物、スキル    
こんにちは。

こちらのサイトのトップに有るようなアクションRPGを作れるようになるには、

どのようなソフトをそろえ、どのような勉強をしていったら良いのでしょうか?

一応家には、Visual C++.net2003とVisual Basic.net2003とBorland C++ Builder6

が有るのですが、他に有ったらいいソフトとか、身につけたら良い技術

があったら教えてほしいのですがよろしくお願いします。

私のスキルはc言語の独習Cなどのc言語の本を3冊ほどやった程度です。

そして今はc言語のポインタの勉強を少しずつやっています。

それからコンソールアプリしか作ったことがありません。


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


Name: 管理人 [URL]  ..伝説のハッカー(311,742ポイント)   Date: 2007/05/09(水) 22:43   No:7498     
Title: Re:アクションRPGに必要な物、スキル    
>こちらのサイトのトップに有るようなアクションRPGを作れるようになるには、

こんにちは。こちらのサイトのトップにあるゲームを作った者ですm(_ _)m
そろえる必要のあるものはそれで十分ですよ。
さらに知識は入門書1冊分位のものしか利用していません^^;

別に木構造や線形リスト、クイックソートなどのアルゴリズムを学ばないと出来ないわけでもないですし、
大げさな話、if分とfor分さえわかればプログラムできるわけで、それをどう組み合わせるかですからsinさん位の知識がおありでしたら十分だと思いますよ。

私自身、ゲームプログラムを学んだ事も無く、参考書や本など1冊も読んだことがありません。
全ては試行錯誤から生まれた方法で、大量のコードをかいていくうちに「あ、こうしたほうがいいな」と思い、そのたびに修正することを繰り返して改良していきました。

ですから、私の書いている方法が本当にいいのかどうかはわかりません(_ _|||)

私は構造体も知らない時から、むしろ自作関数の作り方すら知らないコロから、ゲームを作り始めました。
別に構造体など知らなくてもゲームが作れる事はDXライブラリのHPをご覧になったらわかります。

「ゲームを作りながら必要な知識を勉強する」というスタイルでもいいのではないかと思います。
そっちの方が意欲も出ますしね。

ゲームプログラムに関してはアクションゲームが一番難しいように思います。
反対にサウンドノベルゲームやドラクエ1のような2DRPGが一番簡単だと思います。
アルゴリズム的に考えさせられるのはパズルゲームでしょう。

突然アクションを作ろうとすると難しいかもしれませんし、
単純な2DRPGから作ってみてはいかがでしょうか?
PRGに関してサンプルプログラムは他トピ「RPGサンプルプログラム」にて配布してますので、よければ参考にしてください。

綺麗に書こうとすると難しくなってきますが、最初は汚いコードでもいいので、
「見た目ゲームっぽい」って感じになるようにしてみては。

最初から完璧なコードを書くというのは私のスタイルではないので、勝手に自分のスタイルを押し付けているようですが、わかるところから作ってみるのもわかりやすくていいかと思います。


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

Name: sin  ..ぴよぴよ(448ポイント)   Date: 2007/05/11(金) 13:53   No:7512     
Title: Re:アクションRPGに必要な物、スキル    
管理人さん返信ありがとうございます。

まだ解らない事があるのですが、

>PRGに関してサンプルプログラムは他トピ「RPGサンプルプログラム」にて
>配布してますので、よければ参考にしてください。

Final Storyのファイルをダウンロード、解凍して、このホームページにあるように、

FinalStory.slnを開こうとしたら

>選択されたファイルはVisual Studio ソリューションファイルです。
>このファイルは、新しいバージョンのVisual Studioで作成されて
>いるため、開けません。

というメッセージが出ます。やっぱりVisual C++.net2003だとダメみたいです。

Final Storyのフォルダの中のdatの中にあるソースとかから、VC++.net2003で
作っていくのって無理でしょうか?

質問ばかりですみません。


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

Name: 管理人 [URL]  ..伝説のハッカー(312,613ポイント)   Date: 2007/05/11(金) 19:51   No:7516     
Title: Re:アクションRPGに必要な物、スキル    
あぁ、サンプルはVS2005で作っているので、開けないですね。

ただソースからなら出来ますよ。
DXライブラリ用のプロジェクトの作り方はいいですか?
普通にDXライブラリ用のプロジェクトファイルを用意します。
サンプルプログラムの解凍したフォルダ構成と全く同じように作ってください。
まぁ、プロジェクトを作って、そのフォルダにFinal Storyフォルダの中身をコピーしたらいいです。
その後ソースを追加してください。
というのも、プログラムの中で、
"../../include/GV.h"
と書いてあるので、ソースから見て、ヘッダファイルは2つ上へいくとそこにincludeフォルダがあり、その中にGV.hがあるような階層構造にしないといけないからです。
"GV.h"
このように全てincludeを書き換えたら、全部同じフォルダでもOKです。

ちょっと複雑な事をいいましたけど、わかりました?


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

Name: Justy  ..比類無きプログラマー(98,867ポイント)   Date: 2007/05/11(金) 22:18   No:7520     
Title: Re:アクションRPGに必要な物、スキル    
 実は 2005用のプロジェクトファイルをエディタで開いて、
直接編集すると 2003でも読めるようになることがあります。

 さっくり作ってみたので、まだ 2003用に作り直していないのでしたらどうぞ。


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

Name: 管理人 [URL]  ..伝説のハッカー(312,613ポイント)   Date: 2007/05/12(土) 00:36   No:7522     
Title: Re:アクションRPGに必要な物、スキル    
ホントだ・・。
Justyさんホントよくご存知ですね〜><
プロジェクトファイルってテキスト形式で開けたんですね・・。


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

Name: Justy  ..比類無きプログラマー(99,088ポイント)   Date: 2007/05/12(土) 01:36   No:7525     
Title: Re:アクションRPGに必要な物、スキル    
 最近、2005形式のプロジェクトファイルがあちらこちらで見かけるようになったのに
うちでは開けないのでなんとかならないかなぁ、と 2003のものと内容を比較していたら
かなり似ていることに気付いたんで、怪しいところを書き換えたらすんなりと。

 設定とか変えるとき、時々直接テキストエディタで一括置換で変えてしまった方が
早いこともあるのでこの方法は結構重宝します。

 時々どうやっても読み込めないものもあったりしますが、今のところ成功率は
大体80%くらいです。


>プロジェクトファイルってテキスト形式で開けたんですね
 MSは結構前から XML形式を使っていますよね、いろんなところで。
 C/C++から使うときはいろいろ面倒ですが、Java/C#とかだと扱いが楽なので、
私もよく使います。


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

Name: 管理人 [URL]  ..伝説のハッカー(312,729ポイント)   Date: 2007/05/12(土) 07:30   No:7528     
Title: Re:アクションRPGに必要な物、スキル    
なるほど、そこで何か置換してみようという発想がなかなか出てきません・・。

>MSは結構前から XML形式を使っていますよね、いろんなところで。

そうだったのですか。いろんなところでファイルを展開したことがありませんでした(_ _||)

今度にたような状況になったとき、この方法是非使わせてもらいます☆


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

Name: sin  ..ぴよぴよ(519ポイント)   Date: 2007/05/12(土) 10:53   No:7529 解決!     
Title: Re:アクションRPGに必要な物、スキル    
管理人さんJustyさんレスありがとうございます。

>さっくり作ってみたので、まだ 2003用に作り直していないのでしたらどうぞ。

まだ作り直してなかったので使わしてもらいます。

Justyさんありがとうございます。


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



Name: はね  ..かけだし(2,024ポイント)   Date: 2007/05/11(金) 00:13   No:7506       
Title: またまた質問です    
何度も質問してしまい申し訳ありません

早速本題なのですが

この前質問させていただいたアクションゲームを引き続き制作しています。

で、その制作しているゲームにおいて

ゲームプログラミングの館 24. 行けない所を作る。〜2D〜

を応用してやりたい処理ができそうなのですが

私が制作しているゲームの場合、キャラのx,yをfloat型で宣言しているため
if(hantei[y/32-1][x/32]==1)

のような書き方ができません。

float型でx,yを宣言してしまった場合、この処理は使えないのでしょうか?


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


Name: Justy  ..比類無きプログラマー(98,802ポイント)   Date: 2007/05/11(金) 00:29   No:7507     
Title: Re:またまた質問です    
 xや yを int型にキャストしてから演算してみてはどうでしょうか?


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

Name: 管理人 [URL]  ..伝説のハッカー(311,746ポイント)   Date: 2007/05/11(金) 00:47   No:7508     
Title: Re:またまた質問です    
ちゃんと1区間ずつ動くのであればキャストすればOKです。

[(int)y/32][(int)x/32]

こんな感じで。
しかしボンバーマンやマリオのように、ちょこちょこ動くようなものには使えません。
というのも、
10.0も10.1,10.8も10.9も全部キャストすると10になってしまうからです。
この1以下の誤差がおかしな挙動に繋がります。
きっちり1区間ずつ動くのならキャストだけでOKです。


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

Name: はね  ..かけだし(2,084ポイント)   Date: 2007/05/11(金) 00:59   No:7509 解決!     
Title: Re:またまた質問です    
はい・・・・できました^^;

こんな簡単なことでつまずいている私っていったい・・・

こんな簡単な質問にお答えいただきありがとうございます^^

まだまだ未熟ですが今後ともよろしくお願いいたします


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

Name: 管理人 [URL]  ..伝説のハッカー(312,570ポイント)   Date: 2007/05/11(金) 20:01   No:7518     
Title: Re:またまた質問です    
色々経験してみないとパッとはなかなか思いつかないですよね^^
私もめちゃくちゃ試行錯誤していたのに、人に聞いてみたらものすごい簡単な事で解決したという事もよくあります。
人に聞いてみるのも大事ですね^^


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

Name: はね  ..かけだし(2,178ポイント)   Date: 2007/05/11(金) 23:48   No:7521     
Title: Re:またまた質問です    
そうですね〜
今、チームでゲームを制作しているのですが
「よし!俺はプログラマーやる!」とか言ったものの、人に聞いてばっかりです^^;
早く上達して様々な状況に素早く対応できるようになりたいものです


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

Name: 管理人 [URL]  ..伝説のハッカー(312,716ポイント)   Date: 2007/05/12(土) 00:38   No:7523     
Title: Re:またまた質問です    
いぃですねぇ。
私も誰かと一緒にゲーム作ったりしたかったです・・。
周りにゲームつくろうって感じの友達がいないもので、いつもソロです^^;
バイク好きな奴とかばっかかな・・。

ツーリングならよく行くんですけどねぇ・・・って関係ないかw

そういえば1週間後にZX-9Rが納車されるので楽しみです・・・ってもっと関係ないかw


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



Name: 寝台車  ..ぴよぴよ(43ポイント)   Date: 2007/05/11(金) 19:07   No:7514       
Title: 質問    
初めまして。ソフトにアイコンをつけるのはどうやったら出来るんですか。
誰か教えてください。


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


Name: 管理人 [URL]  ..伝説のハッカー(312,483ポイント)   Date: 2007/05/11(金) 19:55   No:7517     
Title: Re:質問    
寝台車さん、初めまして。

実行ファイルにアイコンを付けると結構雰囲気出て面白いですよね。
私も初めて作った時はちょっと感動しました。
これは本家DXライブラリのサイトに詳しく書いてあるので、こちらを参考にされた方がわかりやすいと思います。

http://homepage2.nifty.com/natupaji/DxLib/dxtec.html#M2


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



Name: 入門  ..ぴよぴよ(8ポイント)   Date: 2007/05/11(金) 12:05   No:7510       
Title: 警告について    
よろしくお願いします。

scanfやfopenを使うと警告が出ます。
この事を先生に聞いてみると、新しい関数を使わないからだと言われました。
何かdefineで最初に書くとその警告は消えるけど根本的な解決にはならないということでした。

聞いてみたものの意味が良くわかりません・・。


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


Name:  ..かけだし(1,191ポイント)   Date: 2007/05/11(金) 12:58   No:7511     
Title: Re:警告について    
関数で検索をして調べて見ましょう^^

教科書とかがあるなら載ってるかもしてませんよ?

関数が何かってのを知ってればたぶん解決できるのでは?

どんな警告かも書いたほうがいいですよ〜


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

Name: フリオ  ..初心者(6,058ポイント)   Date: 2007/05/11(金) 14:13   No:7513     
Title: Re:警告について    
 
 使用しているコンパイラも書きましょう。

ひょっとしてこれかな?
http://www.geocities.jp/ky_webid/common/vc2005warning.html
 


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

Name: 管理人 [URL]  ..伝説のハッカー(312,251ポイント)   Date: 2007/05/11(金) 19:46   No:7515     
Title: Re:警告について    
きっとフリオさんのおっしゃる事で間違いないと思います。
リンク先にひと項目なかったので、ちょっと補足を。

>何かdefineで最初に書くとその警告は消えるけど根本的な解決にはならないということでした。

これは
#define _CRT_SECURE_NO_WARNINGS
これを書いたら警告が出なくなりますからその事だと思います。
根本的な解決にならないという意味はおそらく・・・。

警告というのは、深刻な間違いではないにしても、何か不具合をきたす可能性のある項目を挙げているんですから、
#defineで警告が出るべき項目を隠しても、結局不具合をきたす可能性は残ったままだと言う事だと思います。

不具合というのは、

例えば

char st[100];

で、宣言したとします。
st[0]のアドレスが1000番地だったとします。
アドレスは連続しますから、[99]のアドレスは1099になるはずですね。
領域が確保されるのは、最初から100バイト分です。
つまり1099番地までは使っても大丈夫だと保証してくれます。
しかし1100番地以降はつかっていい領域かどうかわかりません。
大事なデータが1101番地や1102番地にあるかもしれません。
そんな中、

scanf("%s",st);

で、120文字格納すると、1120番地まで文字と終端記号で埋めてしまいますから、1101番地にあった大事なデータは消えてしまいます。
そういう意味で、scanfなどはセキュリティの向上した新たに用意されたscanf_s関数を使った方がいいですよ、と警告が出るわけです。

入門時や短いプログラムを書く時や、ちゃんと管理して、絶対オーバーフローしない状況などでしたら、特に気にする事も無いと思います。
完全なプログラムを書く時に気にするようにしてはいかがでしょうか。


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



Name: 夏天 [URL]  ..初心者(5,473ポイント)   Date: 2007/05/09(水) 00:07   No:7486       
Title: 画像のレイヤー化    
DXで画像のレイヤー化みたいなことってできないのですか?
ほかの画像は消さずに特定の画像だけを消したいのですが
どうすればよいのでしょうか
毎度ながらお願いします><


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


Name: 管理人 [URL]  ..伝説のハッカー(310,860ポイント)   Date: 2007/05/09(水) 01:32   No:7487     
Title: Re:画像のレイヤー化    
全ての画像は上へ上へ上書きされているので、上書きした後で特定のレイヤーだけ消す事は出来ないと思います。
しかし、描画は毎回行うわけですから、そのターンだけそのレイヤーとなる画像を表示しなければ言いだけの話です。
例えば、今
画像1、画像2、画像3、画像4を順に描画して反映しているとします。

画面クリア
→画像1描画→画像2描画→画像3描画→画像4描画→
裏画面反映

画面クリア
→画像1描画→画像2描画→画像3描画→画像4描画→
裏画面反映

画面クリア
→画像1描画→画像2描画→画像3描画→画像4描画→
裏画面反映


こういう繰り返しですね。ここで画像3を取り除きたいレイヤーだとすると

画面クリア
→画像1描画→画像2描画→画像4描画→
裏画面反映


こんな風にその時だけ書かなければいいだけです。
何かフラグを用意してフラグが立っている時は、その特定の画像を表示しない・・といったようにプログラムしてみてはいかがでしょうか。

それとももっと違った処理がしたいのでしょうか?


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

Name: 管理人 [URL]  ..伝説のハッカー(310,982ポイント)   Date: 2007/05/09(水) 01:37   No:7488     
Title: Re:画像のレイヤー化    
この事はレイヤーの件を解決する事にはつながりませんが、
DXライブラリのリファレンスページに
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html
のっているものだけがDXライブラリの関数ではありません。
使用頻度の低い関数についてはリファレンスにのっておらず、ヘッダファイルにひっそり潜んでいます。
非公開関数(?)も結構ヘッダファイルの中に入っているので、時間のあるときDXライブラリのヘッダファイルをのぞいてみてはいかがでしょうか。


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

Name: 夏天 [URL]  ..初心者(5,603ポイント)   Date: 2007/05/10(木) 17:27   No:7504 解決!     
Title: Re:画像のレイヤー化    
ムムム・・・結構面倒な感じですね
ヘッダファイルの中を見てみましたがそれらしいのは見つかりませんでした
しかし、別の機能でとても便利なものを見つけたのでヘッダファイルもたまには覗こうかと思います
管理人様の方法でがんばってみたところそれっぽいのができたのでうれしかったです
ありがとうございました


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

Name: 管理人 [URL]  ..伝説のハッカー(311,862ポイント)   Date: 2007/05/10(木) 21:01   No:7505     
Title: Re:画像のレイヤー化    
よかったですね^^

DXライブラリについての具体的機能については、もちろんDXライブラリ製作者さんが一番よく知っているので、もし気になることがあれば本家でも聞いてみてください。
私もよくお世話になりますけど、すごく親切に教えてくれます。

プログラム系のサイトを開くなら管理人はあれくらいの能力が必要なんでしょうけど、こちらのサイトの管理人は青二才ですみません・・(_ _||)


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



Name: さい  ..ぴよぴよ(339ポイント)   Date: 2007/05/08(火) 00:46   No:7473       
Title: 質問です    
シューティングゲームの館の6節「先ほどのプログラムを分割する」において
指示通りしたあとに実行すると

Error: 外部シンボル '_img_sound_load' が未解決(C:\******\MAIN\DEBUG\MAIN.OBJ が参照)
Error: 外部シンボル '_initialization' が未解決(C:\******\MAIN\DEBUG\MAIN.OBJ が参照)
Error: 外部シンボル '_SetColor' が未解決(C:\******\MAIN\DEBUG\MAIN.OBJ が参照)
Error: 外部シンボル '_Background' が未解決(C:\******\MAIN\DEBUG\MAIN.OBJ が参照)
Error: 外部シンボル '_PlayerControl' が未解決(C:\******\MAIN\DEBUG\MAIN.OBJ が参照)
Error: 外部シンボル '_Background2' が未解決(C:\******\MAIN\DEBUG\MAIN.OBJ が参照)
Error: 外部シンボル '_FpsTimeFanction' が未解決(C:\******\MAIN\DEBUG\MAIN.OBJ が参照)

というかエラーが出てしまいます。
どういった原因が考えられるでしょうか。

ちなみにコピーして貼り付けてみても同様だったので打ちまちがいはないと思います。

Borland使用です


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


Name: 管理人 [URL]  ..伝説のハッカー(311,151ポイント)   Date: 2007/05/08(火) 01:19   No:7474     
Title: Re:質問です    
Borlandはフリー版しか使った事が無く、コマンドプロンプトでbcc32...とうつやつしか知らないんでよくわかりませんが、
Makefileとか作らなくていいんですかね?

プロジェクトごとダウンロードできるんで、よかったら
VisualStudio2005 ExpressEdition(無料)を使ってみてください。


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

Name: Justy  ..比類無きプログラマー(98,521ポイント)   Date: 2007/05/08(火) 03:00   No:7475     
Title: Re:質問です    
どういった原因が考えられるでしょうか

 多分、BCCの仕様ではないかと思われます。



extern void img_sound_load();
extern void initialization();
extern void SetColor();
extern void Background();
extern void PlayerControl();
extern void Background2();
extern void FpsTimeFanction();


 が WinMain関数の中にあると思いますが、これらを WinMain関数の外での宣言になるよう
移動してみて下さい。

 それで直ると思います。


参考スレ


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

Name: さい  ..かけだし(1,573ポイント)   Date: 2007/05/08(火) 03:03   No:7476     
Title: Re:質問です    
ありがとうございます。
VisualStudio2005の製品版を持っていたので使ってみました。

が、旧バージョンであったのか
DxLib.slnを開くと変換を求められました。

「すべてを正常に変換しましたがいくつかの警告があります」
と表示されました。

以下がそれです。


ファイル名 状態 エラー 警告
DxLib.vcproj 変換済み 0 3
変換の問題 - DxLib.vcproj:
Visual C++ はセキュリティで保護された C ランタイム ライブラリ バージョンをサポートします。このライブラリの使用は既定でオンにされています。プロジェクトをビルドするときに、使用できない機能についての警告が表示されるかもしれません。コードをより安全にするために、これらの警告を修正してください。
C/C++ コンパイラの既定の設定は、ISO 標準の C++ により準拠するように編集されました。変更には、ループ スコープに対して標準 C++ を適用したり、wchar_t をネイティブ型としてサポートすることなどが含まれます。これらの変更によって、既存のコードが、コードへの変更、またはビルドされたときのコンパイラ オプションを含まずに、コンパイルされることがなくなる可能性があります。
シングル スレッドのランタイム ライブラリ スイッチ (/MLd, /ML) が C++ コンパイラから削除されました。プロジェクトは、マルチ スレッドのランタイム ライブラリ スイッチ (/MTd, /MT) を使用するように、自動的に変換されました。
プロジェクトは正常にアップグレードされました。
C/C++ コンパイラ スイッチ /YX は現在サポートされていません。/YX はプロジェクト設置から削除されました。
Visual C++ プロジェクトが埋め込み (既定で) Windows SxS マニフェストを生成するための必要条件によって、プロジェクト内のマニフェスト ファイルは、マニフェスト ツールを使用してビルドすることから自動的に除外されます。すべてのマニフェスト ファイルに含まれる依存関係情報を、ソース コードからインクルードされたヘッダー ファイル内で、"#pragma コメント(リンカ、"<依存関係をここに挿入>")" に変換することをお勧めします。プロジェクトが、リソース (.rc) ファイルをとおして RT_MANIFEST リソース セクションにマニフェストを埋め込んでいる場合、プロジェクトが正しくビルドされる前に、行をコメント アウトしなければなりません。
C++ コンパイラの準拠の変更によって、プロジェクトがビルドする前にコード変更が必要になる場合があります。C++ コンパイラの旧バージョンは、メンバ関数名 (例: MemberFunctionName) によるメンバ関数ポインタの指定を許可していました。C++ 標準では、演算子のアドレスを使用した完全修飾名 (例: &ClassName::MemberFunctionName) が必要です。プロジェクトが Windows フォーム デザイナで使用されたフォームやコントロールを含む場合は、デザイナが生成したコードがデリゲート構築で規格外の構文を使ったため (イベント ハンドラを使用して)、InitializeComponent でコード変更をしなければならない可能性があります。


その語さっきのように6節の通りやると
大量のエラーがでてしまいました。



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

Name: さい  ..かけだし(1,645ポイント)   Date: 2007/05/08(火) 03:09   No:7477 解決!     
Title: Re:質問です    
Justyさんのご指摘のようにしましたら
無事解決いたしました!!
本当にこんな深夜にありがとうございました。


また
当方C言語超初心者ですがこれから学んでいくに
あたって気をつけたほうがいいこととかありますか?


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

Name: Justy  ..比類無きプログラマー(98,781ポイント)   Date: 2007/05/08(火) 03:40   No:7478     
Title: Re:質問です    
無事解決いたしました!!
本当にこんな深夜にありがとうございました
 どういたしまして。
 解決して何よりです。


気をつけたほうがいいこととかありますか
 特にこれといってありませんが、せっかく VS2005(MSVC8.0)を持ってらっしゃるなら、BCCより
そちらを使った方がいいかと思いますよ。
 館の記事も MSVC向けに書かれていますし。


大量のエラーがでてしまいました
 私は VS2005は持ってないので判りませんが、その変換を行ってその警告が出た後、
プロジェクトのビルドも失敗しますか?

 ビルドに失敗していないのであればさほど気にしなくてもいいかもしれません。


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

Name: 管理人 [URL]  ..伝説のハッカー(311,201ポイント)   Date: 2007/05/08(火) 07:36   No:7479     
Title: Re:質問です    
おぉ、そんな仕様があるんですか。参考になります。

後、フリー版では少々設定が必要です。
フリー版を使う時の設定方法はこちらです。
http://homepage2.nifty.com/natupaji/DxLib/dxuse_vc2005express.html


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

Name: さい  ..かけだし(1,944ポイント)   Date: 2007/05/08(火) 22:25   No:7482     
Title: Re:質問です    
ありがとうございます。

Justyさん
VS2005は重い上に
前項のようなことがあったので
変更しようか迷っているところでもあります。

ちなみにビルドは失敗していました。


管理人さん
ありがとうございます。
フリー版を使う時には参考にさせていただきます。





また、追加の質問ですが
ゲープロ館の4節に
「透過処理されるのは、限りなく黒に近い色か、画像に予め透過処理をしてある部分です。」
とありますが、サンプル素材の画像(charやshot)には黒で塗られていません。
あらかじめ透過処理というのをしているのでしょうか。
自分の画像を使いたい場合に透過処理はどうすればいいですか?

それとも
int SetTransColor( , , ) ;
を使用するのでしょうか。
その場合分割した現在、どこに入れればいいのでしょうか。




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

Name: 管理人 [URL]  ..伝説のハッカー(310,630ポイント)   Date: 2007/05/08(火) 22:38   No:7483     
Title: Re:質問です    
あ、すみません、製品版を「持っていた」んですか。
どこかで使用しただけかと思いました。
製品版をせっかくお持ちなのでしたらそちらをお使いになるといいですよ。

コンパイルの件は全て解決しました?

また、サンプルは透過処理していたと思います。
フォトショップやGIMP、PictBearなどの画像ソフトをご存知でしょうか?
フォトショは有料ですが、他は無料です。特にGIMPはフリーのくせに数万するソフト並みの機能をもっているので、オススメです。
私はフォトショの方が肌にあっているのでGIMPは使っていませんが・・。
これらどれでも透過処理出来ます。
ウィンドウズに元々入っているペイントではやりにくいので、もしペイントをお使いなのでしたら黒で塗りつぶしてください。
しかしそうするとαブレンドが出来ないので、やはり画像にこるのなら画像ソフトを使うべきですね。

ペイントはメニューバーの「変形」>「背景を不透明にする」にチェックが入っていると思うので、それを外せば良かったとおもいます。
しかしペイントはやりにくいです・・。

とは言えペイントを使っていた時期が長かったのでなれているせいもあり、微調整などよくペイントは利用します。
クリック一つで画像サイズが変更できたり、ペイントもペイントで使いやすいんですよね。

・・なんてダラダラまとまりの無い話をしましたが、一度画像ソフトもためしてみてください。
何かわからなければ聞いてください。


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

Name: さい  ..かけだし(1,858ポイント)   Date: 2007/05/10(木) 04:46   No:7501     
Title: Re:質問です    
ありがとうございました
GIMPを使って透過処理が出来ました!!


ところでふと思ったのですが、DxLibのウィンドウサイズって
変更は出来ないのでしょうか。
いまのサイズだと小さくて・・・

フルスクーリーンにするほかはないのでしょうか。


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

Name: 管理人 [URL]  ..伝説のハッカー(311,836ポイント)   Date: 2007/05/10(木) 13:04   No:7503     
Title: Re:質問です    
サイズは自由に変更できますよ。
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html#R4N1
こちらを参考にしてください。

リファレンスページの「ウインドウモード関係」で他にも色々変更が出来ます。


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



Name: 困ったさん  ..中級者(14,229ポイント)   Date: 2007/05/09(水) 18:03   No:7495       
Title: 構造体リスト、配列、リンクバッファの比較    
今、スタックやキューについて学んでいますが、それらを構造体リスト、配列、リンクバッファなどで実現することについて、それぞれどのような利点や欠点があるのでしょうか?

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


Name: 管理人 [URL]  ..伝説のハッカー(311,781ポイント)   Date: 2007/05/09(水) 22:54   No:7499     
Title: Re:構造体リスト、配列、リンクバッファの比較    
私が応用するのはゲームプログラムなんで、そっちの話ばかりになってしまうんですが、
スタックについてあまり利用した事がありませんが、キューについては利用した事があります。

例えば文字表示バーの待機などです。

「キャラAは敵Bに23のダメージを与えた」
「キャラBはドリンクを使用した」
「キャラCは息絶えた」

などの文字列を1箇所に時間差で表示したかったとします。
上記3項目は同時に表示する必要が出てきました。
しかし表示部は1行分しかないので、1行目を表示してしばらく待機して、2行目を表示する必要があります。

ですから、これらの文字列は3つ同時にデータとして与えるんですが、表示は各3秒ずつ表示しなければならない。
このとき、最初の文字列のポインタをキューに与えます。
次に次の文字列のポインタをキューに与えます。
次にその次の文字列のポインタをキューに与えます。

このキューにたまっている文字列を時間差で表示します。
するとすんなり表示できます。


後は、シューティングの玉の表示とかですかね?

ハンドル1 : 画像1
ハンドル2 : 画像2
ハンドル3 : 画像3
ハンドル4 : 画像4
ハンドル5 : 画像5
・・

と無数に玉の画像があります。
表示すべきかどううかのフラグが1万位あったとします。
全てのフラグについていちいち表示フラグがたっているか調べて表示するのはちょっと無駄な感じがします。
そこで、表示すべきハンドルのみキューに貯めて、キューにはいっているものだけ表示するようにプログラムしてもいいかもしれません。


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

Name: box  ..比類無きプログラマー(67,269ポイント)   Date: 2007/05/09(水) 23:27   No:7500     
Title: Re:構造体リスト、配列、リンクバッファの比較    
リング(リンクではありません)バッファは
配列の終わりの要素から先頭の要素へつながるようにしたデータ構造なので、
ここでは配列と同じとみなします。

配列のメリット:
いちばん単純なデータ構造であり、多くの人が直感的に理解できる(と思う)。
添字さえ管理すれば、スタックやキューをどれだけ使っているかがわかる。
リスト構造に比べれば、格段にわかりやすい。

配列のデメリット:
定義時に要素数が決まってしまう。実行中の柔軟な要素増減が(ほぼ)不可能。

リスト構造のメリット:
ポインタを付け替えるだけで、(ほぼ)制限がない大きさのスタックやキューを管理できる。

リスト構造のデメリット:
配列に比べると、(特に入門者にとって)理解するのがむずかしい。
ポインタの付け替えロジックを誤ってしまいやすい。


お互いにメリット・デメリットが(ここに挙げた以外にも)あります。
配列やリングバッファで十分な場合もあるでしょうし、そうでない場合もあるでしょう。


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

Name: 困ったさん  ..中級者(14,255ポイント)   Date: 2007/05/10(木) 12:58   No:7502     
Title: Re:構造体リスト、配列、リンクバッファの比較    
なんかデータ構造にも用途によって様々な使い道があるんですね。
ありがとうございました!


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



Name: 大根おろし  ..ぴよぴよ(489ポイント)   Date: 2007/05/06(日) 01:20   No:7426       
Title: ヘッダファイルの中に構造体が3つ    
課題で3つの構造体を用意し、それにデータを入力、保存するかを選択させる関数を作成しています。
普通に構造体を宣言して格納して表示すればよいのですが、制限がありまして、

・構造体の型は実際にプログラム内で実態定義するのは一つだけ。
・構造体・数値はすべてヘッダファイルに定義すること。
・externは使用しない。

という制限があり、この構造体を3つ使うところに苦戦しています。

とりあえず構造体は関係ない部分だけ作ってみたのですが、ここからどうしていいかわかりません。
おそらくだいぶ間違ってると思うのですがご指導よろしくお願いします。
使用しているソフトはVC++6.0です。
C言語は参考書を見ながら作れるレベルです。
ヘッダファイルの作り方は習ってないのですが、教師に質問したら読めばわかると言われ教えてもらえないまま連休に入ってしまったので手探りなせいでだいぶおかしいと思います。

/* ヘッダファイル */

typedef struct namae
{
char name[80];
}onamae;

typedef struct data
{
int nenrei;
int hgt;
int wgt;
}sts;

typedef struct ken
{
char ken[80];
char si[80];
char tyou[80];
}syusin;

/* 人間パラメータ設定表示処理 */
void human(void)
{
onamae profil;
int no; /* 入力された処理番号を格納する変数no */

printf("処理を選択して下さい\n");
printf("1:情報入力\n2:情報表示");
scanf("%d", &no);
switch (no)
{
case 1:
for(j = 1; j <= 4; j++)
{
printf("%d人目入力", j);
printf("名前:");
scanf("%s", );
printf("年齢:");
scanf("%d", );
printf("身長:");
scanf("%d", );
printf("体重:");
scanf("%d", );
printf("在住している県:");
scanf("%s", );
printf("在住している市:");
scanf("%s", );
printf("在住している町:");
scanf("%s", );

}
break;
case 2:
for(j = 1; j <= 4; j++)
{
}
break;
default:
printf("エラー\n");
}
return;
}


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


Name: しっぽ  ..初心者(5,757ポイント)   Date: 2007/05/06(日) 14:17   No:7430     
Title: Re:ヘッダファイルの中に構造体が3つ    
逆質問です。


>課題で3つの構造体を用意し、それにデータを入力、保存するかを選択させる関数を作成しています。
>普通に構造体を宣言して格納して表示すればよいのですが、制限がありまして、

>・構造体の型は実際にプログラム内で実態定義するのは一つだけ。
>・構造体・数値はすべてヘッダファイルに定義すること。
>・externは使用しない。


上記の文章は課題を正確に表現していますか?私にはモヤモヤして、理解できません。

最初の1行から、躓いてしまいます。
「3つの構造体を用意」 3種類の構造体? 実体を3つ? コードは3種類の構造体になってますが、
  3種類と解釈してよいですか?

クイズっぽくて面白そうな課題ですので、正確な間違えようのない表現でお願いします。

あとvoid human(void)は「選択させる関数」とは全く別物の関数です。不正確な表現が一部に
あると全体の表現が疑わしく見えてしまいます。



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

Name: 大根おろし  ..ぴよぴよ(889ポイント)   Date: 2007/05/06(日) 14:45   No:7432     
Title: Re:ヘッダファイルの中に構造体が3つ    
うまく説明できていなくて申し訳ありません。
問題をそのまま引用します。

数種類の処理を行うプログラムを作成してください。
これらの処理は完了しても処理を終了させず、何度も選択して処理を行えるようにすること。

処理1
 数値を10進数で入力し、16進数で出力。
処理2
 半角文字列(アルファベット限定)を入力し、文字列内の小文字を大文字に、大文字を小文字に変換し出力。
処理3
 1〜255までの数値を入力し、0xffと論理関・論理和・排他的論理和を行い表示。
処理4

3つの構造体の型を用意しそれぞれに[名前]、[年齢・身長・体重]、[県・市・町]を定義する(4人分)。
それぞれのデータは入力で設定するようにし、入力するか表示するかを選択するメニューを用意して処理を実行する。

特定制限:
構造体の型は3つ用意するが、実際にプログラム内で実態定義を行うのは1種類だけとする。
また、構造体や変数はヘッダファイルにすべて定義し、そのヘッダファイルを読み込んで処理を行うこと。
(プログラム内に直接数値を入れてはいけません。)
externは使用しないこと。(これは口頭での制限)


(pre)
struct AA{
};

struct BB{
};

struct CC{
};

void main()
{
struct CC cc; ←AA、BBは定義してはいけない
}
(/pre)


処理3までは既に出来上がっています。
添付にテキストに貼り付けたソースを載せておきましたので処理1〜3とメインの動きはそちらを参照してください。
>あとvoid human(void)は「選択させる関数」とは全く別物の関数です。
これはメインでswich文を使用して関数に飛んで関数内で出力しているためにこういう形式にしています。

よろしくお願いします。


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

Name: 大根おろし  ..入門者(2,899ポイント)   Date: 2007/05/06(日) 18:08   No:7435     
Title: Re:ヘッダファイルの中に構造体が3つ    
試行錯誤した結果ここまで作りました。
しかし、error C2275: 'syusin' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。
'syusin' の宣言を確認してください。
というエラーとerror C2059: 構文エラー : 'type'がでてしまい、
どうも入出力どちらも格納先の指定が間違ってるのでは?というところまでは調べられたのですが、
具体的にどう直してよいのかわかりません。


/* ヘッダファイル */
typedef struct namae
{
char name[3][80];
}onamae;

typedef struct data
{
int nenrei[3];
int hgt[3];
int wgt[3];
}sts;

typedef struct ken
{
char ken[3][80];
char si[3][80];
char tyou[3][80];
onamae hito;
sts para;
}syusin;

/* main */
#include <stdio.h>
#include <ctype.h> /* toupper tulower isupper islower用*/
#include "gwh.h" /* 人間パラメータ設定表示処理用の自作ヘッダー */

void henkan16(void); /* 数値16進数変換表示処理 */
void henkanmoji(void); /* 文字列変換表示処理 */
void suti(void); /* 数値演算表示処理 */
void human(void); /* 人間パラメータ設定表示処理 */

int main()
{
int i; /* 処理番号 */

/* 処理はループさせる */
while(1)
{
printf("処理を選択して下さい\n");
printf("1:数値16進数変換表示処理\n");
printf("2:文字列変換表示処理\n");
printf("3:数値演算表示処理\n");
printf("4:人間パラメータ設定表示処理\n");
printf("処理番号:");
scanf(" %d", &i);

switch(i){
case 1:
/* 数値16進数変換表示処理を行う */
henkan16();
break;
case 2:
/* 文字列変換表示処理を行う */
henkanmoji();
break;
case 3:
/* 数値演算表示処理を行う */
suti();
break;
case 4:
/* 人間パラメータ設定表示処理を行う */
human();
break;
default:
printf("\nエラー\n\n\n\n");
}
}
}

/* 数値16進数変換表示処理 */
void henkan16(void)
{
int atai; /* 変換したい数値を格納する変数atai */

printf("数値を入力して下さい:");
scanf(" %d", &atai);
printf("\n16進数表示:%x\n\n\n\n", atai);

return;
}

/* 文字列変換表示処理 */
void henkanmoji(void)
{
int c; /* 配列hakoの要素数用の変数c */
int s; /* 変換した文字の値を格納する変数s */
char hako[80]; /* 入力された文字列を格納する変数hako */

/* 配列hakoに変換する文字列を入力する */
printf("文字列を入力して下さい\n");
printf("文字列:");
scanf("%s", hako);

/* 80文字分ループし、配列hakoの中の文字列を各々大文字、小文字に変換する。 */
for(c = 0; c < 80; c++)
{
/* 参照した文字が大文字だったとき */
if(isupper(hako[c]) != 0)
{
/* tolowerはint型の値を返すため、int型変数sに格納して出力する */
s = tolower(hako[c]);
printf("%c", s);

}
/* 参照した文字が小文字だったとき */
else if(islower(hako[c]) != 0)
{
/* toupperはint型の値を返すため、int型変数sに格納して出力する */
s = toupper(hako[c]);
printf("%c", s);
}
/* 参照した文字がアルファベット以外だったとき */
else
{
/* 参照した文字がヌルだった場合は、文字列が終了しているのでループから抜ける */
if(hako[c] == '\0')
{
break;
}
/* 参照した文字がアルファベット以外だったときはエラーを出力してループを抜ける */
printf("\nエラー");
break;
}
}
printf("\n\n\n");

return;
}

/* 数値演算表示処理 */
void suti(void)
{
int su; /* 入力された値を格納する変数su */

/* 数値を変数suに入力する */
printf("数値を入力して下さい\n");
printf("数値:");
scanf(" %d", &su);

/* 入力された値を0x0fで論理関した結果を出力 */
printf("%d\n\n\n", su & 0x0f);
/* 入力された値を0x0fで論理和した結果を出力 */
printf("%d\n\n\n", su | 0x0f);
/* 入力された値を0x0fで排他的論理和した結果を出力 */
printf("%d\n\n\n", su ^ 0x0f);

return;
}

/* 人間パラメータ設定表示処理 */
void human(void)
{
syusin plofir;
int j;
int no; /* 入力された処理番号を格納する変数no */

printf("処理を選択して下さい\n");
printf("1:情報入力\n2:情報表示");
scanf("%d", &no);
switch (no)
{
case 1:
for(j = 0; j < 4; j++)
{
printf("%d人目入力", j + 1);
printf("名前:");
scanf("%s", &syusin.hito.name[j]);
printf("年齢:");
scanf("%d", &syusin.para.nenrei[j]);
printf("身長:");
scanf("%d", &syusin.para.hgt[j]);
printf("体重:");
scanf("%d", &syusin.para.wgt[j]);
printf("在住している県:");
scanf("%s", syusin.ken[j]);
printf("在住している市:");
scanf("%s", syusin.si[j]);
printf("在住している町:");
scanf("%s", syusin.tyou[j]);
printf("\n\n");

}
break;
case 2:
for(j = 0; j < 4; j++)
{
printf("名前:%s\n", syusin.hito.name[j]);
printf("年齢:%d\n", syusin.para.nenrei[j]);
printf("身長:%d\n", syusin.para.hgt[j]);
printf("体重:%d\n", syusin.para.wgt[j]);
printf("在住している県:%s\n", syusin.ken[j]);
printf("在住している市:%s\n", syusin.si[j]);
printf("在住している町:%s\n\n\n", syusin.tyou[j]);
}
break;
default:
printf("エラー\n");
}
return;
}


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

Name: miyaza  ..初心者(8,895ポイント)   Date: 2007/05/06(日) 18:24   No:7436     
Title: Re:ヘッダファイルの中に構造体が3つ    
human()関数のsyusinの部分をplofirに直せばとりあえずsyusinのエラーはなくなると思いますが・・・・・・

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

Name: miyaza  ..初心者(8,977ポイント)   Date: 2007/05/06(日) 18:43   No:7437     
Title: Re:ヘッダファイルの中に構造体が3つ    
4人分のデータを入力しなければならないのに構造体を見ると3人分しか入らないようになってます。
配列変数や構造体についてもう一度勉強してみたらどうでしょう。
上のsyusinの話も、typedefを使用して構造体を宣言したときのことが良く分かってないから上のような書き方になってしまったのではないでしょうか


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

Name: miyaza  ..中級者(9,129ポイント)   Date: 2007/05/06(日) 18:58   No:7438     
Title: Re:ヘッダファイルの中に構造体が3つ    
連続投稿すみません。

human()関数で入力後main()関数に戻ってますよね。そのときのplofirの扱いがどうなると思いますか?
おそらく入力後表示させようと思っても正しく表示されることは無いでしょう。
ローカル変数は関数の終わりに破棄されます。
そのため表示させようと思っても正しく表示されません。これを回避するにはどうしたらいいでしょう。


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

Name: 大根おろし  ..入門者(3,106ポイント)   Date: 2007/05/06(日) 19:45   No:7441 解決!     
Title: Re:ヘッダファイルの中に構造体が3つ    
完全にただの自分のうっかりミスでした。
もっとちゃんとデバッグしていれば対処できたものばかりで質問するまでもなかったですね。
本当にすみませんでした。


>human()関数で入力後main()関数に戻ってますよね。そのときのplofirの扱いがどうなると思いますか?
>おそらく入力後表示させようと思っても正しく表示されることは無いでしょう。
>ローカル変数は関数の終わりに破棄されます。
>そのため表示させようと思っても正しく表示されません。これを回避するにはどうしたらいいでしょう。

最初はグローバル関数にすればいいと考えたのですが、課題の制限にexternが使えないことを思い出して
参考書を見たらstaticがある事を思い出し、それを使用して対処できました。

無事実行することができました。
同じミスをしないように今後も精進していきます。
ありがとうございました。


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

Name: しっぽ  ..初心者(6,577ポイント)   Date: 2007/05/07(月) 15:31   No:7462     
Title: Re:ヘッダファイルの中に構造体が3つ    
課題の原文掲載ありがとうございました。
私には、処理4を出題した意図がさっぱり判りません。
union を使わせたいのかなぁ?それともキャストを多用し汚いコード例を
書いてみろってこと?
出題者より解答が出たら是非教えてください。



//////////////////////////////////
// ヘッダー

#include <stdio.h>

//-------------------------------------------
//(プログラム内に直接数値を入れてはいけません。)
#define NAME 1
#define DATA 2
#define ADDRESS 3

//-------------------------------------------
// 3つの構造体の型を用意しそれぞれに[名前]、[年齢・身長・体重]、[県・市・町]を定義する(4人分)。

#define PERSONS 4

typedef struct tagNamae
{
char name[PERSONS][80];
} Name;

typedef struct tagData
{
int nenrei[PERSONS];
int hgt[PERSONS];
int wgt[PERSONS];
} Data;

typedef struct tagAddress
{
char ken[PERSONS][80];
char si[PERSONS][80];
char tyou[PERSONS][80];
} Address;

union Person
{
Name name;
Data data;
Address address;
};

//-------------------------------------------
// また、構造体や変数はヘッダファイルにすべて定義し、そのヘッダファイルを読み込んで処理を行うこと。

int flag;

//////////////////////////////////
// 実装
#include <string.h>
#include "test.h"

int main()
{
union Person person; // 実際にプログラム内で実態定義を行うのは1種類だけとする。
flag = NAME; // 標準入力から、名前の入出力を指定されたと仮定。

switch(flag){
case NAME:
strcpy(person.name.name[0], "Mr.A");
printf(person.name.name[0]);
break;
case DATA:
// 省略
break;
case Address:
// 省略
break;
default:
break;
}

return 0;
}





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

Name: 大根おろし  ..入門者(3,490ポイント)   Date: 2007/05/07(月) 20:05   No:7468 解決!     
Title: Re:ヘッダファイルの中に構造体が3つ    
>私には、処理4を出題した意図がさっぱり判りません。
>union を使わせたいのかなぁ?それともキャストを多用し汚いコード例を
>書いてみろってこと?
>出題者より解答が出たら是非教えてください。


本日提出したのですが、なんと私の解釈が間違っていて、
処理4は構造体変数を配列にし、ポインタでアドレス渡しして格納するということでした。

つまり

syusin plofir

syusin plofir[4]にして、
human()を
human(&plofir)
という風にアドレス渡しで、
ヘッダファイルの構造体は二次元配列は使わないで処理するとのことでした。

さらに、情報入力と情報表示の処理はそれぞれ関数にして、
例えばinput()・output()というようにしてそこへ構造体のアドレスを移動させて格納するということでした。
修正したデータを置いてきてしまったので後日ソースを貼り付けます。

この問題は友人がGWは暇だとか余計なことを言ったばかりに暇つぶしで出された問題だったので深い意味はないのだと思います。おそらくヘッダファイルやアドレス渡しの練習ができればいいという程度の認識だと思います。
プログラムが得意な人はさらに分割プログラムにしろといわれて修正していましたし。


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

Name: 大根おろし  ..入門者(3,514ポイント)   Date: 2007/05/08(火) 21:57   No:7481     
Title: Re:ヘッダファイルの中に構造体が3つ    
私の作ったものですが、解答です。
長くて入りきらないのでzipで圧縮して添付にのせました。


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

Name: フリオ  ..初心者(5,970ポイント)   Date: 2007/05/09(水) 11:37   No:7489     
Title: Re:ヘッダファイルの中に構造体が3つ    
 
 長くなったので、添付ファイルで。
 


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

Name: しっぽ  ..初心者(6,923ポイント)   Date: 2007/05/09(水) 19:04   No:7497     
Title: Re:ヘッダファイルの中に構造体が3つ    
大根おろしさん、受け取りました。
わざわざありがとうございます。


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



Name: らんえぼ  ..ぴよぴよ(0ポイント)   Date: 2007/05/09(水) 14:52   No:7491       
Title: 画像処理について。    
こんにちわ。質問させてください。

カラーの画像を白黒にする問題で

赤29.9%緑58.7%青11.4%の割合で平均化すればいいのらしいですが

自分がやっても一色になってしまいます。どうしたらいいのでしょうか?

ちなみに自分は

for(j=0;j<YSIZE;j++){
for(i=0;i<XSIZE;i++){
r2[i][j]=0.299*255;r1[i][j];
g2[i][j]=0.587*255;g1[i][j];
b2[i][j]=0.114*255;b1[i][j];
}
}

ってやりました。1が元の絵で2を白黒にしたいのです。

分かる方教えてください。

変更する部分は

for(j=0;j<YSIZE;j++){
for(i=0;i<XSIZE;i++){
r2[i][j]=r1[i][j];
g2[i][j]=g1[i][j];
b2[i][j]=b1[i][j];
}
}

だけでできるらしいです。よろしくお願いします。


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


Name: keichan  ..上級者(21,824ポイント)   Date: 2007/05/09(水) 15:01   No:7492     
Title: Re:画像処理について。    

r2[i][j]=0.299*r1[i][j];
g2[i][j]=0.587*g1[i][j];
b2[i][j]=0.114*b1[i][j];

じゃないんですか?


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

Name: YuO  ..ぴよぴよ(205ポイント)   Date: 2007/05/09(水) 15:27   No:7493     
Title: Re:画像処理について。    
> r2[i][j]=0.299*255;r1[i][j];
> g2[i][j]=0.587*255;g1[i][j];
> b2[i][j]=0.114*255;b1[i][j];

これでは,
・r2[i][j]には0.299 * 255 = 76
・g2[i][j]には0.587 * 255 = 149
・b2[i][j]には0.114 * 255 = 29
が常に代入されます。
そもそも白黒画像ですから,r2[i][j] == g2[i][j] == b2[i][j]でないといけませんし。

白黒にするには,各成分をある割合で混ぜ合わせることによって行います。
つまり,
r2[i][j] = g2[i][j] = b2[i][j] =

(299 * r1[i][j] + 587 * g1[i][j] + 114 * b1[i][j]) / 1000;

とそれぞれの割合で混ぜたものを使う必要があります。


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

Name: らんえぼ  ..ぴよぴよ(55ポイント)   Date: 2007/05/09(水) 15:40   No:7494 解決!     
Title: Re:画像処理について。    
返信ありがとうございます。

無事白黒になりました。

教えてくださってありがとうございました!!


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



Name: 夏天 [URL]  ..初心者(5,491ポイント)   Date: 2007/05/06(日) 16:47   No:7433       
Title: 警告が・・・    
stdio.hとstring.hを使っているとき

下の警告が消えてくれません

どうしたら消えるのでしょうか・・・


――――――――――――――――――――――――――――――――――――――――――――――――
c:\program files\microsoft visual studio 8\vc\platformsdk\include\mmreg.h : warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
c:\documents and settings\tenka\デスクトップ\課題研究\marubatu\main.cpp(55) : warning C4996: 'fopen' が古い形式として宣言されました。
c:\program files\microsoft visual studio 8\vc\include\stdio.h(234) : 'fopen' の宣言を確認してください。
メッセージ: 'This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
c:\documents and settings\tenka\デスクトップ\課題研究\marubatu\main.cpp(62) : warning C4996: 'fscanf' が古い形式として宣言されました。
c:\program files\microsoft visual studio 8\vc\include\stdio.h(249) : 'fscanf' の宣言を確認してください。
メッセージ: 'This function or variable may be unsafe. Consider using fscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'


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


Name: 管理人 [URL]  ..伝説のハッカー(310,239ポイント)   Date: 2007/05/07(月) 09:24   No:7453     
Title: Re:警告が・・・    
mmreg.hの警告は私のところでもでます。
これはこのファイルの一部注釈内にUnicodeでない形式の文字が含まれている事が原因のようです。
文字コードの変換の出来るエディタなど(例えばxyzzy等http://www.jsdlab.co.jp/~kamei/)

c:\program files\microsoft visual studio 8\vc\platformsdk\include\mmreg.h
を開き、Unicodeで上書き保存してください。

また、それ以下の警告は、「もっとセキュリティの高い関数があるからそっち使ってくださいよ」ということです。
例えばfopen関数はfopen_s関数という、同じ機能を持つもっとセキュリティの高い関数があります。
この辺参考にしてください。
http://msdn2.microsoft.com/ja-jp/library/z5hh6ee9(VS.80).aspx
マイクロソフトはこのような入門時に習うような関数ではなく、もっとセキュリティの高い関数を使って欲しいと促進しているので、このような警告を吐きます。

しかし、今まで使い慣れた関数を使い続けたいというのであればプログラムの一番最初に
#define _CRT_SECURE_NO_WARNINGS
を書いてください。
これをインクルード文の前に書く事で警告が消えます。


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

Name: 夏天 [URL]  ..初心者(5,536ポイント)   Date: 2007/05/09(水) 00:02   No:7484     
Title: Re:警告が・・・    
そういうことだったんですか
とてもわかりやすい説明ありがとうございます!!
この警告が出ていたせいで見にくかったんですよ
直してみます


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

Name: 夏天 [URL]  ..初心者(5,544ポイント)   Date: 2007/05/09(水) 00:03   No:7485 解決!     
Title: Re:警告が・・・    
アイコン間違ってました・・・

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



Name: カルマ  ..ぴよぴよ(43ポイント)   Date: 2007/05/07(月) 00:21   No:7444       
Title: モンテカルロ積分    
当たり・はずれ型モンテカルロ積分の課題で、

A=1/√(2π)∫exp(-x^2/2)dx(x=0~2)
のAの点推定値と信頼係数0.95の信頼区間を求めよ。

というものが出たのですが、点推定値は多分Aをモンテカルロ法で近似して求めた値だと思うのですが、
信頼区間が何を表すものなのか分かりません。
何を求めれば良いのか教えてください!


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


Name: 組木紙織  ..中級者(14,095ポイント)   Date: 2007/05/07(月) 00:39   No:7445     
Title: Re:モンテカルロ積分    
式の内容が読み取りきれないので良くわからないが、
多分正規分布の式だと思います。
信頼区間は、統計学の推定と検定のないようですね。

http://case.f7.ems.okayama-u.ac.jp/book_data/book_data.html

ここが参考になると思います。


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

Name: カルマ  ..ぴよぴよ(137ポイント)   Date: 2007/05/07(月) 00:55   No:7447     
Title: Re:モンテカルロ積分    
ありがとうございます!!
式が分かりにくくてすみません!添付しました。
ある区間にその近似値がある確率が95%となるような、区間を求めれば良いということですかね??

どうやって考えれば良いのでしょうか?
全く思い浮かびませんι



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

Name: 組木紙織  ..中級者(14,288ポイント)   Date: 2007/05/07(月) 20:54   No:7470     
Title: Re:モンテカルロ積分    
>ある区間にその近似値がある確率が95%となるような、区間を求めれば良いということですかね??

と考えるよりは、母集団の平均(母平均)が95%の確率で存在する区間。
と考えるほうが正確です。

この場合は標本平均が0、標本分散が1の正規分布を考えています。

考え方はすっ飛ばして結果だけ上げると、
1/√(2π)∫exp(-x^2/2)dx(x= -b~b)= 0.95 となるbを求めよ。
といった問題になります。

モンテカルロ積分の練習問題なんだろうけども、統計学をやっていない人には意味が分からないと思います。
考え方を知りたいのなら上記のリンクのリンク集で放課後の数学入門を見てみるか、統計学の教科書を
見たほうがいいと思います。






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

Name: カルマ  ..ぴよぴよ(201ポイント)   Date: 2007/05/08(火) 21:57   No:7480 解決!     
Title: Re:モンテカルロ積分    
組木紙織さんありがとうございます!

統計学は教養でやったのですが、この辺りまではやっていなかったんです(^_^;)
放課後の数学入門とても参考になりました!


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



Name: そら  ..かけだし(1,128ポイント)   Date: 2007/05/03(木) 17:41   No:7324       
Title: 教えてください    
英単語(最大15文字)を*が現れるまで1つづつ読み込み、読み込んだ英単語の文字数を計算して文字数の度数分布(同一文字数の出現回数)を表示するプログラムを作成せよ。
ただし、文字数を計算するプログラムは文字列を格納する領域の確保は配列を使用し、実行文では配列を使用しないでポインタを使用すること。
という課題が出ているんですが全く分からないので教えてください。

例えば a b c URL * と入力したら
実行結果はこんな感じになります。
文字数  出現回数
1  3
2  0
3  1
4  0
5  0
: :
: :
: :
15 0




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


Name: 管理人 [URL]  ..伝説のハッカー(305,894ポイント)   Date: 2007/05/03(木) 22:17   No:7332     
Title: Re:教えてください    
そらさん、こんにちは。

課題っていざやろうとすると難しく感じるものですよね。
しかし、沢山しないといけないことがくっついているから難しく感じているだけで、わけてわけて作っていけば、簡単だったりします。

そらさんがどの程度Cを知っていらっしゃるのかわからないので、先にお聞きしますが、

@ 入力を文字列に格納する。
A 格納した配列の中に入っているスペースの文字を数える

この2つは出来ますか?
少しでも出来そうにないと思ったら遠慮なく言ってくださいね。

少しずつ作っていきましょう。
もし出来るなら、上の2つを作ってみてください。

課題1
@ 入力を文字列に格納する。
A 格納した配列の中に入っているスペースの文字を数える

このプログラムを作ってください。

作ったら投稿してください。


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

Name: 管理人 [URL]  ..伝説のハッカー(306,033ポイント)   Date: 2007/05/03(木) 22:33   No:7334     
Title: Re:教えてください    
時間のあるうちにサキサキ書いておきますので、順番に見て行って下さい。

くれぐれも下には回答がかいてありますので、○○を作ってくださいと言ったら下をすぐ見ずに、自分で作ってみてから、下の回答と照らし合わせて確認してください。

現在上記2つの事をしてほしいといっていますので、それが出来るまでは(またはどうしてもわからない場合以外は)下に進まないで下さい。

それでは下に回答を続けます。


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

Name: 管理人 [URL]  ..伝説のハッカー(306,296ポイント)   Date: 2007/05/03(木) 22:39   No:7335     
Title: Re:教えてください    
@ 入力を文字列に格納する。

よっしゃ、それならscanfで簡単ジャン!
と思うでしょう。scanfでプログラムを書いてみます。


#include <stdio.h>

int main(){
char ch[1000];

scanf("%s",ch);

printf("-->>> %s\n",ch);

return 0;
}

実行結果

abciusaop234
-->>> abciusaop234

 
 
これで出来た!
・・・と思うでしょうが、実際に今回必要とする、スペースを含んだ入力をしてみます。


実行結果

when I liked soccer.
-->>> when


 
 
あれ?「when」しか入ってないぞ?と思うでしょう。
そうなんです。
scanfはスペースや改行で区間を区切るため、スペースを含む入力には使用できません。
そこでgetcharを使用してみます。

getchar関数というのは、入力された文字列を1文字ずつ返す関数です。
つまり
「when I liked soccer.」
という文字列を入力すると、
1回目にgetcharを呼ぶと「w」が返って来ます。
2回目にgetcharを呼ぶと「h」が返って来ます。
3回目にgetcharを呼ぶと「e」が返って来ます。
4回目にgetcharを呼ぶと「n」が返って来ます。
ですから、

char n;
n = getchar();

で、nを表示していけば1文字ずつ表示できます。
これを使ってみましょう。


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

Name: 管理人 [URL]  ..伝説のハッカー(306,627ポイント)   Date: 2007/05/03(木) 22:43   No:7336     
Title: Re:教えてください    
while( ( ch[i]=getchar() ) != '\n')

これは何をしているかというと、
まず最初にch[i]=getchar()が行われますから、入力された文字列の中から1文字取ってきます。
取ってきた文字が改行で無い限りループします。
iをドンドン進めていけば、入力された文字列が格納できますね。

最後に終端記号を入れましょう。

以下プログラムを見てください。


#include <stdio.h>

int main(){
int i=0;
char ch[1000];

while( ( ch[i]=getchar() ) != '\n')
i++;
ch[i] = '\0';

printf("-->>> %s\n",ch);

return 0;
}

実行結果

when I liked soccer.
-->>> when I liked soccer.


 
 
ご覧の通り、スペースも含めて格納する事が出来ました。
では次にこのスペースの数をカウントしていきましょう。


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

Name: 管理人 [URL]  ..伝説のハッカー(306,878ポイント)   Date: 2007/05/03(木) 22:49   No:7337     
Title: Re:教えてください    
格納する時に一つ一つ文字を確認しているので、
そこでいっぺんにスペースの調査もしてしまいましょう。
numという文字数をカウントする変数を用意し、
スペースが発見されるたびに1カウントアップさせます。

以下のようになります。


#include <stdio.h>

int main(){
int i=0,num=1;
char ch[1000];

while( ( ch[i]=getchar() ) != '\n'){
if(ch[i]==' ')
num++;
i++;
}
ch[i] = '\0';


printf("\n\n");
printf("%s --> の中に単語は%d個\n",ch,num);

return 0;
}


実行結果

when I liked soccer.


when I liked soccer. --> の中に単語は4個


別に難しい事はないですね?ここまでで、私から出した2つの課題は終わりです。
次の課題に進みましょう。


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

Name: 管理人 [URL]  ..伝説のハッカー(306,924ポイント)   Date: 2007/05/03(木) 22:52   No:7338     
Title: Re:教えてください    
課題2
上記プログラムを利用して、各単語の長さをカウントする機能を追加してください。


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

Name: 管理人 [URL]  ..伝説のハッカー(307,988ポイント)   Date: 2007/05/03(木) 23:09   No:7339     
Title: Re:教えてください    
回答です。

今回どうやって数えるかが当然ミソになってきます。
15種類のカウントする変数が必要になってきますね。
変数が多く、同じ型が必要ですから配列で用意しましょう。
カウントするので、なまえをcntとし、
int cnt[16];
として用意します。
なんで15種類なのに16個かというと、[0]を使用するとわかりにくくなるため、[0]は使用しません。
今回は[1]から[15]を使用するので一つ多く宣言しました。
1文字の時は[1]を一つカウントアップ( [1]++; )
2文字の時は[2]を一つカウントアップ( [2]++; )
3文字の時は[3]を一つカウントアップ( [3]++; )

という感じで15文字までいきましょう。
するとcnt配列の各要素は文字数となります。
つまり、文字数をlenとすると
cnt[len]++;
とすればいいわけですね。

各単語の文字数をカウントするには、スペースからスペースまで、または改行までの間の長さを調べてやればいいですね。
ですから
もしスペースなら文字数を表すlenを使ってそれまでの文字数をカウントし、
文字数をカウントするlenを初期化
if(ch[i]==' ' || ch[i]=='\n'){
  cnt[len]++;
  len=0;
}
します。
それ以外のときは、スペース以外ですから、lenを増やせばlenで文字数がカウントできます。
else
  len++;

これらをループで表すと

while(1){

ch[i]=getchar();
if(ch[i]==' ' || ch[i]=='\n'){
cnt[len]++;
len=0;
}
else
len++;
if(ch[i]=='\n')
break;
i++;
}
 
 
 
こうなりますね。
では、これを通してみてみます。



#include <stdio.h>

int main(){
int i=0,cnt[16]={},len=0;
char ch[1000];

while(1){
ch[i]=getchar();
if(ch[i]==' ' || ch[i]=='\n'){
cnt[len]++;
len=0;
}
else
len++;

if(ch[i]=='\n')
break;
i++;
}
ch[i] = '\0';

printf("\n\n");

for(i=1;i<=15;i++)
printf("%d文字 -> %d個\n", i, cnt[i]);

return 0;
}

実行結果

1文字 -> 1個
2文字 -> 0個
3文字 -> 0個
4文字 -> 1個
5文字 -> 1個
6文字 -> 0個
7文字 -> 1個
8文字 -> 0個
9文字 -> 0個
10文字 -> 0個
11文字 -> 0個
12文字 -> 0個
13文字 -> 0個
14文字 -> 0個
15文字 -> 0個

 
 
 
これで各文字数がカウントできました。では次の課題へ参りましょう。


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

Name: 管理人 [URL]  ..伝説のハッカー(308,679ポイント)   Date: 2007/05/03(木) 23:23   No:7340     
Title: Re:教えてください    
今度の課題は今までとは直接関係有りません。
さっぱり忘れてしまってOKです。

今、
int a[5];
と宣言したとします。
配列の領域は連続して確保されるので、[0]のアドレス+1が[1]になり、[1]のアドレス+2が[2]となっていきます。
(実際には4バイト置きにアドレスが確保されているんですが、ポインタを使うとそれを意識しなくていいので、省略します)

ちょっとポインタについておさらいしておきましょう。
ポインタとは、変数のアドレスをいれる変数です。
変数のアドレスをいれる専用の箱ということです。
今、
int *p;
と宣言すると
pには何かのアドレスを入れることになります。

今aを宣言し、aのアドレスをいれて表示してみましょう。

#include <stdio.h>


void main(){
int *p,a=1;
printf("%d\n",a);
p=&a;
printf("%d\n",*p);
}

実行結果
1
1

 
 
意味がわかりますか?
では、その配列バージョンを見てみましょう。


#include <stdio.h>

void main(){
int *p,a[3]={1,2,3};
printf("%d %d %d\n",a[0],a[1],a[2]);
p=a;
printf("%d %d %d\n",*p,*(p+1),*(p+2));
}

実行結果

1 2 3
1 2 3
 
 
 
わかりますか?
a[1]はa[0]のアドレス+1だからこのように表せるわけです。

では課題です。




課題3
int a[10]={0,1,2,3,4,5,6,7,8,9};としてaを宣言し、この配列を扱うためのポインタを用意し、ポインタを使ってa[8]の内容を表示してください。



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

Name: 管理人 [URL]  ..伝説のハッカー(308,825ポイント)   Date: 2007/05/03(木) 23:26   No:7341     
Title: Re:教えてください    
私がお教えするのはとりあえずここまでです。
先ほどまでは「わからなければ下をみたらいいや」と思って気軽に見てしまったかもしれませんが(見ずに一生懸命やってたらすみません)、今度は答えを書かないのでご自分で考えてみてください。
今までの事をしっかり理解すれば必ず出来ます。

もし出来上がったら思うでしょう。
最初 こんなのできない! と思っていた課題でも少しずつやってみることで自分の力でも出来るという事を。

なんでもそうですが、諦めてしまったらそこまでなので、課題が難しければ機能を分割して、少しずつ作ってみる事で案外簡単になるものですから諦めず頑張ってください。

わからないことがあれば聞いてくださいね。


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

Name: 管理人 [URL]  ..伝説のハッカー(311,048ポイント)   Date: 2007/05/08(火) 00:34   No:7472     
Title: Re:教えてください    
そらさんは、この質問に対して解決なさったんでしょうか?

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



Name: KJ  ..ぴよぴよ(390ポイント)   Date: 2007/05/07(月) 19:04   No:7466       
Title: メモリが確保できていない??    
算術乱数の和を、プログラムの途中で求めているのですが、
確保するメモリを20000よりも多くするとコンパイルは出来るのですが、
実行する際にエラーになってしまいます。
2000000個のメモリを確保したいのですが、何がおかしいのでしょうか?

プログラムは↓です。

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define N 2000000

int main(void)
{
unsigned long mkrandom(unsigned long a, unsigned long c, unsigned long x0);

double p[10], t, sigpk, *x;
unsigned long a, c, x0;
int i, k;

x = (double *)malloc(sizeof(long double) * N);

if(x == NULL){
printf("mallocに失敗\n");
return -1;
}

for(i=0 ; i<N ; i++){
x[i]=0.0;
}

x[0] = 1; a = 61; c = 49;

x0 = x[0];

for(i=2 ; i<=N ; i++){
x0 = mkrandom(a, c, x0);
x[i-2] = x0 / (double) 4294967296;
}


for(k = 1; k <= 10; k++){
p[k-1] = 0.0;
sigpk = 0.0;
for(i=1; i<=N-k ; i++){
sigpk += (double)x[i-2]*x[i-2 +k];
p[k-1] = 12.0/N*sigpk - 3;
}
}

for(k = 1; k <= 10; k++){
t = sqrt(N-2)*p[k-1]/sqrt(1 - pow(p[k-1], 2));
printf("P_%d = %f, t = %f", k, p[k-1], t);

if(t < 2.326){
printf(" --> 受容");
}
else{
printf(" --> 棄却");
}
printf("\n");
}
free(x);
return 0;
}

unsigned long mkrandom(unsigned long a, unsigned long c, unsigned long x0){
return a*x0 + c;
}

↓(一部分ですみません・・・)だけを実行すると、失敗にならなかったので、メモリは確保できると思うのですが。。
x = (double *)malloc(sizeof(long double) * N);

if(x == NULL){
printf("mallocに失敗\n");
return -1;
}

どなたかお願いします!m(__)m


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


Name: box  ..比類無きプログラマー(66,972ポイント)   Date: 2007/05/07(月) 20:38   No:7469     
Title: Re:メモリが確保できていない??    

実行時のエラーの件とは無関係かもしれませんが、
気になる点がいくつかあります。

> unsigned long mkrandom(unsigned long a, unsigned long c, unsigned long x0);

これでもコンパイルは通りますが、プロトタイプ宣言はmain()の外に書くのが
より一般的ではないかと思います。

> x = (double *)malloc(sizeof(long double) * N);

double型でなくlong double型の領域が必要な理由は何ですか?

> for(i=1; i<=N-k ; i++){
> sigpk += (double)x[i-2]*x[i-2 +k];

iが1のとき、x[i-2]は定義した領域の範囲外になってしまいます。

> p[k-1] = 12.0/N*sigpk - 3;

iに関するループの中で、毎回p[k-1]を計算する必要はありますか?


ソースコードを貼り付ける際、最初と最後を
<pre>タグと</pre>タグではさんでください(不等号は半角で)。



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

Name: KJ  ..ぴよぴよ(889ポイント)   Date: 2007/05/07(月) 21:26   No:7471 解決!     
Title: Re:メモリが確保できていない??    
>これでもコンパイルは通りますが、プロトタイプ宣言はmain()の外に書くのが
より一般的ではないかと思います。

授業のテキストに書いてあったのでそのまま書いてしまいました。そうなんですね!!

>double型でなくlong double型の領域が必要な理由は何ですか?
確保されていないのではないかと思ってlong doubleを試して、そのままでした。。

>iが1のとき、x[i-2]は定義した領域の範囲外になってしまいます。
そうですね!!
そこを直したところ正常に実行されました!
ありがとうございます!

>iに関するループの中で、毎回p[k-1]を計算する必要はありますか?
そこも修正しました!
自分でやっているときは全く気にしなかったです。。ダメですね・・・

>ソースコードを貼り付ける際、最初と最後を
<pre>タグと</pre>タグではさんでください(不等号は半角で)。


注意書きを読んだのにすっかり忘れていました!すみません!
今度からは気をつけます。

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


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



Name: シナ  ..ぴよぴよ(40ポイント)   Date: 2007/05/07(月) 00:39   No:7446       
Title: 多重積分    
pdfが課題の問題文なのですが、
これが何をすれば良いのか全くわかりません(^_^;)

とりあえず、Iの近似値I(hat)を求めて・・・

この任意の確率変数Xとは何のことなのでしょうか?
何の平均と分散を求めれば良いのかが分かりません。

あと、Prというのも意味が分からず困っています。

どなたか解説お願いしますm(__)m



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


Name: 管理人 [URL]  ..伝説のハッカー(310,521ポイント)   Date: 2007/05/07(月) 09:37   No:7455     
Title: Re:多重積分    
Pというのは確率の事でしょう。
probabilityの頭文字として、数学ではよく使われます。

確率変数というのは、その確率がおきる為の数値のことでしょう。
例えば
さいころをふるとします。
さいころの出た目をXとします。すると3が出るということはX=3と表せます。
Pが確率ならP(X)において
P(X=3) = 1/6
であることがわかりますね。
偶数が出る確率は
P(X=2) + P(X=4) + P(X=6) = 1/2
になります。
ただ私にはこの線

Pr(|X − μ ≥ λσ) ≤1/λ2
  ↑

 
この線の意味がわかりません。
これらの式や確率の話について授業で説明はなかったのでしょうか?


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

Name: box  ..比類無きプログラマー(66,727ポイント)   Date: 2007/05/07(月) 14:41   No:7461     
Title: Re:多重積分    
OKwaveの数学カテゴリーあたりへ持っていった方がよさそうな話ですね。

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

Name: シナ  ..ぴよぴよ(155ポイント)   Date: 2007/05/07(月) 17:11   No:7463     
Title: Re:多重積分    
Pr(|X − μ ≥ λσ) ≤1/λ2

ではなくて、

Pr(|X − μ | ≥ λσ) ≤1/λ2

の間違いでした!

授業というか、実験…演習…のような感じなので毎回特に説明はされないんです。
しかも、授業時間中に上の問題まで進んでなかったので質問もし忘れてしまって(^_^;)

OKwaveに行ってみようと思います。

管理人さん、boxさん、ありがとうございました。




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

Name: box  ..比類無きプログラマー(66,817ポイント)   Date: 2007/05/07(月) 17:18   No:7464     
Title: Re:多重積分    
念のためですけれど、あちらでも課題を丸投げすることは
禁止されているはずです。
確か、スタッフが丸投げと判断したら、質問・回答ごと
すべてスタッフ権限で削除すると思います。

「自分ではここまで考えたけれど、ここから先がわからない」というような
話の持っていき方が必要です。


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

Name: シナ  ..ぴよぴよ(176ポイント)   Date: 2007/05/07(月) 18:58   No:7465 解決!     
Title: Re:多重積分    
見る前に書き込んでいました(>_<)
すみません・・・
プログラムというよりも数学(統計?)的な意味が分からない
と書いたつもりです。。


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



Name: やっかい者  ..ぴよぴよ(226ポイント)   Date: 2007/05/07(月) 08:32   No:7450       
Title: フルパスの記述について    
c:\\windows\\system32\\notepad.exe

パスはこのように記述しますが、実行の時点では\\の部分が何か1バイト文字に
変換されています。

このように記述する意味を教えてください、
実行時に\\は何を基準に変換するのでしょうか?
OSとかマシンとかでしょうか?

ご教授よろしくお願いします。



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


Name: 組木紙織  ..中級者(14,116ポイント)   Date: 2007/05/07(月) 08:40   No:7451     
Title: Re:フルパスの記述について    
osなどは関係ありません。
c言語では
"\n"→改行
"\t"→タブ
"\\"→\
となります。


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

Name: やっかい者  ..ぴよぴよ(451ポイント)   Date: 2007/05/07(月) 09:28   No:7454     
Title: Re:フルパスの記述について    
早速の回答ありがとうございます。

改行やタブは制御コードなのでストリングとしてテキストに直接
書き込みできないのですが、\は1バイトのキャラクタ文字で書き込み
可能なのではないでしょうか?

ファイル階層の区切りに\1個ではだめなのですね、\はファイル文字には
使えないので混同する心配もないと想うのですが・・・

いずれにしても、今回の件は実行後にフルパスを指定する場合は
\\を\(0x5C)に置き換えてその後のストリングを前詰めにすればOKでようか?


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

Name: 管理人 [URL]  ..伝説のハッカー(310,885ポイント)   Date: 2007/05/07(月) 09:50   No:7456     
Title: Re:フルパスの記述について    
すみません、回答していることがご質問の意図と違っていたらスミマセン。


#include <stdio.h>

void main(){

printf("%d\n",'\0');
printf("%d\n",'\n');
printf("%d\n",'\t');
printf("%d\n",'\\');

char st[3];

st[0]='\\';
st[1]='\\';
st[2]='\0';

printf("%s\n",st);
}

実行結果

0
10
9
92
\\


ご質問の意図をはっきり理解していないのですが、
\\は\に変換されて、1バイトとなります。
そもそも文字は全部文字コードで管理されていますから、
http://hp.vector.co.jp/authors/VA008536/data/ascii.html

>\は1バイトのキャラクタ文字で書き込み 可能なのではないでしょうか?

サンプルの通り、\\とかけば\に変換されますから、書き込みできますよ。
2つ続けたいのなら4つ書けばいいと思います。


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

Name: やっかい者  ..ぴよぴよ(470ポイント)   Date: 2007/05/07(月) 10:38   No:7459 解決!     
Title: Re:フルパスの記述について    
ありがとうございます。
この課題をビルドして実行ファイルをバイナリーエディタで見ると確かに
\\は\に変換されていました、またパスのストリングの前詰めの
操作は必要なく。
実行時のパス名変更は、その書き込みoffsetに注意が必要のようです

またまたお世話になりました。


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



Name: DX  ..ぴよぴよ(8ポイント)   Date: 2007/05/06(日) 17:49   No:7434       
Title: ダメージ計算    
ロールプレイングの戦闘での

ダメージ計算の事で聞きたいんですが

なにかバランスの取れた計算方法はありますか??

みなさんはどのように計算してますか??


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


Name: Justy  ..比類無きプログラマー(96,885ポイント)   Date: 2007/05/06(日) 20:37   No:7442     
Title: Re:ダメージ計算    
なにかバランスの取れた計算方法はありますか
 具体的にどういうパラメータがある状態でのダメージ計算なのかわからないので、
 攻撃者の攻撃力 − 攻撃対象の防御力
 がダメージ値となります、としか言えません。

 ゲーム毎にバトルで使用するパラメータ要素は千差万別なので、この手のものに万能な公式はありません。
 従って、試行錯誤するしかないと思います。


みなさんはどのように計算してますか??
 私は作ったことがないので、あまり参考にならないかもしれませんが、
何らかの形で必要なパラメータを入力(ファイルからとか GUIを使ってとか)すれば、
バトルの経過と結果を一瞬で教えてくれるようなツール・・・バトルシミュレータを
作るのが一番いいのではないかと思います。

 それがあれば、計算式の調整や、バトル環境(参加人数、敵のパラメータとか)の
変更してのテストとか主人公の成長の変化による調整なども一括してツール上で
調整・確認することができるので、作業は楽になるはずです。

 ゲームの規模がある程度小さいので、そこまでしなくてもエクセルで計算式を書いて、
シミュレートしていくのもいいかと思います。


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

Name: 管理人 [URL]  ..伝説のハッカー(311,029ポイント)   Date: 2007/05/07(月) 10:01   No:7458     
Title: Re:ダメージ計算    
ダメージ計算の部分は凝りたいですよね。
凝りたいのに、いい計算方法がなくて、結構悩みました。
色々試行錯誤しているうちにこんな計算式にたどり着きました。
私独自のものなので、いいかどうかはわかりません。

ダメージ = レベル*2 + ((自分の攻撃力+武器の攻撃力) - (相手の防御力+相手の装備防御力)) * 自分の力*乱数1 + 自分の力*乱数2;

乱数は正規分布にしたがった乱数です。どこまで凝るかによりますが、正規分布を用いない一様乱数だと、バラバラの値になって、あまりよくありません。
この世で起きる全てのことは正規分布に分布します。
全ての起こる確率が一様だということはありません。
それはさいころを振る目の出る確率という事ではなく、
相手に殴りかかったとき、どれ位ダメージを与えるか。
現実的に言えば、パンチングマシーンを100回やったとき、出るスコアは平均に近い値が一番多く、
平均から離れるに従って少なくなるはずです。
きちんと統計を取れば正規分布になるはずです。

つまり、自然なダメージ値にするには正規分布を使った乱数が良いかと思います。
他トピ「RPGサンプルプログラム」というトピをあげておきますので、参考にしてください。
サンプルのzipファイルを回答すればプロジェクトファイルが
VisualStudio2005があれば開けます。slnファイルをお開きください。

ダメージ計算は
battle_graph_calc.cpp

damdec関数で決定しています。正規分布の乱数はrano関数で生成しています。

ダメージ = レベル*2 + ((自分の攻撃力+武器の攻撃力) - (相手の防御力+相手の装備防御力)) * 自分の力*乱数1 + 自分の力*乱数2;

より

return (int)(lv*2+(power+weapon-(def+equip))*strong*rano(0.01,0.05)+strong*rano(0.2,1.0));

で計算しています。rano関数の第一引数はちらばりを示すσ、第二引数は平均です。
計算式は
specifications.cpp
でも説明しています。

私の勝手な計算式なので、あてになりませんが、参考までに・・。


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



Name: 管理人 [URL]  ..ハッカー(255,600ポイント)   Date: 2007/03/30(金) 06:12   No:6287       
Title: RPGサンプルプログラム    
要望を受けてサンプルプログラムを作っています。

え〜と具体的にどういう感じのRPGが作りたいかわからないので自分で勝手に考えて作ってるんですけどこんなんでいいですかね?

コンパイラはVisualStudio2005です。

http://dixq.net/zip/rpg.zip

ここにプロジェクトファイルも全部あります。
slnファイルを開いて中身をご覧下さい。
とりあえず実行だけさせたい時はトップにある実行ファイルをダブルクリックしてください。
現在方向キーのみ使用できます。戦闘シーンにはいると何も出来なくなるのでEscボタンで終了してください。

ヘタクソな管理人が作っているサンプルですからこれでいいのか保証は出来ませんよ。。(_ _||)

とりあえずキャラがマップ上を動くところ、マップ間移動するところ、戦闘に入るところ、戦闘の最初までを作りました。
8時間かけてそれだけかよ!!
という突込みがきそうですが、亀並みの作成スピードなのでお許しを(_ _||)
ずっと作っているんですけどなかなかサクサクとは・・。

今日は遅いのでこの辺にしておきます。

こんな感じでいいですかね?どの辺まで作ったらいいんでしょう?
戦闘シーンとか完璧に作ろうと思ったらかなり時間かかると思います。
町を作ったり人があるいていたり、武器屋作ったりアイテム作ったりしていると無限に時間がかかるので、
どこまでという線引きしてもらった方がありがたいです。

あまり長いプログラムコード書いても読むのがしんどくなると思いますから
ホンの基本だけみて後自分で作っていったほうがいいような気もします。


あ、あと戦闘に入る時の演出方法なんかはホントに書く人それぞれになると思いますからね、
あくまでサンプルということでご覧下さい。
本当はガラスが割れたみたいにちらばらせたらカッコイイんでしょうけど、そんなことしたらものすごく複雑になってしまいそうだったんで長方形にしました。

で、注釈はまだ全然書いていません。
ざっとみ、こんな感じで作っていいのかだけ見てもらえたらと思います。


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


Name: 風鈴  ..かけだし(1,041ポイント)   Date: 2007/03/30(金) 19:22   No:6295     
Title: Re:RPGサンプルプログラム    
わざわざ本当にありがとうございます。
まさにこんな感じのサンプルがほしかったんです。

ただ、slnファイルが開けないのですがどうすればよいでしょうか。
includeの中にあるヘッダファイルは開けるのですが・・・。

インストールしてあるソフトは下記です。
Borland C++ Compiler 5.5
BCC Developer


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

Name: 管理人 [URL]  ..ハッカー(255,134ポイント)   Date: 2007/03/30(金) 20:09   No:6296     
Title: Re:RPGサンプルプログラム    
あぁ、VC++じゃないですね><

slnファイルはVisualStdioのプロジェクトを開くためのファイルなんで、BCCでは無理です。
BCC使った事無いんで、よくわからないんですが、、。

分割コンパイルしないといけないので、
dat\sorce\
にはいっているソースと
include
に入っている
hファイルとlibファイルで環境を整えてください。

私の場合画像のように環境を作っています。




一応VisualStudio2005の宣伝も・・。
何万もするソフトですが、学生ならものすごい安く手に入ります・・
http://www.coneco.net/PriceList/1051221318/order/MONEY/#list


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

Name: 管理人 [URL]  ..ハッカー(255,091ポイント)   Date: 2007/03/30(金) 23:28   No:6297     
Title: Re:RPGサンプルプログラム    
って別にまだ完成じゃないんで、構築はしなくていいです^^;
こんなファイルでもお渡しして力になれそうですか?


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

Name: 風鈴  ..かけだし(1,129ポイント)   Date: 2007/03/30(金) 23:52   No:6298     
Title: Re:RPGサンプルプログラム    
はい、すごく参考になります。
形になってるのを見るとすごく面白いですね。

VisualC++ 2005 Express Editionというのが無料でしたので、そちらをDLしてインストールしてみたのですが
そちらは、なぜか最後のインストールのところでエラーになってしまったので・・・。
色々調整してやってみようと思います。


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

Name: 管理人 [URL]  ..ハッカー(255,179ポイント)   Date: 2007/03/31(土) 00:01   No:6299     
Title: Re:RPGサンプルプログラム    
あ、その手がありましたね。

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

こちらにエクスプレスエディションの設定方法が書いてあるので参考にしてください。


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

Name: 風鈴  ..かけだし(1,218ポイント)   Date: 2007/03/31(土) 01:55   No:6300     
Title: Re:RPGサンプルプログラム    
なんとか、インストールのときのエラーも解消し、登録等もしてslnファイルも開けました。
本当にありがとうございます。

まだ使っては無いですが、VCはBCCより使いやすいかもですね。


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

Name: 管理人 [URL]  ..ハッカー(255,201ポイント)   Date: 2007/03/31(土) 01:57   No:6301     
Title: Re:RPGサンプルプログラム    
よかったです☆
ただ今その続きを作成中です。



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

Name: 管理人 [URL]  ..ハッカー(255,347ポイント)   Date: 2007/03/31(土) 07:08   No:6302     
Title: Re:RPGサンプルプログラム    
今日もずっと作ってたんですが、戦闘シーンが少し出来ただけです。
ゲームは素材を用意するのにプログラムと同じ位時間がかかってしまうので、ちと時間かかってしまいました。

今日は遅いので・・というかもう朝なのでこの辺で。

今日出来たところまでアップします。

http://dixq.net/zip/rpg2.zip


・読み込みの%は正確に計算していません。
・歩いたらすぐ戦闘になるようにしてあります。
・戦闘項目はどれを選んでも通常攻撃になります。



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

Name: 管理人 [URL]  ..ハッカー(255,700ポイント)   Date: 2007/03/31(土) 21:35   No:6306     
Title: Re:RPGサンプルプログラム    
http://dixq.net/zip/rpg3.zip

町を徘徊する人を作ってみました。

20歩前後歩くと戦闘になります。


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

Name: 風鈴  ..かけだし(1,273ポイント)   Date: 2007/03/31(土) 22:05   No:6307     
Title: Re:RPGサンプルプログラム    
ありがとうございます。
でも、お体を壊さぬ程度にお願いします;

rpg3.zipもrpg2.zipも両方とも解凍できないのですが、何か問題でもあるのでしょうか。
rpg.zipのほうは今も解凍できます。


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

Name: 管理人 [URL]  ..ハッカー(255,743ポイント)   Date: 2007/03/31(土) 22:44   No:6309     
Title: Re:RPGサンプルプログラム    
え、解凍できない・・・ですか?

http://dixq.net/zip/rpg3.lzh

にもあげましたので試してみてください。
他の方はうまく解凍できたと報告があったのですが・・。


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

Name: 風鈴  ..かけだし(1,332ポイント)   Date: 2007/03/31(土) 23:17   No:6311     
Title: Re:RPGサンプルプログラム    
無事解凍できました。どうもです。
さきほどのは、なんか解凍が途中で中断(?)みたいになってしまってたんですが。


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

Name: 管理人 [URL]  ..ハッカー(256,399ポイント)   Date: 2007/04/01(日) 03:44   No:6314     
Title: Re:RPGサンプルプログラム    
次のアップします。

http://dixq.net/zip/rpg4.zip

戦闘に入って一応一方的に戦えます。
もし作ってほしい路線外れてると感じられましたら言ってください。

ダメージの計算方法は何がいいですかね?

ダメージの計算方法は色々考えて色々実験してみたんですが、



rand1=GetRand(10000)/10000.0;
rand2=GetRand(20000)/10000.0;

D = (lv*2) + ((自分の攻撃力+武器のダメージ値)-(相手の防御力+相手の装備)) * 自分の力 * rand1 + 自分の力 * rand2;

もしDが負になればDは0

以下10000回計算した結果です。

lv攻撃力など全部25にした時
最小値=50.005000 最大値= 99.997500 平均71.461380

攻撃力を1上げた時
最小値=50.055500 最大値=102.269000 平均72.632101

力を1上げた時
最小値=50.005200 最大値=101.997400 平均72.319835

だいたい攻撃力や力を1あがれば平均のダメージも1あがります。

 
 

で、計算してみました。
ホントは突然Dを0にしない方がいいでしょうけど、計算が複雑になるので、このようにしました。
特にご希望がなければこれで以降と思いますが、何かいい計算方法ご存知でしたら教えてくださいm(_ _)m


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

Name: 管理人 [URL]  ..ハッカー(256,676ポイント)   Date: 2007/04/01(日) 04:48   No:6316     
Title: Re:RPGサンプルプログラム    
色々考えたんですが、実際に遊んでみるとどの値も均等に出てくるのはなんか変ですね。
中心ないし、特定の値を最頻値として分布するようにプログラムしないといけないかもしれません。
例えば上記画像のような式で計算すると正規分布が表現できますよね。

このように特定の値を最頻値としてばらつきを持たせた方が自然かもしれません。
正規分布はこんな感じです。



最頻値を最小値よりにしておき、何かのアイテムを使用したり何かの魔法を使用すると最頻値が最大値よりになるといった計算式の方が面白いように思います。

実際のRPGってどんな風に値を決定しているんでしょうね?


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

Name: Hermit  ..かけだし(1,982ポイント)   Date: 2007/04/01(日) 08:49   No:6322     
Title: Re:RPGサンプルプログラム    
正規分布の乱数が欲しいってことかな?
ボックス・ミューラー法が、一番手っ取り早い気がします。
あとは、それを加工すれば何とかなりそうな気がしますが。


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

Name: 管理人 [URL]  ..ハッカー(259,073ポイント)   Date: 2007/04/01(日) 09:04   No:6325     
Title: Re:RPGサンプルプログラム    
一応勝敗判定を付け、エンドレスで遊べるようにはなりました。
微妙に注釈もつけ始めています。
行動は何を選んでも一種類しか行いません。

http://dixq.net/zip/rpg5.zip

今日はこの辺にしておきます。

ダメージの計算式考えていたら朝になってしまった^^;

>Hermitさん、

ありがとうございます。
http://atmori.info/engineer/matx/matxnormalrand.htm
この辺みてみると
rnd()を0〜1とした時
t=sqrt(-2.0 * log(1-rnd()));
u=2*PI*rnd();
r1=t*cos(u) ; r2=t*sin(u);
で求まると書いてあったのでやってみたんですけど、うまくいかないんですよね・・;

実行結果
min:-1.711381 max0.803275 平均-0.247841

分布を表現させてみると

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

こんな感じに・・。
もうちょっと正規分布のプログラムついて調べてみます。
randn関数もあるようですが、これも利用方法がよくわからないので・・。
ちょっと今日はもう遅いので(っていう時間でもないですが^^;)明日調べてみようと思いますm(_ _)m


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

Name: Hermit  ..入門者(2,542ポイント)   Date: 2007/04/01(日) 09:34   No:6326     
Title: Re:RPGサンプルプログラム    
昔見ていたところがわからなくなったので、

基本的に、rand を 2個利用します。

    v=root(-2ln(x))*cos(2πy)
    w=root(-2ln(y))*cos(2πx)

ふたつの rand の値で、二つの正規分布乱数が発生できます。
でも面倒なので、ふたつの rand 値で、一つだけ作っただけでもよさそうな気がします。
cos だけ使っていますが、乱数を使って、0〜2Πまでまわしているだけなので、sin だけでもかまいません。

使っている、x,y の乱数を、さしかえるだけで、ふたつの正規分布乱数を作っているだけですので、
2値を返すようにするか、一回二つの乱数を発生させたら、次は乱数を発生させないようにして、
x,y を差し替えるなどの対策が必要ですので、
めんどうなので、毎回、rand ふたつを使った方が楽だと思います。

ln (log) は、大域エラーがでないように注意する必要があるのは・・・これはわかりますね(^^;

これで、平均値 0.0 標準偏差(σ) 1.0 になるはずです。


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

Name: Justy  ..比類無きプログラマー(73,012ポイント)   Date: 2007/04/01(日) 11:47   No:6327     
Title: Re:RPGサンプルプログラム    
 まとめると、こんなかんじでしょうか

double rand_normal()

{
static double r1, r2, s;
static int valid = 0;
double c;
if(!valid)
{
r1 = (double)(rand() - 1) / RAND_MAX;
r2 = (double)(rand() - 1) / RAND_MAX;
s = sqrt(-2.0 * log(1.0 - r2));
}
valid = !valid;
c = 2.0 * M_PI * r1;
return valid? s * sin(c): s * cos(c);
}


 static使っちゃってるところがアレですが、クラス化すれば
すっきりするかと。


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

Name: 管理人 [URL]  ..ハッカー(259,319ポイント)   Date: 2007/04/01(日) 15:48   No:6328     
Title: Re:RPGサンプルプログラム    
あら、なんか私が質問したみたいになってしまってすみません^^;

Hermitさん、理論の説明ありがとうございます。
Justyさん、サンプルありがとうございます。

無事出来ました☆
といってもほとんど写しですが^^;

double rand_normal(double to);

として、toまでの正規分布する乱数を返す関数としました。

ただ、定義のKAISUの0を少なくするとただしく平均が表示されるんですが、
これだときちんと表示されないのは何でなのでしょう・・。
実行結果は画像のようになりました。

ん〜平均はdoubleで計算されているし・・。なんできちんと表示されないのか・・。


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

#define PI 3.14159265358979323846264
#define KAISU 100000

double rand_normal(double to){
static double r1, r2, s , r;
static int valid = 0;
double c;
if(!valid)
{
r1 = (double)(rand() - 1) / RAND_MAX;
r2 = (double)(rand() - 1) / RAND_MAX;
s = sqrt(-2.0 * log(1.0 - r2));
}
valid = !valid;
c = 2.0 * PI * r1;
r=valid? s * sin(c): s * cos(c);
r=(r+5.0)/10.0;
return r*to;
}

int main(){
int i,j,bunpu[100]={};
int lv=20,power=20,weapon=20,def=20,equip=20,strong=20;
double p,min=50,max=50,total=0.0;
srand((unsigned)time(NULL));

for(i=0;i<KAISU;i++){
p= lv*2+(power+weapon-(def+equip))*strong*rand_normal(2.0)+strong*rand_normal(4.0);
if(min>p)min=p;
if(max<p)max=p;
total+=p;
for(j=0;j<100;j++){
if(10+j<p && p<=11+j)
bunpu[j]++;
}
}

printf("min:%f max%f 平均%f\n",min,max,total/KAISU);
for(i=40;i<100;i++){
printf("%2d:",i);
for(j=0;j<bunpu[i]/(KAISU/4000);j++)
printf("*");
printf("\n");
}

return 0;
}



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

Name: Justy  ..比類無きプログラマー(73,891ポイント)   Date: 2007/04/01(日) 17:20   No:6329     
Title: Re:RPGサンプルプログラム    
 まずはさっきのルーチンはちょっとバグってました。
 すみません。
 ごく希に NaNになってしまいます。

 改善版です。

#include <math.h>

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

#define PI 3.14159265358979323846264
#define KAISU 10000
#define ARRAY_BUFFER_SIZE 100

double rand_normal(double sigma, double average)
{
static double r1, r2, s , r;
static int valid = 0;
double c;
if(!valid)
{
r1 = rand() / ((double)RAND_MAX+1);
r2 = rand() / ((double)RAND_MAX+1);
s = sqrt(-2.0 * log(1.0 - r2));
}
valid = !valid;
c = 2.0 * PI * r1;
r=valid? s * sin(c): s * cos(c);
return r * sigma + average;
}

int main(void)
{
int index, div, bunpu[ARRAY_BUFFER_SIZE]={};
double min=DBL_MAX, max=DBL_MIN, total=0.0, avg;
srand((unsigned)time(NULL));

for(index=0;index<KAISU;index++)
{
double p = rand_normal(5.0, 50.0);
int ip = (int)p;
if(min > p) min = p;
if(max < p) max = p;
total += p;
if(ip < 0) bunpu[0]++;
else
if(ip >= ARRAY_BUFFER_SIZE) bunpu[ARRAY_BUFFER_SIZE-1]++;
else bunpu[ip]++;
}
avg = total/KAISU;
printf("min:%f max%f 平均%f\n", min, max, avg);

div = (int)bunpu[50] / 60;
for(index=1; index<ARRAY_BUFFER_SIZE-1; index++)
{
printf("%2d:",index);
int count = 0;
for(count=0; count<bunpu[index]/div; count++)
printf("*");
printf("\n");
}

return 0;
}


 今度のは Nanになりませんし、引数で散らばり具合と中央値(平均)を指定できるようにしてみました。
 綺麗に分布できてると思います。

 ちなみに bunpu[0]と bunpu[ARRAY_BUFFER_SIZE-1]は範囲からはみ出たもの、
として扱っているので表示していません。


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

Name: Justy  ..比類無きプログラマー(74,075ポイント)   Date: 2007/04/01(日) 18:01   No:6330     
Title: Re:RPGサンプルプログラム    
実際のRPGってどんな風に値を決定しているんでしょうね?

 スキルがどうとかアイテム補正、立ち位置とかによって変化するので
いろいろ複雑になっているとは思いますが、普通にぶれ幅決めてランダムって
パターンかと思いますよ。

 やっぱり、RPGとかだと厳密性よりも気持ちよくバトルできるかどうかに
かかってきますから、そのあたりはゲーム性に関わらない限り単純化されると思います。
(式が複雑だとデバッグ・調整も大変ですし)

 シミュレーション系とかじゃないと、正規分布を使う、ってところまでいかない
ような気がしますね。


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

Name: 管理人 [URL]  ..ハッカー(259,364ポイント)   Date: 2007/04/01(日) 18:04   No:6331     
Title: Re:RPGサンプルプログラム    
おぉ、rand_normalとても使いやすいです☆
ありがとうございます^^
この関数を利用させていただきたいと思います♪


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

Name: 管理人 [URL]  ..ハッカー(259,605ポイント)   Date: 2007/04/01(日) 18:09   No:6332     
Title: Re:RPGサンプルプログラム    
そうですかぁ、FF11のようにものすごく厳密な計算式で表現されているであろうゲームをよくやっていたせいかダメージの計算式もちょっとこだわってみたくなりました。
いや〜FF11はすごかったです。限りなく完成されたゲームでした。

どんなレベルとレベルで戦ってもおかしい数値が出ないように、
またレベルが上がるごとにふさわしい値が出るように計算式を作るのは結構大変ですね。

ま、今回はサンプルということで(私のような人間が作るものがサンプルとなっていいのかわかりませんが・・)厳密性より単純化したものを一通り作る事に力を入れたいと思います☆


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

Name: 風鈴  ..かけだし(1,405ポイント)   Date: 2007/04/01(日) 20:51   No:6333     
Title: Re:RPGサンプルプログラム    
私にはまだ理解はできませんが、この一連の流れを保存させていただいております。
いつか、理解できるように。

本当にサンプルありがとうございます。
少しずつですが、自分なりにアレンジしてみたりしてます。
「習うより慣れろ」って、まさにその通りだと思います。


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

Name: 管理人 [URL]  ..ハッカー(259,739ポイント)   Date: 2007/04/01(日) 21:13   No:6334     
Title: Re:RPGサンプルプログラム    
まだ注釈も何も書いてないんで、流れを掴むのは難しいと思います。
私も人の書いたプログラムを理解するのは大の苦手です・・;
ましてやフラグの仕様もわからないのにプログラムだけ渡されても解る方が不思議です^^;
最後にはちゃんとフローチャートみたいな流れも書いて説明しますので、ご安心下さい^^


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

Name: Hermit  ..入門者(2,676ポイント)   Date: 2007/04/01(日) 22:33   No:6336     
Title: Re:RPGサンプルプログラム    
Justyさんのプログラムで、
1回目と2回目で、sin と、cos での変化しか無いようですが・・・

例えば、θが45度だったら、1回目と2回目の数値は同じになってしまいます。
その為、x と y を入れ替える必要があります。
Justyさんのプログラム中だと、r1 と、r2 を入れ替えて、
log の方で使った rand で得た数値を、sin(またはcos) の方で
sin(または cos) の方で使った rand の数値を、log の方で使う必要があります。

まあ、そこまでする必要が無ければそれでもいいのですが。
(正規分布にはなるので)


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

Name: Justy  ..比類無きプログラマー(74,245ポイント)   Date: 2007/04/01(日) 23:51   No:6341     
Title: Re:RPGサンプルプログラム    
1回目と2回目で、sin と、cos での変化しか無いようですが・・・
 ご指摘の通りだと思いますが、意図したとおりでもあります。

 一様分布ではないのでそういう偏りはあっていいでしょうし
(実装的に45度ぴったしが出るというのも今の RAND_MAXの精度ではなかなか)
根本的に「同じ値が連続して出る可能性が全くない乱数」というのは乱数としては
ちょっとどうだろう、というところもあります。

 正規分布な乱数を出力する方法は他にも幾つかあるので、
そのうちの1つ、と思って頂ければ σ(^_^;)


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

Name: 風鈴  ..かけだし(1,507ポイント)   Date: 2007/04/02(月) 20:08   No:6357     
Title: Re:RPGサンプルプログラム    
rpg5.zipですが、壊れていて解凍ができないのですが・・・。
いつも使っていた解凍ソフトがいけないのかと思い、LhazをDLして解凍してみたのですが
書庫が壊れていると表示されます。

ちなみに、ファイルのサイズ
rpg.zip |8,351KB
rpg5.zip|1,123KB


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

Name: 管理人 [URL]  ..ハッカー(260,766ポイント)   Date: 2007/04/02(月) 21:03   No:6364     
Title: Re:RPGサンプルプログラム    
ちょっと調べてみますね。

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

Name: 管理人 [URL]  ..ハッカー(260,830ポイント)   Date: 2007/04/02(月) 21:13   No:6365     
Title: Re:RPGサンプルプログラム    
これでどうでしょうか?

http://dixq.net/zip/rpg6.zip

ちなみにこれは作りかけですので開けるかどうかだけ確認してください^^;


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

Name: 風鈴  ..かけだし(1,531ポイント)   Date: 2007/04/02(月) 21:21   No:6366     
Title: Re:RPGサンプルプログラム    
そちらは無事解凍できました。
ファイルサイズも8KBを超えています。


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

Name: 管理人 [URL]  ..ハッカー(262,338ポイント)   Date: 2007/04/02(月) 21:53   No:6371     
Title: Re:RPGサンプルプログラム    
>ファイルサイズも8KBを超えています。

8MBですね?いや、一応念のために^^;
今後拡張性を持たせる為にもうちっと汎用的に書き直して、端から注釈かいているんで今日は少しまともなアップが出来るんじゃないかと思います(_ _)


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

Name: 風鈴  ..かけだし(1,590ポイント)   Date: 2007/04/02(月) 22:03   No:6375     
Title: Re:RPGサンプルプログラム    
あぁ、8MBです;

本当にわざわざありがとうございます。
実際にゲームプレイするのと、ゲームを作る肯定を考えながらプレイするのとではちょっと違いますね。
少しずつ形になっているのがとても面白いです。


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

Name: Justy  ..比類無きプログラマー(74,379ポイント)   Date: 2007/04/02(月) 22:51   No:6376     
Title: Re:RPGサンプルプログラム    
@ 管理人さんへ

 前から気になっていたのですが、zipの中に

・ *.suo
・ *.ncb
・ Thumbs.db

 のファイルが入っています。
 これらはビルド&実行には(つまり配布時には)不要なファイルです。

 特に上2つは開発しているディレクトリがどこかとか、余計な情報を
含んでいることがありますので、削除しておいた方がいいかと思います。
(ncbはファイルサイズもでかいので、削除するとぐっと zipサイズが小さくなります)


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

Name: 管理人 [URL]  ..ハッカー(262,715ポイント)   Date: 2007/04/02(月) 23:05   No:6377     
Title: Re:RPGサンプルプログラム    
わ〜容量食ってますね〜このファイル!
ありがとうございますm(_ _)m


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

Name: 管理人 [URL]  ..ハッカー(265,039ポイント)   Date: 2007/04/03(火) 11:27   No:6392     
Title: Re:RPGサンプルプログラム    
すみません、遅くなりました。
やっとアップロードします^^;

いい加減なメモ程度の仕様書ですが、仕様書もspecifications.cppファイルに書いておきました。
ちょっとフローチャートは時間がかかるので(_ _||)

全ての関数に注釈を書いておきましたので、メイン関数から順々に
みていけば理解していただけると思います。

一度実行して正常に実行できる事を確認していただいてから見ていただけますでしょうか?

描画される内容としてはほとんど変更がないですが、矛盾の起きる場所や複雑な場所、統一性のないところなどプログラムの修正をあちこちしました。

また、ダメージの計算式はあれこれ実験してこれがいいだろうと思うものがいれてあります。
少々レベルがかわってもあれで対応できると思います。
ただステータスにかなり差が有る場合、ダメージがマイナスになる事がありますので、
そこは、負に成る時はすっぱり0にするのか、
工夫して限りなく0に近くなるようにするのかお好みでどうぞ。

防具や武器は作っていませんが、
ch[0].weaponにセット出来るようになっています。
防具も
ch[0].equip
にセット出来ます。
帽子や手袋を使用するときはここを増やしてください。

ファイルアップしておきます。

http://dixq.net/zip/rpg7.zip

これからもご希望があれば時間があるとき沿って拡張していこうと思います。


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

Name: 風鈴  ..かけだし(1,678ポイント)   Date: 2007/04/03(火) 13:51   No:6414     
Title: Re:RPGサンプルプログラム    
本当にありがとうございます。
なんか、なるほど・・・って感じで読ませていただいてます。

ちょっと話はそれますが
マップエディタやグラフィックエディタ等ゲームを作りに役立つソフトでオススメのものなどありますか?
フリー・シェアどちらでも構わないので、あったら教えてください。


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

Name: 管理人 [URL]  ..ハッカー(268,036ポイント)   Date: 2007/04/03(火) 18:01   No:6429     
Title: Re:RPGサンプルプログラム    
>マップエディタやグラフィックエディタ等ゲームを作りに役立つソフトでオススメのものなどありますか?

そうですねぇ、手書きでマップを書くのは限界がありますもんね。
特にマップチップの種類が2桁になると配列書く時にとてもみにくく・・。
私は
・プログラムでマップを書くには限界がある・・
・趣味の範囲で利用する
ということからRPGツクールの体験版を利用し、(データが保存できないのでスクリーンショット使って保存)、その画像を使っていました。
だからマップチップを使うと言う事ではなく。
しかしこれは容量が大きくなってしまうと言う問題があり、プログラム内で絵が変更できないという問題がありました。

マップエディタを利用するという事を考えた事がなかったので今日探してみます。
いいソフトが見つかったら報告しますね。


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

Name:  ..ぴよぴよ(162ポイント)   Date: 2007/04/03(火) 19:07   No:6440     
Title: Re:RPGサンプルプログラム    
【HSP】
http://www.onionsoft.net/hsp/contest2003/data/hspcontest_524.zip
【不明(ぇ】
http://www.vector.co.jp/soft/win95/game/se231004.html?g

これとかどうでしょうか?

昔HSPでかなり良いのがあったことを記憶していますが、場所がわからなくなってしまいました。
時間が無いので少ししか調べてませんが、良ければ調べてみてください。
【マップエディタ】【作り方】【HSP】見たいな感じの言葉で…


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

Name: Justy  ..比類無きプログラマー(74,795ポイント)   Date: 2007/04/03(火) 21:31   No:6449     
Title: Re:RPGサンプルプログラム    
 下の Platinumはレイヤー機能が結構充実しててよさげですね。


 既にこれで十分な気がしますが、一応ググってみたのを参考までに乗せておきます。

ME MapEditer(Windows95/98/Me / ゲーム)
http://www.vector.co.jp/soft/win95/game/se190983.html

TMapEditer2D 使用上の注意
http://homepage1.nifty.com/mizu-yan/download/tools/tmap_manu.html

Map Editor
http://www.geocities.com/SiliconValley/Vista/7336/robmpy.htm

マップエディターQuoyle(Windows95/98/Me / ゲーム)
http://www.vector.co.jp/soft/win95/game/se386079.html?site=n

マップエディター ANoME(あのみぃ)(Windows95/98/Me / プログラミング)
http://www.vector.co.jp/soft/win95/prog/se222575.html

EgA(Windows95/98/Me / ゲーム)
http://www.vector.co.jp/soft/win95/game/se148524.html

簡易凡用マップエディター(Windows95/98/Me / 文書作成)
http://www.vector.co.jp/soft/win95/writing/se203463.html

リンカとイオナの C++ Diary
http://s-werke.sakura.ne.jp/cppdiary/


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

Name: 管理人 [URL]  ..ハッカー(269,417ポイント)   Date: 2007/04/04(水) 01:07   No:6458     
Title: Re:RPGサンプルプログラム    
おぉぉ、沢山あるんですねぇ。
一つずつ見て行きますね。
雷さんの下の奴結構使えますね。
ただ私はスクロールより固定のマップを使用するんで最初から作ったマップでもいいようなきがするんですよねぇ容量は多くなりますが。

やっぱRPGはスクロールマップのほうがいいのかな?


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

Name:  ..ぴよぴよ(421ポイント)   Date: 2007/04/04(水) 04:22   No:6465     
Title: Re:RPGサンプルプログラム    
昔HSP使おうとしてたとき、マップの製作で両方とも使えるのがあったはずなんですがHD死んだときに一緒にぶっ飛んでしまったので・・・^^;

一番したのは使っては居ませんがw


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

Name: 管理人 [URL]  ..ハッカー(271,770ポイント)   Date: 2007/04/05(木) 18:52   No:6498     
Title: Re:RPGサンプルプログラム    
魔法が使えるようにしてみました。

http://dixq.net/zip/rpg8.zip

まだ新しく作った部分の注釈は書いてないです^^;

魔法はキュア以外が使用できます。
下の魔法ほど強く、詠唱に時間がかかります。

他通常攻撃以外を選択しても全て通常攻撃になるようになっています。


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

Name: 管理人 [URL]  ..ハッカー(274,539ポイント)   Date: 2007/04/06(金) 01:02   No:6514     
Title: Re:RPGサンプルプログラム    
HPの減少にモーションをつけてみました。
戦闘シーンのオープニングは省略してあります。

http://dixq.net/zip/rpg9.zip

またまた新しく作った部分の注釈は書いてないです^^;


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

Name: 管理人 [URL]  ..ハッカー(275,019ポイント)   Date: 2007/04/06(金) 12:32   No:6517     
Title: Re:RPGサンプルプログラム    
HPやアイコンの表示をキレイにしてみました。
項目を選択中に選択項目の説明が上に出るようにしました。

http://dixq.net/zip/rpg10.zip

まだ作成中のアクションのものを選択すると全部通常攻撃になります。


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

Name: 風鈴  ..かけだし(1,747ポイント)   Date: 2007/04/06(金) 12:58   No:6518     
Title: Re:RPGサンプルプログラム    
ちょっと最近用事があり、返事が遅れてしまいました。
その間に相当進んでるみたいで、ありがとうございます。

マップエディタも色々あるんですね。
自分で調べていろいろ試したりしたんですが、中々なじめなくて^^;
少しずつ試して、自分に合ったもの探してみます。


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

Name: 管理人 [URL]  ..ハッカー(275,362ポイント)   Date: 2007/04/06(金) 21:34   No:6521     
Title: Re:RPGサンプルプログラム    
勝手に作ってるんで、気が向いた時見てください(笑

HP,MPなどの表示をキレイにして関数をモジュール化しました。
ダメージ値のポップの仕方も少々工夫しました。

http://dixq.net/zip/rpg11.zip

まだ作成中のアクションのものを選択すると全部通常攻撃になります。


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

Name: BAZZ  ..ぴよぴよ(526ポイント)   Date: 2007/04/06(金) 22:04   No:6522     
Title: Re:RPGサンプルプログラム    
がんばっておいでですね(≧∀≦)
サンプルプログラム結構重要だと思いますので
応援してますw

さてドット絵ドット絵・・・
いいんですよね?雑談だし・・・


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

Name: 管理人 [URL]  ..ハッカー(275,747ポイント)   Date: 2007/04/07(土) 05:13   No:6537     
Title: Re:RPGサンプルプログラム    
あるところから早くボムマンをオンライン化してくれという要望が・・w
春休みが終わってしまった・・。

ぼちぼちがんばりますw

いや〜雑談はいつでもウェルカムですよ^^
もう掲示板を個人的な日記帳にしてくれてもいい勢いですからお気遣い無くw


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

Name: 管理人 [URL]  ..ハッカー(276,221ポイント)   Date: 2007/04/07(土) 18:04   No:6557     
Title: Re:RPGサンプルプログラム    
新しくアップします。

毎回違う記述のしかたをすると見にくいと思うので、今度から追加した機能と仕様を以下のようなフォーマット記述でお伝えします。

http://dixq.net/zip/rpg12.zip

今回追加した機能
・メッセージボード2を追加。メッセージが2段にわかれて表示されます。2つ以上同時に表示すべきメッセージがあったときは時間差で表示します。
・アビリティを下から4つ実装しました。

仕様
・戦闘突入モーションは省いてあります。
・「通常攻撃」「魔法下から4つ」「アビリティ下から4つ」が実装済み。それ以外を選択すると通常攻撃になる。
・アビリティが時間がたたなくても再度使用可能なのはまだ入力禁止が未実装だからです。

追加注釈
なし


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

Name: 管理人 [URL]  ..ハッカー(278,625ポイント)   Date: 2007/04/08(日) 01:36   No:6591     
Title: Re:RPGサンプルプログラム    
別トピでは皆さんお世話になりました(_ _)
魔法は全部唱えられるようになりました。
今回ヘイトの向きを表示するシステムを追加しました。

http://dixq.net/zip/rpg13.zip

今回追加した機能
・ヘイトの向かう向き表示
・キュア

仕様
・ダンジョンで戦闘になる確率は極端に高くしてあります。
・通常攻撃、魔法全部、挑発以外のアビ、が実装済みです。
・アビの使用可不可はまだ判定していません。

追加注釈
なし


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

Name: 管理人 [URL]  ..ハッカー(280,601ポイント)   Date: 2007/04/09(月) 03:05   No:6626     
Title: Re:RPGサンプルプログラム    
今日の更新は
「管理人が桜を見に行ってきた」という個人的などうでもいい理由でちりゆく桜をつけてみました・・ただそれだけです^^;

桜が流れ始めて30秒くらい立てば3Dっぽく見え・・・・・ないか^^;

http://dixq.net/zip/rpg14.zip


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

Name: 風鈴  ..かけだし(1,808ポイント)   Date: 2007/04/13(金) 01:54   No:6763     
Title: Re:RPGサンプルプログラム    
おー・・・。すごいの一言です。
自分の好きな世界を作れるっていうのは、ゲーム作りの本当にいいところですよね。

ゲームを作る際、1番気にすることってなにかありますか?
例えばタイトル画面やシナリオ、音楽など。


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

Name: 管理人 [URL]  ..ハッカー(288,327ポイント)   Date: 2007/04/13(金) 03:24   No:6764     
Title: Re:RPGサンプルプログラム    
>自分の好きな世界を作れるっていうのは、ゲーム作りの本当にいいところですよね。

そうですね〜^^
雪のシーズンは雪降らせてみたり、クリスマスシーズンは星降らせてみたり☆

>ゲームを作る際、1番気にすることってなにかありますか?

SPボムマンを作る時に気をつけたのは「素人くささをどこまで無くせるか」って事でした。
私のような人間がそんな目標をもつのは恐れ多いですが、
実際フリーのゲームって「あ、やっぱ素人が作ったゲームだな」って感じパッとみただけで感じるじゃないですか。
そういうのなくしたいな〜と思いました。
しかしそうなると自然とグラフィックを向上させる必要がでてきて、サウンドを向上させる必要が出てきて・・。
プログラムだけじゃどうにもならない話になってきますよね。
まぁその辺は自分で作れないのでどこまで素材サイトをうまく見つけるかという別の道になっていっちゃうんですけど。

私は・・全て凝りますかねぇ・・。凝ってる割にはたいした作品になってませんけど、無駄に時間だけかかっています^^;
RPGを作るならストーリーにももちろん力をいれますが、やはり一番RPGやってて沢山の時間行うのは戦闘でしょうからいかに戦闘シーンを面白くするかにも力をいれます。
ダメージ計算などももっと複雑にした方がプレイヤーは色々考えられるでしょうし。
シューティングならどれだけ鮮やかな弾幕を作るか、ZUNさんのような弾幕をお手本にがんばります。
教育ソフト系なら自分が解らなくてひぃひぃいていたことを思い出しながら作れば自然とわかりやすくなるように思います。

学校が始まって、バイトも始まって忙しくなってしまったので、あまり作れなくなってしまいましたがこれからも時間を見つけてアップしていきますよ^^
私のサンプルが出来上がるのはずっと先でしょうから、ある程度つかめたら、ご自分で作っていってくださいね♪


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

Name: バグ  ..プログラマー(36,762ポイント)   Date: 2007/04/13(金) 08:19   No:6766     
Title: Re:RPGサンプルプログラム    
私の場合は、見た目よりも操作感にいっちゃいますね。
ようするに、どれだけ気持ち良く遊べるかって事なんですけどね。
カラードロップを作った時にも、キビキビと動くようにできる限りシンプルにしたつもりなんですが…今見ると、まだまだ無駄が多いです(;^_^A
気持ち良く遊べるってのは、スピードだけではなく演出も重要ですよね。落ち物パズルで最高に気持ち良い瞬間ってのは、ブロックが消えた時だと私は思っています。
ただ消えるだけではなく、ちょっとした演出をはさんで消える事で、更にプレイヤーの達成感を刺激できると思うんですよね。
そんな理由で小細工ではあるんですが、カラドロでは消える前にブロックを点滅させたりしてます。
見た目が派手で、演出も完璧なら言うことないんでしょうが、絵心が0な私なので、どうしようもないです(苦笑)


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

Name: 管理人 [URL]  ..ハッカー(288,633ポイント)   Date: 2007/04/13(金) 09:58   No:6767     
Title: Re:RPGサンプルプログラム    
バグさんカラドロ力いれていらっしゃいますねw
いや〜コンソールの自分の中での常識が打ち破られましたよ^^
DXライブラリでの製作は進んでますか?


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

Name: バグ  ..プログラマー(36,845ポイント)   Date: 2007/04/13(金) 10:05   No:6768     
Title: Re:RPGサンプルプログラム    
DxLib版は完全に凍結状態です(笑)
今はMFC版とWIN32API版を勉強しつつ同時進行させてます。まだまだ知らない事ばかりだなぁ…と痛感する日々です(苦笑)
でも、それが楽しいんですよね(^-^)


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

Name: 管理人 [URL]  ..ハッカー(288,824ポイント)   Date: 2007/04/13(金) 10:24   No:6769     
Title: Re:RPGサンプルプログラム    
なるほど〜^^
私は逆にDXライブラリばっかり頼らずにそろそろ抜け出せよ、と自分で思っていますw
DirecXの勉強したいんですが、9の勉強すればいいのか10の勉強すればいいのかで悩んでいます。
どっち勉強するかでそんな違うものなんですかね〜?
Directシリーズは新しいバージョンがでると一気に古いバージョンの本が店頭から消え去るので少しでも古いバージョンに手を出すと本屋で立ち読みができなく・・。
C++も勉強しないといけないし、ウィンドウズプログラミングの知識も付けたい。
授業にバイトもあるし、、あぁ春休みのように時間がないなぁ。。

てかずっとSPボムマン作ってて、大型の免許取りにいけなかった(T_T


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

Name: parapara  ..入門者(4,520ポイント)   Date: 2007/04/17(火) 19:59   No:6935     
Title: Re:RPGサンプルプログラム    
サンプルのような
俺も管理人さんのようにRPG作れるようになりたいです。
特に古いバージョンの戦闘シーンに入るときの画面がいくつかの長方形に分かれたり、
する所とか、その直後の敵と自キャラのズームアップとか、憧れますね。
ただこんな事いえるようなスキル未だ無いんですけど、
自分としてはDirectXを使いたいです。


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

Name: 管理人 [URL]  ..ハッカー(297,648ポイント)   Date: 2007/04/17(火) 22:55   No:6942     
Title: Re:RPGサンプルプログラム    
>特に古いバージョンの戦闘シーンに入るときの画面がいくつかの長方形に分かれたり、

古いバージョンとはどれでしょうか?
一応どのバージョンでも同じ戦闘の入り方ですが^^;

>憧れますね。

ありがとうございます、ただソースもプロジェクトファイルも一緒に同梱してありますので、どのようなアルゴリズムか確認できますよ。

一回画面を16分割してキャプチャから中心から外へ向かってすべらし、乱数つかって自由落下・・としています。
まぁ戦闘の入り方は人それぞれでしょうね。
本当はガラスが割れたみたいにしたかったのですが、そんなことするとコードが非常に難しくなってしまうのでただの16分割にしました^^;



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

Name: 管理人 [URL]  ..ハッカー(299,112ポイント)   Date: 2007/04/19(木) 02:16   No:6976     
Title: Re:RPGサンプルプログラム    
どれが最新かわからない・・らしいので、明確にしておきます^^;

http://dixq.net/zip/rpg14.zip

今の最新サンプルはこれ↑

ただ桜が舞うのとか別に関係ない気が・・^^;


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

Name: 管理人 [URL]  ..伝説のハッカー(310,892ポイント)   Date: 2007/05/07(月) 09:51   No:7457     
Title: Re:RPGサンプルプログラム    
ダメージ計算についての質問があったので、アップいたします。特に更新はありません。

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



Name: やっかい者  ..ぴよぴよ(45ポイント)   Date: 2007/04/19(木) 14:09   No:6990       
Title: USBの信号検知について    
USBの+信号ピンに数ボルトの直流電圧かけた場合、それをプログラムで感知するWindowsAPI関数はあるでしょうか?信号のやり取りは別にしないのですが・・・(MFCは使いません、できればDirectXあたり)
USBの列挙とか、GET何とかでやりたいのですが・・・
ご教授ください。


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


Name: なぎ  ..上級者(16,318ポイント)   Date: 2007/04/20(金) 08:50   No:7023     
Title: Re:USBの信号検知について    
おそらく、ユーザーサイドから検出することはできないと思います。

まず、USB の D+ には外部から電圧をかけてはいけません。
5V(通常、USB の電源)に対して、 1.5kΩの抵抗でプルアップします。
これによって、OS 側は、USB 機器が(ついでに言えば、High Speed で)接続されたことを認識します。

ですから、OS のどこかで、D+ が 1.5kΩでプルアップされたことは認識できていると思いますが。
ユーザーサイドで使うのは、その後、デバイスドライバ経由で、USB デバイスとして登録が終わった後のことになります。



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

Name: やっかい者  ..ぴよぴよ(0ポイント)   Date: 2007/04/21(土) 21:16   No:7062     
Title: Re:USBの信号検知について    
なぎ 様
回答ありがとうございます・・・
では、自前のUSBドライバーを開発することになるでしょうか?
汎用性のある又はD+端子を認識する代替(同等)のドライバーなどありましたら
ご紹介ください。
C言語からは、かなり離れた質問で恐縮です。


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

Name: なぎ  ..上級者(16,518ポイント)   Date: 2007/04/23(月) 09:00   No:7085     
Title: Re:USBの信号検知について    
いずれにしても、D+ の状態を直接知ることはできないはずです。
USB ドライバへの接続までは OS がやってしまいますし、そのドライバを接続するためには、USB デバイスとして正しくデバイスの開始手続きを(USB デバイス側が)行う必要があります。
このために、少なくとも、ベンダーID(USB デバイスメーカーの識別)と、プロダクトID(具体的なデバイスの識別)が定義されていて、OSに通知される必要があります。

汎用的に使える USB のデバイスドライバとしては、
http://www.otto.to/~kasiwano/newpage17.htm
で紹介されているものが使えそうです。


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

Name: やっかい者  ..ぴよぴよ(12ポイント)   Date: 2007/04/23(月) 14:43   No:7089     
Title: Re:USBの信号検知について    
なぎ様
とにかく、貴重な情報ありがとうございます。

USBのD+端子にTTLレベルの信号が印加されたかどうかの有無、
それだけの目的ではつかえそうです、今は想像でしかものが言えませんが
自分のものにするには時間がかかりそうです。
とにかくお世話になりました。



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

Name: やっかい者  ..ぴよぴよ(138ポイント)   Date: 2007/05/07(月) 08:23   No:7449 解決!     
Title: Re:USBの信号検知について    
>デバイスの開始手続きを(USB デバイス側が)行う必要があります。
>このために、少なくとも、ベンダーID(USB デバイスメーカーの識別)と、プロダクトID

ご指示いただいた、この件ですが・・・
ご指摘通り個人レベルではIDをロムることはできないようです。
市販の最も安価なUSBを分解する事にします。
ありがとうございました。


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



Name: 大工  ..上級者(18,123ポイント)   Date: 2007/05/06(日) 06:24   No:7428       
Title: ちょっとしたことですが・・・    
http://www.cmagazine.jp/src/kinjite/c/notcoding.html#index38

このサイトで少しずつ勉強しています。

1.エンディアンの存在を無視する

2.ポインタをlong型変数で保持できると決めつける

3.stdio.hと同じディレクトリにプライベートヘッダを置く

4.構造体のパッキングを無視する

のそれぞれで

1.エンディアンの意味は知っていますが直接的にプログラミングにどう関わってくるのでしょうか?

2.言いたいことがなにかわかりません><。

3.stdio.hと同じディレクトリにプライベートヘッダを置くことの弊害(?)がわからない・・・

4.説明が短すぎてよくわからない・・・

と4つの問題が発生しました・・・・

ご協力おねがいします><。


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


Name: box  ..比類無きプログラマー(66,475ポイント)   Date: 2007/05/06(日) 12:22   No:7429     
Title: Re:ちょっとしたことですが・・・    
ソフトバンククリエイティブがこの3月に発行した
「すべてのプログラマに効く 危険なプログラムの処方箋」という書籍が、
どうもそのサイトの内容をもとに単行本化したもののようです。


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

Name: しっぽ  ..初心者(5,772ポイント)   Date: 2007/05/06(日) 14:25   No:7431     
Title: Re:ちょっとしたことですが・・・    
Cマガジン廃刊になって寂しいです。


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

Name: Justy  ..比類無きプログラマー(98,134ポイント)   Date: 2007/05/07(月) 01:00   No:7448     
Title: Re:ちょっとしたことですが・・・    
 改めて 2000年4月号の記事を見直してみました。
 いいこと書いてありますね。
 ホント、廃刊が残念です。


1.エンディアンの存在を無視する
 単独のプラットフォームで完結するプログラムにとっては影響がないです。
 しかし、例えば Intel+Windowsと PowerPC+Macとか複数の環境でバイナリーデータの
やりとりを行うときにエンディアンの問題が発生します。

 例えば
    int value;

FILE *fp = fopen("a", "r");
if(fp)
{
fread(&value, sizeof(int), 1, fp);
fclose(fp);
}

 というプログラムがあったとしましょう。
 そして、aというファイルにはファイルの先頭からバイナリーデータで
  12 34 56 78
 という4バイトのデータが入っていたとしましょう。

 さて、freadが終わった後 valueに入っている数値はいくつになるでしょうか。

 或いは
 int i, value;

unsigned char *pc = (unsigned char *)&value;
for(i=0; i<sizeof(int); ++i)
*pc++ = (unsigned char)(i+1);


 で、valueの値はどうなるでしょうか。

 それぞれの環境での valueの値を考えてみて下さい。



「2.ポインタをlong型変数で保持できると決めつける」
言いたいことがなにかわかりません

 ポインタをlong型変数で保持というのは
int value = 0x12345678;

long l = (long)&value;


 こういうようなコードです。
 もし、この環境が sizeof(long) < sizeof(int*)だったら??



3.stdio.hと同じディレクトリにプライベートヘッダを置く
弊害(?)がわからない
 サイトにも書いてありますが、弊害はあまり顕著ではありません。
 しかし、確実に存在します。

 stdio.hと同じディレクトリは普通はコンパイラが管理しているディレクトリであり、
コンパイラをバージョンアップしたりアンインストールしたりしたときに、
そのプライベートヘッダが消えてしまうかもしれません。

 又、コンパイラベンダーが提供するヘッダ名と名前が被った場合、
コンパイル時に間違ったファイルを includeしてしまうかもしれません。

 他にも、ソースを管理する上で様々な不都合が生じます。
 複数人で開発をしていて、バージョン管理とかしはじめると特に。


4.構造体のパッキングを無視する
 同じ構造体でも環境が違えば、構造体のサイズが異う可能性があります。
 それどころか pragmaが使われれば、同じ環境も異なってくる可能性があります。

 それを念頭においた上で fwriteで構造体を丸ごとファイルなどに書き出した場合、
別の環境ではどう読み込めばいいのか、を考えてみて下さい。

 あともう1つ。構造体同士の比較で memcmp1回で比較できるかも
考えてみるといいかと思います。


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



Name: mj  ..ぴよぴよ(312ポイント)   Date: 2007/05/06(日) 02:43   No:7427       
Title: 課題の一部なんですが    
こんばんわ。C言語の課題の一部で少し質問したいところがあり考えても
分らなかったので質問させていただきます。

データ(数値)を50個以下キーボードから入力してそれらをソートして出力するとします。
そのとき入力の仕様が
各行(総文字数は80以下)任意個のデータを1つ以上の空白で区切って入力する.入力データの終わりは / で示す.
とすると,fgets で各行を得て,そのあと,1行の中のデータを切り出す処理をすることになる.文字列型データから整数型データへの変換には atoi が使える.
というふうになっています。

僕はこのうち1行の中のデータを切り出す処理をする仕方が分りません。
よければ教えてください。お願いします。


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


Name: 中吉  ..ぴよぴよ(177ポイント)   Date: 2007/05/06(日) 19:05   No:7439     
Title: Re:課題の一部なんですが    
先の質問は自力でなんとかできるようになったのですが、またわからないところがでてきました。
それは、fgetsでキーボードから複数行を入力する方法がよく分らないことです。
char line[51];
while(fgets(line, sizeof(line), stdin)){
・・・・・
条件式(キーボード入力で最後に//がついている) break;
}
としてみたのですが、
キーボードから1行ならエラーがないのですが、複数行はだめでした。

どなたか教えてください。



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

Name: mj  ..ぴよぴよ(0ポイント)   Date: 2007/05/06(日) 19:05   No:7440     
Title: Re:課題の一部なんですが    
名前を間違ってしまいました・・。



Name: toku  ..ぴよぴよ(32ポイント)   Date: 2007/05/05(土) 18:39   No:7415       
Title: 英単語をソート    
英単語が複数あるファイルから読み込んでソートするプログラムを作っています。
ですがその際に関数strcmpやstrcpyを使うよう指定されたのですが、
ソートプログラムのどこに何のために盛り込めばいいのでしょうか?


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


Name: miyaza  ..初心者(8,703ポイント)   Date: 2007/05/05(土) 19:22   No:7416     
Title: Re:英単語をソート    
ファイルから英単語を読み込んでその単語をソートするためには、単語を比べて並べ替えなければなりません。
その比べるときにstrcmp()関数を使います。

strcmp(str1,str2)
としたとき戻り値が正の数ならstr1の方がstr2よりも大きいということになります。
負の数ならstr2の方が大きいということになります。
0なら同じです。


strcpy()は文字列のコピーです。単語の入れ替え部分で使用します。


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

Name: toku  ..ぴよぴよ(68ポイント)   Date: 2007/05/05(土) 20:46   No:7418     
Title: Re:英単語をソート    
ありがとうございます!

つまり文字数の少ない単語からソートするようにという指示なのでしょうか?


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

Name: box  ..比類無きプログラマー(66,385ポイント)   Date: 2007/05/05(土) 21:01   No:7420     
Title: Re:英単語をソート    
strcmp()を使うということは、おそらく、
辞書に出てくる順序にソートする、ということでありましょう。
単語の文字数は関係ないと思います。


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

Name: miyaza  ..初心者(8,863ポイント)   Date: 2007/05/05(土) 21:02   No:7421     
Title: Re:英単語をソート    
>つまり文字数の少ない単語からソートするようにという指示なのでしょうか?
strcmp()が比べるのは文字数ではありません。

strcmp()はstr1とstr2を辞書式の順序で比較します。
つまり、ABとACという文字列がありstrcmp("AB","AC")としたとき戻り値は正の数になります。

アルファベット順もしくはその逆に並び替えろという指示ではないでしょうか。

strcmp()などの関数については、調べれて見れれば詳しく書いてあります。




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

Name: toku  ..ぴよぴよ(163ポイント)   Date: 2007/05/06(日) 01:18   No:7425 解決!     
Title: Re:英単語をソート    
ありがとうございます!
友人の助けもあってなんとか解決できました。
考え方の根底を間違えていたようです。
strcmpはアルファベットの順序を認識している関数なんですね^^;
本当にありがとうございます♪


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



Name: 夏天 [URL]  ..入門者(4,488ポイント)   Date: 2007/05/05(土) 12:01   No:7408       
Title: 正常終了    
課題研究でゲームを作っています
コンパイルはうまくいくんですが
実行した後正常終了してくれません
どこがいけないのでしょうか

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

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

int MouseX , MouseY ; //マウス位置
int StringCr , BoxCr ; //文字色
int Maru[ 3 ] , Mx = 145 , My = 350 ; //○ボタン
int Batu[ 3 ] , Bx = 390 , By = My ; //×ボタン
int Play_win; //ゲームウィンドウ
int Chara1; //自キャラ
int Time; //制限時間
int FontHandle; //問題文用フォント
int i=0,j=0,k,l=0,Pf=0; //文字用配列 i:文字数 j:行数 k:バッファ配列用 l:問題文の文字カウント Pfページフラグ

char QBuf[4][35]={"","","",""},Question[200] = {"あいうえおかきくけこさしすせそたちつてと"}; //問題文バッファと問題文
int Ans = 0 , Qnum ; //回答と問題番号
int Bflag=3; //ボタンフラグ 0:○ 1:× 2:無回答



if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;

// マウスを表示状態にする
SetMouseDispFlag( TRUE ) ;

// 白色の値を取得
StringCr = GetColor( 255 , 255 , 255 ) ;

// 黒の値を取得
BoxCr = GetColor( 0 , 0 , 0 ) ;
LoadDivGraph( "data/maru.png" , 3 , 3 , 1 , 225 , 225 , Maru ) ;
LoadDivGraph( "data/batu.png" , 3 , 3 , 1 , 225 , 225 , Batu ) ;
Play_win = LoadGraph( "data/play_win.png" ) ;
Chara1 = LoadGraph( "data/chara.png" ) ;

Time = GetNowCount() ;
FontHandle = CreateFontToHandle( NULL , 24 , 0 , DX_FONTTYPE_ANTIALIASING_EDGE) ;

while( GetNowCount() - Time < 600000)
{
//ClearDrawScreen() ;
DrawGraph( 0 , 0 , Play_win , TRUE ) ;
DrawGraph( 600 , 300 , Chara1 , TRUE ) ;
// マウスの位置を取得
GetMousePoint( &MouseX , &MouseY ) ;

DrawBox( 0 , 0 , 200 , 32 , BoxCr , TRUE ) ;

// 座標文字列を描く
DrawFormatString( 0 , 0 , StringCr , "%d" ,MouseX) ;
DrawFormatString( 50 , 0 , StringCr , "%d" ,MouseY) ;



//問題文を表示するところ
if(j < 4){
if(i>=34){
QBuf[j][35] = '\0'; //改行するためにヌル入れる
i=0; //カーソルを最初に戻す
j++; //改行
}
QBuf[j][i] = Question[l];
QBuf[j][i+1] = Question[l+1];
QBuf[j][i+2] = '\0';
}
for(k=0;k<j;k++){
DrawFormatStringToHandle( 150 , 10 + 26 * k , StringCr , FontHandle , "%s" , QBuf[k]) ;
}
if(Question[i] != '\0'){
i+=2;
l+=2;
}

//問題文表示ここまでここまで

//○×ボタン
//○ボタン
if( (MouseX <= Mx + 225 && MouseX >= Mx) && (MouseY <= My + 225 && MouseY >= My) ){
if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 )
{
DrawGraph( Mx , My , Maru[ 2 ] , FALSE ) ;// 押されている
Bflag = 0;
}
else
{
DrawGraph( Mx , My , Maru[ 1 ] , FALSE ) ;// 押されていない
}

}
else{
DrawGraph( Mx , My , Maru[ 0 ] , FALSE ) ;
}

//×ボタン
if( (MouseX <= Bx + 225 && MouseX >= Bx ) && (MouseY <= By + 225 && MouseY >= By) ){
if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 )
{
DrawGraph( Bx , By , Batu[ 2 ] , FALSE ) ;// 押されている
Bflag = 1;
}
else
{
DrawGraph( Bx , By , Batu[ 1 ] , FALSE ) ;// 押されていない
}

}
else{
DrawGraph( Bx , By , Batu[ 0 ] , FALSE ) ;
}
//ボタンここまで

// メッセージ処理
if( ProcessMessage() == -1 )
{
break ; // エラーが起きたらループを抜ける
}


ScreenFlip() ;

if(Bflag != 3) break;

// 一定時間待つ
//WaitTimer( 1000 ) ;

}
StringCr = GetColor( 255 , 255 , 255 ) ;

ScreenFlip() ;
WaitKey() ;


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

return 0 ; // ソフトの終了
}


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


Name: しっぽ  ..入門者(4,690ポイント)   Date: 2007/05/05(土) 13:02   No:7409     
Title: Re:正常終了    

//問題文を表示するところ
if(j < 4){
if(i>=34){
QBuf[j][35] = '\0'; // *1*
i=0; //カーソルを最初に戻す
j++; //改行
}
QBuf[j][i] = Question[l]; // *2*
QBuf[j][i+1] = Question[l+1];
QBuf[j][i+2] = '\0';
}




*1*
j=3, i=34 のとき、
QBuf[3][35] = '\0';
は、配列 QBuf の領域外への書き込みが発生します。

*2*
の3行も、配列 QBuf の領域外への書き込みが発生します。
判り易いところでは、前のif文で、jがインクリメントされて4になれば
QBuf[4][0]、QBuf[4][1]、QBuf[4][2] への書き込みが発生します。
ほかに、j=3,i>=33でも領域外への書き込みが発生します。


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

Name: 夏天 [URL]  ..入門者(4,527ポイント)   Date: 2007/05/05(土) 14:16   No:7410     
Title: Re:正常終了    
しっぽ様のアドバイスの領域外への書き込みが発生するのを防ぐというのは
ただ配列を増やせばいいということでしょうか


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

Name: しっぽ  ..入門者(4,843ポイント)   Date: 2007/05/05(土) 15:39   No:7411     
Title: Re:正常終了    
配列で確保した領域の外への書き込みを行い、メモリの内容が破壊されてしまっていることには
了解いだだけましたか?

配列を増やす。たとえば
char QBuf[5][40]={};
とすれば、私の指摘した部分は解消されますが、お勧めできません。

領域の外への書き込みが発生しない制御方法を考えるべきでしょう。
QBufにどのような文字列が格納されることを期待なさっているのか、教えてくだされば
アドバイスすることは可能です。



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

Name: 夏天 [URL]  ..入門者(4,822ポイント)   Date: 2007/05/05(土) 16:03   No:7412     
Title: Re:正常終了    
自分がやりたいことは先にあげたソースの中には入ってないのですが
外部ファイルから文字列を読み込んで表示するものです。

外部ファイルから問題文をQuestionに入れて
そこからQBufに17文字ずつ入れていく
QBuf[0]にはQuestionの1〜17文字まで
QBuf[1]にはQuestionの18〜34文字まで
QBuf[2](3行目)に何も文字が入っていない場合は
3行目以降からは表示しない
文字はすべて2バイト文字です

問題文が24文字の場合は
QBuf[1]の7文字目まで表示
それ以降は表示しない

というものです

自分はプログラム関係は初心者です
しっぽ様の質問に答えられているかどうかすら不安です


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

Name: しっぽ  ..初心者(5,095ポイント)   Date: 2007/05/05(土) 16:33   No:7413     
Title: Re:正常終了    
大体判りました。こんなのでどうですか。
注)確保後に繰り返して使用する場合には、QBufとQuestionの領域を
'\0'で埋めておく必要があります。



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

int main()
{
int j, k;
char QBuf[4][35]={0};
char Question[200] = {"あいうえおかきくけこさしすせそたちつてと"}; //問題文バッファと問題文

// for(j = 0, k = 0; Question[k] && j < 4; ++j, k += 34){
for(j = 0, k = 0; j < 4; ++j, k += 34){ // Question の領域が十分広いから、Question[k] のチェックは不要
memcpy(&QBuf[j][0], &Question[k], 34);
}

for(j = 0; j < 4; ++j){
printf("%d %s\n", j, &QBuf[j][0]);
}

return 0;
}



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

Name: 夏天 [URL]  ..入門者(4,914ポイント)   Date: 2007/05/05(土) 17:18   No:7414     
Title: Re:正常終了    
言い忘れていたことが二つあります
一つ目は、今作っているプログラムはDXライブラリを使っていること
二つ目は、問題文を1文字ずつ表示させるということです

すみませんでした


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

Name: しっぽ  ..初心者(5,442ポイント)   Date: 2007/05/05(土) 20:30   No:7417     
Title: Re:正常終了    
>一つ目は、今作っているプログラムはDXライブラリを使っていること

DirectX ライブラリを使用したWindowプログラムであるこは、はなから承知してます。
私は DirectX ライブラリを使用したことはありませんが、提示した例を応用することは
それほど難しくはないと思います。DirectX とC言語の標準関数を併用できるか、
もしくは代用の関数がある(Windows だと CopyMemory などがありましたから)かと思います。


>二つ目は、問題文を1文字ずつ表示させるということです

これは、コードのどこの部分ですか?文字列をDrawできるなら、その応用で簡単に
できるかと思います。


あと、パッと見で違和感を覚える部分について、間違えを見つけただけで、他の部分にも
メモリのオーバーランがあるかも知れません。


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

Name: 夏天 [URL]  ..入門者(4,930ポイント)   Date: 2007/05/05(土) 22:14   No:7424 解決!     
Title: Re:正常終了    
memcpyで引っかかってしまったのですが
ナントカ成功しました
ありがとうございます!!


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



Name: はね  ..かけだし(1,015ポイント)   Date: 2007/05/04(金) 16:33   No:7366       
Title: キャラクターのジャンプについて    
お久しぶりです。
早速質問なのですが、今、大学の授業でアクションゲームを作っています。
ところが、キャラクターをジャンプさせる所で詰まってしまいました。

こちらの「27.ジャンプの仕方」を参考にして作ってみたのですが(全く同じですが^^;)
上キーを押すと一瞬で画面の端まで動いてしまいうまくいきません。

文系だったもので物理はさっぱりです^^;

if( Key[ KEY_INPUT_UP ] == 1 ){
time1 = GetNowCount();
Player1.jumpflag=1;
}
if(Player1.jumpflag==1){
time2 = GetNowCount() ;
t = (double)(time2 - time1) / 1000.000;
Player1.y = (int)((sqrt ( 2.000 * g * y_max) * t - 0.500 * g * t * t ) * 480.000 / y_max);
if(Player1.y>=0)
DrawRotaGraph((int)Player1.x,(int)Player1.y,1.0f,0.0f,img_char1[0],TRUE);
else
Player1.jumpflag=0;
}

一応こんな感じにしたのですが、何が悪いのでしょう?
助言お願いします


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


Name: Justy  ..比類無きプログラマー(94,256ポイント)   Date: 2007/05/04(金) 17:07   No:7369     
Title: Re:キャラクターのジャンプについて    
 表示座標(Player1.y)を 480から引いてみては?
 すくなくともこちらのサンプルでは引いてます。


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

Name: はね  ..かけだし(1,087ポイント)   Date: 2007/05/04(金) 17:28   No:7371     
Title: Re:キャラクターのジャンプについて    
素早い返答ありがとうございます
あ、確かに引いていました^^;見逃していたみたいです

で、480から引いてみたのですが
今度はキーを押したら一瞬で下まで移動してしまいます


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

Name: Justy  ..比類無きプログラマー(94,373ポイント)   Date: 2007/05/04(金) 17:46   No:7372     
Title: Re:キャラクターのジャンプについて    
>今度はキーを押したら一瞬で下まで移動してしまいます
 最初はどこにいたのでしょう?

 一瞬というのは1秒くらいかけて、とかではなく、
何の途中の課程もなく瞬時に、ということでしょうか?

 gや y_maxの値はサンプルのままですか?


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

Name: はね  ..かけだし(1,178ポイント)   Date: 2007/05/04(金) 17:57   No:7374     
Title: Re:キャラクターのジャンプについて    
>最初はどこにいたのでしょう?
今はとりあえず、x=200 y=400に設定しています。

>一瞬というのは1秒くらいかけて、とかではなく、
何の途中の課程もなく瞬時に、ということでしょうか?
そうです、何の課程もなく瞬時にです。

>gや y_maxの値はサンプルのままですか?
そうです。
g が9.8067で、y_maxが2.000です。


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

Name: Justy  ..比類無きプログラマー(94,538ポイント)   Date: 2007/05/04(金) 18:02   No:7375     
Title: Re:キャラクターのジャンプについて    
 なんとなくわかってきましたので、確認します。
 位置はともかく、ジャンプはしていますか?


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

Name: はね  ..かけだし(1,265ポイント)   Date: 2007/05/04(金) 18:16   No:7377     
Title: Re:キャラクターのジャンプについて    
>ジャンプはしていますか?
とおっしゃいますと、動きはともかく
ジャンプするフラグが立っているか?と言うことでしょうか?
それなら立っています。画像の表示を切り替えて確認しました。


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

Name: Justy  ..比類無きプログラマー(94,197ポイント)   Date: 2007/05/04(金) 18:29   No:7378     
Title: Re:キャラクターのジャンプについて    
 位置はおかしいけど、ジャンプっぽい動きはしてるかな、と思ったんですけど、
してなさそうですね。
 ということは、画面下でずっと止まったままということですか?


 んー、なんだろう。
 上のプログラムですと、ジャンプ中の時だけ DrawGraphを使って描画していますが、
普通に歩いているときはどうしているのでしょう?

 別のところに DrawGraphがあるのでしょうか?


 歩いているときには別のところで DrawGraphしているけど
ジャンプ中は上の if文の中で DrawGraphしていて、
その2つの表示方法がうまく整合性がとれてなくて、ジャンプ中は
一瞬で移動してしまっている、と思ったのですが。

 上のソースを見るとジャンプ開始時のキャラが表示される y座標は
(直前の値が幾つであろうと)必ず 480付近になってしまいます。

 これがワープの原因だと思いますが、ジャンプの動き自体が
うまくいっていない理由がよくわからないですね。


#ビルド・再現できるソースがあると話が早いのですが・・・。


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

Name: はね  ..かけだし(1,377ポイント)   Date: 2007/05/04(金) 20:13   No:7385     
Title: Re:キャラクターのジャンプについて    
>ということは、画面下でずっと止まったままということですか?
最初は初期化した座標(x=200 y=100)にキャラがいます。そして上キー(ジャンプボタン)を押すと、本当はジャンプさせたいのですが、現在は上キーを押すと一瞬で画面端までワープしてしまう状況です。

画像表示に関しては、書き込みした内容には書いていませんでしたが
例えば右キーを押すと画像表示、といったようにそれぞれに割り当てています。


すみません、ソースupしようと思ったのですが容量が大きいらしくupできませんでした。





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

Name: Justy  ..比類無きプログラマー(94,513ポイント)   Date: 2007/05/04(金) 20:37   No:7390     
Title: Re:キャラクターのジャンプについて    
>現在は上キーを押すと一瞬で画面端までワープしてしまう状況です
 ワープした後はそのまま画面端のまま、ということでしょうか?
 画面端とはどの方向でしょうか?


>例えば右キーを押すと画像表示、といったようにそれぞれに割り当てています
 ジャンプ中のDrawRotaGraphの第二引数は今 480から Player1.yを引いた値に
なっていますよね?
 他の描画命令(右押したときとか)も統一してありますか?


>ソースupしようと思ったのですが容量が大きいらしくupできませんでした
 どっかのアップローダーを使うか、あるいはプレイヤー操作・表示に絡む
ソースだけならアップ可能でしょうか?


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

Name: はね  ..かけだし(1,454ポイント)   Date: 2007/05/04(金) 21:02   No:7391     
Title: Re:キャラクターのジャンプについて    
ワープした後は一瞬だけ下(y+)方向に表示され消えてしまいます。

一応キャラの移動+表示に関係するソースをアップしましたのでよければご覧ください


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

Name: Justy  ..比類無きプログラマー(94,600ポイント)   Date: 2007/05/04(金) 21:42   No:7393     
Title: Re:キャラクターのジャンプについて    
 わかりました。

 上を押したときに time1に時間を保存しているのに、
次にPlayerControl()が呼ばれた時に time1は前回の値を覚えていないので、
不定な値になっています。

 従って正しく tの値を計算できていません。



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

Name: Justy  ..比類無きプログラマー(94,682ポイント)   Date: 2007/05/04(金) 21:45   No:7394     
Title: Re:キャラクターのジャンプについて    
 てっとり早く修正するなら、time1だけ、static intの型にするか、グローバル変数に
してみてください。

 それでジャンプしたときのワープは直るかと思います。


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

Name: はね  ..かけだし(1,546ポイント)   Date: 2007/05/04(金) 21:55   No:7395 解決!     
Title: Re:キャラクターのジャンプについて    
なるほど。
ではtime1の値を一度保存させたら継続して使えるようにすればいいんですね

大変長い時間お付き合いいただきありがとうございました。
色々と考えてみます
これで先に進めそうです^^


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

Name: Justy  ..比類無きプログラマー(95,783ポイント)   Date: 2007/05/05(土) 03:50   No:7404     
Title: Re:キャラクターのジャンプについて    
 あ、あとワープしてしまう問題はジャンプの公式に手を加えて初期y座標を
足してあげるとワープしなくなると思います。


 それはそれとしてざっとソースを見ると、いろいろ今後拡張していく上で、
いろいろ辛そうな点や問題点が幾つかありました。


・ DrawRotaGraphが複数箇所ある
 メンテナンスの点からプレイヤー1つに対して1個の DrawRotaGraph()に纏めないと
1カ所引数とかを変更したときに全部直さなければなりません。

 又、ジャンプ中に右とか左とか押すと二重にプレイヤーが描画されることがありますので、
そういう排他制御をしなくて済むよう、描画は1カ所にした方がいいと思います。



・ 時間
 このようにソースのあちこちで GetNowCount()を呼び出し、その時間差に応じた
処理をさせるのはあまり良い処理とは言えません。

 なぜならば、第1にプレイヤーのジャンプは保存したフレームとの実時間における差分を元に
算出するのに対し、通常の左右の移動は実時間とは何の関係もなく動いています。
 これでは処理としてはちぐはぐです。

 第二にプレイヤー側で保存したフレームとの時間差に応じて動作をするなら、
当然エネミーの移動についても同様に時間に応じた処理が必要になります。
 そこでも別途 GetNowCount()を使う呼び出して使う場合、細かいことは省略しますが、
同じフレームでプレイヤー・エネミー「双方」で時間を保存し、次のフレームで双方で
時間差を計ると、それぞれ異なる数値になることがあります。

 つまり、プレイヤーとエネミーが同時(同じフレームで)に同じ式・パラメータで
ジャンプしたとしても、着地のタイミングがわずかにずれる可能性があります。

 では、どうすればいいかというと、大元のメインループの先頭で時間を計測し
システムに記憶させます。
 で、プレイヤーやエネミーはその値を取得して各々で値を保存するようにすれば
それぞれで統一された時間を元に動かすことができます。

 ただ、時間ベースでキャラを動かす必要が本当にあるのかは検討しなければならないと思います。
 マルチタスクOS下では、裏の処理が重かったりするとキャラの動きが飛び飛びのになって、
何がなんだか判らないような動きになったり、あたり判定に失敗して抜けてしまったりする
危険性があるので、よほど実時間ベースでなければならない理由がない限り、
FPSを一定化した上でフレームベースの処理にした方がすっきりすると思います。
 

・ ジャンプ
 たしかにジャンプの公式としては合っていますが、シミュレータでもサンプルでもなくゲームなので、
この式のままではいろいろ不都合があります。
 
 将来的にジャンプ中に左右のキーで軽く移動したいかもしれないですし、滞空したくなるかもしれません。
 そもそもこの式の為にプレイヤーの画面上の座標を 480から引くというわかりにくい処理を
する羽目になっています。
 
(これって他のエネミーとかのあたり判定をとらなければならないオブジェクトとかも
480から引いて表示するか、或いはあたり判定を調べるときに 480から引いてから調べないと
いけないわけで、結構大変な事に)
 
 
 それを解決するにはこの式を変形して別の形で処理してあげる必要があるのではないでしょうか。
 
 
 
 とりあえずこれらを解決した(つもりな)サンプルを作ってみましたので、もしよければどうぞ。
 例の #27のサンプルを改造したものなので、それが動く環境なら動くと思います。
 キーボード上下左右とスペースキーで操作します。

(JUMP_ACTION_MODEの値を 0か 1にするかでジャンプの挙動が若干変わりますので、お試しを)。


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

Name: はね  ..かけだし(1,562ポイント)   Date: 2007/05/05(土) 11:52   No:7407     
Title: Re:キャラクターのジャンプについて    
おぉ!こんなに素晴らしいソースを作っていただいて本当にありがとうございます
早速色々と改良してみたいと思います。

> DrawRotaGraphが複数箇所ある
前にこちらのサイトを参考にさせていただいてSTG作っていましたが、
やはり動きの多いアクションではSTGと同じ、と言う風にはいかないみたいですね^^;

>時間
なるほど、1つ時間で処理してしまうと
他のオブジェクトも時間で処理しないと計算が合わなくなってまずい事になるわけですか。
このような事は全く思いつきませんでした。まだまだ勉強は始まったばかりみたいですw

何から何まで教えていただきありがとうございました。

やはりプログラミングは参考書を開くより場数をこなす方がはるかに勉強になります


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

Name: はね  ..かけだし(1,780ポイント)   Date: 2007/05/05(土) 20:52   No:7419     
Title: Re:キャラクターのジャンプについて    
すみませんがわからない所があったので質問させてください

初歩的な所で申し訳無いのですが、

構造体にあるvec posとはどのような役割なのでしょう?

お時間がある時で結構ですのでお答えいただければ幸いです


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

Name: Justy  ..比類無きプログラマー(96,323ポイント)   Date: 2007/05/05(土) 21:23   No:7422     
Title: Re:キャラクターのジャンプについて    
構造体にあるvec posとはどのような役割なのでしょう?


 pos/vec共に floatの xと yをメンバに持つ構造体です。

 posはポジションの略で、位置を表します。
 ほぼそのままのこの値を DrawRotaGraph()に表示座標として与えています。

 vecはベクトルの略で、そのフレームにおける移動べくトル(移動方向と量)を表しています。
 毎回

   player.pos.x += player.vec.x;

player.pos.y += player.vec.y;


 と、vecの値を posに足していますよね?

 vec.xが 0なら水平方向の位置は変化しませんが、
vec.xが 1なら、毎フレーム1ピクセルずつ右に向かって移動します。

 同様に vec.yが 0なら垂直方向の位置は変化しませんが、
vec.yが -1なら毎フレーム1ピクセルずつ上に向かって移動します。

 ジャンプの時(JUMP_ACTION_MODE=0の方式の場合)は、一瞬だけ少し強めに -y方向になるよう
vec.yに値を入れると、後は勝手に上に上がっていきます。

 で、重力の計算としては毎フレーム vec.yに対して下向きに力を加えているので、
いつかは上昇を止めて下降する、というわけです。
(毎フレーム重力がかかっているので、床にめり込まないよう毎回調整が必要に
なってしまいます)。

 vec.xvec.yの値を画面に表示してみるとどういうふうに動いているか判りやすくなると思います。


 でつまり結論としては、直接 posをいじって位置を変えるのではなく、
あくまで移動方向 vecを変更することで位置 posを変えていく、という構造になっています。

 この方式は加速・減速が表現しやいですし、移動方向が明確になるのでアクションゲームでは
一般的な方式なのではないでしょうか。
(着地の時にバウンドする処理も簡単にこのパラメータの制御だけでできますし、
氷の表面をすべっているかのごとく、方向キーを離しても惰性で動く、なんてことも
簡単です)



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

Name: はね  ..かけだし(1,871ポイント)   Date: 2007/05/05(土) 21:42   No:7423     
Title: Re:キャラクターのジャンプについて    
なるほど
x,yのvecを変えることでposが変化して
結果動くということですか。
ソースを見ていると時々このvec,posが出てくるのですが意味が分からずにスルーしていましたが
これでスッキリできました。
ありがとうございました^^


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



Name: sub  ..ぴよぴよ(570ポイント)   Date: 2007/04/25(水) 22:42   No:7153       
Title: 何度もすいません・・・    
初めましてわからないので教えて欲しいことがあったので来させて頂きました、よろしくお願いします。

ファイルから読み込んで5人目までの成績を表示するプログラムなのですが6人以上いた場合は1人の成績も表示せずに終了させるようにするにはどうすればいいでしょうか?
ファイルは
g 20 20 20
t 40 40 40
j 40 40 40
のような感じです(上ので3人)



#include <stdio.h>

typedef struct score{
char name[40];
int eng;
int mat;
int sci;
} Score;

int main(void)
{
FILE *fp;
char cmd[20], fname[20], rank;
int ch=0;


Score data[5];
Score *p;
p=data;


while (rank!='q'){
printf("CMD>");
fflush(stdout);
gets(cmd);
sscanf(cmd, "%c %s", &rank, fname);


switch(rank){
case 'r':
if ((fp = fopen(fname, "r")) == NULL){
printf("%sが開けません\n", fname);
}

break;


case 'd':
while (fscanf(fp, "%s %d %d %d", p->name, &(p->eng), &(p->mat), &(p->sci)) == 4){
printf("名前:%s\n",data[ch].name);
printf("英語:%d\n",data[ch].eng);
printf("数学:%d\n",data[ch].mat);
printf("理科:%d\n\n",data[ch].sci);
ch++;
p++;
if (ch==5){
break;}
}
break;


case 'q':
fclose(fp);
break;
}
}

return (0);
}


あとgetsをfgetsに変えられないでしょうか?

本当によろしくお願いします・・・


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


Name: なぎ  ..上級者(19,786ポイント)   Date: 2007/04/26(木) 13:27   No:7162     
Title: Re:何度もすいません・・・    
通常のファイルで、人数を事前に把握する方法はありません。
従って、一般的な方法では、処理に先立って、ファイルを読み込み、何人分のデータがあるのか確認しておくことになります。

1)ファイルをオープン
2)データを読み込みつつ、数を確認
3)ファイルをクローズ

4)6人以上のデータがあれば終わり。
5)再度、ファイルをオープン
6)データを読み込みつつ表示
7)ファイルをクローズ

こんな感じです。

fgets() を使うのであれば、ファイルとして、 stdin (これは、FILE * 型であらかじめ定義してあります)を指定すればOKです(引数は fgets() にあわせるとして)

あと例示されているプログラムですが、
ファイルをオープン → データを表示 → プログラム終了
という流れ以外の処理はできないはずなのに、入力を 受けて case で振り分けるのは、危険です。

いきなり、d が入力されると、あまり良くないことが起こります。
2回続けて d が入力されるとか。
それに対する手当もされていないように見えますし。


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

Name: なぎ  ..上級者(19,827ポイント)   Date: 2007/04/26(木) 16:00   No:7165     
Title: Re:何度もすいません・・・    
良く見たら、配列が定義されているので、割引簡単に、できそうですね。
読み込んですぐに表示せず、後でまとめて表示する、しないを決めます。

後ほど。


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

Name: なぎ  ..上級者(20,589ポイント)   Date: 2007/04/26(木) 17:43   No:7174     
Title: Re:何度もすいません・・・    
おおよそこんな感じでできます。
ただ、このプログラムでは、わざわざポインタを使っている必然性が感じられません。
(ポインタの使い方の練習?)

それも考慮すると、


case 'd':

while (fscanf(fp, "%s %d %d %d", data[ch].name, &data[ch].eng, &data[ch].mat, &data[ch].sci) == 4)
{
ch++;
if (ch==5) break;
}

if (ch < 5) // データが5人分以下なら
{
for (i = 0; i <= ch; i++)
{
printf("名前:%s\n",data[ch].name);
printf("英語:%d\n",data[ch].eng);
printf("数学:%d\n",data[ch].mat);
printf("理科:%d\n\n",data[ch].sci);
}
}

break;


あとこういう場合は、for() の構文でこう書くこともあります。
(以前は、よく見かけたが)


case 'd':

for (ch = 0; (ch < 5) && (fscanf(fp, "%s %d %d %d", data[ch].name, &data[ch].eng, &data[ch].mat, &data[ch].sci) == 4); ch++);
// こちらの for() ループの実体は、空文だけ。

if (ch < 5) // データが5人分以下なら
{
for (i = 0; i <= ch; i++)
{
printf("名前:%s\n",data[ch].name);
printf("英語:%d\n",data[ch].eng);
printf("数学:%d\n",data[ch].mat);
printf("理科:%d\n\n",data[ch].sci);
}
}

break;


あと、後者の構文を使う時には、 「&& は、左側から順次チェックして、偽になった時点でそれ以降の評価は行わない」という規則が有効に機能しています。

ch が 5 になった時点で、(ch < 5) が偽になります。すると、この後は評価しないので、data[5] がアクセスされることはありません。



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

Name: sub  ..ぴよぴよ(695ポイント)   Date: 2007/05/01(火) 17:14   No:7277     
Title: Re:何度もすいません・・・    
どうもありがとうございます。ほぼ1週間ネットできない状況が続いていました。
返事が遅れてしまいすいません。

case 'd'の中を二つに分ければよかったんですね・・・
こういうのが全く思いつかない自分にいらいらします・・・

今またこのプログラムをちょっといじってつくるものをしているところですので、
またわからないことがあると思うので、その時は教えていただけると幸いです。

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


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

Name: sub  ..かけだし(1,655ポイント)   Date: 2007/05/05(土) 10:20   No:7406     
Title: Re:何度もすいません・・・    


#include <stdio.h>

int mis(FILE *fpm);

typedef struct score{
char name[40];
int eng;
int mat;
int sci;
} Score;

Score data[5];

int main(void)
{
FILE *fp;
char cmd[20], fname[20], rank;
int j=0,m;

while (rank!='q'){
printf("CMD>");
fflush(stdout);
fgets(cmd, 20, stdin);
sscanf(cmd, "%c %s", &rank, fname);


switch(rank){


case 'r':
if ((fp = fopen(fname, "r")) == NULL){
printf("Cannot open the File!\n");
return (-1);
} m=mis(fp);
if (m==1){
return (-1);
}
break;


case 'd': for (j=0;j<=m;j++){
printf("名前:%s\n",data[j].name);
printf("英語:%d\n",data[j].eng);
printf("数学:%d\n",data[j].mat);
printf("理科:%d\n\n",data[j].sci); } break;


case 'q':
fclose(fp);
printf("File close!\n");
break;
default:
printf("コマンドを正しく入力してください\n");
}
}
return (0);
}

int mis(FILE *fpm)
{
int i, k,m;

for (i=0;i<=5;i++){
k = fscanf(fpm, "%s %d %d %d", data[i].name, &data[i].eng, &data[i].mat, &data[i].sci);
if(1<=k && k<=3){
printf("%d番目のデータが不正です\n", i+1);
return(1);
}
else if(i==5 && k==4){
printf("Error!!\n");
return (1);
}
else if (k== -1){
m=i-1;
break;
}
}
return (m);
}




いろいろ改良してこんなふうになりました。

次の質問なのですが、mallocを使って成績データを読み込む前に、まず成績データの件数を入力し、これをもとに配列の記憶領域を動的(プログラム実行時)に確保する。
ということなんですがどうもわかりません・・・

まずファイルに

10 ←人数
g 40 40 40 1人目
t 40 40 40 2人目

として今のファイルだと10人分の記憶領域を作るということなんですが・・・
sizeof演算子とかつかわないといけないのでしょうか?
教えていただけると幸いです。


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



Name: こうへい  ..ぴよぴよ(66ポイント)   Date: 2007/05/05(土) 00:30   No:7401       
Title: 質問です    
C言語初心者なのですが、よろしくお願いいたします。C言語でLEDを
0000 0001
0000 0011
0000 0010
0000 0110
0000 0100
0000 1100
0000 1000
0000 1001
0000 0001
(繰り返し)
というふうに点灯させたいのですがどのようにプログラムを作ればよいのか分かりません。
無限ループの中だけでいいので教えていただけませんでしょうか。


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


Name: 管理人 [URL]  ..伝説のハッカー(309,321ポイント)   Date: 2007/05/05(土) 04:13   No:7405     
Title: Re:質問です    
LEDをどのようにプログラムで操作すればいいのかわかりませんが・・・。
とりあえずprintfで上記のように表示させたいのなら、単純に配列に上記情報をいれて表示するだけにしてみては・・。


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



Name: 夏天 [URL]  ..入門者(2,999ポイント)   Date: 2007/05/04(金) 21:07   No:7392       
Title: 制限時間について    
DXライブラリには制限時間が作れるものがありましたよね
自分はそれをバーにして目で見えるようにしようとがんばっています。
時間がたつにつれてバーがどんどん短くなっていくアレです
DrawBoxで四角を作るとこまではいいのですが
自分はそこにグラデーションを付けたいのです
どうやってつけるのでしょうか


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


Name: バグ  ..プログラマー(39,381ポイント)   Date: 2007/05/04(金) 21:59   No:7396     
Title: Re:制限時間について    
線を引く関数がありますよね?あれを利用します。
例えば、赤〜緑へ変化するバーを作りたい場合には、RGB(255,0,0)〜RGB(0,255,0)へと少しずつ色を変えながら、座標を横へ1つずつ移動させつつ縦線を描画する事で出来ます。


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

Name: 夏天 [URL]  ..入門者(3,030ポイント)   Date: 2007/05/05(土) 00:07   No:7400 解決!     
Title: Re:制限時間について    
そんな方法があったとは・・・自分もまだまだ未熟です
しかしその方法で行ってみたいと思います
ありがとうございました!


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



Name: かずお  ..ぴよぴよ(113ポイント)   Date: 2007/05/04(金) 01:37   No:7349       
Title: 画像の表示方法について    
はじめまして。かずおと申します。

私は主にC言語を使っております。画像処理のプログラミングを勉強したいのですが、
画像を表示する手段として、PCでは、VC++がよく使われていますが、
バージョンアップが多く、個人で購入するには高価すぎるため、フリーかもっと
安いプログラミングソフトを使いたいと考えています。プログラミングが比較的簡単で、
手ごろなソフトを紹介していただけないでしょうか?
画像処理の内容は、主に2次元画像処理で、フォトショップのような加工、あるいは
JPEGのような圧縮を、勉強したいと考えています。

どうぞ、よろしくお願いします。


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


Name: かずお  ..ぴよぴよ(326ポイント)   Date: 2007/05/04(金) 02:17   No:7352     
Title: 画像の表示方法について(再)    

私は主にC言語を使っております。現在は、BorlandC++Compiler5.5を使用しております。
画像処理のプログラミングを勉強したいのですが、画像を表示する手段として、
フリーか安いプログラミングソフトを使いたいと考えています。
こちらで、紹介されているDXライブラリは、私の要望に適したソフトなのでしょうか?
それ以外にあれば、プログラミングが比較的簡単で、手ごろなソフトを紹介していただけ
ないでしょうか?ちなみに、私はC以外は殆どプログラミング経験がありません。

画像処理の内容は、主に2次元画像処理で、フォトショップのような加工、あるいは
JPEGのような圧縮を、勉強したいと考えています。


どうぞ、よろしくお願いします。


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

Name: 管理人 [URL]  ..伝説のハッカー(309,188ポイント)   Date: 2007/05/04(金) 03:09   No:7353     
Title: Re:画像の表示方法について(再)    
VisualStudioは無料で使えますよ。

http://www.microsoft.com/japan/msdn/vstudio/express/

ちょっと設定が面倒ですがコチラに書いてあります。

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


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

Name: バグ  ..プログラマー(39,164ポイント)   Date: 2007/05/04(金) 08:23   No:7354     
Title: Re:画像の表示方法について    
画像の表示だけならば、BCCでも、windows.hをインクルードしてBitBlt関数を利用すればできると思いますよ。

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

Name: 管理人 [URL]  ..伝説のハッカー(309,197ポイント)   Date: 2007/05/04(金) 09:20   No:7355     
Title: Re:画像の表示方法について    
画像の表示だけだったんですか(_ _||)

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

Name: バグ  ..プログラマー(39,259ポイント)   Date: 2007/05/04(金) 09:32   No:7357     
Title: Re:画像の表示方法について    
あ、失礼しました。加工とかも書いてありますね…(;^_^A
しかし、いまいち質問の意図するところが分からないです…。結局は自分で画像加工や処理をするソフトを組みたいのか、それとも既製品を使用して加工や処理をした画像を表示したいだけなのか…それによって回答も変わってきますよね。


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

Name: かずお  ..ぴよぴよ(459ポイント)   Date: 2007/05/04(金) 20:00   No:7382     
Title: 画像の表示方法について    
早速の回答ありがとうございます。

私は画像処理について、加工、圧縮(JPEG、その他)などを主に勉強しておりまして、
実際にプログラムで(勉強のために)作成してみようと思っています。
C言語のみで画像の表示をどうしたらよいのか分かりません。
(要するに画像を表示する部分を、どうプログラミングすればよいかという質問です。)
できるだけ簡単に、かつ、VC++のような高価なソフトを購入せずに(1、2万円程度までならOK)
画像処理の勉強をしたいと、考えております。

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


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

Name: 管理人 [URL]  ..伝説のハッカー(309,064ポイント)   Date: 2007/05/04(金) 20:12   No:7384     
Title: Re:画像の表示方法について    
えぇと、先ほどもいいましたけど、VisualStudioのフリー版じゃだめですか?

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

Name: バグ  ..プログラマー(39,290ポイント)   Date: 2007/05/04(金) 20:14   No:7386     
Title: Re:画像の表示方法について    
画像を表示するだけであれば、新たにソフトを購入する必要はありませんよ。今の環境でじゅうぶんです(^-^)
ところで、こちらから逆に質問なのですが、C言語に関してどの程度の理解がありますか?入門書の練習問題を解ける程度の知識があればお話がしやすいです。
あと、Windowsプログラムを組んだ事はありますか?


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

Name: かずお  ..ぴよぴよ(525ポイント)   Date: 2007/05/04(金) 23:15   No:7397     
Title: Re:画像の表示方法について    
「管理人さん」ありがとうございます。
フリーのVisualStudio


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

Name: かずお  ..ぴよぴよ(795ポイント)   Date: 2007/05/04(金) 23:34   No:7399     
Title: Re:画像の表示方法について    
「管理人さんへ」
ありがとうございます。フリーのVisualStudioがあるなんて知りませんでした。

「熟練のプログラマーさんへ」
C言語はいくつか仕事で組んだことがありますので、入門レベルはあると思っています。
Windowsプログラムで描画ができることは知ってはいますが、プログラムを組んだ経験はありません。


いくつか方法はあると思うのですが、どちらがより簡単なのか迷っている状況です。
なお、今後とも画像処理プログラミングの勉強は続けていきたいと思っています。従って単なる一時
しのぎ的に描画するのではなく、(画像処理部分は)C言語メインで作成し、描画部分はそのどちらか
の方法で今後プログラミングして行く方針です。


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



Name: jugS  ..かけだし(1,582ポイント)   Date: 2007/05/04(金) 15:29   No:7364       
Title: SRPGについて    
こんにちは
以前、「分割コンパイルについて」と質問した者です。
今回はSRPGについてのことなんですが
基本的にSRPGは2D,3Dのどっちですか?




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


Name: Justy  ..比類無きプログラマー(94,202ポイント)   Date: 2007/05/04(金) 16:38   No:7367     
Title: Re:SRPGについて    
>基本的にSRPGは2D,3Dのどっちですか?
 えーと何がですか?
 SPPGを遊ぶならどっちってことですか?
 作るならどっちがいいってことですか?
 それともどっちの方が存在すること自体許せない、とか?


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

Name: jugS  ..かけだし(1,581ポイント)   Date: 2007/05/04(金) 17:17   No:7370     
Title: Re:SRPGについて    
すいません
質問の仕方が的確ではありませんでしたね。
自分の目標はSRPGを作ることなので
作るとしたらどっちがいいかなと言うことです。


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

Name: Justy  ..比類無きプログラマー(94,511ポイント)   Date: 2007/05/04(金) 17:54   No:7373     
Title: Re:SRPGについて    
>作るとしたらどっちがいいかなと

 作ろうとしているゲームの世界観・コンセプト・ビジュアル・システムに
合っている方、というのが正直なところですが。


 もし、初めて SRPGを作られるのであれば、2Dにしておいた方がいいと思います。

 3Dだと3Dであるが故の手間とか工夫が必要になり、ゲーム本体の制作に割く
時間が減ってしまいますから(専属に人を割り当てられるのであればいいのですが)。


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

Name: jugS  ..かけだし(1,674ポイント)   Date: 2007/05/04(金) 18:14   No:7376     
Title: Re:SRPGについて    
そうですね
私的にも2Dで作った方が良いのかなーと思っていたんですが
これを機に2Dで作っていきたいと思います。
「ディスガイア」というソフトが目標なのですが
作るにあたって、必要な知識はありますか?


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

Name: 管理人 [URL]  ..伝説のハッカー(309,032ポイント)   Date: 2007/05/04(金) 20:11   No:7383     
Title: Re:SRPGについて    
2Dプログラミングを初めてなさるんでしたら、このHPのゲームプログラミングの館でも参考にしてください^^
かなり初心者むけに書いているので無駄な処理とかふさわしくない書き方も含まれているので、
もし中級者以上のお力があれば、その辺はご自分でいいように改良してください(_ _)


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

Name: jugS  ..かけだし(1,582ポイント)   Date: 2007/05/04(金) 20:25   No:7388     
Title: Re:SRPGについて    
一応シューティングの館の方を参考にして
実際に自分で打ちながら勉強しているのですが
やはりシューティングとSRPGは
仕組みや必要となる知識、関数が違うのかなと思ったので質問してみたんですが。



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



Name: りん  ..かけだし(2,383ポイント)   Date: 2007/05/04(金) 16:28   No:7365       
Title: ポインター    
/pre
#include <stdio.h>

int main(void) {
int array[5];
int *p;
int i;
p = array;

for(i = 0; i < 5; i++) {
array[i] = i;
}
/*
for(i = 0; i < 5; i++) {
printf("array[%d]--->&array[%d]....%p>>>>>%d\n",i,i,&array[i],*(p +i));
}
return 0;
*/
printf("\n");
for(i = 0; i < 5; i++){
printf("array[%d]--->&array[%d]=%p--->%d\n"i,i,&array[i],p[i]);
}
return 0;
}
pre/

エラーが出てしまいます。
for(i = 0; i < 5; i++){
printf("array[%d]--->&array[%d]=%p--->%d\n"i,i,&array[i],p[i]);のあたりです。なぜ?


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


Name: box  ..比類無きプログラマー(66,319ポイント)   Date: 2007/05/04(金) 16:51   No:7368     
Title: Re:ポインター    

> printf("array[%d]--->&array[%d]=%p--->%d\n"i,i,&array[i],p[i]);

\n"の直後にカンマが必要です。

ソースコードを貼り付けるときのタグは、
<pre>と</pre>です(不等号は半角)。



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



Name: 夏天 [URL]  ..入門者(2,622ポイント)   Date: 2007/05/04(金) 00:43   No:7344       
Title: 押しボタンについて    
自分の質問は本当は直接DXライブラリを配布しているHPの掲示板にするべきものだと思いますが
ここのほうが質問しやすいのでまたまた来ました

DXライブラリを使ってグラフィックボタンを作りたいのですが
イマイチ作り方がわかりません
どうやって作るのか教えてください
ちなみに作っているのは○×問題です


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


Name: バグ  ..プログラマー(39,122ポイント)   Date: 2007/05/04(金) 01:05   No:7347     
Title: Re:押しボタンについて    
あらかじめ画像を作っておいて、LoadGraph関数とDrawGraph関数を使用して表示するやり方が1つ。

もう1つは、DrawLine、DrawBox、DrawCircle等の図形描画関数を使用して毎回書き替えるやり方でしょうか…

GetMouseInput関数でマウスの状態を調べ、クリックされた場合にGetMousePoint関数でマウスカーソルの位置を取得し、ボタンの範囲内にカーソルがあった場合、ボタンが押されたと判定する…とこんな感じで如何でしょうか?


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

Name: 管理人 [URL]  ..伝説のハッカー(309,076ポイント)   Date: 2007/05/04(金) 01:07   No:7348     
Title: Re:押しボタンについて    
・ボタンを押す処理が必要なのか
・今押したという瞬間の処理が必要なのか
・オンマウスの判定が必要なのか

今どの部分でつまっていらっしゃいますか?

特定の領域にボタンを表示させたら、例えば四角形を表示する関数
DrawBox(100,100,200,200,(略));
でボタンを作ったら、マウスがその領域(100,100)~(200,200)までの間にいるときボタンを押せば
プッシュ処理とすればいいでしょう。

「今押した」という処理は、前回の入力状態が0で、今回の入力状態が1の時のみ処理をすれば、
今の瞬間押した時のみ処理が出来ます。

画像でボタンを作るのなら指定座標+画像サイズで領域を判定すればいいでしょう。


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

Name: 夏天 [URL]  ..入門者(2,866ポイント)   Date: 2007/05/04(金) 10:10   No:7358     
Title: Re:押しボタンについて    
自分が今詰まっているところは
・問題を表示(ここは画像関係ないですね・・・;)
・ボタン表示
・ボタンをオンマウスで画像を変更←この辺です
・クリックしたら回答が出てくる
・次の問題へ

こんな感じです
領域で処理・・・難しそうです
ムムム・・・面妖な・・・
上の方法でオンマウス状態のときに画像を変えるって言うのもできるんですか?


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

Name: バグ  ..プログラマー(39,199ポイント)   Date: 2007/05/04(金) 11:15   No:7359     
Title: Re:押しボタンについて    
常にマウスカーソルの座標を取得しておいて、ボタンの座標と比較して、マウスカーソルがボタンの上にあればグラフィックを描き変えればいいのではないでしょうか?

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

Name: 管理人 [URL]  ..伝説のハッカー(308,911ポイント)   Date: 2007/05/04(金) 12:10   No:7361     
Title: Re:押しボタンについて    
DXライブラリは始めたばかりですか?
それらは結構簡単ですよ^^
四角形を(100,100)の座標に50x50の大きさで書きましょう。と
言われたらかけますか?

マウスの今の座標を取得する関数がありますから、
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html#R5N6
それを使えば今のマウスの座標がわかります。
例えばマウスの座標を
int x,y;
とすると、上記で書いた四角形にあるかどうかを判定するには

if(100<x && x<=150  &&  100<y && y<=150){//x座標が100~150で、かつ、y座標が100~150

    /*処理*/
}

 
 
で判定させればいいことがわかります。
このイフ文にマッチする時には画像2を表示させ、それ以外の時は画像1を表示させればオンマウスで画像の変更が可能です。

どこかわからないですか?


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

Name: 夏天 [URL]  ..入門者(2,920ポイント)   Date: 2007/05/04(金) 12:22   No:7362 解決!     
Title: Re:押しボタンについて    
本当に簡単にできました
こんな簡単にできるなんて思いもしませんでした
自分は難しく考えすぎていたようです
丁寧に教えていただきありがとうございました!!


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

Name: 管理人 [URL]  ..伝説のハッカー(308,923ポイント)   Date: 2007/05/04(金) 12:44   No:7363     
Title: Re:押しボタンについて    
解決してよかったですね☆

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



Name: black  ..ぴよぴよ(350ポイント)   Date: 2007/05/04(金) 00:10   No:7342       
Title: 教えてください    
課題について教えていただきたいのですが。
課題の内容は
#include <iostream>

main()
{
char c;
int i;
std::cout << "文字を入力してください: ";
std::cin >> c;
i = c;
std::cout << "入力された文字は " << c << " です" << std::endl;
std::cout << "数値で表すと " << i <<" です" << std::endl;
}
上記を基に、入力された文字が小文字ならば対応する大文字を、大文字ならば対応する小文字を返すプログラムを作りなさい。
入力された文字が小文字なのか、大文字なのかを適切に判断すること。記号や数字が入力された場合にはエラーメッセージを表示するように。
*各種アルファベットが数値としてどのような値を持っているのか調べてから、どうすれば変換できるのか方法を考えるとよい。
というものなのですが、数字を使って計算してはだめとのことなので困っています。
ご教授お願いします。


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


Name: box  ..比類無きプログラマー(66,353ポイント)   Date: 2007/05/04(金) 00:31   No:7343     
Title: Re:教えてください    
そのプログラムに対して、
・英小文字のa〜z
・英大文字のA〜Z
を一つ一つ入力データとして与え、
実行結果がどうなるかを確認してください。

もしかすると、全部地道にやらなくても、
最初のいくつかの実行結果から残りの結果を
推測できるかもしれません。

a〜zおよびA〜Zが数値としてどんな値を持つかがわかったら、
例えばaをAに変換する(数値を使わないで)にはどうすればよいか、
逆にAをaに変換するにはどうすればよいかが
見えてくるかもしれません。


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

Name: 管理人 [URL]  ..伝説のハッカー(308,871ポイント)   Date: 2007/05/04(金) 01:02   No:7346     
Title: Re:教えてください    
ヒントは、
aの文字コード - Aの文字コード が何になるか
bの文字コード - Bの文字コード が何になるか
表示させてみてください。
すぐにわかるはずですよ。


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

Name: black  ..ぴよぴよ(564ポイント)   Date: 2007/05/04(金) 01:40   No:7350     
Title: Re:教えてください    
返事ありがとうございます。
考えた結果このようになったのですが、これでよいのでしょうか。
#include <iostream>

main()
{
char c;
int i;
std::cout << "文字を入力してください: ";
std::cin >> c;
i = c;
std::cout << "入力された文字は " << c << " です" << std::endl;

if(c>='A' && c<='Z'){
c+='a'-'A';
std::cout << "小文字にすると " << c << " です" << std::endl;

}else if(c>='a' && c<='z'){
c-='a'-'A';
std::cout << "大文字にすると " << c << " です" << std::endl;

}else{
std::cout << "アルファベットだけ入力してください" << std::endl;
}
}


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

Name: black  ..ぴよぴよ(628ポイント)   Date: 2007/05/04(金) 01:57   No:7351     
Title: Re:教えてください    
追記
当方、大学2年でC言語を学び始めたのでC言語について全くといっていいほどわかりません。
環境は、大学で作成およびコンパイルしていて家には作成環境がありません(PCはあります)
どうか、わかりやすく教えてください。


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

Name: 管理人 [URL]  ..伝説のハッカー(309,250ポイント)   Date: 2007/05/04(金) 09:24   No:7356     
Title: Re:教えてください    
いいんじゃないですか^^
特に間違っている箇所も無いように思いますし、エラー処理も書いてあって、課題にある数値も使ってないので要求に合っているように思います。☆


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

Name: black  ..ぴよぴよ(674ポイント)   Date: 2007/05/04(金) 11:34   No:7360 解決!     
Title: Re:教えてください    
ありがとうございました!
おかげで解決することができました。また何かあったらよろしくお願いします。


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



Name: Lbfuvab  ..ぴよぴよ(491ポイント)   Date: 2007/05/02(水) 22:52   No:7301       
Title: またまたすいません    
チェスのプログラムでいつも使う関数をまとめて使えるようにするのはどうすればいいのでしょうか?
すいませんが教えてください。


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


Name: 管理人 [URL]  ..伝説のハッカー(304,251ポイント)   Date: 2007/05/02(水) 22:58   No:7303     
Title: Re:またまたすいません    
関数を纏めるときは、関数ポインタが便利ですよ。
配列や線形リストなど、アドレスで管理してひとまとまりで扱っていますよね?
そのように、関数にもそれぞれアドレスがあるわけですから、その関数のアドレスを利用して扱って見ます。
ゲームプログラミングの館にそれが詳しく書いてあります。

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

参考にしてみてください^^


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

Name: Lbfuvab  ..ぴよぴよ(411ポイント)   Date: 2007/05/02(水) 23:02   No:7304     
Title: Re:またまたすいません    
すいませんが、あのいちいち新しい修正プログラムを作る際に関数を作り直すって言うのが
めんどくさくて何かのファイルに使う関数をまとめたりは出来ないのでしょうか?


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

Name: 管理人 [URL]  ..伝説のハッカー(304,793ポイント)   Date: 2007/05/02(水) 23:12   No:7306     
Title: Re:またまたすいません    
ヘッダファイルにまとめてはいかがでしょうか?
メモ帳でもいいんで、
使う関数をこぴぺしてください。
そして○○.hという名前で保存してください。
コンパイルしているファイルがある場所に保存してください。

プログラムの一番最初に
#include "○○.h"

と書いてください。
そうすることで、関数を違うファイルから読み込めます。
インクルードしたということは、結局そこに書いたのと同じことになります。


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

Name: Lbfuvab  ..ぴよぴよ(449ポイント)   Date: 2007/05/03(木) 16:12   No:7318 解決!     
Title: Re:またまたすいません    
有難うございました。
今簡単なテストプログラムを作ったところうまく行きました。


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

Name: Lbfuvab  ..ぴよぴよ(478ポイント)   Date: 2007/05/03(木) 16:19   No:7319     
Title: またまたまたすいません    
何度もすいません。
乱数はどの様にすれば作れるのでしょうか?


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

Name: box  ..比類無きプログラマー(66,155ポイント)   Date: 2007/05/03(木) 16:55   No:7320     
Title: Re:またまたまたすいません    
それほど厳密なものでなければ、標準関数の
・srand()→疑似乱数の種をセットする
・rand() →疑似乱数を発生させる
で作成できます。

(乱数発生に関する参考情報)
メルセンヌ・ツイスタ
ボックス・ミューラー法
(注)以上の参考情報について、私に説明を求められても十分なお答えはできません。


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

Name: 管理人 [URL]  ..伝説のハッカー(305,305ポイント)   Date: 2007/05/03(木) 18:38   No:7328     
Title: Re:またまたまたすいません    
乱数にどの程度の質を求めますか?
もし特に良質な乱数でなくていいのなら、
boxさんのおっしゃるとおり、srandで初期化し、randで乱数を取得してください。

使い方の説明としてこの辺がわかりやすいでしょうか。

http://www005.upp.so-net.ne.jp/h-masuda/grwin/rand01.html



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

Name: Lbfuvab  ..ぴよぴよ(539ポイント)   Date: 2007/05/04(金) 00:45   No:7345 解決!     
Title: Re:またまたまたすいません    
有難うございました。
チェスの自動対戦のプログラムが作りたくて
色々調べたのですが良く分からなくて(初期化が特に
悩んでたのです。


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



Name: ひろゆき  ..ぴよぴよ(88ポイント)   Date: 2007/04/30(月) 20:09   No:7269       
Title: Cからの移行    
はじめてこのHPを拝見しましたひろゆきです。僕は高2で、今大体のC言語を勉強し終わった(入門書を勉強修了した)のですが、あまりCの企業での需要は少ないと聞いたのでC++かJava(特にJava)へ移行したいのですが、JavaはCの影響を受けていることは大体知っているのですが、今Javaへ移るべきか、もう少しCを極めてから(C++へいってから)Javaへ移行するべきか迷っています。どうすればいいでしょうか?将来はSEになりたいのです。

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


Name: 大工  ..上級者(17,682ポイント)   Date: 2007/04/30(月) 20:39   No:7270     
Title: Re:Cからの移行    
C言語はとっても深いですよ!!printf();だけでも色々ありますから。C言語の入門書 → 応用編 → ポインタ → アルゴリズムって感じで勉強してみたらどうでしょう?そこからC++ Javaに進んでみては?いまは企業よりプログラミングを楽しんでみましょう

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

Name: Justy  ..比類無きプログラマー(91,278ポイント)   Date: 2007/04/30(月) 21:29   No:7271     
Title: Re:Cからの移行    
あまりCの企業での需要は少ないと
 そうでもないです。
 業種によっては、Javaの需要が皆無な方面もあります。
 結局入った会社・業種によって変わってきます。
 それにひろゆきさんが就職する頃にはまた状況は変わっていると思います。


今Javaへ移るべきか
 幅広くやっておくことに超したことはありませんが、
まだ就職まで長いのでこの際、1つの言語を極めておくのが得策だと思います。

 1つ言語をきちんと修めたのなら、2つ目、3つ目の言語は驚くほど
あっという間に覚えられます。
 焦らず自分のペースで1つ1つ足固めをしていった方がいいでしょう。


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

Name: ひろゆき  ..ぴよぴよ(266ポイント)   Date: 2007/05/01(火) 20:11   No:7285     
Title: Re:Cからの移行    
わざわざ返答ありがとうございます。いろいろな言語に興味を持ってしまい、気持ちがゆらいでいました。みなさんの言うとおりCを極めてみます。ところで、Cを極めるといっても自分で考えてもっと実用的なことをしたいのですが・・・。マイコンなども興味あるのですが・・・。とにかくもっとソースコードを見て(解析)したいのです。

今持っている本は、

C言語によるプログラミングースーパーリファレンス

プログラミング作法

たのしいC(柴田氏の著作)

です。アルゴリズムを学ぶ上での本やその他のおすすめの本を教えてください。


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

Name: Justy  ..比類無きプログラマー(91,703ポイント)   Date: 2007/05/02(水) 00:59   No:7288     
Title: Re:Cからの移行    
Cを極めるといっても自分で考えてもっと実用的なことをしたいのですが
 入門書を読了した段階でしたら、読むより書くことを重視した方がいいでしょう。
 言語の基本を正しく理解する為にもある程度本格的にたくさん書いたいた方が
より理解が深まると思います。

 何か実際に作ってみてはどうですか?
 自分が欲しいと思っている(でも世の中に存在しない)ツールとか。
 或いは適当に課題・目標を設定してそれに挑戦するのもいいかと思います。
 とにかく手を動かして1行でも多くのコードを書いてみて下さい。




アルゴリズムを学ぶ上での本やその他のおすすめの本

 アルゴリズムならこのあたりでしょうか。

新版 C言語によるアルゴリズムとデータ構造
http://www.amazon.co.jp/dp/4797331631

C言語による最新アルゴリズム事典: 本: 奥村 晴彦
http://www.amazon.co.jp/dp/4874084141


 後者は
http://oku.edu.mie-u.ac.jp/~okumura/algo/

 からソースがDLできます。


 あとお勧め書籍はこのスレに書いてあります。


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

Name: 管理人 [URL]  ..伝説のハッカー(303,357ポイント)   Date: 2007/05/02(水) 13:51   No:7297     
Title: Re:Cからの移行    
私は基礎も出来ていない頃から(今もそうですが・・)プログラムコードを書いてばかりいました。
参考書を読んでちまちまやっていくより、自分の興味あるものを作りながら勉強していくスタイルが私にはあっていました。
私はゲームを作るのが好きなので、ゲームを作りながら、「ここはもうちょっと効率よくかけるのでは?」という疑問が出てきたり、
「敵の弾幕はどうしたらきれいにかけるのかな?」という疑問からベジェの書き方を勉強したり、
作っている中で色々勉強していきました。
「勉強」と思ってやっているものと「趣味」と思ってやっているものは天と地ほどの開きが出来ると思います。
何に興味がおありかわかりませんが、ウィンドウズプログラミングを勉強してツールを作ってみたり、ゲームプログラムを勉強してゲームを作ってみたり、自分の興味あるものを一つ作ってみることも大きな勉強になると思いますよ。

柴田氏の本はいいものが多いですよね。私は明解C言語には何度も助けられました。
入門編と実践編があるので、よければ参考にしてください。


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

Name: ひろゆき  ..ぴよぴよ(332ポイント)   Date: 2007/05/03(木) 15:27   No:7316     
Title: Re:Cからの移行    
僕は将来、高度なソフト(オフィスで活躍するようなソフト)を作りたいのです。あるところではJavaのほうがC++よりもいいといわれ、ここではCのほうがいいという返信がありますが、、、結局はどうすればよいでしょうか???

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

Name: バグ  ..プログラマー(38,968ポイント)   Date: 2007/05/03(木) 16:07   No:7317     
Title: Re:Cからの移行    
結局は好みの問題じゃないでしょうか?
個人的な意見ですが、さまざまな言語がありますけれど、ほとんどの言語はC言語やC++に似ているように思います。ですから、C言語を勉強しておいて損をする事はないでしょう。
逆に言えば、どれか1つでも極めてしまえば、他の言語への移行もそれほど難しいものではないという事にもなりますよね?


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

Name: Justy  ..比類無きプログラマー(94,141ポイント)   Date: 2007/05/03(木) 16:55   No:7321     
Title: Re:Cからの移行    
あるところではJavaのほうがC++よりもいいといわれ、ここではCのほうがいいという
 C/C++がいいのか、 Javaがいいのかは人に勧める場合、非常に悩むところです。
 人によって意見はまさに真っ二つに分かれるでしょう。
 どちらも利点と欠点を含んでいるので個人的には両方やりましょうと言いたいところですが、
どちらか?と訊かれるとどっちでもいいと思います。
 先にも書きましたが、1言語を覚えれば後の言語の習得は非常に短期間で済みますから。

 それにまだ就職されるまでにまだ何年もありますよね?
 移り変わりの激しいこの業界、ひろゆきさんが就職された会社で(6年後くらいでしょうか?)、
どんな言語が使われているかなんてわからないわけですし、ひょっとしたら現在の主流言語の
主な仕事が過去の資産のメンテナンスだけしかなくなっている、なんてことがあり得るわけで。

 であれば焦らないでとりあえず1つの言語をきっちり覚えるという意味で、
既に C/C++に着手しているのであればそれをある程度追求してみるのが手だと思います。

 で、C/C++で覚えることはもうない、と思ったら次に(Javaとか)に移ればいいんです。


 本題からは若干外れますが
結局はどうすればよいでしょうか???
 結局は、プログラミングの本質を覚えましょう、ということです。

 重要なのは「言語」ではないんですよ。
 ざっくり言ってしまえば、Rubyだろうが、C#だろうが、Haskellだろうが何だっていいんですよ。

 重要なのはひろゆきさんがその言語を使って、何を作れるのか、どう作っていくのか・・・
一言で言えば「プログラミングセンス」なんですよ。
 それを磨かないことにはどの言語をやっても一緒です。


 あと、SEは直接プログラムを組むことなく、主に資金・人的リソースの管理だったり
システムの仕様・仕組みを考えるのが主な仕事となります。

 プログラミングをしながらどういう仕様にすれば、より便利になるか、コスト(時間・人)が
安くできるかを考えながらアプリ・システムを考え作っていくと勉強になるかと思います。


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

Name: 通りすがり  ..入門者(3,887ポイント)   Date: 2007/05/03(木) 18:03   No:7325     
Title: Re:Cからの移行    
本当に“高度なソフト”を開発するためには、
1)ベンダー系 ニーズを予想してソフトを作る
2)コンサル系 クライアントに合わせたソフトを作る
のいずれかの上級職に就くことなります。通常は、2)のコンサル系の方が大規模です。
例えば、システムがダウンして大問題になった東京証券取引所の基幹システムがそうです。

そうなると、プログラミング言語うんぬんよりも、
ソフトウェア工学の中でも特に要求工学と呼ばれる分野を勉強する必要があります。
私は、学歴が全てだとは思いたくありませんが、
日本で大規模開発の上級職に就いている人たちは、旧帝大や有名私立出身の人が多いです。
小さな会社に入るか、日曜プログラマとしてVectorなどに出品したいのならば別ですが、
本当に上級職を目指すのなら、今は学校の勉強に専念することをお勧めします。

実際にプログラミング言語を使ってプログラムを書くのは、プログラマの仕事です。
プログラマは仕様書に基づいてプログラムを組むだけで、
それまで開発をしたことが無い文系出身者が多いのも事実です。
加えて、新しい技術や言語を覚える必要があるため、35歳定年説があったぐらいです。
(もちろん、スーパークリエータと呼ばれる人たちもいますが。)

それでも、勉強の息抜きにプログラミングをしたいということであれば、
個人的にはJavaを推薦しておきます。オブジェクト指向という観点では
C#の方が好きですが、JavaもTigerあたりから頑張っているので。


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

Name: 管理人 [URL]  ..伝説のハッカー(305,590ポイント)   Date: 2007/05/03(木) 18:43   No:7329     
Title: Re:Cからの移行    
個人のフリープログラマーとかじゃなく、
大規模になってくると、ソフトウェアを作るという作業は

「設計」なのか「実装」なのかで変わってきます。

「ソフトウェアの設計図を作る人」

「渡された設計図通りに実際に作る人」

ということですね。
前者においても、様々な役割があります。
まず、ソフトウェア開発の一番最初に位置する部分を「上流工程」といいますが、
最上流工程は、「人々はどんなソフトを求めているのだろうか?」という事を性格に判断する作業になります。
これは要求定義という工程です。
つまり、上流工程になればなるほど、実際のプラットフォームには依存せず、
どんな言語だろうと関係ない、
「○○というソフトを作ろう」
という意見を出すような役割になります。

よくわからなければもう少しお話いたしますが、どちらの方面に進まれる予定でしょうか?


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

Name: ひろゆき  ..ぴよぴよ(121ポイント)   Date: 2007/05/03(木) 19:37   No:7330     
Title: Re:Cからの移行    
ありがとうございます。僕はいずれにしろ趣味でのプログラミング言語や仕事でのプログラミング言語を考えてませんでした。僕はプログラミングが趣味で使う言語はなにか?というのを聞きたかったのです。で、結局Javaを極めることにしました。Cはこれから進化していく仕事のベース(もちろんJavaのベースでもあります)の上での勉強、つまり通過点で習得したわけです。もちろん、Javaの勉強もCの影響を受けているのでCの復習はかかせないと自分でも感じております。つまり、仕事ではもちろんこれから普及していくPerlなどの言語ではまた改めて習得が必要であることはわかっております。まずは、Javaを勉強して趣味でのプログラムを作ってみます。矛盾する点がありましたら、ご容赦ください。

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

Name: 管理人 [URL]  ..伝説のハッカー(305,640ポイント)   Date: 2007/05/03(木) 22:05   No:7331     
Title: Re:Cからの移行    
C,JAVAはどちらも肩を並べる有名な言語ですし、どちらを学ばれても後悔はしないと思いますよ^^
JAVAはウェブでも活躍しますから、趣味での用途も広がると思います。

頑張ってください☆


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

Name: ひろゆき  ..ぴよぴよ(167ポイント)   Date: 2007/05/03(木) 22:18   No:7333 解決!     
Title: Re:Cからの移行    
お忙しいなか、僕のつたない質問に対して時間を割いていただきどうもありがとうございました。これからも当サイトにてお世話になることがあるかもしれないのでそのときはよろしくおねがいします。

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



Name: 夏天 [URL]  ..かけだし(1,421ポイント)   Date: 2007/05/02(水) 20:25   No:7300       
Title: サンプルプログラムにて    
サンプルプログラムのサウンドノベル風文字列描画、テキストバッファ使用バージョンが
自分には難解です。
こんな初歩的なところでつまずいている自分のために
改行の他にmainで読み込んだ文字列を別の関数で表示などといった
ユーザ関数を多用した同じことができるプログラムが欲しいです。
どなたか作ってください!
お願いします!お願いします!


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


Name: 管理人 [URL]  ..伝説のハッカー(304,250ポイント)   Date: 2007/05/02(水) 22:56   No:7302     
Title: Re:サンプルプログラムにて    
>どなたか作ってください!

いやいや、誰かに作ってもらってたんじゃ夏天さんのスキルが上がりませんよ^^
少しずつ作ってみませんか?

まず、半角が無いテキストデータだとして考えましょう。


char txt[128]="今日からサウンドノベル風文字列表示の勉強をします";

これを時間差で表示させて見ます。

まず、時間差で表示させるには、

1、1文字格納、表示
2、2文字格納、表示
3、3文字格納、表示

これを延々と繰り返せばいいですね。
また繰り返すまでの区間は、配列に\0が見つかるまでです。

txt2というもともとの配列のほかにtxt2という描画用の配列を用意します。
txt2にtxtから必要な分だけコピーして、常にtxt2を表示するようにしてみます。

まず、
txt[0],txt[1]をtxt2[0],txt[1]にコピーし、txt2[2]に\0を格納します。
つまり
txt2[0] = txt[0];
txt2[1] = txt[1];
txt2[2]='\0';
こういうことです。
すると%sでtxt2を表示させれば「今」が表示できますね。
どうように、
txt2[0] = txt[0];
txt2[1] = txt[1];
txt2[2] = txt[2];
txt2[3] = txt[3];
txt2[4]='\0';
としてやり、同様に表示すると今度は「今日」が表示できます。
txt2[0] = txt[0];
txt2[1] = txt[1];
txt2[2] = txt[2];
txt2[3] = txt[3];
txt2[4] = txt[4];
txt2[5] = txt[5];
txt2[6]='\0';
とすると「今日は」になります。
常にtxt2を表示させれば段々1文字ずつ増えていきますね?
このコピーをコピー元の配列の中身が\0になるまでしていけば、サウンドノベル風になりますね?
つまり2要素ずつコピーしては、終端記号をいれていけばいいわけです。

ただこれを毎回2ずつ増やしていると早すぎるので、特定ターンに一回処理をするようにプログラムするとよいでしょう。

やり方つかめてきましたかね?


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

Name: 管理人 [URL]  ..伝説のハッカー(304,731ポイント)   Date: 2007/05/02(水) 23:10   No:7305     
Title: Re:サンプルプログラムにて    
txt[p2][p1]で管理しています。


int i,p1=0,p2=0,counter=0;
char txt2,txt[10][128]={
"今日はサウンドノベル風文字列表示法を勉強しています。",
"色々人の書いたプログラムを理解するのは難しいですが",
"わからなくとも、どんなプログラムでもいいので試行錯誤しながら自分で",
"いろんなプログラムを書いてみることで",
"自分の力となります。",
"がんばってください。",
};

if(エンターが今の瞬間押されたら){
p2++; p1=0;//次の文章へ
}

if(counter%3==0)//3周に1回処理をする
if( /*次の要素が\0でなければ*/ )
p1+=2;//表示する文字を全角1つ増やす

for(i=0;i<p1;i++){
txt2[i]=txt[p2][i]//コピー
/*もし用意した配列よりp1が大きければブレイク*/
}
txt2[i]='\0';//終端記号格納

DrawFormatString( /* txt2を表示 */ );


counter++;


 
こんな感じでどうでしょうか?
人のプログラムを読むのになれていらっしゃらないようなので、極力コードの直接記述はさけました。
/* */の部分は自分で作ってください。
無駄な部分もありますが、わかりやすさ最優先で書きました。

半角が混ざるともうちっとテクが必要です。
次はそのテクの話をします。


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

Name: 管理人 [URL]  ..伝説のハッカー(305,402ポイント)   Date: 2007/05/02(水) 23:30   No:7307     
Title: Re:サンプルプログラムにて    
まず、

char txt_a[3]="AB";
char txt_b[3]="あ";

において、


printf("%d\n",txt_a[0]);
printf("%d\n",txt_b[0]);

をしてみてください。何か違いに気づくはずです。
全角はsignedでは1バイト目がかならずマイナスになります。
半角はプラスになります。
以下サンプルを書いてみました。



#include<stdio.h>

void main(){
int i;
char ta[11]="abcdeABCDE";
char tb[11]="あイ言○Z";
for(i=0;i<10;i+=2)
printf("ta[%d]=%d\tta[%d]=%d\ttb[%d]=%d\ttb[%d]=%d\t\n",i,ta[i],i+1,ta[i+1],i,tb[i],i+1,tb[i+1]);
}

実行結果

ta[0]=97 ta[1]=98 tb[0]=-126 tb[1]=-96
ta[2]=99 ta[3]=100 tb[2]=-125 tb[3]=67
ta[4]=101 ta[5]=65 tb[4]=-116 tb[5]=-66
ta[6]=66 ta[7]=67 tb[6]=-127 tb[7]=-101
ta[8]=68 ta[9]=69 tb[8]=-126 tb[9]=121
 
 
 
tbの偶数配列要素というのは、文字の1バイト目を表しています。赤字の部分です。
つまり、全角は1バイト目がマイナスであることを利用すれば
半角か、全角かが判定できます。
ですから調べた要素がプラスなら1つ配列要素をずらせばよく、
調べた要素がマイナスなら2つ要素をずらせばいいわけですね。
わかります?


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

Name: 管理人 [URL]  ..伝説のハッカー(305,430ポイント)   Date: 2007/05/02(水) 23:37   No:7308     
Title: Re:サンプルプログラムにて    
文字コードはこちらにこれでもかと載っているので
http://ash.jp/code/

参考にしてください。
半角の文字コードはこちらが見やすいかな?
http://e-words.jp/p/r-ascii.html


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

Name: Justy  ..比類無きプログラマー(92,144ポイント)   Date: 2007/05/03(木) 00:06   No:7309     
Title: Re:サンプルプログラムにて    
 一応念の為捕捉を。

 char型は singedなのか unsignedのどちらかになりますが、どちらになると決められないので
負になるかどうかのチェックは必ず signedにキャストしてから行って下さい。

 次にシフト JISにおける2バイト文字の判定は 負であるかだけのテストだけでは
半角カタカナを誤認するので不十分です。
 半角カタカナを外して判定する必要があります。


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

Name: 管理人 [URL]  ..伝説のハッカー(305,577ポイント)   Date: 2007/05/03(木) 00:16   No:7310     
Title: Re:サンプルプログラムにて    
そういえば昔、文字コードがどうなっているのかかたっぱしから出力してみたことがあり、
半角カタカナも負であることを知りました。

半角カタカナを使うとバグがおきるとよくいわれるのはこのためなんですかね?
半角カタカナを想定したエラー処理をしていないシステムがあるということでしょうか。


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

Name: Justy  ..比類無きプログラマー(92,391ポイント)   Date: 2007/05/03(木) 00:54   No:7311     
Title: Re:サンプルプログラムにて    
半角カタカナを使うとバグがおきるとよくいわれるのはこのためなんですかね
 まぁそうですね。
 昔はデータ量を減らす為に1バイトで表現できるカタカナということで、重宝されたのですが
今では過去との互換の為だけに存在する、本来は不要な文字です。

 インターネットとかだと使われる文字コードは非常に多いので
半角カタカナを使用されると文字コードの判定が難しくなって文字化け発生率が高くなりますし、
昔のメールでは 7bitしか扱わないので即文字化けでした。

 とはいえ、最近は UnicodeとかMIMEとか ESMTPとかで回避できるので、大分半角カタカナの
トラブルも減りましたよね。


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

Name: 管理人 [URL]  ..伝説のハッカー(305,626ポイント)   Date: 2007/05/03(木) 01:48   No:7312     
Title: Re:サンプルプログラムにて    
不要な文字ですかぁ、と言う事は将来なくなる可能性も?
でも結構顔文字に使ったり、コメントとか突っ込みに半角カタカナって結構重宝しますよねw
昔のメールは7bitですかぁ、、残りの1bitは何かのフラグだったんですか?


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

Name: Justy  ..比類無きプログラマー(93,251ポイント)   Date: 2007/05/03(木) 02:51   No:7313     
Title: Re:サンプルプログラムにて    
と言う事は将来なくなる可能性も
 もうここまで来てしまうと、その可能性は大幅な改訂でもない限りいですね。
 Unicodeにもちゃっかり入ってますし。


残りの1bitは何かのフラグだったんですか?
 いえ、もともとメールのプロトコル(SMTP)は 7bitしか扱わない(1バイトが 8ビットとは限らない)ので、
どうするかはサーバー次第です。
 8bitのメールを送ってしまった場合、経由する全てのメールサーバーが 8bitを通すものなら
大丈夫かもしれませんが、8bit目を削除してしまう仕様のものが1つでもあれば
データは破損します。

 日本語をメールで送る場合、本文なら ISO-2022-JPに、ヘッダなら Base64とかのコードに
変換して 7bitで収まるようにしてから送っているので日本語がメールで扱えているわけです。


 でも半角カナは ISO-2022-JPには入っていないんですよね。だからそのまま流すと
どうなるかは状況次第です。
 半角カナをどう扱うかはメーラーによって対応が違っていて、うちのメーラーから
半角カナメールを送るとメーラー側で半角カナを判定して全角に直してから
送っているようです。


 今は ESMTPという 8bitを扱えるプロトコルがあり、大分普及してきているので
8bitで送ってしまっても大丈夫な確率は高くなっているのですが、
それでも半角カナは使わないのがマナーというものですね。


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

Name: 夏天 [URL]  ..かけだし(2,424ポイント)   Date: 2007/05/03(木) 11:04   No:7314     
Title: Re:サンプルプログラムにて    
管理人様のソースのコメント欄を考えて見ました
しかしコンパイルエラーが出てきます
どこが間違っているのでしょうか

#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
//ChangeWindowMode( TRUE ) ;
int i,p1=0,p2=0,counter=0;
int Cr;
char txt2,txt[10][128]={
"今日はサウンドノベル風文字列表示法を勉強しています。",
"色々人の書いたプログラムを理解するのは難しいですが",
"わからなくとも、どんなプログラムでもいいので試行錯誤しながら自分で",
"いろんなプログラムを書いてみることで",
"自分の力となります。",
"がんばってください。",
};

if(CheckHitKey( KEY_INPUT_RETURN )){
p2++; p1=0;//次の文章へ
}

if(counter%3==0){//3周に1回処理をする
if( txt[p2][p1+1] != '\0' ){
p1+=2;//表示する文字を全角1つ増やす
}
}

for(i=0;i<p1;i++){
txt2[i]=txt[p2][i];//コピー
/*もし用意した配列よりp1が大きければブレイク*/
if(txt2[i] < p1){
break;
}
}
txt2[i]='\0';//終端記号格納

Cr = GetColor( 255 , 255 , 255 );

DrawFormatString( 0, 0, Cr, "%s", txt2);


counter++;
}


c:\program files\microsoft visual studio 8\vc\platformsdk\include\mmreg.h : warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
c:\documents and settings\tenka\デスクトップ\vcqma\dxlib.h(1529) : warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
c:\documents and settings\tenka\デスクトップ\vcqma\str.cpp(32) : error C2109: 配列または、ポインタでない変数に添字が使われました。
c:\documents and settings\tenka\デスクトップ\vcqma\str.cpp(34) : error C2109: 配列または、ポインタでない変数に添字が使われました。
c:\documents and settings\tenka\デスクトップ\vcqma\str.cpp(38) : error C2109: 配列または、ポインタでない変数に添字が使われました。
ビルドログは "file://c:\Documents and Settings\Tenka\デスクトップ\vcqma\Debug\BuildLog.htm" に保存されました。
vcqma - エラー 3、警告 2
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========


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

Name: box  ..比類無きプログラマー(66,047ポイント)   Date: 2007/05/03(木) 14:42   No:7315     
Title: Re:サンプルプログラムにて    

> 管理人様のソースのコメント欄を考えて見ました
> しかしコンパイルエラーが出てきます
> どこが間違っているのでしょうか

Unicode形式云々の件は、よくわかりません。
他の件は、

> char txt2,txt[10][128]={

txt2が配列ではないのに

> txt2[i]=txt[p2][i];//コピー
> if(txt2[i] < p1){
> txt2[i]='\0';//終端記号格納

配列のごとく扱っているためです。


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

Name: 管理人 [URL]  ..伝説のハッカー(304,922ポイント)   Date: 2007/05/03(木) 16:57   No:7322     
Title: Re:サンプルプログラムにて    
あらら・・すみません、txt2は配列のコピー先の配列なので、配列でなくてはなりません。
txtの一番低い次元の要素数用意してください。
つまり、今は

txt2[128]ということになります。


#include "DxLib.h"

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

int i,p1=0,p2=0,counter=0;
int Cr;
char Key[256],oldKey[256]={},txt2[128],txt[10][128]={
"今日はサウンドノベル風文字列表示法を勉強しています。",
"色々人の書いたプログラムを理解するのは難しいですが",
"わからなくとも、どんなプログラムでもいいので試行錯誤しながら自分で",
"いろんなプログラムを書いてみることで",
"自分の力となります。",
"がんばってください。",
};

Cr = GetColor( 255 , 255 , 255 );

while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && Key[KEY_INPUT_ESCAPE]==0){

if( oldKey[KEY_INPUT_RETURN]==0 && Key[KEY_INPUT_RETURN]==1 ){//1回前の時入力してなくて、今入力していたら
p2++; p1=0;//次の文章へ
}

if(counter%3==0){//3周に1回処理をする
if( txt[p2][p1+1] != '\0' ){
p1+=2;//表示する文字を全角1つ増やす
}
}

for(i=0;i<p1;i++){
txt2[i]=txt[p2][i];//コピー
/*もし用意した配列よりiが大きければブレイク*/
if(128-1 <= i){
break;
}
}
txt2[i]='\0';//終端記号格納
DrawFormatString( 0, 0, Cr, "%s", txt2);

for(i=0;i<256;i++)//今の入力情報を記憶
oldKey[i]=Key[i];

counter++;
ScreenFlip();
}
DxLib_End();
return 0;
}

 
 
これでどうですか?


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

Name: 管理人 [URL]  ..伝説のハッカー(305,012ポイント)   Date: 2007/05/03(木) 17:02   No:7323     
Title: Re:サンプルプログラムにて    
極力おかきになったプログラムをそのまま使いましたが、どこかわからないところありますか?



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

Name: 夏天 [URL]  ..入門者(2,505ポイント)   Date: 2007/05/03(木) 18:18   No:7326 解決!     
Title: Re:サンプルプログラムにて    
なんとか理解できそうです
いろいろわかりやすき教えていただきありがたく思っています
最初に誰か作ってくださいとわがままを言ったにもかかわらず
こんなにわかりやすく教えていただき本当にありがたいです
コレで野望にまた一歩近づいたような気がします
ありがとうございました!


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

Name: 管理人 [URL]  ..伝説のハッカー(305,203ポイント)   Date: 2007/05/03(木) 18:34   No:7327     
Title: Re:サンプルプログラムにて    
夏天さん、
人の書いたプログラムって理解するのは難しいものですよね。
だからこそ、ゲームプログラミングの館では、直接コードを見ることを目的とせず、概念を理解する事を目的としてご利用下さい。
頑張ってくださいね☆

Justyさん、
逆に私が質問したような形になってしまい、すみません^^;
なるほど、7というと中途半端な数字に見えますけど、特に8である必要はないですものね。
ありがとうございます。


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



Name: 夏天 [URL]  ..ぴよぴよ(784ポイント)   Date: 2007/05/01(火) 17:55   No:7278       
Title: さらに課題研究にて    
C言語では
fscanf(fp,"%d %s %s\n",&n,str1,str2);
のようにスペースで区切ったところずつ読んでいくというものを
DXではどのようにやるのでしょうか
まったく手が付かないので教えてください


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


Name: バグ  ..プログラマー(38,511ポイント)   Date: 2007/05/01(火) 18:22   No:7279     
Title: Re:さらに課題研究にて    
同じやり方で出来ますよ(;^_^A

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

Name: 夏天 [URL]  ..かけだし(1,188ポイント)   Date: 2007/05/01(火) 18:41   No:7280     
Title: Re:さらに課題研究にて    
むむ、できません・・・

なぜでしょう・・・

ちなみにソースはこうです

#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
int FileHandle ;
int n;
char str1[200],str2[50];
FILE *fp

// DXライブラリの初期化
if( DxLib_Init() == -1 ) return -1 ;

// test.cpp ファイルを開く
//FileHandle = FileRead_open( "test.txt" ) ;
fp = fopen("test.txt" , "r");


// 一行読む
fscanf(fp,"%d %s %s\n",&n,str1,str2);

// 画面に描画
DrawString( 0, 0, str1, GetColor( 255,255,255 ) ) ;

// キー入力を待つ
WaitKey() ;

// ファイルを閉じる
//FileRead_close( FileHandle ) ;
fclose(fp);

// DXライブラリの後始末
DxLib_End() ;

return 0 ;
}

実行画面が半角のフがズラリとなっています


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

Name: box  ..比類無きプログラマー(65,605ポイント)   Date: 2007/05/01(火) 18:58   No:7281     
Title: Re:さらに課題研究にて    

> FILE *fp

セミコロンがないのは単なるtypoですか?

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

間違いなくオープンできていますか?
fpがNULLでないことを確認する必要があります。

また、fopen(), fscanf(), fclose()を使うのであれば、
stdio.hのインクルードが必要でありましょう。


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

Name: バグ  ..プログラマー(38,551ポイント)   Date: 2007/05/01(火) 18:58   No:7282     
Title: Re:さらに課題研究にて    
fopen関数を使うのに必要なファイルがインクルードされていませんよ(;^_^A
DxLib.hだけでは駄目です(>_<)


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

Name: バグ  ..プログラマー(38,573ポイント)   Date: 2007/05/01(火) 19:00   No:7283     
Title: Re:さらに課題研究にて    
うわ、モロ被りしてしまいました(苦笑)

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

Name: 夏天 [URL]  ..かけだし(1,257ポイント)   Date: 2007/05/01(火) 19:06   No:7284 解決!     
Title: Re:さらに課題研究にて    
ほ、ホワアァ!できました!!
stdio.hはDXでインクルードしてくれているものだと勘違いしていました
インクルードしたところ無事動いたのでよかったです。

どうもありがとうございました!!


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

Name: 管理人 [URL]  ..伝説のハッカー(303,471ポイント)   Date: 2007/05/02(水) 13:55   No:7298     
Title: Re:さらに課題研究にて    
遅くなりました・・。話題がさめた頃にやってきてすみませぬ(_ _|||)

ファイル関係の関数はDXライブラリ独自のものもあります。
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html#R19N1
ここから下に書いてある関数は全てそうです。
しかしこれらは、「読み込むだけ」なので、データを作ったりするときは普通のCの標準関数を使って欲しいと作者様からも言われました。

これは
http://homepage2.nifty.com/natupaji/DxLib/dxtec.html#T11
アーカイブを使って全てのファイルを一つにしたとき、それを読み込むものですので違う用途で用意されたものです。

今後のご参考までに。。


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



Name:  ..中級者(12,759ポイント)   Date: 2007/04/30(月) 16:27   No:7255       
Title: 2整数の大小比較    
こんにちは!!!!!!!『☆』です!!!!(笑)
またまた質問にきました♪♪お願いいします。

問題は、「2つの整数 a,b を入力し、大きい方の値を出力するプログラムを作成せよ」っていう問題なんです。
そして+αで、
1. int max(int a, int b); /* a と b のうち大きい方の値を返す関数 */
2. void asc_swap(int *a, int *b); /* *a < *b となるように swap する関数 */

という2つ関数を使うように指定されているんですよ。
それで、私が作ったプログラムは・・・・・


#include <stdio.h>

int max(int a,int b){

if(a>b){
printf("関数 max を使った場合:大きい方は%dです.\n",a);
}
else{
printf("関数 max を使った場合:大きい方は%dです.\n",b);
}
return 0;
}

void asc_swap(int *a,int *b){
int t;

if(a<b){
printf("関数 asc_swap を使った場合:大きい方は%dです.\n",b);
}
else if(a>b){
t=*b;
*b=*a;
*a=t;
}
printf("関数 asc_swap を使った場合:大きい方は%dです.\n",t);
}

int main(void){
int a,b;
printf("a :");
scanf("%d",&a);
printf("b :");
scanf("%d",&b);

max(a,b);
asc_swap(&a,&b);

return 0;
}

っというものなんですが。。。。上手く行きません・・・・
bよりもaが大きいとき、asc_swap関数が上手く働いていないんですが・・どこが違うのでしょうか??
教えてください☆お願いします。


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


Name: box  ..比類無きプログラマー(64,599ポイント)   Date: 2007/04/30(月) 16:36   No:7258     
Title: Re:2整数の大小比較    
a, bというポインタの大小ではなく、a, bが指している領域の内容の大小を
比較しなければなりません。


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

Name:  ..中級者(12,790ポイント)   Date: 2007/04/30(月) 16:54   No:7259     
Title: Re:2整数の大小比較    
ということは・・・アドレスってことですか??

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

Name:  ..中級者(12,990ポイント)   Date: 2007/04/30(月) 17:01   No:7260     
Title: Re:2整数の大小比較    
swap関数をこのようになおしてみました。

void asc_swap(int *a,int *b){
int t;

if(*a<*b){
printf("関数 asc_swap を使った場合:大きい方は%dです.\n",*b);
}
else if(*a>*b){
t=*b;
*b=*a;
*a=t;
}
printf("関数 asc_swap を使った場合:大きい方は%dです.\n",*b);
}

『*』をつけてみたんですが・・・
bが大きい時、

『関数 asc_swap を使った場合:大きい方は2です.』
こおん文章が2回表示されてしまいます。。


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

Name:  ..中級者(13,205ポイント)   Date: 2007/04/30(月) 17:04   No:7261     
Title: Re:2整数の大小比較    
何回もすみません。。。。

このように変えてみました☆

void asc_swap(int *a,int *b){
int t;

if(a<b){
printf("関数 asc_swap を使った場合:大きい方は%dです.\n",b);
}
else if(*a>*b){
t=*b;
*b=*a;
*a=t;
}
printf("関数 asc_swap を使った場合:大きい方は%dです.\n",*b);
}

一応、実行結果は合っているんですが、内容的に合ってますか??


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

Name: box  ..比類無きプログラマー(64,722ポイント)   Date: 2007/04/30(月) 17:16   No:7262     
Title: Re:2整数の大小比較    
17:04のコードは、
if(a<b){
と、ポインタどうしを比べているので正しくありません。
比較の仕方は、17:01の方が正しいです。

17:01のコードで、後の方のprintf()の内容と書いている場所が正しくありません。
else if のすぐ後に、
「*aの方が大きい」という内容のメッセージを出力してから、
*aと*bを入れ替えるとよいでしょう。


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

Name: box  ..比類無きプログラマー(64,749ポイント)   Date: 2007/04/30(月) 17:22   No:7263     
Title: Re:2整数の大小比較    
ところで、2つの整数値が等しい場合は、どうするようになっているのですか?

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

Name:  ..中級者(13,141ポイント)   Date: 2007/04/30(月) 17:24   No:7264     
Title: Re:2整数の大小比較    
ちょっと全然違う質問なんdせすが、、、関数の中で出力するという子とはしないほうがいいですか??
出力はmain関数でした方がいいでかね??


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

Name:  ..中級者(13,062ポイント)   Date: 2007/04/30(月) 17:25   No:7265     
Title: Re:2整数の大小比較    
ちょっと全然違う質問なんですが、、、関数の中で出力するという子とはしないほうがいいですか??
出力はmain関数でした方がいいでかね??

あ!!そうですね!!同値のときは、強制終了するように、変えてみます。



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

Name:  ..中級者(13,081ポイント)   Date: 2007/04/30(月) 17:32   No:7266     
Title: Re:2整数の大小比較    
でも、asc_swap関数は、void型なので、return -1もbreakも使えません。。。

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

Name: box  ..比類無きプログラマー(64,841ポイント)   Date: 2007/04/30(月) 18:44   No:7267     
Title: Re:2整数の大小比較    
> 1. int max(int a, int b); /* a と b のうち大きい方の値を返す関数 */
> 2. void asc_swap(int *a, int *b); /* *a < *b となるように swap する関数 */

2つの整数のうち大きい方を出力するプログラムで、
max()を作成せよという指示はわかりますが、
asc_swap()の方はどうもよくわからないですね。

別に2つの整数を入れ替えなくても、単に大小関係を判定するだけで
よいはずなのですが…。


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

Name:  ..中級者(12,992ポイント)   Date: 2007/04/30(月) 18:56   No:7268     
Title: Re:2整数の大小比較    
ううん。。。私たちもそう思うんですけどねぇー。。。
入れ換える練習みたいなんですよねぇ。。。。
しかも、 *a < *b となるように swap する関数 のようにまた指示されてるんです。。


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

Name: フリオ  ..初心者(5,966ポイント)   Date: 2007/05/01(火) 01:26   No:7273     
Title: Re:2整数の大小比較    
 
 こんなんでいいのかな?。


#include <stdio.h>

int max(int a, int b)
{
if(a > b) return a;
return b;
}

void asc_swap(int *a, int *b)
{
int temp;

if(*a < *b) return;
temp = *a;
*a = *b;
*b = temp;
return;
}
int main(void)
{
int a, b;

printf("a = ");
scanf("%d", &a);
printf("b = ");
scanf("%d", &b);
if(a == b) puts("同じ値です。");
else {
printf("%d が大きい\n", max(a, b));
asc_swap(&a, &b);
printf("a == %d, b == %d\n", a, b);
}
return 0;
}

 


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

Name:  ..中級者(13,161ポイント)   Date: 2007/05/01(火) 14:06   No:7275     
Title: Re:2整数の大小比較    
フリオさん、ありがとうございます。

やはり、関数じゃなくて、main関数でprintfしたほうがいいんですかねぇーー。。

なんか私のとちょっと違ったんで、勉強になりました。

if だけしか使ってないところも、勉強になりました。
確かに、2整数しかないから、私が書いてた見たいにelse if とかはいらないですねぇ。
フリオさんの方がもっと、シンプルなものですねぇ。


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



Name:  ..かけだし(1,946ポイント)   Date: 2007/04/15(日) 12:15   No:6825       
Title: 関数の作り方    
こんにちは★ぉひさしぶりです。
関数の作り方の質問です。
たぶん、みなさんにとっては、全然やさしい問題だと思うんですが、私はいまだにいまいち理解ができません。。。

今回、『入力された文字列を指定された方向(左右)にローテートするプログラム』をつくりました。
頑張って作ったのですが、提出する時は、『左ローテートする関数と右ローテートする関数を作成すること』と注意をうけました。

私が作ったプログラ厶は、以下のようです。

#include <stdio.h>


main(){

char moji[100]; /*文字をいれる配列*/
char a;
int houkou; /*ローテートの方向を選ぶ*/
int i,n; /*配列内の位置*/

printf("文字列を入力してください:");
scanf("%s",&moji);

printf("左右どちらにローテートしますか?(左:1,右:2): ");
scanf("%d",&houkou);

if(houkou==2){ /*右を選択したとき*/
for(i=8;i>=0;i--){
moji[i+1]=moji[i];

if(moji[i]=='\0') n=i;

}
moji[0]=moji[n];
moji[n]='\0';
}

else if(houkou==1){ /*左を選択したとき*/
a=moji[0];
for(i=0;moji[i]!='\0';i++){
moji[i]=moji[i+1];
}
moji[i-1]=a;
}
else{ /*それ以外のとき*/
printf("エラー\n");
return -1;
}

printf("ローテート結果:%s\n",moji); /*ローテート結果を表示する*/
return 0;
}

 
 

このプログラ厶をどのようにして関数を利用したものにつくり変えればいいんでしょうか?
ご指導お願いします。


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


Name: 管理人 [URL]  ..ハッカー(290,139ポイント)   Date: 2007/04/15(日) 13:13   No:6831     
Title: Re:関数の作り方    
上記プログラムは配布されたもので、それを関数化することが課題ですか?

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

Name:  ..かけだし(2,086ポイント)   Date: 2007/04/15(日) 13:17   No:6832     
Title: Re:関数の作り方    
いいえ。
もともと問題は関数を使って提出する問題なんですが、関数の作り方が分からないので、普通にプログラムを作りました。なので、このプログラムは私が自分で作ったものです。

なにか違うところがあったんでしょうか??
一応、プログラム的には、コンパイルもできるし、ちゃんと実行できるので、問題ないと思うのですが・・。


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

Name: 管理人 [URL]  ..ハッカー(290,210ポイント)   Date: 2007/04/15(日) 13:18   No:6833     
Title: Re:関数の作り方    
自作関数の作り方は過去にこのような回答をしていますので

http://www.play21.jp/board/formz.cgi?action=res&resno=5084&page=&lognum=17&id=dixq&rln=5134

よければ参考にしてください。


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

Name: 管理人 [URL]  ..ハッカー(290,251ポイント)   Date: 2007/04/15(日) 13:19   No:6834     
Title: Re:関数の作り方    
***自作関数について***



***変数の有効範囲について***

をご覧下さい。


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

Name: 管理人 [URL]  ..ハッカー(290,301ポイント)   Date: 2007/04/15(日) 13:23   No:6835     
Title: Re:関数の作り方    
あらら〜、そうですか、自作したものだと書いてありましたね、寝てないので集中力が・・><
すみませんzzz


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

Name:  ..かけだし(2,428ポイント)   Date: 2007/04/15(日) 13:24   No:6836     
Title: Re:関数の作り方    
こんな感じでしょうか??


#include <stdio.h>

int main(void){

char moji[100]; /*文字をいれる配列*/
int houkou; /*ローテートの方向を選ぶ*/
int i; /*配列内の位置*/

printf("文字列を入力してください:");
scanf("%s",&moji);

printf("左右どちらにローテートしますか?(左:1,右:2): ");
scanf("%d",&houkou);

if(houkou==2){
right_rotate(moji,i);
}

else if(houkou==1){
left_rotate(moji,i);
}

else{
printf("エラー\n");
return -1;}

printf("ローテート結果:%s\n",moji);
}

/*右ローテート関数*/
int right_rotate(char moji[],int i){
int n;
for(i=8;i>=0;i--){
moji[i+1]=moji[i];

if(moji[i]=='\0') n=i;

}
moji[0]=moji[n];
moji[n]='\0';
return ;
}

/*左ローテート関数*/

int left_rotate(char moji[],int i){
char a;
a=moji[0];
for(i=0;moji[i]!='\0';i++){
moji[i]=moji[i+1];
}
moji[i-1]=a;
return ;
}


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

Name: 管理人 [URL]  ..ハッカー(290,573ポイント)   Date: 2007/04/15(日) 13:38   No:6838     
Title: Re:関数の作り方    
そういう感じなんですけど、これではコンパイルとおりませんよね?
何かエラーが出ているはずです。

というのも、関数を呼んでいる地点より下に自作関数があるので、コンパイラはどこに関数があるのかわからないのです。
メイン関数より下に自作関数を書く場合は「プロトタイプ宣言」が必要です。
プロトタイプ宣言なしに書くには単にメイン関数より上に書きます。

また、

int xxx(){

}

というint型関数であるにもかかわらず、returnの値がありません。
int型関数というのは、関数を呼んだ地点にint型で何か値を返すという意味です。
にもかかわらず
return ;
と、returnに値が返されていないのでエラーになります。
値を返す必要が無いのならvoid関数にしましょう。

void xxx(){

}

こんな形です。
そうすればとりあえず良いはずです。

しかし、メイン関数がmainから始まっています。

int main(){

ではじめたほうがいいでしょう。
また、このプログラムでは最大8文字までしか対応できませんがいいのでしょうか?


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

Name:  ..かけだし(2,483ポイント)   Date: 2007/04/15(日) 13:42   No:6839     
Title: Re:関数の作り方    
まず、引数にとしていれるべきものがわからないんですが・・・
例えば左ローテート関数では、char moji[],int iを仮引数にして、char aは仮引数にしてないのですが、いいのでしょうか??


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

Name:  ..入門者(3,148ポイント)   Date: 2007/04/15(日) 13:49   No:6840     
Title: Re:関数の作り方    
直してみました★

#include <stdio.h>

void right_rotate(char moji[],int i);
void left_rotate(char moji[],int i);

int main(){

char moji[100]; /*文字をいれる配列*/

int houkou; /*ローテートの方向を選ぶ*/

int i; /*配列内の位置*/

printf("文字列を入力してください:");

scanf("%s",&moji);

printf("左右どちらにローテートしますか?(左:1,右:2): ");

scanf("%d",&houkou);

if(houkou==2){

right_rotate(moji,i);

}


else if(houkou==1){

left_rotate(moji,i);

}


else{

printf("エラー\n");

return -1;
}

printf("ローテート結果:%s\n",moji);

}

/*右ローテート関数*/

void right_rotate(char moji[],int i){

int n;

for(i=8;i>=0;i--){

moji[i+1]=moji[i];

if(moji[i]=='\0') n=i;

}

moji[0]=moji[n];

moji[n]='\0';

return ;

}

/*左ローテート関数*/

void left_rotate(char moji[],int i){

char a;

a=moji[0];

for(i=0;moji[i]!='\0';i++){

moji[i]=moji[i+1];

}

moji[i-1]=a;

return ;

}


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

Name:  ..入門者(3,153ポイント)   Date: 2007/04/15(日) 13:53   No:6841     
Title: Re:関数の作り方    
どうでしょうか??

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

Name: 管理人 [URL]  ..ハッカー(290,803ポイント)   Date: 2007/04/15(日) 14:07   No:6843     
Title: Re:関数の作り方    
>char moji[],int iを仮引数にして、char aは仮引数にしてないのですが、いいのでしょうか??

まず、aはメイン関数で使用する機会がないので、自作関数内だけで使用できればよいため、それでOKです。
一方iも自作関数内でしか使用していないので、渡す必要がありません。
それぞれの自作関数内で宣言させてください。引数は一つで大丈夫です。
要は両方の関数内で使用する変数だけ受け渡してやればいいのです。

入力した文字列の長さを調べて、どのような長さの文字列でも対応できるようにする必要はないのでしょうか?
右に動かす処理の方法と左に動かす処理の方法が若干違うので、統一した方がキレイに見えるようにも思います。


ちょっと出かける必要がありますので、ちょっと待ってください^^;
よければサンプル作りますね。


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

Name:  ..入門者(3,354ポイント)   Date: 2007/04/15(日) 14:16   No:6844     
Title: Re:関数の作り方    
そうですか。
つまりmain関数で使わないものかつ、自作関数の変数的につかうものは、仮引数にする必要はないんですね!!
つまり・・・mainに値を返すものだけを、自作関数の仮引数にすればいいんですよね。

それでは、iも仮引数から外せばいいですね。

はい。文字列の長さを調べる必要は得にないんですが、確かに、今のままだと8文字までしかだめですよねー。8を100に変えちゃえばいいですかねー。

出かけるんですかー^^
気を付けてくださいねー★
はい、また返答お待ちしてます★
お願いします。


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

Name:  ..入門者(3,413ポイント)   Date: 2007/04/15(日) 14:18   No:6845     
Title: Re:関数の作り方    
そうなんですよ。右と左のローテートのやり方が統一できなくて、このようなやりかたしか思い付かなかったですよ。統一できちゃうんですか???いろいろ方法があるんでしょーね。

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

Name: 管理人 [URL]  ..ハッカー(291,642ポイント)   Date: 2007/04/15(日) 21:25   No:6853     
Title: Re:関数の作り方    
ただ今帰りました。休みの日で天気のいい日は必ずツーリングに行くのでm(_ _)m
春なんで、ツーリングにいい時期ですねぇ、ブログにも書きましたが昨日も観光に行ってました☆

では、回答の続きです。
左にローテートする関数でこんな感じにしてみました。
lenには文字列の長さが入っています。


void rotate_left(char moji[],int len){
int i; char a;
a=moji[0];
for(i=0;i<len-1;i++)
moji[i]=moji[i+1];
moji[len-1]=a;
return ;
}
 
 
意味わかりますよね?右にローテートする関数はこんな風にしてみました。


void rotate_right(char moji[],int len){
int i; char a;
a=moji[len-1];
for(i=len-1;i>0;i--)
moji[i]=moji[i-1];
moji[0]=a;
return ;
}
 
 
先ほどと逆を行ってるだけですね。

文字列の入力をちょっと工夫して、3文字以上の文字列でなかったらもう一度入力をうがなすようにしてみました。
以下メイン関数の一部です。


while(1){
printf("文字列を入力してください:");
scanf("%99s",&moji);
len=strlen(moji);
if(len<3){
printf("3文字以上の文字列を入力してください。\n");
continue;
}
else
break;
}


scanf文の中の99は最大で99文字しか入らないようにするためです。
100しか配列要素を用意していないので、バッファオーバーしないように書きました。
strlenは\0までの長さを求める関数です。\0は含めませんので、実質的な文字の長さです。

continueはループの最初に戻る、breakはループを抜けます。


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


void rotate_left(char moji[],int len){
int i; char a;
a=moji[0];
for(i=0;i<len-1;i++)
moji[i]=moji[i+1];
moji[len-1]=a;
return ;
}
void rotate_right(char moji[],int len){
int i; char a;
a=moji[len-1];
for(i=len-1;i>0;i--)
moji[i]=moji[i-1];
moji[0]=a;
return ;
}

int main(){
char moji[100]={};
int houkou,len;
while(1){
printf("文字列を入力してください:");
scanf("%99s",&moji);
len=strlen(moji);
if(len<3){
printf("3文字以上の文字列を入力してください。\n");
continue;
}
else
break;
}
while(1){
printf("左右どちらにローテートしますか?(左:1,右:2): ");
scanf("%d",&houkou);
if(houkou==1)
rotate_left(moji,len);
else if(houkou==2)
rotate_right(moji,len);
else{
printf("エラー\n");
break;
}
printf("ローテート結果:%s\n",moji);
}
return 0;
}
 
 
このサンプルを一度実行してみてください。
何度でもローテートできるようにしてあります。



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

Name:  ..入門者(3,537ポイント)   Date: 2007/04/16(月) 19:04   No:6875 解決!     
Title: Re:関数の作り方    
おそくなりました☆

なるほどぉーー!!
確かに、3文字以上ないとローテートできないので、そっちの方がいいかもしれません!!
とゆーか、そっちの方がいいですねぇ!!

どぉーも、詳しく書いていただいてありがとぉーございました。

実は、私・・・・ちょっと応用的に、1文字だけじゃなくて、ローテートする文字数を聞いてその文字数分だけ、ローテートする事も考えてしまいました!!!!
ちょっと、最近プログラミングがんばってるんですよ!!(笑)


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

Name: 管理人 [URL]  ..ハッカー(293,820ポイント)   Date: 2007/04/16(月) 19:36   No:6881     
Title: Re:関数の作り方    
失礼ですが、★さんは、以前の☆さんと同じ方ですか?
以前に☆さんがいらっしゃったので^^;http://www.play21.jp/board/ranking.cgi?id=dixq

>実は、私・・・・ちょっと応用的に、1文字だけじゃなくて、ローテートする文字数を聞いてその文字数分だけ、ローテートする事も考えてしまいました!!!!

お〜いいですね〜。
プログラムはそうやって課題だけじゃなく、課題から「こう工夫するとこう応用できるのでは?」と考えながら色々試してみるのはホントいいことです^^

最初はどんなに汚くてもいいからただ動けばいい!って感じで作って行っていいですけど、
余裕が出てきたらどうやったらスマートに、無駄な処理なくかけるだろか?
って事にも気を配ってみてください☆

関数化をうまく汎用化できるようになれば処理を書くのがとても楽になりますよ^^


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

Name:  ..入門者(3,400ポイント)   Date: 2007/04/19(木) 23:13   No:7013     
Title: Re:関数の作り方    
はい。同じ方です(笑)
以前使ってた名前忘れてしまって・・・★にしようと思ったら、☆だったってゆー。。(笑)

スマートですねぇ!!わかりました☆
これからは、学校の課題をひとまず片付けて、そのプログラムをいろいろいじくる事にも時間をかかれればなぁー♪と思います。

また、ぃろぃろ教えてくださいねぇー!!!!!


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

Name: 管理人 [URL]  ..伝説のハッカー(300,174ポイント)   Date: 2007/04/22(日) 15:25   No:7074     
Title: Re:関数の作り方    
遅くなりました・・(_ _|||)

同じ方でしたか^^
おかしいな〜前は塗りつぶし無かったようなとw
どちらに統一されます?よければ2つにわかれているポイントひとまとめにしますが^^
(どうでもいい話かなw

これからも頑張ってくださいね〜☆


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

Name:  ..入門者(3,542ポイント)   Date: 2007/04/23(月) 23:10   No:7104 解決!     
Title: Re:関数の作り方    
本当ですかぁ??
それじゃ、『☆』に統一してもらえますかぁ???(笑)
よろしくぉねがいします。。。(笑)

はぁーぃ!!!!!頑張りますーー。


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

Name: 管理人 [URL]  ..伝説のハッカー(300,455ポイント)   Date: 2007/04/24(火) 00:00   No:7105     
Title: Re:関数の作り方    
う〜、忙しくて掲示板に書き込みも出来ないしむつさんに作ってもらったスクリプトもアップできない(T_T
☆さんに統一しておきましたよ^^

修正しようと名前一覧を表示させてびっくりしましたけど、今までこんなにも沢山の人が利用しているんですね^^;
一覧スクロールするのにちょい時間かかりましたw

いつの間にか私のポイントが30万・・。
まぁ掲示板ランク上がったからって何か商品があるわけでもないんですけどね^^;

もしかしたら神になると記念品が・・・(ナイナイ


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

Name:  ..中級者(12,803ポイント)   Date: 2007/04/30(月) 16:29   No:7257     
Title: Re:関数の作り方    
管理人さん大人気なんですよ♪♪
頑張ってこれからも私のような未熟者を助けてくださいねぇ。。お願いします☆


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



Name: 夏天 [URL]  ..ぴよぴよ(690ポイント)   Date: 2007/04/30(月) 12:12   No:7253       
Title: 課題研究にて    
課題研究でクイズゲームを作るのですが
問題文を表示してる最中でも回答できるようにしたいのですが
どうすればいいのかまったくわからず
ヒントが欲しくここにきました


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


Name: バグ  ..プログラマー(38,506ポイント)   Date: 2007/04/30(月) 12:31   No:7254     
Title: Re:課題研究にて    
1:問題文を文字列で読み込む

2:1文字だけ表示する

3:プレイヤーの入力を待つ

4:2と3を繰り返し、文字列が終端まできたら、3だけを行なう

という流れで如何でしょうか?


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

Name: 夏天 [URL]  ..ぴよぴよ(697ポイント)   Date: 2007/04/30(月) 16:28   No:7256 解決!     
Title: Re:課題研究にて    
ありがとうございます
おかげでできました


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



Name: クルス  ..ぴよぴよ(0ポイント)   Date: 2007/04/26(木) 17:48   No:7175       
Title: 質問です    
第1節 (導入)必要な画像を保存する。 で、説明どおりにやっていったのですが、どうにも、画像が表示されませんorz


Name: クルス  ..ぴよぴよ(96ポイント)   Date: 2007/04/26(木) 17:56   No:7176     
Title: Re:質問です    
すいません、ミスって投稿してしまいました。

画像は、サンプルプログラム実行用フォルダに入れています。
が、プログラムをコピーしても画像が表示されていません。
もしかして、testフォルダの保存場所が悪いのでしょうか?


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

Name: クルス  ..ぴよぴよ(114ポイント)   Date: 2007/04/26(木) 22:08   No:7182     
Title: Re:質問です    
第1節じゃなかったですね・・・・何度もすいません・・・

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

Name: 管理人 [URL]  ..伝説のハッカー(301,378ポイント)   Date: 2007/04/27(金) 21:14   No:7205     
Title: Re:質問です    
遅くなりました。
コンパイラは何ですか?
Borlandでしたら一度「Debug」フォルダにいれて実行してもらえますか?


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

Name: クルス  ..ぴよぴよ(130ポイント)   Date: 2007/04/29(日) 23:10   No:7246     
Title: Re:質問です    
Borlandじゃ、やり方変わってくるんですか・・・・失礼しました。

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

Name: 管理人 [URL]  ..伝説のハッカー(302,978ポイント)   Date: 2007/04/30(月) 11:49   No:7252     
Title: Re:質問です    
Debugフォルダにいれたらきちんとできました?

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



Name: ダッシュ  ..中級者(12,738ポイント)   Date: 2007/04/25(水) 23:29   No:7155       
Title: ソフトが消せない(T_T)    
はあ、もう嫌だ。さっきから一時間以上奮闘してるんですがもう限界です。助けてください。

取り合えず今までの流れを。。。

podcastってありますよね。あれを自分のウォークマンに入れて聞きたいなと思ったんです。
それでitunesってソフトを使えば、それができると知ったので、早速ダウンロードしてみました。
しかし、どうやっても自分のウォークマンと同期させることができず、もしかしたらインストール時の設定がおかしかったのかと思い、itunesを一度消して入れなおそうと考えました。しかし・・・・・消せない!!!

どうやったら消せるんでしょうか。またitunesやpodcastについて詳しい方がおられましたら、宜しくお願いします。


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


Name:  ..ぴよぴよ(876ポイント)   Date: 2007/04/26(木) 13:53   No:7163     
Title: Re:ソフトが消せない(T_T)    
もう一度インストーラーを起動して、インストールして、それから再起動して、アインストールしてもだめでしたか?

強制削除ソフトがあるらしいので使ってみてはどうでしょうか?


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

Name: ダッシュ  ..中級者(12,807ポイント)   Date: 2007/04/26(木) 21:33   No:7180     
Title: Re:ソフトが消せない(T_T)    
もう一度インストールすると言うことは同じソフトが二つになってしまうということですよね。
その状態にして大丈夫なのでしょうか。いや、できるのはわかるんですが、イマイチ自信がないです。


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

Name: box  ..比類無きプログラマー(64,059ポイント)   Date: 2007/04/26(木) 22:31   No:7183     
Title: Re:ソフトが消せない(T_T)    
> もう一度インストールすると言うことは同じソフトが二つになってしまうということですよね。

違うと思いますよ。
規定のインストール先を選べば、前にインストールした分があっても
上書きするだけです。


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

Name:  ..かけだし(1,111ポイント)   Date: 2007/04/27(金) 13:11   No:7189     
Title: Re:ソフトが消せない(T_T)    
そうそう^^
上書きすると消せる可能性(アインストール可能)があるのですよ?


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

Name: 管理人 [URL]  ..伝説のハッカー(301,171ポイント)   Date: 2007/04/27(金) 14:16   No:7192     
Title: Re:ソフトが消せない(T_T)    
ものすごい名前が長いファイルは消せなかったりしますけど、そういうのじゃないですよね^^;
以前ファイルの名前が長すぎて移動も削除も閲覧も何も出来なくなってあせりました・・。
windowsは特定の長さをこえた名前でファイル名を作ると操作不能になるバグがあるようなんで、お気をつけて(_ _||)
解決策として、そのファイルがある上のフォルダの名前を短くするなどあります。
どうも絶対パスが一定の長さ以上になるとバグるみたいです。
vistaとかで解決したんでしょうかね?


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

Name: keichan  ..上級者(21,701ポイント)   Date: 2007/04/27(金) 15:57   No:7197     
Title: Re:ソフトが消せない(T_T)    
>vistaとかで解決したんでしょうかね?

オフラインMSDN "_MAX_PATH 定数" で以下のような注釈がありました。


C ランタイムは、最大 32,768 文字までのパスの長さをサポートしていますが、
これより長いパスをサポートするかどうかは、オペレーティング システム
(特にファイル システム) によって決まります。フィールドの合計は、
Windows 98 FAT32 ファイル システムとの下位互換性を完全に保つために、
_MAX_PATH を超えないようにする必要があります。Windows NT 4.0、Windows 2000、
Windows XP Home Edition、Windows XP Professional、Windows Server 2003、
および Windows Server 2003 の各 NTFS ファイル システムでは、最大 32,768 文字の
パスをサポートしていますが、Unicode API を使用する場合に限ります。
長いパス名を使用する場合は、パスを \\?\ という文字で始め、
Unicode バージョンの C ランタイム関数を使用してください。


VistaのファイルシステムはNTFSなので解決はおそらくしていないと思います。

次期OSに対応するであろう WinFS で"もしかしたら"最大パス長が引き伸ばされるかもしれません。

http://japan.cnet.com/news/ent/story/0,2000056022,20086780,00.htm


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

Name: ダッシュ  ..中級者(13,018ポイント)   Date: 2007/04/29(日) 23:08   No:7245     
Title: Re:ソフトが消せない(T_T)    
すいません、しばらく来れませんでした。

取り合えずもう1度インストしてみたら修復ってのが出てたのでそれをやってみました。
入れなおしてみてもあんまり変わらないのでこれはたぶん仕様なんでしょうね。仕方ないようです。

とはいえ上書きされることは知りませんでしたから、ためになりました。皆様ありがとう御座います。



独り言(と言うか愚痴):なんか音楽ソフトっていっぱいあるけど全部使いにくかったり、機能が微妙だったりでホントうんざりです。ソフト統一するなりどっかの会社が完璧なソフトを作るなりしてもらえるとユーザーとしては楽なんですけどね。いえ、気にしないで下さい。ただの独り言です。(涙)


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

Name: バグ  ..プログラマー(38,601ポイント)   Date: 2007/04/29(日) 23:16   No:7247     
Title: Re:ソフトが消せない(T_T)    
いい目標ができたじゃないですか!(^-^)
自分の使い易いようにカスタマイズしたソフトを自作するってのはどうですか?
データ変換のやり方さえ分かれば、あとはインターフェイス部の作り込みだけですから、意外に簡単かもしれませんよ(ぉぃ)


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

Name: ダッシュ  ..中級者(13,048ポイント)   Date: 2007/04/30(月) 00:26   No:7249     
Title: Re:ソフトが消せない(T_T)    
うう。大学合格したら精進させていただきます。はぁ、皆さんみたいに自由自在にパソコン使えれば・・・。

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

Name: 管理人 [URL]  ..伝説のハッカー(302,678ポイント)   Date: 2007/04/30(月) 11:40   No:7250     
Title: Re:ソフトが消せない(T_T)    
>keichanさん

ありがとうございます。
しかし3万文字もなかったはずですが・・。
あっても500文字位でしょうか・・。
ネットで解決策がないか見ていると、解決法が書いてあったのでそれを利用したのですが、
そこにも3万文字はなかったです。
何が原因なんでしょうね。
ソフトで一度長い名前のファイルを作ると移動も消せも出来なくなる・・。
ファイル名は255文字までしか使用できないようですが、そういうファイルは255文字以上になっているように思います。
ネットの情報を見ても256文字以上のファイルでこの現象がおきるとあります。
しかしそれなら何故上位のフォルダ名を変更したら解決するんでしょう・・、なぞです・・(汗


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



Name: Sena  ..ぴよぴよ(348ポイント)   Date: 2007/04/26(木) 21:36   No:7181       
Title: 二次元配列の関数    
いつもお世話になっております。
質問なんですが、わかる方いましたらお願い致します。


二次元配列の関数なんですが、
このようなchar型に入力を数値入力をしたいのですが、
入力部分わ関数に分けて行い、入力した文字列をmain()
に戻して出力したいのですが、どのように文字列を引数として
渡せばいいでしょうか??

ポインターでアドレスを渡せばいいのでしょうか?
3日くらい悩んだのですが、苦戦しております。
わかる方お願い致します。


void main()
{
char c[5][10];
}
char input()
{
fgets()
return c;
}


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


Name: なぎ  ..上級者(20,760ポイント)   Date: 2007/04/27(金) 14:30   No:7194     
Title: Re:二次元配列の関数    
結論だけ言えば、

void input(char c[][10])
{
// この中で、 c[][] を設定する
}

int main()
{
char c[5][10];
input(c);
}

で、引数は渡せます。

fgets() で文字列を受け取りたい(キーボードから?)であれば、
この場合は、

fgests(c[i], 10, stdin);

で、i 番目の配列に入力できるのではないかなと思います。




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

Name: 管理人 [URL]  ..伝説のハッカー(301,967ポイント)   Date: 2007/04/28(土) 10:20   No:7220     
Title: Re:二次元配列の関数    
プログラムから拝見すると少しプログラムについて誤解されてらっしゃるようですので、

void main()

{
  char c[5][10];
}
char input()
{
  fgets()
  return c;
}

 
ここですけど、引数としてもらった値をここで返せばmainに渡ると思っているのではないでしょうか?
アドレスを渡せば自作関数内で変更したデータはそのまま変更されます。
アドレスを渡さなければ自作関数内で変更したデータはmainで反映されません。

今回はアドレスを渡しているので、main内で変更が反映されますし、returnはなくてOKです。
void関数でいいでしょう。
(returnの意図していた事が違ったらすみません)

ちょっと関数の値受け渡し、関数の作り方、返り値の使い方、などを勉強してみてください。


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

Name: Sena  ..ぴよぴよ(435ポイント)   Date: 2007/04/29(日) 21:09   No:7241     
Title: Re:二次元配列の関数    
みなさんありがとうございます。

そうですよね、アドレスを渡せば良いのですね♪
ありがとうございます。

もし二次元配列をアドレスとして関数に渡しても、二次元配列の機能として
使えるのでしょうか??

または、特別な使い方があるのでしょうか??


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

Name: 管理人 [URL]  ..伝説のハッカー(302,466ポイント)   Date: 2007/04/29(日) 22:47   No:7244     
Title: Re:二次元配列の関数    
ご質問の意味が少々わかりにくいのですが。。
えぇと、メイン関数の中で宣言したものは、自作関数にきちんと渡せばきちんと使用できますよ。
ポインタで渡せば値は変更できますし、アドレスを渡さなければただのコピーした値として扱われます。

一度こんなプログラムを書いてみてはいかがでしょうか?

#include<stdio.h>


int print(int a[3][3]){
int i,j;
//ここで色々2次元配列の中身を変更してみる
for(i=0;i<3;i++)
for(j=0;j<3;j++)
printf("%d ",a[i][j]);
printf("\n\n");
return 33;
}

int main(){
int i,a[3][3]={{0,1,2},{3,4,5},{6,7,8}};
i = print(a);
printf("返って来た値は%d\n",i);
return 0;
}
 
 
 
とにかくなんとなくわかりにくいと思っていることがあればそれを解消すべく引っかかっている部分を何度もプログラム書いてみることです。


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




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +