C言語何でも質問掲示板

Total hit  今日  昨日  



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

 
   ソースファイルのまと ....   
     ・[43172] たかぎ 
     ・[43183] tk 
     ・[43185] 初心者 
     ・[43224] たいちう 
     ・[43270] 初心者 
     ・[43275] sizuma 
     ・[43307] tk 
   ヘッダーでの関数定義   
     ・[43283] Libra 
     ・[43284] バグ 
     ・[43286] 寺初心者 
     ・[43287] 寺初心者 
     ・[43288] non 
     ・[43289] 寺初心者 
     ・[43290] softya 
     ・[43292] 寺初心者 
     ・[43293] non 
     ・[43295] 寺初心者 
   先ほどの応用について ....   
     ・[43271] sizuma 
     ・[43276] kos-mos 
   C++の宿題で困っていま ....   
     ・[43245] たかぎ 
     ・[43248] kos-mos 
     ・[43250] たかぎ 
     ・[43251] kos-mos 
     ・[43252] たかぎ 
     ・[43253] kos-mos 
     ・[43254] kazuoni 
     ・[43255] たかぎ 
     ・[43257] kazuoni 
     ・[43260] たかぎ 
     ・[43261] sizuma 
     ・[43264] kos-mos 
     ・[43265] kos-mos 
     ・[43266] kos-mos 
   龍神録XNA 19章   
     ・[43238] Dixq (管理人) 
     ・[43241] yu 
     ・[43242] YuO 
     ・[43243] softya 
     ・[43246] softya 
     ・[43249] softya 
     ・[43256] softya 
   C++の宿題で困っていま ....   
     ・[43226] kazuoni 
     ・[43227] kazuoni 
     ・[43230] non 
     ・[43233] kos-mos 
   次のプログラミングの ....   
     ・[43127] バグ 
     ・[43155] たかぎ 
     ・[43220] Dixq (管理人) 
     ・[43221] Dixq (管理人) 
     ・[43222] Dixq (管理人) 
   画像で滑らかなアニメ ....   
     ・[43079] softya 
     ・[43080] Dixq (管理人) 
     ・[43085] Justy 
     ・[43195] Sakana 
   最大化ボタンで真っ暗 ....   
     ・[43162] Mist 
     ・[43167] tyu 
     ・[43174] Mist 
     ・[43178] tyu 
     ・[43180] Mist 
     ・[43181] Libra 
     ・[43191] tyu 
     ・[43192] Mist 
     ・[43193] Mist 
   無題   
     ・[43022] やっくん 
     ・[43025] たかぎ 
     ・[43065] あや 
     ・[43067] non 
     ・[43070] あや 
     ・[43071] non 
     ・[43072] あや 
     ・[43073] softya 
     ・[43074] あや 
     ・[43075] softya 
     ・[43076] あや 
     ・[43077] 通りすがり 
     ・[43082] たかぎ 
     ・[43083] ROM 
     ・[43086] qwerty 
     ・[43088] 無名 
     ・[43089] バグ 
     ・[43091] non 
     ・[43093] qwerty 
     ・[43094] たかぎ 
     ・[43095] たかぎ 
     ・[43096] softya 
     ・[43097] Mist 
     ・[43098] softya 
     ・[43099] たかぎ 
     ・[43100] softya 
     ・[43101] たかぎ 
     ・[43104] softya 
     ・[43105] softya 
     ・[43108] たかぎ 
     ・[43110] たかぎ 
     ・[43117] softya 
     ・[43119] 普段見てる派 
     ・[43122] たかぎ 
     ・[43125] qwerty 
     ・[43128] softya 
     ・[43129] たかぎ 
     ・[43130] Mist 
     ・[43131] たかぎ 
     ・[43132] Mist 
     ・[43136] たかぎ 
     ・[43140] たかぎ 
     ・[43143] softya 
     ・[43144] non 
     ・[43146] softya 
     ・[43147] non 
     ・[43148] softya 
     ・[43149] non 
     ・[43150] softya 
     ・[43152] たかぎ 
     ・[43154] softya 
     ・[43156] たかぎ 
     ・[43159] softya 
     ・[43160] sizuma 
     ・[43161] Mist 
     ・[43164] たかぎ 
     ・[43166] Mist 
     ・[43168] たかぎ 
     ・[43171] Tororo 
     ・[43173] たかぎ 
     ・[43176] softya 
   配列にひらがなを格納 ....   
     ・[43153] たかぎ 
   画像のサイズ取得   
     ・[42944] Justy 
     ・[43023] Libra 
     ・[43084] Justy 
     ・[43142] Libra 
   抽象クラスをvectorに ....   
     ・[43134] GPGA 
     ・[43135] ジャーニー 
     ・[43137] たかぎ 
     ・[43138] ジャーニー 
     ・[43139] たかぎ 
     ・[43141] ジャーニー 
   無題   
     ・[43007] ひよこ 
     ・[43092] コン 
   バッチファイルで小数 ....   
     ・[43027] Mist 
     ・[43028] 組木紙織 
     ・[43029] Mist 
     ・[43032] pie 
     ・[43033] softya 
     ・[43038] Mist 
     ・[43047] 組木紙織 
     ・[43050] Mist 
     ・[43051] 組木紙織 
     ・[43052] Mist 
     ・[43053] Mist 
     ・[43054] Mist 
     ・[43055] Mist 
     ・[43090] 組木紙織 
   2Dにおける円運動   
     ・[43060] チルチル 
     ・[43062] Dixq (管理人) 
     ・[43063] MNS 
     ・[43081] シノニム 
   DXライブラリの下地色 ....   
     ・[43059] チルチル 
     ・[43061] 396 
     ・[43064] チルチル 
     ・[43066] 396 
     ・[43068] MNS 
     ・[43069] softya 
   iniファイル保存場所の ....   
     ・[43040] Mist 
     ・[43042] バグ 
     ・[43046] softya 
     ・[43048] ななし 
     ・[43058] バグ 
   次のプログラミングの ....   
     ・[43041] バグ 
     ・[43049] non 
   ファミコンの矩形波で ....   
     ・[42859] softya 
     ・[42901] TKOZ 
     ・[42969] TKOZ 
     ・[42971] softya 
     ・[42990] softya 
     ・[43006] TKOZ 
     ・[43011] softya 
     ・[43024] TKOZ 
   スケーリング   
     ・[42866] non 
     ・[42873] 愛川 
     ・[42905] 愛川 
     ・[42914] ドラ 
     ・[42915] non 
     ・[42933] 愛川 
     ・[42940] 星映 
     ・[42941] 愛川 
     ・[42946] 星映 
     ・[42948] non 
     ・[42988] 愛川 
     ・[42993] 星映 
     ・[42996] non 
     ・[42997] non 
     ・[43021] 愛川 
   弾幕シューティング   
     ・[42782] yu 
     ・[42789] jay 
     ・[42811] Dixq (管理人) 
     ・[42889] jay 
     ・[42932] yu 
     ・[42934] Dixq (管理人) 
     ・[42936] Dixq (管理人) 
     ・[42938] yu 
     ・[42979] jay 
     ・[43013] yu 
   画像を移動させる際の ....   
     ・[42794] kazuoni 
     ・[42798] ラッコ 
     ・[42802] kazuoni 
     ・[42803] 星映 
     ・[42805] ラッコ 
     ・[42807] mats 
     ・[42808] ラッコ 
     ・[42814] 星映 
     ・[43009] ラッコ 
     ・[43010] ラッコ 
   開けられない   
     ・[43001] non 
     ・[43008] jay 
   弾の速度制限   
     ・[42450] Dixq (管理人) 
     ・[42452] チルチル 
     ・[42457] ALFA 
     ・[42460] チルチル 
     ・[42486] スタートメニュー 
     ・[42489] チルチル 
     ・[42535] スタートメニュー 
     ・[42538] チルチル 
     ・[42540] Tatu 
     ・[42669] スタートメニュー 
     ・[42670] スタートメニュー 
     ・[42686] softya 
     ・[42751] スタートメニュー 
     ・[42760] Tatu 
     ・[42795] 星映 
     ・[43002] スタートメニュー 
   無題   
   並び順   
     ・[42962] softya 
     ・[42970] しいたけ 
     ・[42972] non 
     ・[42973] しいたけ 
     ・[42977] non 
     ・[42985] しいたけ 
     ・[42987] softya 
     ・[42989] しいたけ 
     ・[42991] softya 
     ・[42995] しいたけ 
     ・[42998] non 
   DXライブラリで炎を再 ....   
     ・[42259] Dixq (管理人) 
     ・[42266] ぬっち 
     ・[42271] Dixq (管理人) 
     ・[42306] ぬっち 
     ・[42360] Justy 
     ・[42377] ぬっち 
     ・[42568] 通りすがり 
     ・[42570] ティラミス 
     ・[42636] Q 
     ・[42661] Dixq (管理人) 
     ・[42663] Dixq (管理人) 
     ・[42666] Justy 
     ・[42719] けんたろうちゃん 
     ・[42791] Dixq (管理人) 
     ・[42800] けんたろうちゃん 
     ・[42806] Dixq (管理人) 
     ・[42927] Justy 
     ・[42937] Dixq (管理人) 
     ・[42939] Justy 
     ・[42947] ぬっち 
     ・[42958] kazuoni 
     ・[42994] Justy 
   無題   
     ・[42981] Dixq (管理人) 
     ・[42982] softya 
     ・[42983] asa 
   弾幕って・・・   
     ・[42796] 星映 
     ・[42801] チルチル 
     ・[42804] jay 
     ・[42809] チルチル 
     ・[42813] 星映 
     ・[42884] jay 
     ・[42894] チルチル 
     ・[42928] 星映 
     ・[42978] jay 
   無題   
     ・[42975] Naohiro19 
     ・[42976] nowe 
   vector<string> ....   
     ・[42757] たいちう 
     ・[42759] たかぎ 
     ・[42772] dic 
     ・[42949] たいちう 
     ・[42968] dic 
   高速フーリエ変換   
     ・[42819] Naohiro19 
     ・[42956] ruru re 
     ・[42967] toyo 
   乱数を発生させたい   
     ・[42951] Dixq (管理人) 
     ・[42952] しかばね 
     ・[42953] バグ 
     ・[42954] softya 
     ・[42955] tt 
     ・[42957] softya 
     ・[42966] non 
   領域をわける方法   
     ・[42961] softya 
     ・[42963] kaito 
     ・[42964] softya 
     ・[42965] Mist 
   文字のバブルソート   
     ・[42867] やっくん 
     ・[42880] サック 
     ・[42887] non 
     ・[42895] サック 
     ・[42896] Mist 
     ・[42898] サック 
     ・[42906] non 
     ・[42935] サック 
     ・[42945] やっくん 
   コマンドプロンプト   
     ・[42816] 朽木 
     ・[42817] 天和 
     ・[42818] non 
     ・[42820] 天和 
     ・[42821] たかぎ 
     ・[42822] non 
     ・[42823] 天和 
     ・[42825] softya 
     ・[42826] non 
     ・[42827] softya 
     ・[42828] たかぎ 
     ・[42829] softya 
     ・[42831] たかぎ 
     ・[42833] 天和 
     ・[42837] softya 
     ・[42838] 天和 
     ・[42839] box 
     ・[42841] 天和 
     ・[42843] box 
     ・[42845] 天和 
     ・[42846] non 
     ・[42847] たかぎ 
     ・[42848] box 
     ・[42850] softya 
     ・[42852] 天和 
     ・[42853] たかぎ 
     ・[42854] non 
     ・[42855] たかぎ 
     ・[42856] softya 
     ・[42858] box 
     ・[42860] box 
     ・[42863] 天和 
     ・[42865] たかぎ 
     ・[42868] non 
     ・[42869] 天和 
     ・[42870] box 
     ・[42871] たかぎ 
     ・[42872] softya 
     ・[42874] たかぎ 
     ・[42875] softya 
     ・[42876] box 
     ・[42877] 天和 
     ・[42878] 天和 
     ・[42879] たかぎ 
     ・[42881] 天和 
     ・[42883] たかぎ 
     ・[42885] 天和 
     ・[42886] softya 
     ・[42888] たかぎ 
     ・[42890] non 
     ・[42891] 天和 
     ・[42892] 天和 
     ・[42893] たかぎ 
     ・[42897] 天和 
     ・[42899] たかぎ 
     ・[42903] softya 
     ・[42904] 天和 
     ・[42907] 天和 
     ・[42909] box 
     ・[42912] Hermit 
     ・[42916] たかぎ 
     ・[42917] たかぎ 
     ・[42920] 天和 
     ・[42922] 天和 
     ・[42923] たかぎ 
     ・[42924] Hermit 
     ・[42925] 天和 
     ・[42926] たかぎ 
     ・[42929] softya 
     ・[42930] Hermit 
     ・[42931] たかぎ 
     ・[42942] Hermit 

Name: 初心者  ..熟練のプログラマー(41,185ポイント)   Date: 2009/12/03(木) 16:52   No:43170       
Title: ソースファイルのまとめ方    
一つのメインファイルとヘッダーに殆んどソースを
書いています。しかし、プログラムが大きくなるにつれて
非常に読むのが面倒になってきました。
どのようにまとめたら綺麗になるんでしょうか?
ヘッダーにグローバル変数をまとめると綺麗らしいですが・・・。

ソースプログラムの雛型のまとめ方や、こうやったら綺麗にまとまるよって
方法があったら是非おしえてください。


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


Name: たかぎ [URL]  ..ハッカー(130,736ポイント)   Date: 2009/12/03(木) 16:57   No:43172     
Title: Re:ソースファイルのまとめ方    
とりあえず現状認識からですね。
Doxygenでも使って可視化してみてください。

> ヘッダーにグローバル変数をまとめると綺麗らしいですが・・・。

同じ努力を払うのなら、グローバル変数をなくすか、せめて減らす方向を検討してみてください。


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

Name: tk  ..ぴよぴよ(37ポイント)   Date: 2009/12/03(木) 17:29   No:43183     
Title: Re:ソースファイルのまとめ方    
自分は、ソースファイルを別々に書いてますね。
deifne定義専用(define.h)とかグローバル専用(global.h)とか・・・
何度も使う関数(共通関数的なもの)も、別ファイルに書いてます。

mainファイルに作ったヘッダーファイルをインクルードすればすみますし、
define値を変えたいって時は、define.hを見ればいいですし。

まぁグローバル変数を複数のファイルで参照(インクルード)する場合は、
注意が必要ですが、そのあたりは自分で調べてください。
ネットとかで検索すればすぐ出てくると思います。


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

Name: 初心者  ..熟練のプログラマー(41,211ポイント)   Date: 2009/12/03(木) 17:38   No:43185     
Title: Re:ソースファイルのまとめ方    
defineのファイルは
#define a 10;
とかまとめたものですか?


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

Name: たいちう  ..プログラマー(37,320ポイント)   Date: 2009/12/03(木) 20:44   No:43224     
Title: Re:ソースファイルのまとめ方    
> 一つのメインファイルとヘッダーに殆んどソースを
> 書いています。しかし、プログラムが大きくなるにつれて
> 非常に読むのが面倒になってきました。

ちなみに大きいとはどの位の行数なのでしょうか。
大きいプログラムを理解するのに最適な方法は、自然な形に分割することです。
処理の流れの塊を考えて関数に分割しますよね?
関数を分類して関連性の高いグループ毎にヘッダーファイルや
ソースファイルに分割するのが定石です。
例えば、文字列処理の関数を集めたソースファイル、とか、
画面表示に使う関数を集めたソースファイル、とか。

とはいっても上手な分割は簡単ではなく、非常に重要なスキルです。
多くのプログラムを読んで多くのプログラムを書いて、
経験を積んでいってください。


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

Name: 初心者  ..熟練のプログラマー(41,237ポイント)   Date: 2009/12/04(金) 01:09   No:43270     
Title: Re:ソースファイルのまとめ方    
>たいちうさん

1000行くらいです。
変数がいっぱいです。


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

Name: sizuma [URL]  ..上級者(18,906ポイント)   Date: 2009/12/04(金) 01:58   No:43275     
Title: Re:ソースファイルのまとめ方    
1000行は見づらいですかね。
なんにせよ、プログラムの構造が見やすいかによると思います。

同じような処理を何回も書いてないか? → 関数に
引数が多すぎないか          → 構造体に

もしくはスコープを見直したら変数の宣言は見やすくなるかも?

あと、初心者っていう名前は他の人とかぶるんでやめましょうね。


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

Name: tk  ..ぴよぴよ(0ポイント)   Date: 2009/12/04(金) 12:55   No:43307     
Title: Re:ソースファイルのまとめ方    
> defineのファイルは
> #define a 10;
> とかまとめたものですか?

です。

ただし、あくまで例の一つにすぎないので、
できれば、他の人の作り方をみてコーディングパターンを学んだほうがいいです。
自分が、「綺麗に書かれている」と思ったソースを見て、
最初は作り方とか真似して書いていれば、
自ずと、どうソースを書いていくべきかというのが
見えてくるはずです。
あとは、そこに自分なりの工夫を加えるなりして、
自分の作り方を固めればいいです。

ですが、最初に言ったとおり例のひとつにすぎないので、
いくつかのコーディングパターンをもっといたほうが便利です。

長文失礼しました。


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



Name: 寺初心者  ..ぴよぴよ(73ポイント)   Date: 2009/12/04(金) 09:00   No:43281       
Title: ヘッダーでの関数定義    
ttp://okabi.blog92.fc2.com/blog-entry-523.html

上の関数を使ってfpsを安定化させようと思っています。初心者なのでよくわからいんですが
上の関数コードをヘッダーファイルに張り付けてインクルードして
メインプログラムに表示させるとエラーばかりでます。
アホか?って思うと思いますがなぜか分かりません。

特に
ヘッダーで定義した関数をメインファイルで書いてをコンパイルしたら、その関数は識別されていませんって
エラーをはくことがあります。関数の定義はどのようにするべきなのですか?

よろしくお願いします。


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


Name: Libra  ..中級者(11,398ポイント)   Date: 2009/12/04(金) 09:13   No:43283     
Title: Re:ヘッダーでの関数定義    
原因となりそうなものを


・BCCでコンパイルするとき
ファイルを複数に分けてコンパイルするときは、
makefileを作らないと上手く行きません。
開発環境がVisualStudioであればこの操作を自動でやってくれます。


・ヘッダーファイルにソースを書いているため、インクルードの順番で認識されない
ヘッダーファイルにはプロトタイプ宣言を書くものです。
書き方が悪いと、自作ヘッダのインクルードする順番によって、
別のソースで自作ヘッダが呼び出される前に関数が呼び出されて、
認識されないことがあるかもしれません。


開発環境やソースがないと、原因を予測しか出来ません。
開発環境を提示し、ソースを添付したら(誰かが)対応してくれると思います。


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

Name: バグ  ..ハッカー(175,715ポイント)   Date: 2009/12/04(金) 09:14   No:43284     
Title: Re:ヘッダーでの関数定義    
DXライブラリを使用したソースのようですが、ヘッダにはDXライブラリをインクルードされていますか?

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

Name: 寺初心者  ..ぴよぴよ(372ポイント)   Date: 2009/12/04(金) 09:39   No:43286     
Title: Re:ヘッダーでの関数定義    
ヘッダーにDXライブラリをインクルードしています。
上のソースファイルをヘッダーに張り付けて

#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ;//ウィンドウモードに変更する関数
if( DxLib_Init() == -1 ) return -1;//初期化処理する関数

     Fps(); //ヘッダーで定義した関数
WaitKey() ;//何か入力があるまで待つ関数
DxLib_End() ;//終了処理をする関数

return 0 ;
}

って簡単に言えば書いてるとおもいますけど、これじゃだめなんですか?
コンパイルはVC++EEです。


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

Name: 寺初心者  ..ぴよぴよ(586ポイント)   Date: 2009/12/04(金) 09:46   No:43287     
Title: Re:ヘッダーでの関数定義    
#include "DxLib.h"
#include "function.h"//Fps()が入ったヘッダー

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ;//ウィンドウモードに変更する関数
if( DxLib_Init() == -1 ) return -1;//初期化処理する関数

     Fps(); //ヘッダーで定義した関数
WaitKey() ;//何か入力があるまで待つ関数
DxLib_End() ;//終了処理をする関数

return 0 ;
}

です。すいません。


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

Name: non  ..比類無きプログラマー(74,519ポイント)   Date: 2009/12/04(金) 10:04   No:43288     
Title: Re:ヘッダーでの関数定義    
どんなエラーか、たくさん出るなら最初の10個ぐらいでも良いので貼り付けてください。


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

Name: 寺初心者  ..ぴよぴよ(922ポイント)   Date: 2009/12/04(金) 10:25   No:43289     
Title: Re:ヘッダーでの関数定義    
: error C3872: '0x3000': この文字を識別子で使用することはできません
: error C2065: ' double' : 定義されていない識別子です。
: error C2146: 構文エラー : ';' が、識別子 'FRAME' の前に必要です。
: error C2065: 'FRAME' : 定義されていない識別子です。
: error C3872: '0x3000': この文字を識別子で使用することはできません
: error C2065: ' static' : 定義されていない識別子です。
: error C2144: 構文エラー : 'double' は ';' によって先行されなければなりません。
: error C3872: '0x3000': この文字を識別子で使用することはできません
: error C2065: ' static' : 定義されていない識別子です。
: error C2144: 構文エラー : 'double' は ';' によって先行されなければなりません。
: error C2065: 'FRAME' : 定義されていない識別子です。
: error C3872: '0x3000': この文字を識別子で使用することはできません
: error C2065: ' static' : 定義されていない識別子です。
: error C2144: 構文エラー : 'double' は ';' によって先行されなければなりません。


定義されていないってはくんでヘッダーになにかインクルードするんじゃないかと
思います。それとも張り付けたのがいけないのか?
ちなみにヘッダーのインクルードはDXライブラリだけです。


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

Name: softya [URL]  ..熟練のプログラマー(61,073ポイント)   Date: 2009/12/04(金) 10:30   No:43290     
Title: Re:ヘッダーでの関数定義    
全角空白がソースコードに紛れ込んでいますね。
文字列中以外で全角空白を使うとエラーになりますよ。


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

Name: 寺初心者  ..かけだし(1,063ポイント)   Date: 2009/12/04(金) 10:50   No:43292     
Title: Re:ヘッダーでの関数定義    
ありがとうございます。動きました。
しかし、この方も他の方もそうですが
fps関数をいれるとなぜかカクカク動くようになります。
なぜこのようになるのでしょうか?
いれないとそれなりにスムーズなのですが・・・
もし、そうならないfps関数があったのならおしえてくれませんか?
よろしくお願いします。


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

Name: non  ..比類無きプログラマー(74,545ポイント)   Date: 2009/12/04(金) 10:50   No:43293     
Title: Re:ヘッダーでの関数定義    
スペースの部分を消して、半角でスペースまたはTABを入力しなおしてください。


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

Name: 寺初心者  ..かけだし(1,125ポイント)   Date: 2009/12/04(金) 11:37   No:43295 解決!     
Title: Re:ヘッダーでの関数定義    
ありがとうございます。みなさんのおかげで
解決しました。
もうひとつ質問ができましたのでよければご意見きかせてください。


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



Name: kos-mos  ..かけだし(2,463ポイント)   Date: 2009/12/04(金) 00:44   No:43267       
Title: 先ほどの応用についての質問です。    
またまた何度もすみません。
今度は先ほどご指導いただいた「挿入ソートを用いて値の小さい順に表示させる」という宿題についての疑問なのですが、これを「大きい順」にするにはどのようにしたらいいのでしょうか?

先ほどの宿題の内容は以下の通りです。

=問題=

一次配列(要素はint型、要素数は30)に格納されている要素を値の小さい順に並べ替える。
配列の初期値は以下のように,配列の初期化で指定する.
int array[N] = {636, 80, 246, 766, 881, 383, 244, 671, 503, 331, 444, 723, 916, 287, 492, 719, 476, 187, 704, 115, 774, 334, 618, 625, 582, 938, 427, 831, 899, 999};
挿入ソート(insertion sort)アルゴリズムを用いる。

=アルゴリズム=

1. ソート済み位置を、配列先頭の要素番号-1から1ずつ増やしながら、配列末 尾の要素番号-1になるまで以下の処理を繰り返す。
 1-1. ソート済み位置+1の位置に格納されている要素を挿入要素とする。
 1-2. 挿入位置←ソート済み位置+1
 1-3. 現在位置←ソート済み位置
 1-4. 現在位置が配列先頭の要素番号以上であり、かつ現在位置の要素が 挿入要素よりも大きい限り以下の処    理を繰り返す。
  1-4-1. 現在位置の要素を1つ後ろの位置に格納する。
  1-4-2. 挿入位置←現在位置
  1-4-3. 現在位置を配列の先頭方向に1つ戻す。
 1-5. 挿入要素を挿入位置に格納する。
2. 配列の各要素を表示する。

OS:Vista
コンパイラ:VC++ 2008
C++は数カ月程度の初心者です。
三度目の投稿なので至らないところもあると思いますが、どうかよろしく願いします。



#include <iostream>
using namespace std;

#define N 30 //配列の要素数

void main(){
int array[N] = {636, 80, 246, 766, 881, 383, 244, 671, 503, 331, 444, 723, 916, 287, 492, 719, 476, 187, 704, 115, 774, 334, 618, 625, 582, 938, 427, 831, 899, 999};
int sortedPos; //ソート済み位置
int pos; //現在位置
int insertElem; //挿入要素
int insertPos; //挿入位置

//1. ソート済み位置を、配列先頭の要素番号-1から1ずつ増やしながら、配列末 尾の要素番号-1になるまで以下の処理を繰り返す。
for(sortedPos = -1; sortedPos < N-1; sortedPos++){

//1-1. ソート済み位置+1の位置に格納されている要素を挿入要素とする。
insertElem = array[sortedPos +1];

//1-2. 挿入位置←ソート済み位置+1
insertPos = sortedPos +1;

//1-3. 現在位置←ソート済み位置
pos = sortedPos;

//1-4. 現在位置が配列先頭の要素番号以上であり、かつ現在位置の要素が 挿入要素よりも大きい限り以下の処理を繰り返す。
while( pos >= 0 && array[pos] > insertElem){

//1-4-1. 現在位置の要素を1つ後ろの位置に格納する。
array[pos +1] = array[pos];

//1-4-2. 挿入位置←現在位置
insertPos = pos;

//1-4-3. 現在位置を配列の先頭方向に1つ戻す。
pos = pos -1;
}

//1-5. 挿入要素を挿入位置に格納する。
array[insertPos] = insertElem;
}

//2. 配列の各要素を表示する。
for(int i = 0; i < N; i++){
cout << array[i] <<endl;
}
}


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


Name: sizuma [URL]  ..上級者(18,364ポイント)   Date: 2009/12/04(金) 01:24   No:43271     
Title: Re:先ほどの応用についての質問です。    
先ほどは、
挿入すべき値より大きかったら一つづつずらしていきました。
降順にしたいならば、
挿入すべき値より小さかったら一つづつずらしていけばいいですよね。


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

Name: kos-mos  ..かけだし(2,443ポイント)   Date: 2009/12/04(金) 03:19   No:43276 解決!     
Title: Re:先ほどの応用についての質問です。    
なるほど、わかりました。
ありがとうございました。


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



Name: kos-mos  ..かけだし(1,225ポイント)   Date: 2009/12/03(木) 22:34   No:43244       
Title: C++の宿題で困っています。(その2)    
一日に何度もすみません。
今回は挿入ソートを用いて値の小さい順に表示させるという宿題についての質問です。

宿題の内容は以下の通りです。

=問題=

一次配列(要素はint型、要素数は30)に格納されている要素を値の小さい順に並べ替える。
配列の初期値は以下のように,配列の初期化で指定する.
int array[N] = {636, 80, 246, 766, 881, 383, 244, 671, 503, 331, 444, 723, 916, 287, 492, 719, 476, 187, 704, 115, 774, 334, 618, 625, 582, 938, 427, 831, 899, 999};
挿入ソート(insertion sort)アルゴリズムを用いる。

=アルゴリズム=

1. ソート済み位置を、配列先頭の要素番号-1から1ずつ増やしながら、配列末 尾の要素番号-1になるまで以下の処理を繰り返す。
 1-1. ソート済み位置+1の位置に格納されている要素を挿入要素とする。
 1-2. 挿入位置←ソート済み位置+1
 1-3. 現在位置←ソート済み位置
 1-4. 現在位置が配列先頭の要素番号以上であり、かつ現在位置の要素が 挿入要素よりも大きい限り以下の処    理を繰り返す。
  1-4-1. 現在位置の要素を1つ後ろの位置に格納する。
  1-4-2. 挿入位置←現在位置
  1-4-3. 現在位置を配列の先頭方向に1つ戻す。
 1-5. 挿入要素を挿入位置に格納する。
2. 配列の各要素を表示する。


現在わかる範囲で以下のように書いてみたところ、
コンパイルエラーに「'=' : 左のオペランドが、左辺値になっていません。(27)」と表示されてしまいました。
このプログラムでいいのか自体分からず、ここからどうすればいいのか全く分かりません。

OS:Vista
コンパイラ:VC++ 2008
C++は数カ月程度の初心者です。
二度目の投稿なので至らないところもあると思いますが、どうかよろしく願いします。


#include <iostream>
using namespace std;

#define N 30 //配列の要素数

void main(){
int array[N] = {636, 80, 246, 766, 881, 383, 244, 671, 503, 331, 444, 723, 916, 287, 492, 719, 476, 187, 704, 115, 774, 334, 618, 625, 582, 938, 427, 831, 899, 999};
int sortedPos; //ソート済み位置
int pos; //現在位置
int insertElem; //挿入要素
int insertPos; //挿入位置

//1. ソート済み位置を、配列先頭の要素番号-1から1ずつ増やしながら、配列末 尾の要素番号-1になるまで以下の処理を繰り返す。
for(sortedPos = -1; sortedPos < N-1; sortedPos++){

//1-1. ソート済み位置+1の位置に格納されている要素を挿入要素とする。
insertElem = array[sortedPos +1];

//1-2. 挿入位置←ソート済み位置+1
insertPos = sortedPos +1;

//1-3. 現在位置←ソート済み位置
pos = sortedPos;

//1-4. 現在位置が配列先頭の要素番号以上であり、かつ現在位置の要素が 挿入要素よりも大きい限り以下の処理を繰り返す。
while( pos >= sortedPos && array[pos] > insertElem);{

//1-4-1. 現在位置の要素を1つ後ろの位置に格納する。
array[pos +1] = array[pos];

//1-4-2. 挿入位置←現在位置
insertPos = pos;

//1-4-3. 現在位置を配列の先頭方向に1つ戻す。
pos +1 = pos;
}

//1-5. 挿入要素を挿入位置に格納する。
insertPos = insertElem;
}

//2. 配列の各要素を表示する。
for(int i = 0; i < N; i++){
cout << array[i] <<endl;
}
}





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


Name: たかぎ [URL]  ..ハッカー(131,228ポイント)   Date: 2009/12/03(木) 22:37   No:43245     
Title: Re:C++の宿題で困っています。(その2)    
詳しく見ていませんが、コメントを信じるなら...

> pos +1 = pos;

の部分は

--pos;

ではないでしょうか?


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

Name: kos-mos  ..かけだし(1,295ポイント)   Date: 2009/12/03(木) 22:53   No:43248     
Title: Re:C++の宿題で困っています。(その2)    
pos +1 = pos;

の部分を

--pos;

としたところ、エラーは無くなったのですが、実行すると -858993460 が30回表示されるだけでした。


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

Name: たかぎ [URL]  ..ハッカー(131,235ポイント)   Date: 2009/12/03(木) 22:58   No:43250     
Title: Re:C++の宿題で困っています。(その2)    
> エラーは無くなったのですが、実行すると -858993460 が30回表示されるだけでした。

では、コメントがおかしいか、他のところが間違っているのだと思います。


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

Name: kos-mos  ..かけだし(1,351ポイント)   Date: 2009/12/03(木) 23:15   No:43251     
Title: Re:C++の宿題で困っています。(その2)    
挿入位置←ソート済み位置+1

はソート済み位置+1を挿入位置に代入するという意味です。


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

Name: たかぎ [URL]  ..ハッカー(131,241ポイント)   Date: 2009/12/03(木) 23:17   No:43252     
Title: Re:C++の宿題で困っています。(その2)    
↓この意味は?

> //1-4-3. 現在位置を配列の先頭方向に1つ戻す。


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

Name: kos-mos  ..かけだし(1,389ポイント)   Date: 2009/12/03(木) 23:31   No:43253     
Title: Re:C++の宿題で困っています。(その2)    
現在位置(pos)をpos-1みたいな感じだと思うんですが・・・

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

Name: kazuoni [URL]  ..ハッカー(116,177ポイント)   Date: 2009/12/03(木) 23:34   No:43254     
Title: Re:C++の宿題で困っています。(その2)    
おかしいのは
while( pos >= sortedPos && array[pos] > insertElem);

pos +1 = pos;
insertPos = insertElem;

の三行ですかね。

配列の扱い方ができていないような気がします・・・

#追記
上に挙げた三行についてですが、
一行目はアクセスしてはいけない要素にアクセスしてしまうことがあります。
二行目はたかぎさんのおっしゃる通りです。
三行目は「ポジション」に値を代入するのではなく、「要素」に代入するです。


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

Name: たかぎ [URL]  ..ハッカー(131,331ポイント)   Date: 2009/12/03(木) 23:35   No:43255     
Title: Re:C++の宿題で困っています。(その2)    
> 現在位置(pos)をpos-1みたいな感じだと思うんですが・・・

つまり、

pos = pos - 1;

ですね。これは、

--pos;

と同じ意味です。
このコメントが正しいのであれば、ほかが間違っています。

しっかり見る時間がとれないので、こんな回答になってしまいますが、もう一度良く見直してみてください。


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

Name: kazuoni [URL]  ..ハッカー(116,227ポイント)   Date: 2009/12/03(木) 23:40   No:43257     
Title: Re:C++の宿題で困っています。(その2)    
ごめんなさい。一行目では、なぜかセミコロンが入っているという点を忘れていましたので、さらに追記です・・・

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

Name: たかぎ [URL]  ..ハッカー(131,383ポイント)   Date: 2009/12/03(木) 23:58   No:43260     
Title: Re:C++の宿題で困っています。(その2)    
kazuoniさんが指摘された3箇所を修正すれば動きます。
ただし、最初のwhileについては、

> //1-4. 現在位置が配列先頭の要素番号以上であり、かつ現在位置の要素が 挿入要素よりも大きい限り以下の処理を繰り返す。

でなければならないのに、

現在位置がソート済み位置以上であり、かつ現在位置の要素が 挿入要素よりも大きい限り以下の処理を繰り返す。

になっています。


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

Name: sizuma [URL]  ..上級者(18,291ポイント)   Date: 2009/12/04(金) 00:02   No:43261     
Title: Re:C++の宿題で困っています。(その2)    
ちょこちょこ変えて考えようかと思ったんですけど、自分でアルゴリズム見て書いた方が早そうなんで、書いてみたです。
変数が多すぎてわけがわからなくなってしまうので・・・



#include <iostream>

using namespace std;

#define N 30 //配列の要素数

void main(){

int array[N] = {636, 80, 246, 766, 881, 383, 244, 671, 503, 331,
444, 723, 916, 287, 492, 719, 476, 187, 704, 115,
774, 334, 618, 625, 582, 938, 427, 831, 899, 999};

int currentPos;
int insertElm;

for(int i=0;i<N-1;i++){
currentPos=i+1;
insertElm = array[currentPos];
while(currentPos > 0 && insertElm < array[currentPos-1]){
array[currentPos] = array[currentPos-1];
currentPos--;
}
array[currentPos] = insertElm;
}

for(int i = 0;i<N;i++){
cout<<array[i]<<endl;
}
}



頭の中で要素の移動とかを考えながら(もしくはソートの流れを書きながら)したほうがいいのではないでしょうか?
http://ja.wikipedia.org/wiki/%E6%8C%BF%E5%85%A5%E3%82%BD%E3%83%BC%E3%83%88


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

Name: kos-mos  ..かけだし(1,406ポイント)   Date: 2009/12/04(金) 00:24   No:43264     
Title: Re:C++の宿題で困っています。(その2)    
皆さんのご指摘を参考にいじったら、無事完成しました

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

Name: kos-mos  ..かけだし(1,420ポイント)   Date: 2009/12/04(金) 00:25   No:43265     
Title: Re:C++の宿題で困っています。(その2)    
本当にありがとうございました。

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

Name: kos-mos  ..かけだし(1,433ポイント)   Date: 2009/12/04(金) 00:26   No:43266 解決!     
Title: Re:C++の宿題で困っています。(その2)    
解決マークを忘れてました。

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



Name: softya  ..熟練のプログラマー(59,380ポイント)   Date: 2009/12/03(木) 20:57   No:43228       
Title: 龍神録XNA 19章    
大変お待たせしました!
C#+XNAで開発中の龍神録の19章のXNA版が出来ました。
http://softyasu.net/game/gametop.html
色手探り状態ですが、よろしくお願いします。

・音楽と効果音は、許可をいただけておりませんので未搭載です。
・C#と言うかオブジェクト指向でゲームを組むのは初めてなので試行錯誤中です。
・龍神録のCコードをベースにしていますが、モジュール構成はだいぶ変わっています。

ご意見・ご感想お待ちしております。


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,093,449ポイント)   Date: 2009/12/03(木) 21:43   No:43238     
Title: Re:龍神録XNA 19章    
おぉ〜制作お疲れ様でございます〜^^
へ〜これXNAで動いてるんだ〜、すごいですね♪

これ私の環境だと若干カク付いて見えるのですが、60FPSです?
後、コンパイルしようとすると添付ファイルのように表示されるんですが、どうしてでしょう^^;


XNAだったら3D背景とかガンガン動かせそうですね。
C#だから遅いとも聞きますが、実際どれ位違うもんなんです?


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

Name: yu  ..熟練のプログラマー(41,330ポイント)   Date: 2009/12/03(木) 22:14   No:43241     
Title: Re:龍神録XNA 19章    
ソースコード綺麗ですね〜。とても見易いです。

自分も何かゲーム作ろうかな〜とか考えて
C++でクラスを使ってSTGを作ってみようとしたのですが
設計に無理があったのか、途中で行き詰ってしまいましたw

ソースコードはC#ですが、参考になります。
これからも頑張ってください!


>>Dixq様
>XNAだったら3D背景とかガンガン動かせそうですね。

以前、XNAで先輩と一緒になってゲーム(?)を作っていたのですが、
3Dモデルをかなり多く表示しても対して重くなかったので驚きましたw
今そのゲームのデータを持っていますが、先輩の許可を貰っていないので配布できません...

>これ私の環境だと若干カク付いて見えるのですが、60FPSです?
>後、コンパイルしようとすると添付ファイルのように表示されるんですが、どうしてでしょう^^;

自分の環境では滑らかに動いてます。
コンパイルも、エラー無し・警告無しでちゃんとできました。


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

Name: YuO  ..プログラマー(39,485ポイント)   Date: 2009/12/03(木) 22:16   No:43242     
Title: Re:龍神録XNA 19章    
実装を見てはいないですが,簡単な報告から。

まず,ビルドエラー系の報告から。
・例によって,System.Dataへの参照が残っている (XBox 360用でエラー)
・本体のPipelineへの参照は不要 (Contentの中の参照設定のみで十分,XBox 360用でエラー)
・Content中のPipelineへの参照は,プロジェクトへの参照にすべき (クリーンビルドでエラーになる)

次に,Xbox360上で動かしてみて気になった点
・Xbox360の場合,方向パッドよりも左スティックで動作させたい
・XBLIGの視点ではありますが,PlayerIndex.One固定ではなく,最初のSTARTを押したPlayerIndex等にした方がよい
BBS: プレイテストとピア レビューでチェックすべき項目のチェックリスト - XNA Community Forums
http://forums.xna.com/forums/t/37260.aspx
このプログラム自体はXBLIG (XBox Live Indie Games) ではないですが,気にかけておいた方がよいと思います。

配布関係
・ランタイムパックは……これはいったい?ClickOnceのなれの果て?何にせよ,ランタイム単体の配布はやめた方がよい。単体配布するのであれば,MS公式のページへの誘導をした方がよい
SITE: ダウンロードの詳細 : .NET Framework 3.5
http://www.microsoft.com/downloads/details.aspx?familyid=333325FD-AE52-4E35-B531-508D977D32A6&displaylang=ja
SITE: ダウンロードの詳細 : Microsoft XNA Framework Redistributable 3.1
http://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID=53867a2a-e249-4560-8011-98eb3e799ef2
なお,ランタイムパックはEULA違反 (2.a.iiの最初の項目) の可能性があることを指摘しておきます。
> お客様のプログラムにおいて再頒布可能コードに重要な新しい機能を追加すること
・Windows用の実行ファイルの配布であれば,ClickOnceが手軽で良いかと
MSDN: 開発した Windows ゲームの配布
http://msdn.microsoft.com/ja-jp/library/bb464156.aspx
SITE: ひにけにXNA : ClickOnce その1
http://blogs.msdn.com/ito/archive/2008/10/17/clickonce-01.aspx
SITE: ひにけにXNA : ClickOnce その2
http://blogs.msdn.com/ito/archive/2008/10/22/clickonce-02.aspx
・プロジェクトファイル中,.svnディレクトリ,binディレクトリ,objディレクトリ,*.suo,*.user,*.cachefileは不要なので削除すべき
.svnディレクトリ : VS管理外 (Subversion管理用?)
binディレクトリ / objディレクトリ : コンパイルすればできるので不要
*.suo / *.user : ユーザーオプションファイル (デバッグ時のコマンドラインオプション等) なので不要
*.cachefile : なんでしょうか……。初回ビルド時まで存在しないので,不要

> 後、コンパイルしようとすると添付ファイルのように表示されるんですが、どうしてでしょう^^;

XNA Game Studio 3.1をインストールしていますか?
SITE: ダウンロードの詳細 : Microsoft XNA Game Studio 3.1
http://www.microsoft.com/downloads/details.aspx?FamilyID=80782277-D584-42D2-8024-893FCD9D3E82&displaylang=ja
エラーメッセージを見る限り,XNA GS3.1が存在しないのかな,という感があります。


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

Name: softya [URL]  ..熟練のプログラマー(60,029ポイント)   Date: 2009/12/03(木) 22:32   No:43243     
Title: Re:龍神録XNA 19章    
>おぉ〜制作お疲れ様でございます〜^^
>へ〜これXNAで動いてるんだ〜、すごいですね♪

はい。XNAで動いております。
元と動きの違いが無いか確認をお願いしますね。

>これ私の環境だと若干カク付いて見えるのですが、60FPSです?

位置などの更新は60FPSなのですが、画面の更新は負荷次第で勝手に30FPSになったりしています。
画面の更新が30FPSが多い気がするので、今後調査予定です。

>後、コンパイルしようとすると添付ファイルのように表示されるんですが、どうしてでしょう^^;

えーと(^^ゞ
調べますので時間をください。
コンテントパイプラインでエラーですか。
こいつには苦労させられております。

>XNAだったら3D背景とかガンガン動かせそうですね。
>C#だから遅いとも聞きますが、実際どれ位違うもんなんです?

まだ目に見えて遅いと言う実感はないですが、また実測してみますね。
3D背景はやり放題だと思います。ためしていませんが(^_^;)
今のところの感想は、XNAはレンダリングステートを自己管理しないといけないので、DXライブラリよりかなり初心者に辛いですね。

でも一番辛いのは、コンテントパイプラインと言うリソースを管理する仕組みですが、オリジナルのリソースは自分でリソース管理するコードを書かないと行けないのはやってみるまで知りませんでした。日本語の情報が極端に少ないので試行錯誤しながら導入してます。今回はcsvのコンテントパイプラインを追加した分けですが、見事にエラーでてますね。うーん。(^^ゞ


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

Name: softya [URL]  ..熟練のプログラマー(60,200ポイント)   Date: 2009/12/03(木) 22:38   No:43246     
Title: Re:龍神録XNA 19章    
>>yu様。

>ソースコード綺麗ですね〜。とても見易いです。

ありがとうございます。

>自分も何かゲーム作ろうかな〜とか考えて
>C++でクラスを使ってSTGを作ってみようとしたのですが
>設計に無理があったのか、途中で行き詰ってしまいましたw

私のもだいぶ無理があると思ってます。
試行錯誤で書いてますので、50章版はだいぶ変わるかもしれません。

>ソースコードはC#ですが、参考になります。
>これからも頑張ってください!

参考になって、うれしいです。

>自分の環境では滑らかに動いてます。
>コンパイルも、エラー無し・警告無しでちゃんとできました。

環境次第なんでしょうか。うーーん。


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

Name: softya [URL]  ..熟練のプログラマー(60,852ポイント)   Date: 2009/12/03(木) 22:58   No:43249     
Title: Re:龍神録XNA 19章    
>>YuOさん
C#に不慣れなので、色々ありがとうございます。

>まず,ビルドエラー系の報告から。
>・例によって,System.Dataへの参照が残っている (XBox 360用でエラー)
>・本体のPipelineへの参照は不要 (Contentの中の参照設定のみで十分,XBox 360用でエラー)
>・Content中のPipelineへの参照は,プロジェクトへの参照にすべき (クリーンビルドでエラーになる)
はい。見直してみます。
System.Dataへの参照は直したつもりだったんですが(^^ゞ

>次に,Xbox360上で動かしてみて気になった点
>・Xbox360の場合,方向パッドよりも左スティックで動作させたい
>・XBLIGの視点ではありますが,PlayerIndex.One固定ではなく,最初のSTARTを押したPlayerIndex等にした方がよい

了解しました。修正させていただきます。

>BBS: プレイテストとピア レビューでチェックすべき項目のチェックリスト - XNA Community Forums
>http://forums.xna.com/forums/t/37260.aspx
>このプログラム自体はXBLIG (XBox Live Indie Games) ではないですが,気にかけておいた方がよいと思います。

チェックします。

>配布関係
・ランタイムパックは……これはいったい?ClickOnceのなれの果て?何にせよ,ランタイム単体の配布はやめた方がよい。単体配布するのであれば,MS公式のページへの誘導をした方がよい

新規プロジェクトを発行(ClickOnce)しただけのものですね。

>なお,ランタイムパックはEULA違反 (2.a.iiの最初の項目) の可能性があることを指摘しておきます。
> お客様のプログラムにおいて再頒布可能コードに重要な新しい機能を追加すること

中身無いプロジェクトを発行しただけのはグレイゾーンって事ですね。修正したいと思います。

>・Windows用の実行ファイルの配布であれば,ClickOnceが手軽で良いかと

色々やってみたんですが、しっくり来なくて。
もう一度チャレンジしてみます。

>・プロジェクトファイル中,.svnディレクトリ,binディレクトリ,objディレクトリ,*.suo,*.user,*.cachefileは不要なので削除すべき
>.svnディレクトリ : VS管理外 (Subversion管理用?)
>binディレクトリ / objディレクトリ : コンパイルすればできるので不要
>*.suo / *.user : ユーザーオプションファイル (デバッグ時のコマンドラインオプション等) なので不要
>*.cachefile : なんでしょうか……。初回ビルド時まで存在しないので,不要

分かりました。
削除圧縮するバッチをWSHで作成します。

>VS管理外 (Subversion管理用?)
その通りです。

>エラーメッセージを見る限り,XNA GS3.1が存在しないのかな,という感があります。
なるほど、そちらですか。


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

Name: softya [URL]  ..熟練のプログラマー(60,937ポイント)   Date: 2009/12/03(木) 23:39   No:43256     
Title: Re:龍神録XNA 19章    
[変更報告]
とりあえずランタイムパッケージを削除しました。
XNA19実行パックは、CliceOnceで作成した物に変更したためインストールする必要があります。

プロジェクト面の修正はしばらくお待ちください。


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



Name: kos-mos  ..ぴよぴよ(210ポイント)   Date: 2009/12/03(木) 20:29   No:43218       
Title: C++の宿題で困っています。    
今回は選択ソートを用いて値の小さい順に表示させるという宿題についての質問です。

宿題の内容は以下の通りです。

=問題=

一次配列(要素はint型、要素数は30)に格納されている要素を値の小さい順に並べ替える。
配列の初期値は以下のように,配列の初期化で指定する.
int array[N] = {636, 80, 246, 766, 881, 383, 244, 671, 503, 331, 444, 723, 916, 287, 492, 719, 476, 187, 704, 115, 774, 334, 618, 625, 582, 938, 427, 831, 899, 999};
選択ソート(selection sort)アルゴリズムを用いる。

=アルゴリズム=

1. ソート済み位置を、配列先頭の要素番号-1から1ずつ増やしながら、 配列末尾の要素番号-1になるまで以下の処理を繰り返す。
1-1. ソート済み位置+1の位置に格納されている要素を最小値とし、その 値と位置を保存する。
1-2. 現在位置をソート済み位置+2から配列の末尾まで変えながら以下の 処理を繰り返す。
1-2-1. 現在位置の要素が最小値よりも小さいならば、その値と位置 を最小値と最小値の位置に代入する。
1-3. 最小値の要素とソート済み位置+1の要素を交換する。
2. 配列の各要素を表示する。

現在わかる範囲で以下のように書いてみたところ、
実行すると一応ソートはされているのですが、要素の内の一部の値が何度も表示されてしまいました。
すべての値を小さい順にソートされた状態で表示させたいのですが、ここからどうすればいいのか全く分かりません。

OS:Vista
コンパイラ:VC++ 2008
C++は数カ月程度の初心者です。
初投稿なので至らないところもあると思いますが、どうかよろしく願いします。


#include <iostream>
using namespace std;

#define N 30 //配列の要素数

void main(){
int array[N] = {636, 80, 246, 766, 881, 383, 244, 671, 503, 331, 444, 723, 916, 287, 492, 719, 476, 187, 704, 115, 774, 334, 618, 625, 582, 938, 427, 831, 899, 999};
int sortedPos; //ソート済み位置
int pos; //現在位置
int min; //最小値
int minPos; //最小値の位置

//1. ソート済み位置を、配列先頭の要素番号-1から1ずつ増やしながら、 配列末尾の要素番号-1になるまで以下の処理を繰り返す。
for(sortedPos = -1; sortedPos < N-1; sortedPos++){

//1-1. ソート済み位置+1の位置に格納されている要素を最小値とし、その 値と位置を保存する。
min = array[sortedPos +1];
minPos = sortedPos +1;

//1-2. 現在位置をソート済み位置+2から配列の末尾まで変えながら以下の 処理を繰り返す。
for(pos = sortedPos +2; pos < N; pos++){

//1-2-1. 現在位置の要素が最小値よりも小さいならば、その値と位置 を最小値と最小値の位置に代入する。
if(array[pos] < min){
min = array[pos];
minPos = pos;
}
}

//1-3. 最小値の要素とソート済み位置+1の要素を交換する。
int temp = min;
min = array[sortedPos +1];
array[sortedPos +1] = temp;
}

//2. 配列の各要素を表示する。
for(int i = 0; i < N; i++){
cout << array[i] <<endl;
}
}


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


Name: kazuoni [URL]  ..ハッカー(116,017ポイント)   Date: 2009/12/03(木) 20:49   No:43226     
Title: Re:C++の宿題で困っています。    
//1-3. 最小値の要素とソート済み位置+1の要素を交換する。 


int temp = min;

min = array[sortedPos +1];

array[sortedPos +1] = temp;


ではなくて、


array[minPos] = array[sortedPos +1];


array[sortedPos +1] = min;


ではないでしょうか?


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

Name: kazuoni [URL]  ..ハッカー(116,090ポイント)   Date: 2009/12/03(木) 20:53   No:43227     
Title: Re:C++の宿題で困っています。    
#補足
なぜできていなかったかを、デバッガで追ってみてください。
VC++のようなので、ブレークポイントが使えます。
っといっても、数値の入れ替えができていないだけなんですけどね^^;


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

Name: non  ..比類無きプログラマー(74,405ポイント)   Date: 2009/12/03(木) 21:02   No:43230     
Title: Re:C++の宿題で困っています。    
>1. ソート済み位置を、配列先頭の要素番号-1から1ずつ増やしながら

考え方がわからない。なんでって思う。
先頭は0でしょう。その方が自然です。

minをわざわざ覚えておく必要もないかも、INDEXだけ覚えておけば充分。


for(sortedPos = 0; sortedPos < N ; sortedPos++){

//1-1. ソート済み位置+1の位置に格納されている要素を最小値とし、その 値と位置を保存する。
minPos = sortedPos ;

//1-2. 現在位置をソート済み位置+2から配列の末尾まで変えながら以下の 処理を繰り返す。
for(pos = sortedPos +1; pos < N; pos++){

//1-2-1. 現在位置の要素が最小値よりも小さいならば、その値と位置 を最小値と最小値の位置に代入する。
if(array[pos] < array[minPos]){
minPos = pos;
}
}



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

Name: kos-mos  ..ぴよぴよ(241ポイント)   Date: 2009/12/03(木) 21:09   No:43233 解決!     
Title: Re:C++の宿題で困っています。    
皆さまのおかげで無事なりました。
ありがとうございました。


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



Name: 名無しのごんべい  ..ぴよぴよ(340ポイント)   Date: 2009/12/03(木) 12:03   No:43106       
Title: 次のプログラミングのやり方を教えてください    
(管理人により記事が編集されました(編集した部分は灰色部分です))
(名無しのごんべいさんへ、質問の仕方が利用規約に沿っていないようです。例を書きましたので○○の部分を埋めるように編集し直してみてください。)

例:
皆さんこんにちは。私は今大学でプログラムを勉強しています。
以下のような課題が出たのですが、全く解らず困っているのでわからない所を教えて頂けると幸いです。
プログラム歴は○○で、使っているOSは○○、コンパイラは○○です。



問題1:
整数 n を入力とし,n 以下の整数のうち,2 の倍数でも 3 の倍数でもないものの和を出力する関数 int sum_n_23(int n) を作成せよ.次に main 関数内で整数 2 個をキーボードから入力させ,int 型変数 a, b にそれぞれ代入せよ.最後に,関数 int sum_n_23(int n) を用いて a 以上 b 未満の数のうち,2の倍数でも3の倍数でもないものの和を求めて出力させるプログラムを完成させよ.

補足1:
この問題については○○まで学校で勉強していて、自分としては○○まで理解しています。
しかし○○が解らないので、どうすれば解決出来るか教えてください。



問題2:
2つの int 型変数へのポインタを受け取り, 2 つの変数の値のうち小さい方を 1 番目のポインタの指す変数に, 大きい方を 2 番目のポインタの指す変数にセットする関数 void sort2(int*, int*) を作成せよ. 下のプログラムで動作を確認せよ.

#include <stdio.h>

void sort2(int *a, int *b)
{

}

int main(void)
{
int a, b;

printf("a = ");
scanf("%d", &a);
printf("b = ");
scanf("%d", &b);
printf("a=%d, b=%d → ", a, b);
sort2(&a,&b);
printf("a=%d, b=%d\n", a, b);

return 0;
}


補足2:
この問題については○○まで学校で勉強していて、自分としては○○まで理解しています。
しかし○○が解らないので、どうすれば解決出来るか教えてください。(以下略)



問題3:
2つの自然数 a, b に対し, a と b の最大公約数を求める関数 int gcd(int a, int b) を作成せよ.
2つの自然数 a, b に対し, その公約数をすべて表示する関数 void print_cd(int , int) を作成せよ.
※ 「a と b の公約数」は「a と b の最大公約数の約数」なので, gcd(a,b) を呼び出して 2 数の最大公約数 g を求めてその全約数を表示すればよい. i = 2, 3, …, g について i が g を割り切るかどうかテストし, 割り切ればそれを表示するようにする.
main から gcd と print_cd を呼び出し, キーボードから入力した自然数 a, b に対して, 最大公約数とすべての公約数とを表示するようにせよ (表示形式は任意).



問題4:
double 型の外部変数 dollar (1ドルが何円かを表す) と euro (1ユーロが何円かを表す) を宣言せよ.
円の金額を受け取り, それをドルに両替したとき何ドルになるかを返す関数 double yen2dollar(double) を作成せよ. ただし, 円をドルに両替するときのレートは, dollar+1.0 とする. (例えば, 1ドル110円のとき, 円をドルに両替すると1ドル111円で計算される.)
円の金額を受け取り, それをユーロに両替したとき何ユーロになるかを返す関数 double yen2euro(double) を作成せよ. ただし, 円をユーロに両替するときのレートは, euro+1.0 とする.
ドルの金額を受け取り, それを円に両替したとき何円になるかを返す関数 double dollar2yen(double) を作成せよ. ただし, ドルを円に両替するときのレートは, dollar-1.0 とする.
ユーロの金額を受け取り, それを円に両替したとき何円になるかを返す関数 double euro2yen(double) を作成せよ. ただし, ユーロを円に両替するときのレートは, euro-1.0 とする.
今日のドルのレート (dl) とユーロのレート (er) を受け取り, 次のように両替の金額の例を表示する関数 void kawase_example(double dl, double er) を作成せよ.
dollar に dl を, euro に er を代入する.
"今日のレートは 1 ドル xxx.xx 円, 1 ユーロ xxx.xx 円です." と表示する.
10,000円をドルに両替するといくらになるかを yen2dollar を用いて計算し, "10000 円をドルに両替すると xxx.xx ドルになります." 等と表示する.
同様に 10,000円をユーロに両替した結果を表示する.
100 ドルを円に両替した結果を表示する.
100 ユーロを円に両替した結果を表示する.
100 ユーロを円に両替し, それをドルに両替した結果を表示する.
同様に, 100 ドルを円を経由してユーロに両替した結果を表示する.
main 関数から
kawase_example(112.0, 135.0);
kawase_example(114.5, 139.5);
を呼び出すようにせよ



問題5:
2 次元座標上に k 個(k>0)の点 p0,...,pk-1 が与えられているものとする.キーボードから新しい点のデータ data が入力されたとき, p0,...,pk-1 の中で data との距離がもっとも近いものを求め,その点の識別番号(p0,...,pk-1)とそのときの距離を表示するプログラムを作成せよ.ただし,data からの距離が等しい点が複数ある場合はその中のいずれか一つの識別番号が求められればよいものとする.


問題6:
整数 a, b を入力とし,その最大公約数を計算して出力する関数 int gcd( int a, int b) を [リスト5.17]を参考にして定義せよ.これを利用して,main 関数内で互いに素な(最大公約数が1である)自然数の組 (x, y)を列挙して表示させるプログラムを作成せよ.ただし,x は10以上17未満の整数, y は30以上36以下の整数とする.



問題7:
文字列 s 中の数字の個数を返す関数 int str_num_count(char s[]) を作成せよ



問題8:
下のように初期化した文字列 sentence と, キーボードから入力した文字列 str に対し, sentence が str で始まっているかどうか (str が sentence の先頭から一致するかどうか) を判定して表示するプログラムを作成せよ. sentence の方が str より長いと仮定してよい.
char sentence[] = "This is a pen. That is an apple.";




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


Name: バグ  ..ハッカー(175,670ポイント)   Date: 2009/12/03(木) 12:59   No:43127     
Title: Re:次のプログラミングのやり方を教えてください    
たくさん質問するのは結構ですが、せめて開発環境とか開発言語とか、自分がC言語のことをどの程度理解しえいるかとか、答えだけが欲しいのかとか、自分で解く気があるのかとか、もう少し情報を提示してください。




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

Name: たかぎ [URL]  ..ハッカー(130,341ポイント)   Date: 2009/12/03(木) 16:05   No:43155     
Title: Re:次のプログラミングのやり方を教えてください    
> n 以下の整数のうち,2 の倍数でも 3 の倍数でもないものの和

常にマイナス無限大になると思いますが、intでは表現できませんね。
この辺りはどうお考えですか?

> キーボードから入力させ

キーボードからの入力を受け付ける一般的な実現方法はありません。
また、キーボードが存在するかどうかもプラットフォームしだいです。

> 関数 int sum_n_23(int n) を用いて a 以上 b 未満の数のうち,2の倍数でも3の倍数でもないものの和を求めて

sum_n_23の仕様しだいですが、数学的にはマイナス無限大からマイナス無限大を引いても意味が無いことを指摘しておきます。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,092,527ポイント)   Date: 2009/12/03(木) 20:32   No:43220     
Title: Re:次のプログラミングのやり方を教えてください    
問題2についてのお二方の回答。
こちらにまとめさせて頂きました。


Name: バグ ..ハッカー(174,758ポイント) Date: 2009/12/02(水) 15:11 No:43039

2つの int 型変数へのポインタを受け取り, 2 つの変数の値のうち小さい方を 1 番目のポインタの指す変数に, 大きい方を 2 番目のポインタの指す変数にセットする関数 void sort2(int*, int*) を作成して、コンパイルして実行すれば確認できますよ。


Name: non ..比類無きプログラマー(73,618ポイント) Date: 2009/12/02(水) 16:18 No:43045

ほとんどのテキストにポインタを使った参照渡しの例がswapという関数であると
思いますので、それを参考に作ってください。
例えば
http://www1.cts.ne.jp/~clab/hsample/Point/Point12.html


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,092,723ポイント)   Date: 2009/12/03(木) 20:33   No:43221     
Title: Re:次のプログラミングのやり方を教えてください    
もう一問あったようなので追加します。

問題9
int t, int h を入力とし, t2*h/3 を計算して出力する関数 double pyramid(int t, int h)を定義せよ. さらに,main から pyramid を呼び出して,その出力(戻り値)を適当な double 型の変数に代入せよ.最後に,5≤i≤10 の整数 i についてi2*(i+2)/3 を計算し, 結果を下記のような形式 (小数点以下 3 桁) で表示するプログラムを作成せよ.

i pyramid
5 58.333
6 96.000
7 147.000
8 213.333
9 297.000
10 400.000


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,093,071ポイント)   Date: 2009/12/03(木) 20:38   No:43222     
Title: Re:次のプログラミングのやり方を教えてください    
さてさて・・、量が多くてどこから回答してよいものやら^^;

利用規約を読んで頂けたらわかると思いますが、課題だけ書いて、誰かやって頂戴っていうのは規約違反になります。
規約どうのこうのよりも自分の為にならないですし、回答者もどう回答してよいか解らず困るので、
質問はなるべく規約に沿った形でお願いしますね。
規約なんて読みたくないかもしれませんが、めんどうなら、画像の部分だけささっと読んでもらえたらと思います^^


まず、いきなり問題を解いてもよく解らないと思うので、
こちらから少し質問させて下さい。

今現在どの程度理解されていますか?
例えば私が

問題A
キーボード入力から文字列を受け取り、その文字数をカウントして表示するプログラムを作りましょう

って問題出したら、解けますか?
それが出来たらいくつか出来そうです。


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



Name: Sakana  ..かけだし(1,496ポイント)   Date: 2009/12/02(水) 22:17   No:43078       
Title: 画像で滑らかなアニメーションさせるには?    
LoadDivGraph関数で[0]〜[2]に格納した画像を順次表示させ滑らかなアニメーションをさせようと試みようとしているのですが、具体的に書きますと、横スクのアクションゲーでキーが押されると攻撃モーションをするという事なのですがDrawGraph(x, y, image[n])のnの部分に+1していくという書き方だと早すぎてチカチカしてしまうのです
そこでSleep()関数等でちょっと描画を遅くしてみようとしてみたら
動作がおかしくなってしまい、上手くアニメーションさせる事が出来ません

適切な書き方があればご教示下さい



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


Name: softya  ..熟練のプログラマー(54,299ポイント)   Date: 2009/12/02(水) 22:20   No:43079     
Title: Re:画像で滑らかなアニメーションさせるには?    
DrawGraph(x, y, image[n/2];
とするだけで1/2の再生速度になりますよ。
DrawGraph(x, y, image[n/3];
なら1/3に!


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,092,270ポイント)   Date: 2009/12/02(水) 22:33   No:43080     
Title: Re:画像で滑らかなアニメーションさせるには?    
DrawGraph(x, y, image[n/4]
なら1/4n(ry



Sleep関数で止める方法はよくないです。
Sleep関数はFPS制御用だけに使った方がいい・・というかそうであるべきかと。
毎フレーム必ず制御関数に処理を返してあげる構造がベストだと思います。
マルチスレッドでは無い限り、Sleepを使うと全て止まってしまい、
背景なども止まってしまいます・・。

遅くする、早くする、などはカウンタを使っていくらでも変更可能ですから。
FPSは固定にして、動きの計算式を変えるようにすることお勧めします。

(それらを全て理解した上でSleepを使うなら良いでしょうが)


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

Name: Justy  ..伝説なるハッカー(468,936ポイント)   Date: 2009/12/03(木) 01:03   No:43085     
Title: Re:画像で滑らかなアニメーションさせるには?    
 基本的には既に出ているアイデアでいいかとは思いますが、ちょっと別の方向から。


> 滑らかなアニメーション

 「滑らか」にするならアニメのコマ数を増やすのが無難ではないでしょうか。
 [0]〜[2]を [0]〜[3]とか[0]〜[4]にするだけも結構違ってみえるはずです。



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

Name: Sakana  ..かけだし(1,583ポイント)   Date: 2009/12/03(木) 18:36   No:43195 解決!     
Title: Re:画像で滑らかなアニメーションさせるには?    
nを割る書き方で丁度いい速度になり自然な速度でアニメーションをさせる事が出来るようになりました
Justyさんのおっしゃる通り滑らかにするなら画像の枚数増やす事ですよね
Sleepの使い方がよく分かっていなかったので、ご説明ありがとうございました




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



Name: tyu  ..ぴよぴよ(89ポイント)   Date: 2009/12/03(木) 16:33   No:43158       
Title: 最大化ボタンで真っ暗に    
DXライブラリで最大化ボタンって有効なんですか?
http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=1096
ここ見て一応やってみましたが、ウインドウから最大化すると
真っ暗になります。


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


Name: Mist  ..比類無きプログラマー(74,411ポイント)   Date: 2009/12/03(木) 16:38   No:43162     
Title: Re:最大化ボタンで真っ暗に    
>  因みに、ウインドウモードが切り替わった際にグラフィック
> ハンドルは全て解放されてしまいますので、

と書いてます。
画像の再ロードを忘れていませんか?


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

Name: tyu  ..ぴよぴよ(121ポイント)   Date: 2009/12/03(木) 16:46   No:43167     
Title: Re:最大化ボタンで真っ暗に    
画像の再ロードの仕方教えてくれませんか?
よろしくお願いします。


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

Name: Mist  ..比類無きプログラマー(74,474ポイント)   Date: 2009/12/03(木) 17:00   No:43174     
Title: Re:最大化ボタンで真っ暗に    
LoadGraph関数などでロードするだけですよ。

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

Name: tyu  ..ぴよぴよ(190ポイント)   Date: 2009/12/03(木) 17:08   No:43178     
Title: Re:最大化ボタンで真っ暗に    
それはもう一度コンパイルしろってことでしょか?
実行した後、ウインドウの最大化で画面を表示させると暗くなるって意味
で私は語っているんですが・・・。すいません。



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

Name: Mist  ..比類無きプログラマー(74,590ポイント)   Date: 2009/12/03(木) 17:15   No:43180     
Title: Re:最大化ボタンで真っ暗に    
画像ロード

最大化

もう一度ロード(←ここが重要)

というふうにプログラムが組まれていれば問題ないはずですが。
現状のソースを提示してもらえると具体的な回答が得られるかと思います。


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

Name: Libra  ..中級者(11,199ポイント)   Date: 2009/12/03(木) 17:19   No:43181     
Title: Re:最大化ボタンで真っ暗に    
DXライブラリリファレンス、SetRestoreGraphCallback関数の
説明を読んでみるとよいかもしれません。


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

Name: tyu  ..ぴよぴよ(335ポイント)   Date: 2009/12/03(木) 18:02   No:43191     
Title: Re:最大化ボタンで真っ暗に    
初心者なんでポインタは基礎しかわからないですが、
int SetUseASyncChangeWindowModeFunction( int Flag, void (*CallBackFunction)(void*), void *Data );
特に↑が良く分からないです。

仮に最大化された時に前の画面データを呼び出す簡単な例があったら教えてくれませんか?
考えてみます。よろしくお願いします。


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

Name: Mist  ..比類無きプログラマー(75,044ポイント)   Date: 2009/12/03(木) 18:16   No:43192     
Title: Re:最大化ボタンで真っ暗に    
リンク先の本家管理人さんサンプルの改変です。
画像はサンプルプログラム実行用フォルダに入っていたのを使っています。
VC++2008EEで動作確認済み。


#include "DxLib.h"

int iGraph;

// 画面モード変更時に呼ばれるコールバック関数
void ChangeCallback( void *Data )
{
// 画像の再ロード
iGraph = LoadGraph("TestTex1.jpg");
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
// 最大化ボタンを有効にする
SetUseASyncChangeWindowModeFunction( TRUE, ChangeCallback, NULL );

// ウインドウモードで起動する
ChangeWindowMode( TRUE );

// DXライブラリ初期化処理
if( DxLib_Init() == -1 ) return -1;

// 描画先画面を表にする
SetDrawScreen( DX_SCREEN_FRONT ) ;

// 画像のロード
iGraph = LoadGraph("TestTex1.jpg");

// ESC キーが押されたら終了する
while( CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// メッセージ処理(エラーが発生したらループを抜ける)
if( ProcessMessage() == -1 ) break;

DrawGraph(0, 0, iGraph, FALSE);

// 裏画面の内容を表画面に反映します
ScreenFlip() ;
}

// DXライブラリの後始末
DxLib_End() ;

// ソフトの終了
return 0 ;
}


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

Name: Mist  ..比類無きプログラマー(76,192ポイント)   Date: 2009/12/03(木) 18:18   No:43193     
Title: Re:最大化ボタンで真っ暗に    
タブの所がずれるのでもう一度。
(何でタブ幅8なんだorz)

#描画先が表になってたのを裏に修正(影響ないけど念のため)


#include "DxLib.h"

int iGraph;

// 画面モード変更時に呼ばれるコールバック関数
void ChangeCallback( void *Data )
{
// 画像の再ロード
iGraph = LoadGraph("TestTex1.jpg");
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
// 最大化ボタンを有効にする
SetUseASyncChangeWindowModeFunction( TRUE, ChangeCallback, NULL );

// ウインドウモードで起動する
ChangeWindowMode( TRUE );

// DXライブラリ初期化処理
if( DxLib_Init() == -1 ) return -1;

// 描画先画面を裏にする
SetDrawScreen( DX_SCREEN_BACK ) ;

// 画像のロード
iGraph = LoadGraph("TestTex1.jpg");

// ESC キーが押されたら終了する
while( CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// メッセージ処理(エラーが発生したらループを抜ける)
if( ProcessMessage() == -1 ) break;

DrawGraph(0, 0, iGraph, FALSE);

// 裏画面の内容を表画面に反映します
ScreenFlip() ;
}

// DXライブラリの後始末
DxLib_End() ;

// ソフトの終了
return 0 ;
}


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



Name: あや  ..かけだし(1,642ポイント)   Date: 2009/12/01(火) 23:54   No:43020       
Title: 無題    
英小文字から英大文字にする関数 int toupper(int c) があると思うんですが、これを使わずに同じことをするにはどんな関数を使えばよいかわかる方教えてもらえませんか???

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


Name: やっくん  ..中級者(14,619ポイント)   Date: 2009/12/02(水) 01:38   No:43022     
Title: Re:無題    
これを使わずに行うのならば自分で作るっていうのも手ですよ。
アスキーコードではABCDEFG・・・・は1つずつしか番号が変わりません。
たとえば
A→41
B→42
C→43
また、abcdefg・・・も同様です。
ということは、Aの番号から小文字のaの番号を引いた値(Bからbを引いても、Cからcを引いても同じ)を小文字に足してあげると小文字→大文字へ変換することが可能です。


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

Name: たかぎ [URL]  ..ハッカー(126,395ポイント)   Date: 2009/12/02(水) 08:57   No:43025     
Title: Re:無題    
wctob(towupper(btowc(c))) とか wctob(towctrans(btowc(c), wctrans("toupper"))) とか



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

Name: あや  ..かけだし(1,679ポイント)   Date: 2009/12/02(水) 20:44   No:43065     
Title: Re:無題    
JISコードを使って、Aの番号からaの番号を引くと−20となるのですが、これにどういう風に小文字を足すのですか?

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

Name: non  ..比類無きプログラマー(73,762ポイント)   Date: 2009/12/02(水) 21:03   No:43067     
Title: Re:無題    
こんな感じ

if('a' <= ch && ch <= 'z')
ch-=('a'-'A');




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

Name: あや  ..かけだし(1,842ポイント)   Date: 2009/12/02(水) 21:26   No:43070     
Title: Re:無題    
自分でやろうとすると、どうつなげてよいのかがわからないのでやってみてもらえませんか?

#include <stdio.h>

int main(void)
{
int ch;

while (1) {
ch=getchar();
if('a' <= ch && ch <= 'z')
ch-=('a'-'A');
}

printf("文字列を入力してください:");


..........????


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

Name: non  ..比類無きプログラマー(73,782ポイント)   Date: 2009/12/02(水) 21:38   No:43071     
Title: Re:無題    
何がわからないのか、わかりません。
どういう課題なの?


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

Name: あや  ..かけだし(1,872ポイント)   Date: 2009/12/02(水) 21:47   No:43072     
Title: Re:無題    
toupperを使わずに英小文字を英大文字に変換する関数を作りたいのです!!
JISコードを使って作れたらベストです。


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

Name: softya  ..熟練のプログラマー(54,211ポイント)   Date: 2009/12/02(水) 21:55   No:43073     
Title: Re:無題    
最初の質問からすると、これでOKでは?

int my_toupper(int ch)
if('a' <= ch && ch <= 'z')
ch-=('a'-'A');
return ch;
}


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

Name: あや  ..かけだし(1,887ポイント)   Date: 2009/12/02(水) 22:05   No:43074     
Title: Re:無題    
my_toupperは使わないとできないですか?

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

Name: softya  ..熟練のプログラマー(54,285ポイント)   Date: 2009/12/02(水) 22:08   No:43075     
Title: Re:無題    
>my_toupperは使わないとできないですか?
これで何が問題があるか、具体的に教えて欲しいです。

>英小文字から英大文字にする関数 int toupper(int c) があると思うんですが、これを使わずに同じことをするにはどんな関数を使えばよいかわかる方教えてもらえませんか???

って事なので自作関数にしてみただけですが。


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

Name: あや  ..かけだし(1,908ポイント)   Date: 2009/12/02(水) 22:11   No:43076 解決!     
Title: Re:無題    
いえ全く問題ないです(^_-)-☆
ありがとうございます。


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

Name: 通りすがり  ..上級者(18,126ポイント)   Date: 2009/12/02(水) 22:16   No:43077     
Title: Re:無題    
質問者が全くCのこと理解していないようです。
まずは言葉の意味を理解して使わないと回答者と意思疎通が出来ませんよ。

とりあえず学校の宿題が出来たらそれでいいといった感じなのでしょうが、
せっかくお金を出してもらって勉強する時間を確保してもらってるんだから、
勉強しましょうよ。
学生のうちだけですよ、大人になったら忙しい時間を見つけて勉強しなくちゃならなく・・(ブツブツ

さて、

>toupperを使わずに英小文字を英大文字に変換する関数を作りたいのです!!

というからmy_toupper関数が示されているのに

>my_toupperは使わないとできないですか?

って意味不明です。
関数を使わないならnon氏が既に答えています。

で、小文字から大文字にすることが出来たなら、
練習として大文字から小文字にするプログラムを作りましょう。
そうやって覚えていかないと毎回同じこと人に聞かないと出来なくなりますよ。


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

Name: たかぎ [URL]  ..ハッカー(126,467ポイント)   Date: 2009/12/02(水) 22:54   No:43082     
Title: Re:無題    
途中から問題がすり替わっているような...

> これを使わずに同じことをするにはどんな関数を使えばよいかわかる方教えてもらえませんか???

とのことなので、btowc, towupper, wctobを組み合わせれば実現できると答えたのですが、いつの間にか関数を自作する話になっているようです。
英大文字とか英小文字とか書いているところが微妙ですが、toupperと同じことをするにはロケール等も実装しなければなりません。
完全にオリジナルなら簡単ですが、既存のtoupperの動作に合わせるとなると至難の業です。
少なくとも処理系を特定しなければ無理です。


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

Name: ROM  ..ぴよぴよ(739ポイント)   Date: 2009/12/02(水) 23:28   No:43083     
Title: Re:無題    
質問に一字一句間違いなく忠実に回答出来るのは素晴らしいと思いますが、
質問の仕方や文章、今までの流れなどから、
恐らくこういうことが聞きたいのだろうと柔軟な解釈をすることも必要ではないでしょうか。
例えば、
「既存の関数を使うような質問の仕方だが、恐らく自作関数の宿題なんだろうな」などですね。
現時点で、たかぎさんが言っていることに対する的確な反応が質問者から得られるとは思えません。

今回はそこまでではありませんが、質問者が恐らく得たいだろう回答をするのではなく、あくまで忠実であり、
望む答えが得られないのは質問の仕方が悪いからだと暗に言っているかのような回答がよく見られます。
特に批難するようなつもりはありませんが、親切な回答ではないなと見ていてよく思います。


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

Name: qwerty  ..ぴよぴよ(120ポイント)   Date: 2009/12/03(木) 01:51   No:43086     
Title: Re:無題    
>>ROMさん
おっしゃっていることはよくわかります。
さらにここ最近、余計にその風潮が強まってきている気がします。

必ずお読み下さいと書いてある利用規約を読んでいないと思われる質問が多々あるのも事実ですが、
気軽に質問できることが売りであるはずのこの掲示板の趣旨が非常に損なわれている気がします。

また、規約上、回答する際の姿勢は回答者の一存とのことですが、方針としては温かなアドバイスが望まれています。

もう少し柔軟に対応してあげても良いと思いますね。


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

Name: 無名  ..ぴよぴよ(31ポイント)   Date: 2009/12/03(木) 06:55   No:43088     
Title: Re:無題    
人間味に欠ける回答が目に付きます。

(1)厳しい
(2)言葉足らず
(3)理屈によってのみ解釈する
(4)規約という結論を伝えるだけでその理由を述べない
(5)顔文字が無い
(6)相手の気持ちに対する配慮が無い
(7)悪く言えば、意地悪
(8)上記と逆の事をしようという心構えが無い


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

Name: バグ  ..ハッカー(175,565ポイント)   Date: 2009/12/03(木) 08:18   No:43089     
Title: Re:無題    
解答者への批判が目立ちますが…ここの掲示板はまだ親切だと思いますよ。

たとえ課題の丸投げであっても、自分で解こうという意欲のある書き込みに対しては非常に細かく対応してくれる人が多いです。

それこそ、他の掲示板だったら『ググれ』で終了する内容であってもです。

そもそも、ここは『答えを提示させる場所』ではなく、『答えへ導く場所』というコンセプトがあったはずです。それなのに何を説明しても「分かりません」、「やってみせてください」の一点張では、質問者のやる気を疑われても致し方ないと私は考えます。

ぶっちゃけてしまうと、そのような質問者を相手にしても解答者的には面白くないんですよ。そもそも、解答者には自己満足以外は解答するメリットはありません。

それなのに、何も手応えのないやり取りをしていたのでは自己満足すら得られないどころか、残るのは徒労感のみという事になってしまいます。

解答者も人間ですから、課題文だけを載せているような『人間味に欠ける質問』には答えたくありませんし、打っても響かないような質問者には腹も立ちます。その辺りは質問する側も理解して欲しいなぁ…と個人的に思うところです。


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

Name: non  ..比類無きプログラマー(73,900ポイント)   Date: 2009/12/03(木) 09:06   No:43091     
Title: Re:無題    
> 人間味に欠ける回答が目に付きます。

私のことでしょうか。

>
> (1)厳しい

学校で、何のためにプログラムを勉強しているのでしょうか?ちょっと調べるのとわかるのに、
調べようとはしない。先生に聞いても教えてくれないからっていうけど、それは、先生の考え方
があって、自力で問題を解決する力を身につけさせるためではないでしょうか。だとすれば、
解答だけを教えてあげるのは本人のためになりません。厳しさが本人の役に立つのです。

> (2)言葉足らず

質問者が、充分な情報を提供している場合には、それなりに説明しているつもりです。「わかりません」
だけの1〜2行の質問に対し、たくさんの方が質問以上の長い回答をしていると思います。
「言葉足らず」の質問に対し、「言葉足らず」の回答をするのはあたりまえでしょう。
自分で勉強している人にとっては、言葉足らずでも、ヒントがあれば充分だと思います。
例えば、検索のキーワードだけでもね。

> (3)理屈によってのみ解釈する

最近の学生を見ていると、自分の考えを相手にうまく伝えられない人が増えています。これは、親(おとな)に責任があると思っています。例えば、親が子供によく言う「おなかすいていない?」「眠いの?」
「何が食べたい?」など、子供が話していないのに、先回りして、世話を焼いています。これが、
考え方を相手に伝えることができない子供を作っていると思います。
社会人ではこれは通用しません。私は、社会人(おとな)として、そのことを伝えたいし、学んで欲しい。


私は意地悪な頑固親父でありたい。








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

Name: qwerty  ..ぴよぴよ(183ポイント)   Date: 2009/12/03(木) 09:46   No:43093     
Title: Re:無題    
何も批判しているわけではありません。
親切な書き込みもありますが、そうでない場合もあります。
親切でないというよりも適切でないという方がいいかもしれません。

>そもそも、ここは『答えを提示させる場所』ではなく、『答えへ導く場所』というコンセプトがあったはずです。それなのに何を説明しても「分かりません」、「やってみせてください」の一点張では、質問者のやる気を疑われても致し方ないと私は考えます。

ここは理解できます。
しかしバグさんが解答者と表現することには少し疑問を感じます。
それでは自身で『答えへ導く場所』というコンセプトをないがしろにしていると言っているようなものです。

>質問する側も理解して欲しい
おっしゃっていることはよくわかります。
質問する人の中には、この掲示板を初めて利用する人もいます。もちろんそうでない人もいます。
質問者にも理解してほしいというのはもっともですが、その書き込み内容から、今回問題となっているような
質問をする人たちはどちらかと言えば、前者のような、もしくはそれに近い人たちだと思います。
そんな人たちにもう少し寛容であってあげてもいいのではないか、と思っただけです。

この掲示板の回答者を非難・批判しているわけではなく、あくまでこのようであった方が『アットホームで温かい』この掲示板の方針に沿うのではないかと意見しているに過ぎません。


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

Name: たかぎ [URL]  ..ハッカー(126,992ポイント)   Date: 2009/12/03(木) 10:19   No:43094     
Title: Re:無題    
> 人間味に欠ける回答が目に付きます。

主に指摘されているのは私でしょうね。

> (1)厳しい

これはnonさんと同意見です。
あと、「厳しい」というのを「親切」の反対語だと誤解している人がいるように思います。
「親切」の反対は「冷淡」であり、もっとも冷淡な態度は、質問を読んで回答可能なのに回答しないことです。
回答は義務ではありませんが、質問者への対応としては、「回答しない」が最も冷淡です。
ほかには、ヒントとなるような示唆をまったく与えず、「自分でやれ」とかいう回答もそうでしょうね。
「ググれ」はヒントを含んでいるからまだましです。

> (2)言葉足らず

これもnonさんと同意見です。
中には、期待する回答(=課題・宿題の答え)が得られないことをもって「言葉足らず」という人もいると思いますが、まったく筋違いですね。

> (3)理屈によってのみ解釈する

これもnonさんと同意見です。
泣き落としに同情した回答をすることは望ましくありませんし、感情的になって相手を罵倒するような回答もダメでしょう。

> (4)規約という結論を伝えるだけでその理由を述べない

規約を守らない人は、

1. 書いてあっても読まない
2. 読んでも理解できない
3. 理解できても無視する

のどれかです。このうち、1.と3.は人間性に問題があります。
2.はC言語より先に国語を勉強すべきです。ただし、質問者が子供や外国人等であれば、その旨を告げてもらえれば配慮することはできます。

理由を述べないのは、多くの場合、規約を読めばすぐにわかるから述べていないのです。
規約を読むのも回答を読むのも、手間はそう変わらないです(むしろ、記述が洗練されている規約を読むほうが楽なはず)ので、この指摘は的外れではないでしょうか?

> (5)顔文字が無い

これは意味不明です。
顔文字の有無と人間味にどんな関係があるのでしょうか?
この論法でいけば、顔文字が発明されていなかった時代の文学作品は、すべて人間味がないことになりますが...

> (6)相手の気持ちに対する配慮が無い

具体的な事例を示してください。

> (7)悪く言えば、意地悪

これもnonさんと同意見です。

> (8)上記と逆の事をしようという心構えが無い

正しいと思わないことを試みないのは当然かと思います。


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

Name: たかぎ [URL]  ..ハッカー(127,280ポイント)   Date: 2009/12/03(木) 10:47   No:43095     
Title: Re:無題    
ROMさん
> 質問の仕方や文章、今までの流れなどから、
> 恐らくこういうことが聞きたいのだろうと柔軟な解釈をすることも必要ではないでしょうか。
> 例えば、
> 「既存の関数を使うような質問の仕方だが、恐らく自作関数の宿題なんだろうな」などですね。
> 現時点で、たかぎさんが言っていることに対する的確な反応が質問者から得られるとは思えません。

それは無理があります。
私が最初に回答した時点では、最初の質問しかありませんでした。
つまり、あやさんが学生なのか社会人なのかも分かりませんし、C言語の経験も分かりません。処理系も不明です。結局何がしたいのかについては、「toupperを使わずに同じことをするには、どんな関数を使えばよいか」だとしか解釈のしようがありませんね。
それを

> 「既存の関数を使うような質問の仕方だが、恐らく自作関数の宿題なんだろうな」

と解釈するのは明らかな曲解であり、柔軟な解釈の範疇を超えています。

どうせ学校の宿題なんだろうと決め付けるのは簡単ですが、それは明らかに相手を見下しています。
あるいは、どうせWindowsでVisual C++を使っているのだろうという決め付けも正しくありません。

今回の場合、処理系不明ですので、最初の時点ではASCIIを想定できないわけです。
ASCIIでないとしても、アルファベットの文字コードが連続している規格上の保証はありませんので、処理系不明の状況でそのような回答は正しくありません。
間違った回答、あるいは間違っている可能性が思い当たる回答をするのは不誠実です。

なお、のちに「JISコード」だと発言されていますが、JISコードがISO-2022-JPのことだとすると、シフトシーケンスが絡むので、1バイトを見ただけで変換することはできなくなります。


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

Name: softya  ..熟練のプログラマー(55,022ポイント)   Date: 2009/12/03(木) 11:32   No:43096     
Title: Re:無題    
えーと、勝手に決め付けて不誠実な回答をしている張本人です。
たかぎさんを例にあげて申し訳ないですが、確率論として回答者は大体何が分かっていないか分かっていないので。

>wctob(towupper(btowc(c))) とか wctob(towctrans(btowc(c), wctrans("toupper"))) とか
とイキナリ書かれても????なワケです。現にスルーされちゃってます。
このような不毛なやり取りよりは、回答者の求める情報が得られるテンプレートを用意して答えてもらった方が良いんじゃないかと思う次第です。現実に規約を読まない人は続出してますから現実解として必要だと思うんですよ。

[テンプレート案]
なるべく正確に回答するため次の問いにお答えください。
・OSの名称(WindowsXPやLinuxなど)
・コンパイラの名称、バージョンや年号(VisualC++2008やBCC5.5など)。
・質問したい言語の正確な種類。C言語かC++なのか?
・言語を勉強してからの期間や自分で思う習得レベル(3ヶ月。初心者)
・まだ習得できていない言語の機能。特に質問に関係することは詳細に(関数、構造体、ポインタなど)
まだ足らないと思いますが検討していただけると幸いです。
これに質問に応じて付け加えも必要だとは思います。



最後に揚げ足取りなのですが、
>間違った回答、あるいは間違っている可能性が思い当たる回答をするのは不誠実です。
とおっしゃっているのですが、
>wctob(towupper(btowc(c))) とか wctob(towctrans(btowc(c), wctrans("toupper"))) とか
の回答はワイド文字が無い処理系はどうなのでしょう?
厳密でありたい、たかぎさんらしく無いと思いました。

>どうせ学校の宿題なんだろうと決め付けるのは簡単ですが、それは明らかに相手を見下しています。
今回のたかぎさんの上記のような遠回りな回答は、私には質問者を煙に巻いて馬鹿にしているようにみえますが・・・。厳格なのは全然問題ないと私は思いますので、どんどん質問者に逆質問をぶつけちゃってほしいんですよ。


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

Name: Mist  ..比類無きプログラマー(73,694ポイント)   Date: 2009/12/03(木) 11:38   No:43097     
Title: Re:無題    
> [テンプレート案]

規約に書いているテンプレートと何が違うんですか?


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

Name: softya  ..熟練のプログラマー(55,131ポイント)   Date: 2009/12/03(木) 11:43   No:43098     
Title: Re:無題    
>規約に書いているテンプレートと何が違うんですか?
すいません。規約の内容確認を忘れてました。テンプレに漏れがありますね。
ただ、規約を読んでくださいと書くよりは、こちらからの質問として書くほうが答えてもらえるかと思いましたので提案しました。規約を読んでくださいと書いても、大体は中途半端な答えしかもらえませんので。


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

Name: たかぎ [URL]  ..ハッカー(127,632ポイント)   Date: 2009/12/03(木) 11:46   No:43099     
Title: Re:無題    
> 現にスルーされちゃってます。

規約すら読まない質問者が回答をスルーすることは想定範囲です。

> このような不毛なやり取りよりは、回答者の求める情報が得られるテンプレートを用意して答えてもらった方が良いんじゃないかと思う次第です。現実に規約を読まない人は続出してますから現実解として必要だと思うんですよ。

テンプレートはすでに用意されています。
読まない人はどこで書いても読みませんので同じですね。
# 現に回答がスルーされています。

> ワイド文字が無い処理系はどうなのでしょう?

非標準処理系を除けば、ワイド文字がない処理系はありません。
古い処理系なら、それを書いてもらわないとどうしようもありませんね。

> 今回のたかぎさんの上記のような遠回りな回答は、私には質問者を煙に巻いて馬鹿にしているようにみえますが・・・。

煙に巻く意図はまったくありません。
今回の質問に対する回答としては、私の知識の範囲ではあの方法(towupper等を用いる)以外は思いつきませんでした。
正確には、もっと面倒な方法もあるにはありますが...
例えば、

const char lower[] = "abc...xyz";
const char upper[] = "ABC...XYZ";
char *pos = strchr(c); /* strchrという「関数」を使った */
if (pos != NULL) c = upper[pos - lower];

などです。

どこが馬鹿にしていると取られたのか、後学のためにご教示ください。

> 厳格なのは全然問題ないと私は思いますので、どんどん質問者に逆質問をぶつけちゃってほしいんですよ。

今回の場合、質問しなくても回答できますからね。
例えば、処理系に依存せずに実現する方法がなければ、その旨指摘して補足を求めるようにしています。


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

Name: softya  ..熟練のプログラマー(55,519ポイント)   Date: 2009/12/03(木) 11:47   No:43100     
Title: Re:無題    
規約テンプレをベースに改良してみました。

[1] 質問文
 [1.1] 自分が今行いたい事は何か
 [1.2] どのように取り組んだか(プログラムコードがある場合記載)
 [1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
 [1.4] 今何がわからないのか、知りたいのか

[2] 環境  
 [2.1] OS : Windows, Linux等々
 [2.2] コンパイラ名 : VC++ 2008EE, Borand C++, gcc等々
[2.3] 質問したい言語の正確な種類。C言語かC++なのか?

[3] その他
 ・どの程度C言語を理解しているか。言語を勉強してからの期間や自分で思う習得レベル(3ヶ月。初心者)
 ・まだ習得できていない言語の機能。特に質問に関係することは詳細に(関数、構造体、ポインタなど)
 ・ライブラリを使っている場合は何を使っているか

こんな感じでしょうか?


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

Name: たかぎ [URL]  ..ハッカー(127,703ポイント)   Date: 2009/12/03(木) 11:51   No:43101     
Title: Re:無題    
> ・まだ習得できていない言語の機能。特に質問に関係することは詳細に(関数、構造体、ポインタなど)

これは無理では?
まだ習得できていないのだから、存在すら知らない機能があるわけです。
例えば、C++のADLを習得できていない場合、「ADLが習得できていません」と書けるぐらいなら相当分かっていますよね。


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

Name: softya  ..熟練のプログラマー(55,660ポイント)   Date: 2009/12/03(木) 11:59   No:43104     
Title: Re:無題    
>どこが馬鹿にしていると取られたのか、後学のためにご教示ください。

この場合だと
>wctob(towupper(btowc(c))) とか wctob(towctrans(btowc(c), wctrans("toupper")))
ぐらい何も言わなくても分かるだろうって印象を受けます。
何も分からない質問者からすれば、wctobってなに?状態だと思いますので「こんな事も分からないのか?」と言われている気分になると思います。あくまで私の見解であるとお断りしておきます。


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

Name: softya  ..熟練のプログラマー(55,902ポイント)   Date: 2009/12/03(木) 12:03   No:43105     
Title: Re:無題    
>> ・まだ習得できていない言語の機能。特に質問に関係することは詳細に(関数、構造体、ポインタなど)
>これは無理では?

そうですね。
では、これではどうでしょうか?

今回の質問に関係することで自信の無い言語機能や知識を書き添えてください(関数の仕組み、構造体の書き方、ポインタの使い方など)



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

Name: たかぎ [URL]  ..ハッカー(127,783ポイント)   Date: 2009/12/03(木) 12:06   No:43108     
Title: Re:無題    
> 何も分からない質問者からすれば、wctobってなに?状態だと思いますので

というか、該当する関数がわからないから質問しているわけですから、回答に未知の関数が出てくるのは当然だと思いますが...。
分からなければ調べるなり、再質問するなりすればよいだけですよね。
それに、質問者が「どうせ何も分からない」と決め付けるのは、やはり問題があるように思います。


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

Name: たかぎ [URL]  ..ハッカー(127,843ポイント)   Date: 2009/12/03(木) 12:10   No:43110     
Title: Re:無題    
> 今回の質問に関係することで自信の無い言語機能や知識を書き添えてください(関数の仕組み、構造体の書き方、ポインタの使い方など)

これでも大差ありませんね。
何が自信があって、何が自信がないのか判断できるのは、相当分かっている場合だけです。
それよりは、分かっていることを書かせるほう(つまり現状のテンプレート)が現実的です。


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

Name: softya  ..熟練のプログラマー(56,050ポイント)   Date: 2009/12/03(木) 12:36   No:43117     
Title: Re:無題    
>というか、該当する関数がわからないから質問しているわけですから、回答に未知の関数が出てくるのは当然だと思いますが...。
>分からなければ調べるなり、再質問するなりすればよいだけですよね。

私ならそうしますが、全ての人がそうしてくれるとは私は思えません。
たかぎさんは、全ての人がそうしてくれると思っているのでしょうか?





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

Name: 普段見てる派  ..ぴよぴよ(165ポイント)   Date: 2009/12/03(木) 12:38   No:43119     
Title: Re:無題    
こういうやり取りって定期的に出てくるみたいですけど、たいていたかぎさんの回答の仕方から話が出てきますよね。

たかぎさんは完全に自分が正しいと思い込んでいますし、人の意見を聞き入れる言動も無いので毎回同じ事になりますね。
これだけ多くの人が疑問に思ってるのだから自分の回答の仕方について少しは立ち止まって考えてみてもいいのでは。

まだ算数しかわからない小学生に大学レベルの専門用語で解説し、自分の知識を見せ付ける、そんな感じが普段からよく伝わってくるんですよ。
はたから見たらその姿がどんなにおとなげないか。
相手を見下す云々言ってますが質問文みたらどんな相手かだいたいわかるでしょう。

たかぎさんは聞く耳もたないみたいですが、いろんな人から「今日もあんな回答してる。おとなげないな〜」と思われるのは損ですよ。

別に私の発言に対して意見いりません。また聞き流すだけならそれもありでしょう。


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

Name: たかぎ [URL]  ..ハッカー(127,859ポイント)   Date: 2009/12/03(木) 12:48   No:43122     
Title: Re:無題    
> たかぎさんは、全ての人がそうしてくれると思っているのでしょうか?

いいえ、そうは思っていません。
ただ、それ以上は本人の問題です。
答えが欲しいだけの人でなければ、自分で努力をするものです。


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

Name: qwerty  ..ぴよぴよ(671ポイント)   Date: 2009/12/03(木) 12:55   No:43125     
Title: Re:無題    
>>普段見てる派さん
横から失礼させてください。

たかぎさんを擁護する気は毛頭ないですが、その内容はあまりにたかぎさんに対して失礼かと思います。

たかぎさんの姿勢は概ね理解できます。
たかぎさんはなにも自分が完全に正しいとは思っていませんし、人の意見を聞き入れる言動もないわけではありません。現にsoftyaさんに対して「後学のためにご教示ください」と言っています。
たかぎさんは聞く耳もきちんと持たれているように感じます。

ただ、“質問に”厳密であろうとするばかりに“質問者に”対する配慮が欠けている部分があります。
これは当人は見下す云々言っていますが、普段見てる派さんがおっしゃるように、質問文を見ればどんな相手かだいたい見当はつくし、たいていは当たっています。
そうでない場合、稚拙な質問をしていても質問者自身はすごく賢明な方である場合もあるかと思いますが、
そのような事例なごく稀です。このような場合、確率的に高い場合に対しての姿勢で回答する方が親切であり、より自然であるといえます。
その点で、大人気ないという普段見てる派さんの思いに共感します。


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

Name: softya  ..熟練のプログラマー(56,262ポイント)   Date: 2009/12/03(木) 13:01   No:43128     
Title: Re:無題    
>どこが馬鹿にしていると取られたのか、後学のためにご教示ください。
この件に関しては、掘り下げてもしょうがないのでここまでとさせてください。
とりあえず先の回答は、私はそう取れる回答だと思った。そう思った人がいるってことをたかぎさんに伝えたかっただけです。たかぎさんに、そういう意図が無いのは分かっていて書きました。たかぎさんがそう思われるのを承知で書いていたのなら申し訳ありません。

>答えが欲しいだけの人でなければ、自分で努力をするものです。
たぶん、私とたかぎさんの望んでいる努力レベルが違うのだと思います。
これも見解が一致すると思えませんので、これまでとさせてください。一致させる必要も無いと思います。

テンプレートに関しては、しばらく放置して色々な意見を伺わせていただきます。
なければ無いで、それでもかまいません。


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

Name: たかぎ [URL]  ..ハッカー(128,753ポイント)   Date: 2009/12/03(木) 13:06   No:43129     
Title: Re:無題    
意見はいらないとのことですが...

> たかぎさんは完全に自分が正しいと思い込んでいますし、人の意見を聞き入れる言動も無いので毎回同じ事になりますね。
> これだけ多くの人が疑問に思ってるのだから自分の回答の仕方について少しは立ち止まって考えてみてもいいのでは。

多くといっても、高々10人に満たないわけですが...
回答のしかたについては、いつも立ち止まって考えてみていますよ。
その結果得られた結論が、気に入る人もいれば、そうでない人もいるというだけです。

> まだ算数しかわからない小学生に大学レベルの専門用語で解説し、自分の知識を見せ付ける、そんな感じが普段からよく伝わってくるんですよ。
> はたから見たらその姿がどんなにおとなげないか。

だから、なぜ「算数しかわからない小学生」と決め付けられるのかが謎です。

学生の場合、自分に近い年代や経験の人しか想定していないのかもしれません。
しかし、実際はそうではないのです。
「私は大学生で、C言語を授業で習い始めて3ヶ月です」のようにいってもらえれば、相応の対応をします。
けれども、規約を無視した横柄な質問者に迎合する必要などまったくありませんね。
それとも、本当に小学生で、規約を読めるだけの国語力がない人まで想定しているのでしょうか?

> 相手を見下す云々言ってますが質問文みたらどんな相手かだいたいわかるでしょう。

想像はつきます。ただ、断定はできませんね。
いい歳をして、経験も豊富なのに、稚拙な表現をする人は少なからずいます。
どんな相手にも敬意を払うのは当然のことだと思います。

> たかぎさんは聞く耳もたないみたいですが、いろんな人から「今日もあんな回答してる。おとなげないな〜」と思われるのは損ですよ。

指摘を受ければその都度真摯に対応しています。
多くの指摘内容は、顧客に対してならそのようにすべきだろうと思うものがほとんどです。
何がいいたいかというと、掲示板での質問者と回答者の関係は、顧客と業者の関係ではなく、対等だということです。
ですから、回答者としての立場では、いたれりつくせりのサービスは行いません。
質問者は、本来自分で解決するのが筋だからです。

また大人気ないといわれるかもしれませんね。
要するに、スルー力が足りないことは自分でも自覚しています。


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

Name: Mist  ..比類無きプログラマー(73,966ポイント)   Date: 2009/12/03(木) 13:16   No:43130     
Title: Re:無題    
ここは誰でも書ける掲示板なのですから、他人の回答が自分の基準に合わないから改めろって言うのは変じゃないでしょうか。
ここは、たかぎさんしか回答できない掲示板ではないでしょう。
誰かがレスつけたら他のレス出来なくなるわけでもないでしょう。
たかぎさんの回答が不十分、意に沿わないものだと思えばその人がよいと思う回答すればいいだけのこと。
回答のスタイルは人それぞれですから、それぞれのスタイルに合った回答をつければいいだけのこと。
回答の採否は質問者がするべきであり、その他大勢の回答者、閲覧者がするべきものではありません。
規約に明確に違反していない限り、他人の回答内容を規制するような権利は誰にもありません。(Dixqさんは除く)


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

Name: たかぎ [URL]  ..ハッカー(128,943ポイント)   Date: 2009/12/03(木) 13:28   No:43131     
Title: Re:無題    
qwertyさん
> ただ、“質問に”厳密であろうとするばかりに“質問者に”対する配慮が欠けている部分があります。
> これは当人は見下す云々言っていますが、普段見てる派さんがおっしゃるように、質問文を見ればどんな相手かだいたい見当はつくし、たいていは当たっています。

先ほども書いたとおり、想像はつきます。
ただ、規約を守って質問する人であれば、そんな想像は不要のはずです。
「自分はルールを守らないけど、配慮してね」という自己中心的な質問者に合わせる必要はないと思います。

> そうでない場合、稚拙な質問をしていても質問者自身はすごく賢明な方である場合もあるかと思いますが、
> そのような事例なごく稀です。このような場合、確率的に高い場合に対しての姿勢で回答する方が親切であり、より自然であるといえます。

すごく賢明ではなくても、普通の人は多数います。
ここでいう「普通」とは、規約を理解できる程度の国語力があり、最低限のルールを守ろうとする程度の社会適応力がある人のことです。


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

Name: Mist  ..比類無きプログラマー(74,296ポイント)   Date: 2009/12/03(木) 13:32   No:43132     
Title: Re:無題    
「テンプレ」について

[2.3] 質問したい言語の正確な種類。C言語かC++なのか?

[2.3] 使用言語:C(90,99),C++,C#,VB,JAVA等々

のほうが単純明快と思う。
最後の一文についてはたかぎさんと同意見。
どうしても書きたいなら、文章ではなく書く側にどう書いてよいかを考えさせる余地を出来るだけ排除させるようなもののほうがよいと思います。


Cの経験は:はじめた直後、1ヶ月、3ヶ月、マスター
配列:知らない、知ってる、使いこなせる
構造体:知らない、知ってる、使いこなせる
ポインタは:知らない、知ってる、使いこなせる

とは言え、こういうテンプレはやるべきことを多くしすぎると敬遠される傾向にあるのでほどほどに。


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

Name: たかぎ [URL]  ..ハッカー(129,497ポイント)   Date: 2009/12/03(木) 13:49   No:43136     
Title: Re:無題    
テンプレートについて...

まず現状ですが、テンプレートができて一定の効果は上げていると思います。
テンプレートに沿った質問の場合、(自分の能力不足を除けば)特に回答に困ると感じたことはないので、今のままでもよいとは思いますが、[2.3]についてはMistさん案の方がよさそうですね。
他の部分については、あまり扱いを難しくしないことの方がメリットがあるように思います。

それより、規約を読まないことのほうが大問題です。
そもそも、「必ずお読み下さい」と書いているにもかかわらず、読まない理由がわかりません。
初回だけであれば、うっかり見落としたということも考えられます。ただ、規約を読めと何度いわれても読まない人は、一体どういう人なのか想像がつきません。
唯一想像できるのは、相手が外国人で、日本語が不自由な場合だけですが、本当に外国人である場合がどの程度あるのか分かりませんね。


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

Name: たかぎ [URL]  ..ハッカー(129,747ポイント)   Date: 2009/12/03(木) 14:22   No:43140     
Title: Re:無題    
レスが前後しますが...

softyaさん、ありがとうございます。
> >答えが欲しいだけの人でなければ、自分で努力をするものです。
> たぶん、私とたかぎさんの望んでいる努力レベルが違うのだと思います。

最後にひとつだけ。
ちなみにsoftyaさんが望んでいる努力レベルを教えていただけますか?


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

Name: softya  ..熟練のプログラマー(56,378ポイント)   Date: 2009/12/03(木) 14:28   No:43143     
Title: Re:無題    
>最後にひとつだけ。
>ちなみにsoftyaさんが望んでいる努力レベルを教えていただけますか?

知らべ方を教えて、調べてって言っても調べない人は困りますが、最初から調べてくれとは思っていないって感じでしょうか。調べ方も分かってない感じですし。
まぁ、自身ありげななのに調べて無い場合は、ここに書いてありますよって突っ込む場合がありますが。


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

Name: non  ..比類無きプログラマー(73,979ポイント)   Date: 2009/12/03(木) 14:38   No:43144     
Title: Re:無題    
ちょっと、仕事の手が空いたので、仲間に入れさせてください。
「次のプログラミングのやり方を教えてくだい」ってスレが、嵐(荒らし)のように
吹き荒れてますが・・・・
あの方は、努力されているのでしょうか?
あれだけたくさん入力したのだから、努力しているともいえますし、宿題を投げ出さずに
提出しようと努力もしている。すると、無視せずに手を差し伸べるべきでしょうか。
前に、あの方に回答してしまったので、この嵐を呼んだのかと反省している次第です。


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

Name: softya  ..熟練のプログラマー(56,501ポイント)   Date: 2009/12/03(木) 14:57   No:43146     
Title: Re:無題    
>あれだけたくさん入力したのだから、努力しているともいえますし、宿題を投げ出さずに
>提出しようと努力もしている。すると、無視せずに手を差し伸べるべきでしょうか。

とりあえず、コミニュケーションする気がなさそうな方はスルーしてます。
義務でも努力目標でもありませんので。


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

Name: non  ..比類無きプログラマー(74,194ポイント)   Date: 2009/12/03(木) 15:10   No:43147     
Title: Re:無題    
わざと、つっかかって申し訳ないですが・・・

コミュニケーションの取れない人に、あなたはコミュニケーションを取れてませんよと
返してあげるのは、誰かがしてあげるべきだと思うのですよね。
それが、規約を読んでねとか、環境は何?ってことになって、それが行き過ぎると
言葉に皮肉が混じる。人間だからしょうがないって思いますよね。
>人間味に欠ける回答が目に付きます。
人間味がありすぎるからだと思うのですがねぇ。要するにお節介焼きですね。無視できないのは。


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

Name: softya  ..熟練のプログラマー(56,929ポイント)   Date: 2009/12/03(木) 15:20   No:43148     
Title: Re:無題    
>それが、規約を読んでねとか、環境は何?ってことになって、それが行き過ぎると
>言葉に皮肉が混じる。人間だからしょうがないって思いますよね。

しょうがないと思いますよ。
ちゃんとコミュニケーション取れてない分けですから。
ただ、徒労に終わるのいやですよね。
こちらから何を書いても返事が無い人。
つまり、会話のキャッチボールが出来ない人。

名無しのごんべいさんは、会話のキャッチボールが出来ない人に認定しても良さそうな気がします。

>要するにお節介焼きですね。無視できないのは。
こういう所で回答書いている人は、基本的にお節介焼きなんでしょうね。


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

Name: non  ..比類無きプログラマー(74,124ポイント)   Date: 2009/12/03(木) 15:31   No:43149     
Title: Re:無題    
おおまかなところで、softya さんと意見の一致があってよかった。
なんか、今まですれ違っているような気がしてましたからね。
じゃ、これからも私は私のスタイルでいかせていただきますので、今後ともよろしく。


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

Name: softya  ..熟練のプログラマー(56,999ポイント)   Date: 2009/12/03(木) 15:44   No:43150     
Title: Re:無題    
>おおまかなところで、softya さんと意見の一致があってよかった。
>なんか、今まですれ違っているような気がしてましたからね。
>じゃ、これからも私は私のスタイルでいかせていただきますので、今後ともよろしく。

はい、よろしくお願いします。
多少スタイルが違っても、質問者にC言語を理解してもらいたいって気持ちは同じだと思います。


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

Name: たかぎ [URL]  ..ハッカー(129,930ポイント)   Date: 2009/12/03(木) 15:45   No:43152     
Title: Re:無題    
softyaさん
> 知らべ方を教えて、調べてって言っても調べない人は困りますが、最初から調べてくれとは思っていないって感じでしょうか。調べ方も分かってない感じですし。

なるほど。確かに望んでいる努力レベルが違うようです。
私の場合、プログラミングに限らず、製品の使い方がわからなければ取扱説明書を読むというのは基本中の基本だと考えています。
プログラミングの場合、開発ツールのドキュメントですね。
こんなことは、わざわざ掲示板で説明されなくても、ある程度の年齢(遅くとも中学生ぐらい)になれば分かって当然のことですからね。

# そもそも処理系不明の状況では、具体的な示唆をすること自体困難ですが...
# 「ググれ」といった方が親切なのかな?


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

Name: softya  ..熟練のプログラマー(57,943ポイント)   Date: 2009/12/03(木) 16:04   No:43154     
Title: Re:無題    
>私の場合、プログラミングに限らず、製品の使い方がわからなければ取扱説明書を読むというのは基本中の基本だと考えています。

はい。それも私とズレている所だと思います。
私は、世の中の大半の人はマニュアルを隅から隅まで読まない人だと思っていますので。

># そもそも処理系不明の状況では、具体的な示唆をすること自体困難ですが...
># 「ググれ」といった方が親切なのかな?

私見ですが、それを気にするなら処理系の違いを丁寧に説明するとかしないと理解してもらえないって気がします。大体みんな、その手の話題をスルーする傾向があると感じますが。
たかぎさん自身は、どう感じていらっしゃるのでしょうか?


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

Name: たかぎ [URL]  ..ハッカー(130,529ポイント)   Date: 2009/12/03(木) 16:12   No:43156     
Title: Re:無題    
> 私見ですが、それを気にするなら処理系の違いを丁寧に説明するとかしないと理解してもらえないって気がします。

さっき書いたのは、例えばVisual Studio 2008を使っていることがわかっていれば、オンラインヘルプの操作のしかたとか、MSDNライブラリの見かたとか、具体的な示唆をすることも可能だということです。
処理系不明の状況では、読むべきドキュメントはJIS X3010とか、そういうことになってしまいます。

経験の浅い人が処理系の違いを理解できないのは当然ですし、そんなことは要求していません。
だからこそ、処理系に依存している、依存しないに関わらず、規約で処理系を明記するように指示されているわけです。
規約に従っていれば、初心者がその辺の判断をする必要がなくなるわけです。

> 大体みんな、その手の話題をスルーする傾向があると感じますが。

規約に従うのは、不要な話題をスルーするための最良の知恵です。


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

Name: softya  ..熟練のプログラマー(58,118ポイント)   Date: 2009/12/03(木) 16:34   No:43159     
Title: Re:無題    
>>大体みんな、その手の話題をスルーする傾向があると感じますが。
>規約に従うのは、不要な話題をスルーするための最良の知恵です。
それは重々承知しております。
印象の事を言っておりますので、一般論で返されても私も困ります。

>たかぎさん自身は、どう感じていらっしゃるのでしょうか?
の意図は、質問者さん達に受け入れられていると感じているのか?今一通じて無いなと感じていらっしゃるのかお聞きしたかったのです。お答えいただけるなら、印象での答えをお願いしたいのですが。



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

Name: sizuma  ..上級者(17,780ポイント)   Date: 2009/12/03(木) 16:35   No:43160     
Title: Re:無題    
私見ですが、失礼します。

確かに、規約も守れてない人には、たかぎさんの回答は分からないんじゃないかな?とは思います。
でもたかぎさんの回答で、僕は勉強になっています。
多かれ少なかれ、僕みたいに質問しないで、トピックの内容を見て勉強してるって人もいるんじゃないでしょうか?おそらく少なかれ、でしょうけど・・・
たかぎさんのように、リンクが貼ってあって、能力が分かる人の回答は信頼できて参考にしやすいです。

まぁ僕はたかぎさんの本読んでたりで、たかぎさん贔屓が入ってます。
というわけで私見でした。


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

Name: Mist  ..比類無きプログラマー(74,395ポイント)   Date: 2009/12/03(木) 16:36   No:43161     
Title: Re:無題    
横レスですいませんけど

># そもそも処理系不明の状況では、具体的な示唆をすること自体困難ですが...

> それを気にするなら処理系の違いを丁寧に説明するとかしないと理解してもらえないって気がします。

この流れが理解できません。
質問者が処理系を示せばそれに合った回答をすればよいだけで、違いを説明する必要なんて全く無いですし、理解させる必要も全くないと思うのですが。
だからテンプレに入っているわけで。


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

Name: たかぎ [URL]  ..ハッカー(130,627ポイント)   Date: 2009/12/03(木) 16:43   No:43164     
Title: Re:無題    
>>たかぎさん自身は、どう感じていらっしゃるのでしょうか?
>の意図は、質問者さん達に受け入れられていると感じているのか?今一通じて無いなと感じていらっしゃるのかお聞きしたかったのです。お答えいただけるなら、印象での答えをお願いしたいのですが。

人によりけりでしょうね。
仮にすぐに理解できなくても、有益そうだと感じていただければ、理解しようと努力してくれるでしょう。
もともとそういう状況になるのは、質問の意図が不明確な場合がほとんどです。
不明確な質問からは、理解が困難な回答しかかえってこないのはしかたがありません。


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

Name: Mist  ..比類無きプログラマー(74,457ポイント)   Date: 2009/12/03(木) 16:44   No:43166     
Title: Re:無題    
私向けの質問じゃなけいけど

> 質問者さん達に受け入れられていると感じているのか?

softyaさんの考えでは、受け入れられないような回答はしたら駄目なんですか?
回答者はそんなことを気にしなければならないんですか?
質問者がたかぎさんのような回答を望んでいないとあなたが考えるのは勝手ですけど、それが本当かどうかは質問した人に聞いてみないとわからないんじゃないですか?
私が知る限り、質問者がたかぎさんの回答に対してそういう意思を見せたことは無いですよ。


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

Name: たかぎ [URL]  ..ハッカー(130,662ポイント)   Date: 2009/12/03(木) 16:49   No:43168     
Title: Re:無題    
> 私が知る限り、質問者がたかぎさんの回答に対してそういう意思を見せたことは無いですよ。

スルーされることはよくありますが...
まあ、もともとコミュニケーション能力に欠ける人も多いので、意思の疎通ができなくてもいちいち気にしません。


Name: Tororo  ..ぴよぴよ(835ポイント)   Date: 2009/12/03(木) 16:55   No:43171     
Title: Re:無題    
私みたいなのが言うのも何ですけど、こう言う事は新しいスレでやったらどうですか?
マナースレとかにして。
解決したスレで長々とやるより、新スレで話し合ったほうが解決しやすいんじゃないですか?

そうすれば、管理人sも言いやすいんではないんですか?

横やり失礼しましたm(_ _)m


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

Name: たかぎ [URL]  ..ハッカー(130,745ポイント)   Date: 2009/12/03(木) 16:58   No:43173     
Title: Re:無題    
> 私みたいなのが言うのも何ですけど、こう言う事は新しいスレでやったらどうですか?
> マナースレとかにして。
> 解決したスレで長々とやるより、新スレで話し合ったほうが解決しやすいんじゃないですか?

これはごもっともですね。


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

Name: softya  ..熟練のプログラマー(58,248ポイント)   Date: 2009/12/03(木) 17:04   No:43176     
Title: Re:無題    
>softyaさんの考えでは、受け入れられないような回答はしたら駄目なんですか?

そんな事はありません。
処理系とか難しい話は、なんかスルーされてませんか?
って印象をお聞きしただけです。
私自身は、私が書いたものでもスルーされるなと感じておりますので。

>私みたいなのが言うのも何ですけど、こう言う事は新しいスレでやったらどうですか?
>マナースレとかにして。
>解決したスレで長々とやるより、新スレで話し合ったほうが解決しやすいんじゃないですか?

はい。失礼しました。


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



Name:  ..かけだし(1,433ポイント)   Date: 2009/12/03(木) 14:45   No:43145       
Title: 配列にひらがなを格納し、比較するにはどうしたらいいですか。    
二つの文章の類似度を算出するというプログラムを作成しようとしています。
形態素解析としてMeCabを使用して文章を解析し、単語ごとを配列に格納し比較する予定です。

ひらがなを配列に格納するにはどうしたらよいでしょうか?


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


Name: たかぎ [URL]  ..ハッカー(130,245ポイント)   Date: 2009/12/03(木) 15:55   No:43153     
Title: Re:配列にひらがなを格納し、比較するにはどうしたらいいですか。    
ひらがなをどう表現するかによります。
多バイト文字を使うのであれば...

const char *s1 = "あいうえお";
char s2[strlen(s)+1];
strcpy(s2, s1);

とでもすればよいでしょうし、ワイド文字を使うのであれば、

const wchar_t *s1 = L"あいうえお";
wchar_t s2[wcslen(s1)/sizeof(wchar_t)+1];
wcscpy(s2, s1);

のようにしてください。

元のデータが多バイト文字で、ワイド文字に変換するのであれば、

const char *s = "あいうえお";
size_t n = strlen(s);
wchar_t wcs[n+1];
mbstowcs(wcs, s, n);

とでもすればよいでしょう。
この場合、ロケールの設定をお忘れなく。


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



Name: Libra  ..中級者(10,531ポイント)   Date: 2009/11/30(月) 00:51   No:42943       
Title: 画像のサイズ取得    
現在DirectXでプログラムを組んでいます。
画像を読み込んで、ポリゴンにテクスチャを貼って表示させるとき、
表示サイズが必要となるのですが、
今までは、画像を読み込むときに、画像のサイズも一緒に引数として渡していたのですが、
画像を読み込むときに、画像サイズも一緒に読み込むようにしようと考えました。

目的は、読み込んだ画像をそのままのサイズで表示させるためです。
そのため、画像の縦横のサイズを取得したいのですが、
DirectXで画像の縦横のサイズを取得する処理は用意されているのでしょうか?

言語:C++、C(C++はまだ始めたばかりなので、Cが混ざってます)
開発環境VisualStudio2008
DirectX9
参考にしているサイト:ttp://marupeke296.com/GameMain.html その3の部分です

一応、画像サイズを読み込む処理は自分で書いてみたのですが、
もし、DirectXで処理が用意されているのであれば、そっちを使いたいです。


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


Name: Justy  ..伝説なるハッカー(468,051ポイント)   Date: 2009/11/30(月) 01:05   No:42944     
Title: Re:画像のサイズ取得    

> DirectXで画像の縦横のサイズを取得する処理は用意されているのでしょうか?

 ファイル読み込み前なら

D3DXGetImageInfoFromFile 関数
http://msdn.microsoft.com/ja-jp/library/cc372763.aspx


 読み込んだ後なら、

GetLevelDesc メソッド (IDirect3DTexture9)
http://msdn.microsoft.com/ja-jp/library/cc324020.aspx

D3DSURFACE_DESC 構造体 ()
http://msdn.microsoft.com/ja-jp/library/cc323938.aspx

ってところでしょうか。


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

Name: Libra  ..中級者(10,884ポイント)   Date: 2009/12/02(水) 03:08   No:43023     
Title: Re:画像のサイズ取得    
回答ありがとうございます m(_ _)m。
MSDNのリファレンスを探す際、Get〜Size的な関数があるのかと思っていました。
サイズに関しては、解決しました。

スレッドタイトルと内容が変わってしまうのですが、
デバックを手伝っていただけないでしょうか。申し訳ないのですが・・・。



DirectXで画像を表示するプログラムです。
Dxlibを参考に、作成しているのですが、
DrawPrimitiveメソッドを呼び出した際に、エラーが出てしまいました。


Windowを作成するクラス、DirectInputを制御するクラス、
画像を制御するクラスを作成し、
それらのインスタンスをまとめたクラスを作成。
Mainでそのクラスのインスタンスを生成することで、
DirectXを制御する、という流れになっています。

エラーが出ているのは、GraphicManagerクラスです。
参考にしたのは、ttp://marupeke296.com/DXGSmp_No3_CreateTexture.htmlです。

描画の流れは、

頂点バッファの作成→テクスチャの作成→頂点位置を決定→
ロックをかける→SetStreamSource、SetFVF、DrawPrimitiveメソッドを呼び出す

とやっているのですが、DrawPrimitiveを呼び出したときに例外が出てしまいます。


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

Name: Justy  ..伝説なるハッカー(468,848ポイント)   Date: 2009/12/03(木) 00:57   No:43084     
Title: Re:画像のサイズ取得    

> DrawPrimitiveを呼び出したときに例外が出てしまいます

 D3DFVF_XYZ -> D3DFVF_XYZRHWにしたらどうなりますか?


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

Name: Libra  ..中級者(11,172ポイント)   Date: 2009/12/03(木) 14:27   No:43142 解決!     
Title: Re:画像のサイズ取得    
#define FVF_VERTEX2D ( D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1 )

のD3DFVF_XYZをD3DFVF_XYZRHWに変更したところ、例外が発生しなくなりました。


あと、今日ソースを見たところ、
SetTextureメソッドの位置が一箇所場所がずれていました・・・・。
パソコンの前で「うわあああああああああああああああああああああああ」と悶絶です。
画像も表示され、期待通りの仕様を満たすことが出来ました。


今は、画像をロードする構造体のVectorを1つ用意しているのですが、
もうひとつ、画像の切り抜き位置を格納するVectorを用意してやれば、
DXライブラリと同じ感じに画像のロード部分を扱えるのではないか、
と考えています。蛇足ですね(汗)。


Justyさん、手伝ってくださってありがとうございました。


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



Name: ジャーニー  ..かけだし(1,887ポイント)   Date: 2009/12/03(木) 13:33   No:43133       
Title: 抽象クラスをvectorにいれたい    
お久しぶりです
今C++とDXライブラリで制作中のゲームで描画関係だけをクラス配列でまとめて管理したいです
具体的にいうと・・・

std::vector<Draw> draw;
draw.push_back(new DrawLine());
といった感じです
Drawは描画関係の抽象クラスで更新、描画クラスのみ定義しています
DrawLineはDrawクラスを継承し、直線を描画するという描画メソッドを定義し、vectorに追加します
タスクシステムのまねごとのような感じです

ちなみに上を実装しようとした場合Drawクラスを定義し、vectorを作った時点で「抽象クラスはインスタンス化できません」というコンパイルエラーがでてしまいます
上を実装しようとした場合、どのようにすればいいのでしょうか
vectorにこだわっているわけではないですが描画するだけなのでタスクシステムほど大掛かりでなくてもいいのでお願いします


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


Name: GPGA  ..比類無きプログラマー(71,186ポイント)   Date: 2009/12/03(木) 13:36   No:43134     
Title: Re:抽象クラスをvectorにいれたい    
×std::vector<Draw> draw;
○std::vector<Draw*> draw;

追加、削除の頻度が高いならばvectorよりlistを使用することを推奨します。


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

Name: ジャーニー  ..かけだし(1,922ポイント)   Date: 2009/12/03(木) 13:41   No:43135 解決!     
Title: Re:抽象クラスをvectorにいれたい    
早速のご返事ありがとうございます
listを使うことも考え実装していきます
ありがとうございました


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

Name: たかぎ [URL]  ..ハッカー(129,548ポイント)   Date: 2009/12/03(木) 13:51   No:43137     
Title: Re:抽象クラスをvectorにいれたい    
ポインタにするのが本来のやり方ですが、最近の処理系はshared_ptrを使えることも多いので検討してみてもよいでしょう。


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

Name: ジャーニー  ..かけだし(2,012ポイント)   Date: 2009/12/03(木) 14:01   No:43138     
Title: Re:抽象クラスをvectorにいれたい    
色々な提案ありがとうございます
ただちょっと急ぎで作っており検討している時間がなく、頻繁に追加・削除を行うゲームではないので今回はshared_ptrは見送らせていただきます
次回はshared_ptrを考え、作ってみたいと思います


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

Name: たかぎ [URL]  ..ハッカー(129,690ポイント)   Date: 2009/12/03(木) 14:13   No:43139     
Title: Re:抽象クラスをvectorにいれたい    
> 頻繁に追加・削除を行うゲームではないので今回はshared_ptrは見送らせていただきます

頻繁に追加・削除を行う場合は std::listを使うべきであって、shared_ptrは関係ありません。
shared_ptrを使うと、明示的にdeleteしなくても勝手にやってくれるので、メモリ管理(というかオブジェクト管理)が非常に楽になります。
std::vector<Draw*>を使うと、vectorが解体される前に、全メンバに対してdeleteを行わなければなりません。


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

Name: ジャーニー  ..かけだし(2,005ポイント)   Date: 2009/12/03(木) 14:26   No:43141     
Title: Re:抽象クラスをvectorにいれたい    
>たかぎさん

メモリ管理が楽になるということですね。
一度調べてみて、すぐに使えるようなら考えてみます。


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



Name: コン  ..ぴよぴよ(149ポイント)   Date: 2009/12/01(火) 16:30   No:43005       
Title: 無題    
はじめまして、こんにちは。コンと言います。

早速ですが、”自機の残機設定”について質問します。
今、私はシューティングゲームを作っているのですが、自機の残機設定で詰まっています。
敵の弾が当たったら1つ減るようになっていますし、残りが0になったらちゃんとGame Overになります。
ですが、何故かある時に残機がリセットされて初期数値の”残り3機”になってしまいます。
それで、よく見てみると自機のFlagが1の時で、敵が現れた瞬間に起こるようなんです。
自分なりに対策を講じてみましたが、何ら効果は無く、悪戦苦闘中です。
こちらの「シューティングゲームの館」にあったソース類を参考にさせて頂いておりますので、
大体の構造などは似ていると思います。
どなたか、思い当たる点などでも構いませんので、ご助力お願いします。


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


Name: ひよこ  ..比類無きプログラマー(74,127ポイント)   Date: 2009/12/01(火) 18:02   No:43007     
Title: Re:無題    
ソースがあればわかりますね。
自機のFlagが1の時で、敵が現れた瞬間に起こるようなんです
>>では敵が現れる、場所を探してみるのはどうでしょうか?


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

Name: コン  ..ぴよぴよ(182ポイント)   Date: 2009/12/03(木) 09:41   No:43092 解決!     
Title: Re:無題    
前よりももっと注意して見てみたら解決できました。
ありがとうございました。


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



Name: 組木紙織  ..比類無きプログラマー(76,301ポイント)   Date: 2009/12/02(水) 10:18   No:43026       
Title: バッチファイルで小数の四則演算をするには?    
c言語を関係はないのですが、久々の質問です。

現在バッチファイルで色々な処理を扱う状況にあります。
その中でawkやperlのように変数、四則演算、ループを使って便利に扱えればよいと考えています。
変数、ループ、分岐、整数の四則演算についてはバッチファイル内で行う方法があるのですが、
小数の四則演算を取り扱う方法がありません。

整数部2桁、小数部2桁程度の固定小数の和、差の計算だけでかまわないので、何とかする方法は
ないのでしょうか?


環境はWindows2000またはWindowsXPですが、
まずはwindows2000を対象でお願いします。


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


Name: Mist  ..比類無きプログラマー(72,623ポイント)   Date: 2009/12/02(水) 10:28   No:43027     
Title: Re:バッチファイルで小数の四則演算をするには?    
少数二桁ならば全ての値を100倍して計算すればいいんじゃないでしょうか。

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

Name: 組木紙織  ..比類無きプログラマー(76,365ポイント)   Date: 2009/12/02(水) 10:41   No:43028     
Title: Re:バッチファイルで小数の四則演算をするには?    
>Mistさん
回答ありがとうございます。

そのようにして計算できても最後の100で割るときに小数部が切られてしまうのでその方法は使えませんでした。

いい忘れていましたが、最終的にほしい結果は小数部が入った文字列です。

rem Aは12.34の100倍で考えている
set A=1234

rem Bには12.34を入れたいがBは12が入ってしまう
set /A B=A/100

rem ここから先12.34を使っていく


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

Name: Mist  ..比類無きプログラマー(72,723ポイント)   Date: 2009/12/02(水) 10:56   No:43029     
Title: Re:バッチファイルで小数の四則演算をするには?    
rem 計算結果が1234=12.34だったとする
set /a A=1234
set /a B=A/100
set /a C=A%%100

set D=%B%.%C%

文字列でいいならこれでOK(XP動作確認済み)


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

Name: pie  ..ぴよぴよ(11ポイント)   Date: 2009/12/02(水) 13:41   No:43032     
Title: Re:バッチファイルで小数の四則演算をするには?    
> Mistさん

ホントですか?
A=1204とかだとどうなります?


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

Name: softya  ..熟練のプログラマー(53,459ポイント)   Date: 2009/12/02(水) 14:38   No:43033     
Title: Re:バッチファイルで小数の四則演算をするには?    
素直に小数点演算するコンソールアプリを作ったほうが簡単のような・・・。
あるいは、Windows2000だったらWSHが使えるのでWSHで組むとか。


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

Name: Mist  ..比類無きプログラマー(72,891ポイント)   Date: 2009/12/02(水) 15:06   No:43038     
Title: Re:バッチファイルで小数の四則演算をするには?    
set /a A=1209
set /a B=A/100
set /a C=A%%100

if %C% LSS 10 (set D=%B%.0%C%) else (set D=%B%.%C%)

echo %D%

修正しました。
これでも末のゼロ(12.00とか12.10)は残るけど、少数2位までの数値保証と考えればこれでもいいのかな?
変換後の使い道が不明なのでここまでにしておきます。
12.00を12と表現するのであればさらにif文追加してください。


> pieさん

ご指摘ありがとうございました。


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

Name: 組木紙織  ..比類無きプログラマー(76,376ポイント)   Date: 2009/12/02(水) 16:22   No:43047     
Title: Re:バッチファイルで小数の四則演算をするには?    
>皆様
コメント&回答ありがとうございます。

>変換後の使い道が不明なのでここまでにしておきます。
gmt(コマンドラインで地図を描くソフト)を使うためにいちいち同じ値を手で入力すると間違えそうなので
自動化を考えています。


表現については12.00でも12でも問題はありません。


演算&出力はMistさんの方法で出来ると思いますが、ユーザーからの入力値を100倍するという問題が残っています。
引き続いて入力の方法を教えてほしいです。


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

Name: Mist  ..比類無きプログラマー(73,027ポイント)   Date: 2009/12/02(水) 16:35   No:43050     
Title: Re:バッチファイルで小数の四則演算をするには?    
ユーザには小数点付きの状態で入力させたいってことですか?
仕様として、「値は小数点つけずに入力してください。(12.34→1234,12.00→1200)」とするのは駄目ですか?


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

Name: 組木紙織  ..比類無きプログラマー(76,462ポイント)   Date: 2009/12/02(水) 16:45   No:43051     
Title: Re:バッチファイルで小数の四則演算をするには?    
>仕様として、「値は小数点つけずに入力してください。(12.34→1234,12.00→1200)」とするのは駄目ですか?

それは可能です。
(小数入力が無理ならそうしようと思っていました。)

ただ、バッチ処理でどこまでの処理が出来るかどうかが、まだ良くわかっていないので質問をしました。
かなり難しいor不可能なのでしょうか?


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

Name: Mist  ..比類無きプログラマー(73,244ポイント)   Date: 2009/12/02(水) 16:56   No:43052     
Title: Re:バッチファイルで小数の四則演算をするには?    
入力は出来るんですが整数への変換が成功しません。
下のようなバッチ組んでみましたが、小数部分の切り出しで失敗します。
もうちょっと考えてみます。

echo off

set /p INP="値入力(xx.xx形式) >"

echo ret1=%INP%

set /a SEI=%INP:~0,2%
set /a SHOU=%INP:~2,2%

echo SEI=%SEI%
echo SHOU=%SHOU%

set /a A=%SEI%*100+%SHOU%

echo A=%A%

set /a B=A/100
set /a C=A%%100

if %C% LSS 10 (set D=%B%.0%C%) else (set D=%B%.%C%)

echo %D%

echo on


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

Name: Mist  ..比類無きプログラマー(73,445ポイント)   Date: 2009/12/02(水) 17:05   No:43053     
Title: Re:バッチファイルで小数の四則演算をするには?    
改良版。
一応動作する、けど12.03とか入力するとSHOU=03になるので8進数扱いになる。
なので12.09と入力するとSHOU=09になって8進数でありえない数値になってエラーになる。

echo off

set /p INP="値入力(xx.xx形式) >"

echo ret1=%INP%

set /a SEI=%INP:~0,2%
set /a SHOU=%INP:~3,2%

echo SEI=%SEI%
echo SHOU=%SHOU%

set /a A=%SEI%*100+%SHOU%

echo A=%A%

set /a B=A/100
set /a C=A%%100

if %C% LSS 10 (set D=%B%.0%C%) else (set D=%B%.%C%)

echo %D%

echo on


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

Name: Mist  ..比類無きプログラマー(73,651ポイント)   Date: 2009/12/02(水) 17:16   No:43054     
Title: Re:バッチファイルで小数の四則演算をするには?    
無理やり感全開だけど希望通りの動作すると思います。
私がテストした範囲では問題なし、さっきみたいにバグってたらごめんなさい。
ただ、「整数2桁.小数2桁」で入力してもらうしかないです。
8とかは08.00という感じで。

@echo off

set /p INP="値入力(xx.xx形式) >"

echo ret1=%INP%

set /a SEI2=%INP:~0,1%
set /a SEI1=%INP:~1,1%
set /a SHOU1=%INP:~3,1%
set /a SHOU2=%INP:~4,1%

echo SEI2=%SEI2%
echo SEI1=%SEI1%
echo SHOU=%SHOU1%
echo SHOU=%SHOU2%

set /a A=%SEI2%*1000+%SEI1%*100+%SHOU1%*10+%SHOU2%

echo A=%A%

set /a B=A/100
set /a C=A%%100

if %C% LSS 10 (set D=%B%.0%C%) else (set D=%B%.%C%)

echo %D%

@echo on


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

Name: Mist  ..比類無きプログラマー(73,682ポイント)   Date: 2009/12/02(水) 17:18   No:43055     
Title: Re:バッチファイルで小数の四則演算をするには?    
あ、入力データの整合性チェックは入ってません。
間違った入力されるとエラーになるか間違った結果になります。


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

Name: 組木紙織  ..比類無きプログラマー(76,567ポイント)   Date: 2009/12/03(木) 08:34   No:43090 解決!     
Title: Re:バッチファイルで小数の四則演算をするには?    
>Mistさん

完成版?ありがとうございます。

まだ作っていませんが、これで作れると思います。

ワイルドカードがあるので文字列処理が比較的得意と思っていましたが
バッチ処理は思ったより出来る機能が少なかった事が収穫です。


ありがとうございました


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



Name: シノニム  ..ぴよぴよ(149ポイント)   Date: 2009/12/02(水) 17:32   No:43056       
Title: 2Dにおける円運動    
初めて書き込むので稚拙な部分もあるかと思いますが、なにとぞよろしくお願いします。

現在専門学校での課題でゲームを作っています。コンパイラはC++で、OSはwindowsXPです
口頭ではなかなか伝わりづらいと思ったので、画像を作ってみました

2つの画像をこのように円運動させたいんですが、一応今の知識で実装はできました

ですが向かい側の画像の配置や、画像を増やすと全部変数を手打ちしなおさないといけないこともあり、もっと便利な関数が作れないものかなと思い質問させて頂きました

できれば、

void Circle(int x, int y, float radius, float speed);
関数名(中心点の座標X, 中心点の座標Y, 半径, 回るスピード);

このような関数をつくれればと思っています。
皆さんの意見を聞かせていただけませんでしょうか
よろしくお願いします


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


Name: チルチル  ..比類無きプログラマー(81,846ポイント)   Date: 2009/12/02(水) 18:42   No:43060     
Title: Re:2Dにおける円運動    
>void Circle(int x, int y, float radius, float speed);

え〜と関数内で行いたい動作は何ですか?

座標の取得でしょうか?描画でしょうか?

とりあえず任意の数の座標を等間隔で円運動させたいなら一例としては
void Circle(int x,int y,int &X,int &Y,int Num,int MAX,int Cycle,int Reach,int Count){

float Angle=PI2/Cycle*Count+PI2/MAX*Num;
X=x+cos(Angle)*Reach;
Y=y+sin(Angle)*Reach;
}
一応説明すると
x,中心X座標
y,中心Y座標
&X,結果を代入する変数
&Y,結果を代入する変数
Num,何個目の座標か
MAX,座標の数
Cycle,一周する時間
Reach,半径
Count,カウンタ

わかりにくかったら添付したコードで確認してください

今はどうやって実装しているのかとか
具体的に何に使うのか教えていただければ
もう少しマシなのも作れますが・・


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,091,894ポイント)   Date: 2009/12/02(水) 19:05   No:43062     
Title: Re:2Dにおける円運動    
ちゃちゃっと作ってみました。
もしDXライブラリで実行出来たらやってみてください。

http://dixq.net/zip/bbs/RotateSample.zip

とりあえず2種類回転させる方法があると思うので、2種類でやっています。
cp1とcp2で回転のさせ方が違います。


#include <math.h>
#include "Lib/DxLib.h"

#define PI 3.141592654f
#define PI2 (PI*2)

typedef struct{
float x,y; //座標
float ox,oy;//回転の中心
float T; //周期
float Range;//半径
}Point_t;

void RotatePoint(const float ox, const float oy, float *x, float *y, const float angle){
float tx = *x - ox, ty = *y - oy;
*x = tx * cos( angle ) - ty * sin( angle ) + ox;
*y = tx * sin( angle ) + ty * cos( angle ) + oy;
}


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
int Cnt=0;
Point_t cp1={120,240,320,240,240,}, cp2={520,240,320,240,180,200};
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

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

RotatePoint( cp1.ox, cp1.oy, &cp1.x, &cp1.y, PI2/cp1.T );

cp2.x = cp2.ox + cos( PI2/cp2.T*Cnt ) * cp2.Range;
cp2.y = cp2.oy + sin( PI2/cp2.T*Cnt ) * cp2.Range;

DrawCircle( cp1.x, cp1.y, 10, GetColor(255, 0, 0), TRUE );
DrawCircle( cp2.x, cp2.y, 10, GetColor( 0,255,255), TRUE );
DrawCircle( 320 , 240 , 5 , GetColor(255,255,255), TRUE );

Cnt++;
ScreenFlip();
}

DxLib_End();
return 0;
}

cp1はRotatePointという自作関数で回転させています。
引数の説明です。
ox : 回転させたい中心点x
oy : 回転させたい中心点y
x : 回転させる点x
y : 回転させる点y
angle : 回転させる角度

これで(ox,oy)を中心にx,yを角度angleほど回転させることが出来ます。

あとは普通に中心点を基準にsinとcosで計算する方法もあります。
それがcp2です。
難しい事は何もしてないです。
単に角度からx成分、y成分を出して、Rangeの半径を掛けているだけです。






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

Name: MNS  ..上級者(22,830ポイント)   Date: 2009/12/02(水) 19:16   No:43063     
Title: Re:2Dにおける円運動    
C++ということなので、クラスなどを使っているのであれば

class Object
{
float mX; //X座標
float mY; //Y座標
float mAngle; //現在の角度

public:
void Circle(int x, int y, float radius, float speed)
{
mAngle += speed;
mX = x + cos(mAngle) * radius;
mY = y + sin(mAngle) * radius;
}

float GetX(){ return mX; }
float GetY(){ return mY; }

Object() :mX(0.0), mY(0.0), mAngle(0.0)
{}
};
あくまでシノニムさんが示された関数を尊重する形にするとこうなりますが、
まあ、あまり良い設計とは言えないでしょうね・・・。


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

Name: シノニム  ..ぴよぴよ(185ポイント)   Date: 2009/12/02(水) 22:37   No:43081 解決!     
Title: Re:2Dにおける円運動    
みなさんのおかげでなんとか実装できました!

返答、ありがとうございました!


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



Name: 396  ..ぴよぴよ(16ポイント)   Date: 2009/12/02(水) 18:09   No:43057       
Title: DXライブラリの下地色の黒について    
DXライブラリは画像が重なる時、その色が黒であると
すかします。私は白のほうがすごくやり易いのですが
その設定は可能なんですか?
よろしくお願いします。


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


Name: チルチル  ..比類無きプログラマー(81,468ポイント)   Date: 2009/12/02(水) 18:17   No:43059     
Title: Re:DXライブラリの下地色の黒について    
SetTransColor関数でどうでしょうか?

http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_graph.html#R15N7

まあ画像の段階で透過した方が良いかもしれませんけどね


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

Name: 396  ..ぴよぴよ(49ポイント)   Date: 2009/12/02(水) 18:55   No:43061     
Title: Re:DXライブラリの下地色の黒について    
画像の段階で透かせるってどうやれば
いいんですか?
正直分かりません。


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

Name: チルチル  ..比類無きプログラマー(81,874ポイント)   Date: 2009/12/02(水) 19:33   No:43064     
Title: Re:DXライブラリの下地色の黒について    
png形式とかの画像を編集すれば透過できますよ
龍神録素材もそんな感じですし


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

Name: 396  ..ぴよぴよ(99ポイント)   Date: 2009/12/02(水) 20:59   No:43066     
Title: Re:DXライブラリの下地色の黒について    
すいません。
画像を透かせるために何をするかってことが分からないんです・・・。
操作ではなく本質的なことです。


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

Name: MNS  ..上級者(22,922ポイント)   Date: 2009/12/02(水) 21:10   No:43068     
Title: Re:DXライブラリの下地色の黒について    
本質的なこと、と言われるとうまく答えられませんが、

PNGやGIF形式などは、その画像に透過色というのを定められます。
その透過色の情報は画像自体が持ち、それらの形式を扱えるものであれば、
例えばペイントソフトで透過色を定めたPNG形式の画像を扱えば、きちんと透過されます。
ホームページに記載したり、ワードに画像を挿入したりしても、恐らく透過されるはずです。
これはゲーム製作においても例外ではなく、DXライブラリで透過色を定めた画像を読み込めば、
その透過色が黒色でなくても、きちんと透過されます。
PNGには、αチャンネルという、ピクセル単位で透明度を定める機能もあるので、
興味があれば調べるとよいと思います。

私は別にこのようなことに詳しい者ではないので、ところどころ誤った点があると思いますが、
大体このようなものである、とわかっていただければと思います。


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

Name: softya  ..熟練のプログラマー(54,169ポイント)   Date: 2009/12/02(水) 21:12   No:43069     
Title: Re:DXライブラリの下地色の黒について    
αチャンネルのある画像データを作る必要がありますね。
DXライブラリで扱えるαチャンネルのある画像ファイルのファイルの拡張子はpngで、αチャンネルのあるpngを作れるツールとしてはgimp2などがあります。


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



Name: ななし  ..かけだし(1,647ポイント)   Date: 2009/12/02(水) 14:54   No:43035       
Title: iniファイル保存場所の変更    
visualStudio2005、C++を使用しています。
実行ファイルと同じ場所にiniファイルを作成しようとしているのですが、
検索するとMFC利用を前提とした解説ばかりです。
win32apiを利用したやり方というのはあるのでしょうか?

わからない所というのが、
MFCの解説だとCWinAppのクラスメンバであるm_pszProfileNameに
実行ファイルへのパスを上書きする、とあるのですが
win32apiですとこの変数に当るものがあるのでしょうか?(get××()みたいな関数でゲットできたり)
よろしくお願い致します。


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


Name: Mist  ..比類無きプログラマー(72,959ポイント)   Date: 2009/12/02(水) 15:11   No:43040     
Title: Re:iniファイル保存場所の変更    
Google検索結果です。

http://www.google.co.jp/search?q=win32api+ini%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a

http://www.kouteipenguin.net/annex/2007/04/win32apiini_ceea.html


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

Name: バグ  ..ハッカー(175,140ポイント)   Date: 2009/12/02(水) 15:25   No:43042     
Title: Re:iniファイル保存場所の変更    
アプリ起動直後にカレントディレクトリパスを保持しておくのがいいんじゃないかな?
GetCurrentDirectoryというそのまんまな名前の関数がありますんで、調べてみてください。


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

Name: softya  ..熟練のプログラマー(54,262ポイント)   Date: 2009/12/02(水) 16:21   No:43046     
Title: Re:iniファイル保存場所の変更    
アプリの配布を考えていて、Program Filesの下にインストールしてもらうつもりなら、Vista以降OSでは思っても見ない場所にiniファイルが作られる事になりますので注意が必要です。

前にブログで記事を書いていたので参考にしてください。
http://softyasu.blog121.fc2.com/blog-entry-68.html


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

Name: ななし  ..かけだし(1,719ポイント)   Date: 2009/12/02(水) 16:24   No:43048 解決!     
Title: Re:iniファイル保存場所の変更    
>Mistさん
>バグさん
上記のアドバイスを参考にしてみた結果、
GetPrivateProfileString();でiniファイルへのパスを設定できそうです。
ありがとうございました。


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

Name: バグ  ..ハッカー(175,866ポイント)   Date: 2009/12/02(水) 18:15   No:43058     
Title: Re:iniファイル保存場所の変更    
昔作ったINIファイルへの読み書きを多少楽に扱えるクラスを紹介しておきます。

INIファイルは便利な反面、文字列への変換作業が面倒なんですよね。

その面倒さを軽減させる為だけに作ったのが以下のクラスです(笑)

CConvertは文字列と値の相互変換を行うクラスで、CIniFileはCConvertを利用して書き込みと読み込みを多少楽に行うクラスです。

VisualStudio2005で作成しております。
よかったらどうぞ♪



#pragma once

#include <string>
#include <sstream>
#include <windows.h>

template <typename Type>
class CConvert
{
public:
CConvert(void)
{
}

virtual ~CConvert(void)
{
}

// Type型の値から文字列への変換
// Type tValue = 変換したい値
// return = 変換された文字列
static std::string ToString(Type tValue)
{
std::stringstream cStringStream;
cStringStream.setf(std::ios::fixed, std::ios::floatfield);
cStringStream << tValue;
return cStringStream.str();
}

// 文字列からType型の値への変換
// std::string szString = 変換したい文字列
// return = 変換されたType型の値
static Type ToValue(std::string szString)
{
std::stringstream cStringStream;
cStringStream << szString;
Type tValue;
cStringStream >> tValue;
return tValue;
}
};

template <typename Type>
class CIniFile
{
public:
CIniFile(void)
{
}

virtual ~CIniFile(void)
{
}

// INIファイルへの書き込み
// const char* pszFilePath = 書き込み先ファイルのパス
// const char* pszSection = セクション
// const char* pszKey = キー
// Type tValue = 書き込むデータ
static void Write(const char* pszFilePath, const char* pszSection, const char* pszKey, Type tValue)
{
WritePrivateProfileStringA(pszSection, pszKey, CConvert<Type>::ToString(tValue).c_str(), pszFilePath);
}

// INIファイルからの読み込み
// const char* pszFilePath = 書き込み先ファイルのパス
// const char* pszSection = セクション
// const char* pszKey = キー
// Type tDefault = 読み込みに失敗した際に代入される値
// int nDataLength = 読み込みに使用するバッファ長
// return = ファイルから読み込まれたType型の値
static Type Read(const char* pszFilePath, const char* pszSection, const char* pszKey, Type tDefault, int nDataLength)
{
char* szBuf = new char[nDataLength];
GetPrivateProfileStringA(pszSection, pszKey, CConvert<Type>::ToString(tDefault).c_str(), szBuf, nDataLength, pszFilePath);
Type tValue = CConvert<Type>::ToValue(szBuf);
delete[] szBuf;
return tValue;
}
};


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



Name: 名無しのごんべい  ..ぴよぴよ(151ポイント)   Date: 2009/12/02(水) 15:03   No:43036       
Title: 次のプログラミングの詳しいやり方を教えてください。    
自然数 n を入力とし,1 から n の自然数の和 1 + 2 + … + n を計算して出力する関数 int sum_1ton(int n) を作成せよ.さらに main 関数の中でキーボードから整数 x を入力させ,関数 sum_1ton を用いて 1 から x までの和を計算した戻り値を表示させるプログラムを作成せよ.関数 sum_1ton からの戻り値を main 関数内の int 型変数 y に代入してから表示させること.(「1 から 10 の自然数の和は ? です」のように表示させよ)

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


Name: バグ  ..ハッカー(175,054ポイント)   Date: 2009/12/02(水) 15:20   No:43041     
Title: Re:次のプログラミングの詳しいやり方を教えてください。    
ヒントです。そのまま提出しない方が良いですよ。


namespace ConsoleApplication
{
class Program
{
static void Main(System.String[] args)
{
try
{
System.Console.WriteLine("1 から 10 の自然数の和は " + sum_1ton(System.Int32.Parse(System.Console.ReadLine())) + " です");
}
catch
{
System.Console.WriteLine("数値を入力してね♪");
}
}

static System.Int32 sum_1ton(System.Int32 n)
{
System.Int32 res = 0;
for (System.Int32 i = 1; i <= n; ++i) res += i;
return res;
}
}
}


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

Name: non  ..比類無きプログラマー(73,711ポイント)   Date: 2009/12/02(水) 16:30   No:43049     
Title: Re:次のプログラミングの詳しいやり方を教えてください。    
おそらくCだと判断して、関数部分のみ作ってみました。
mainぐらい自分で作れるでしょ。

int sum_1ton(int n)
{
return (n>1)? n+sum_1ton(n-1):1;
}



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



Name: TKOZ  ..プログラマー(39,905ポイント)   Date: 2009/11/29(日) 16:45   No:42851       
Title: ファミコンの矩形波で#を鳴らすには??    
cc65というファミコン用のc言語開発環境でゲームを作っているTKOZです。
このサイトには大変お世話になっております。

ところで、ファミコンの矩形波でドレミファソラシドは再生できたのですが、#(シャープ)の
音を鳴らすにはどうすればいいのでしょうか?

↓のサイトはドレミをレジスタに設定するときに周波数を計算するときに参考にしたサイトです。
http://panna.dyndns.org/etc/onritu.html
http://hp.vector.co.jp/authors/VA042397/nes/apu.html


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


Name: softya  ..熟練のプログラマー(50,266ポイント)   Date: 2009/11/29(日) 17:02   No:42859     
Title: Re:ファミコンの矩形波で#を鳴らすには??    
#は半音上げる分けですから、下のサイトの様な周波数になります。
http://homepage1.nifty.com/toshio-k/inspi/interval.html
ミとシには#は存在しません → 鍵盤を見ると分かります。


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

Name: TKOZ  ..熟練のプログラマー(41,588ポイント)   Date: 2009/11/29(日) 19:48   No:42901     
Title: Re:ファミコンの矩形波で#を鳴らすには??    
>>softyaさん
情報ありがとうございます。
2段階の変換を関数電卓で計算して、
テーブルにしました。

loとhiの2つのテーブルと、あの曲のmusictblです。

聴けば分かります。w

はじめてのチュウです。

一応、ソース書いときます。



#define APU_CH1_REG0 (*(unsigned char*)0x4000)
#define APU_CH1_REG1 (*(unsigned char*)0x4001)
#define APU_CH1_REG2 (*(unsigned char*)0x4002)
#define APU_CH1_REG3 (*(unsigned char*)0x4003)
#define APU_PLAY_CH (*(unsigned char*)0x4015)
#define APU_REG0_DUTY_875 0x00
#define APU_REG0_DUTY_750 0x40
#define APU_REG0_DUTY_500 0x80
#define APU_REG0_DUTY_250 0xC0
#define APU_REG0_COUNT_OFF 0x00
#define APU_REG0_COUNT_ON 0x20
#define APU_REG0_FIX_OFF 0x00
#define APU_REG0_FIX_ON 0x10
#define APU_REG1_FRQCHG_ON 0x80
#define APU_REG1_FRQCHG_OFF 0x00
#define APU_REG1_FRQCHG_DSC 0x08
#define APU_REG1_FRQCHG_ASC 0x00

#define DO 0
#define DOS 1
#define RE 2
#define RES 3
#define MI 4
#define FA 5
#define FAS 6
#define SO 7
#define SOS 8
#define RA 9
#define RAS 10
#define SI 11
#define DO2 12
#define DOS2 13
#define RE2 14
#define RES2 15
#define MI2 16
#define FA2 17
#define FAS2 18
#define SO2 19
#define SOS2 20
#define RA2 21
#define RAS2 22
#define SI2 23
#define DO3 24
#define ST 25
#define END 26
#define REST 27

// スクリーンのオン・オフ
void ShowScreen(char ShowFlag)
{
if (ShowFlag == 1) {
*(char*)0x2000 = 0x08;
*(char*)0x2001 = 0x1e;
} else {
*(char*)0x2000 = 0x00;
*(char*)0x2001 = 0x00;
}
}

// スクロール設定
void SetScroll(unsigned char x, unsigned char y)
{
*(char*)0x2005 = x;
*(char*)0x2005 = y;
}

void SoundPlay(unsigned char note, unsigned char vol)
{
unsigned char scale_hi3[]={ 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0};

unsigned char scale_lo3[]={171, 149 ,125, 104, 83, 64, 46, 29, 14, 254, 240, 188,
214, 201, 190, 179, 170, 160, 151, 143, 134, 127, 120, 113,
107};
vol &= 0x0F;
APU_PLAY_CH = 0x0B;
APU_CH1_REG0 = APU_REG0_DUTY_875 | APU_REG0_COUNT_ON | APU_REG0_FIX_ON | vol;
APU_CH1_REG1 = APU_REG1_FRQCHG_ON;

if(scale_lo3[note]==REST) return;

APU_CH1_REG2 = scale_lo3[note];
APU_CH1_REG3 = 0xF8 | scale_hi3[note];

}

// メイン関数
char NesMain()
{
const char palettes[] = {
0x0f, 0x00, 0x10, 0x20,
0x0f, 0x06, 0x16, 0x26,
0x0f, 0x08, 0x18, 0x28,
0x0f, 0x0a, 0x1a, 0x2a
};
const char string[] = "HELLO, MUSIC!";
char msctbl[]={
DO2,RA,SO,FA,FA,SO,RA,DO2,RE2,DO2,REST,REST,DO2,RA,SO,FA,FA,SO,//18
RA,DO2,RE2,DO2,REST,REST,MI,SO,DO2,RA,SO,SO,SO,FA,//14
REST,REST,FA,SO,FA,RA,SO,FA,FA,SO,RA,REST,RA,DO2,RE2,DO2,RA,//17
SO,FA,FA,FA,SO,FA,RA,SO,FA,FA,REST,FA,FA,RA,DO2,DO2,DO2,//17
RE2,RA,SO,FA,REST,REST,FA,FA,RA,DO2,DO2,DO2,RE2,RA,SO,//15
FA,REST,REST,SI,RE2,REST,SI,SI,RE2,REST,MI2,MI2,//12
FAS2,REST,MI2,MI2,FAS2,MI2,RE2,REST,RA,RA,SO,FA,//12
RA,RE2,DO2,REST,REST,FA,FA,RA,RE2,DO2,REST,RA,DO2,FA2,FA2,//15
RE2,RA,DO2,REST,RA,DO2,FA2,SO2,FA2,DOS2,DO2,MI2,//12
RE2,RA,SO,SO,RE2,MI2,RE2,DO2,REST,RA,RA,SO,FA,RA,//14
RE2,DO2,REST,FA,FA,RA,RE2,DO2,REST,RA,DO2,FA2,FA2,RE2,//14
RA,DO2,REST,RA,DO2,FA2,SO2,FA2,DOS2,DO2,MI2,RE2,RA,//13
REST,REST,SO,SO,RE2,RE2,DO2,DO2,RE2,RA,SO,SO,FA,//13
REST,DO2,RA,SO,FA,FA,SO,RA,DO2,RE2,DO2,REST,REST,//14
DO2,RA,SO,FA,FA,SO,RA,DO2,RE2,DO2,REST,RA,DO2,REST,REST,REST,REST,REST};//18
unsigned char i;
long int cnt=0;
char index=0;

ShowScreen(0);

// パレットを書き込み
*(char*)0x2006 = 0x3f;
*(char*)0x2006 = 0x00;
for (i = 0; i < 0x10; i ++)
*(char*)0x2007 = palettes[i];

// ネームテーブルへ書き込み
*(char*)0x2006 = 0x21;
*(char*)0x2006 = 0xc9;
for (i = 0; i < 13; i ++)
*(char*)0x2007 = string[i];

SetScroll(0, 0);
ShowScreen(1);


// 無限ループ
while (1){
cnt++;
if(cnt>960)
{
cnt=0;
SoundPlay(msctbl[index],8);
index++;
if(index>217)index=0;
}
}

return 0;
}




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

Name: TKOZ  ..熟練のプログラマー(41,670ポイント)   Date: 2009/11/30(月) 18:02   No:42969     
Title: Re:ファミコンの矩形波で#を鳴らすには??    
鳴らしてみれば分かるのですが、途中で「プツ」と変な音が鳴ります。
電卓での計算違いか、もしくは、曲データの打ち間違えか、分かりませんが、
とりあえず、デバッグしてみます。


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

Name: softya  ..熟練のプログラマー(52,214ポイント)   Date: 2009/11/30(月) 18:10   No:42971     
Title: Re:ファミコンの矩形波で#を鳴らすには??    
PSG系のサウンドドライバを見た事があるので、私も後でコードを検証しますよ。
ただ、ちょっと後になっちゃいます。

勘では、必要無いのにPSGのレジスタ毎フレーム書き換えてません?


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

Name: softya  ..熟練のプログラマー(52,765ポイント)   Date: 2009/12/01(火) 00:36   No:42990     
Title: Re:ファミコンの矩形波で#を鳴らすには??    
とりあえず、見つけたバグだけ。

> if(scale_lo3[note]==REST) return;
if(note==REST) return;
が正解では?

それと、

再生方法
1. I/O【0x4015】で設定するチャンネルの再生をオフにする
2. チャンネルのレジスタに情報を設定
3. I/O【0x4015】で設定したチャンネルの再生をオンにする

を守ってませんが、鳴っている最中に「チャンネルのレジスタに情報を設定」するとノイズが出ると思います。

パッと目に付いたところだけなので、また明日みてみます。
理由:NESのAPUの仕様はPSGより複雑だったため。

ところで、NES研究所の「FM音源4チャンネルとPCM音源1チャンネル」と書いてありますが、どうみてもFM音源では無いですよね。
http://ja.wikipedia.org/wiki/FM%E9%9F%B3%E6%BA%90


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

Name: TKOZ  ..熟練のプログラマー(41,899ポイント)   Date: 2009/12/01(火) 16:56   No:43006     
Title: Re:ファミコンの矩形波で#を鳴らすには??    
>>softyaさんへ
バグを見つけてくださり、ありがとうございます。

とりあえず、
if(note==REST) return;
にしたら、ノイズが無くなったので、報告しておきます。

しかし、音がnote==RESTになった時に、音色の再生が止まらなくなったので、
困りました。

で、その後、このif文を
APU_PLAY_CH=0x0B;
の上に置き、さらに、
if(note==REST){APU_PLAY_CH==0x00;return;}
としました。

>ところで、NES研究所の「FM音源4チャンネルとPCM音源1チャンネル」と
>書いてありますが、どうみてもFM音源では無いですよね。
そうですね。違うと思います。

ヒントをくれてくださり、ありがとうございます。


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

Name: softya  ..熟練のプログラマー(53,025ポイント)   Date: 2009/12/01(火) 19:22   No:43011     
Title: Re:ファミコンの矩形波で#を鳴らすには??    
えーと、解決したって事でしょうか?


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

Name: TKOZ  ..熟練のプログラマー(41,938ポイント)   Date: 2009/12/02(水) 06:49   No:43024 解決!     
Title: Re:ファミコンの矩形波で#を鳴らすには??    
そうです。解決しました。
解決ボタンを押すのを忘れてました。
ありがとうございました。


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



Name: 愛川  ..ぴよぴよ(518ポイント)   Date: 2009/11/29(日) 17:09   No:42861       
Title: スケーリング    
11個の非負の整数を入力として受け付ける。
これは,0点から10点までの人数だと考える。
このデータを利用して,*を使用したヒストグラムを出力したい。
人数が大きい場合には,*が画面を折り返してしまい,見にくくなってしまう。
そこで,次のようにスケーリング(縮小)を行いたい。
 *の数の最大を40 としたい。
 全データの最大値が,*の数を40個として表すことにする。
 例えば,最大値が80 だとして,それを40個とすることは50%に縮小することになる。
他のデータも同じように縮小する。
人数が20の場合は,*が10個になる。
また人数が25 の場合は,その半分が12.5なるが,小数点以下を四捨五入して*を13個とする。
 なお最大値が40以下の場合は,拡大も縮小も行わない。

出力形式は,最初の2桁が点数,一つ空白,続いて8桁が人数,一つ空白,*を0から40個となる。

下のようなプログラムは書けたのですが、スケーリングのやり方が分かりません。
よかったら教えていただけないでしょうか。

#include<stdio.h>
int main(void){
int i, j, data[11];
for(i = 0; i <= 10; i++){
scanf("%d", &data[i]);
}
for(j = 0; j <= 10; j++){
printf("%2d %8d ", j, data[j]);
for(i = 0; i < data[j]; i++){
printf("*");
}
printf("\n");
}
return(0);
}


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


Name: non  ..比類無きプログラマー(71,814ポイント)   Date: 2009/11/29(日) 17:28   No:42866     
Title: Re:スケーリング    
まず、環境を書いてください。
それに、添付するプログラムは、規約を読んで<pre>タグを使ってください。

さて、上のプログラムに、最大値を求めるプログラムを
追加してみてください。



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

Name: 愛川  ..ぴよぴよ(687ポイント)   Date: 2009/11/29(日) 17:44   No:42873     
Title: Re:スケーリング    
申し訳ありません。
OSはWindows、コンパイラはVisual C++です。


#include<stdio.h>
int main(void){
int i, j, data[11];
for(i = 0; i <= 10; i++){
scanf("%d", &data[i]);
}
for(j = 0; j <= 10; j++){
printf("%2d %8d ", j, data[j]);
for(i = 0; i < data[j]; i++){
printf("*");
}
printf("\n");
}
return(0);
}


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

Name: 愛川  ..ぴよぴよ(835ポイント)   Date: 2009/11/29(日) 20:38   No:42905     
Title: Re:スケーリング    
最大値を求めるプログラムを追加しました。
ここからがどうしていいか全く分かりません。
よろしくお願いします。

#include<stdio.h>

int main(void){
int i, j, data[11], max = 0;
for(i = 0; i <= 10; i++){
scanf("%d", &data[i]);
if(data[i] > 0){
max =data[i];
}
}
for(j = 0; j <= 10; j++){
printf("%2d %8d ", j, data[j]);
for(i = 0; i < data[j]; i++){
printf("*");
}
printf("\n");
}
return(0);
}


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

Name: ドラ  ..入門者(3,689ポイント)   Date: 2009/11/29(日) 21:17   No:42914     
Title: Re:スケーリング    
>最大値を求めるプログラムを追加しました。
本当に最大値が取得できているか確認しましたか?


>ここからがどうしていいか全く分かりません。
無事に最大値maxが算出できたなら、何個'*'を出力すればいいか計算するだけでしょう。
max <= 40 の場合は、data[j]個。
max > 40 の場合は基本的に40の(data[j]/max)倍の個数の'*'を表示すればいいですね。
ただし、小数点以下四捨五入の指示がありますので求めた個数に0.5を加算してから
小数点以下を切り捨てると良いでしょう。



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

Name: non  ..比類無きプログラマー(72,176ポイント)   Date: 2009/11/29(日) 21:18   No:42915     
Title: Re:スケーリング    
最大値が求まっていません。
このままでは、最後に入力したデータがmaxになります。


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

Name: 愛川  ..かけだし(1,004ポイント)   Date: 2009/11/29(日) 22:55   No:42933     
Title: Re:スケーリング    
すみません、間違えていました。
最大値の部分は直せましたが、そのあとがうまくいきません。

#include<stdio.h>

int main(void){
int i, j, data[11], max = 0;
double a;
for(i = 0; i <= 10; i++){
scanf("%d", &data[i]);
if(data[i] > max){
max =data[i];
}
}
for(j = 0; j <= 10; j++){
printf("%2d %8d ", j, data[j]);
if(max <= 40){
for(i = 0; i < data[j]; i++){
printf("*");
}
}
else{
a = 40 / max + 0.5;
for(i = 0; i < a * data[j]; i++){
printf("*");
}
}
printf("\n");
}
return(0);
}


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

Name: 星映  ..かけだし(2,246ポイント)   Date: 2009/11/29(日) 23:56   No:42940     
Title: Re:スケーリング    
>a = 40 / max + 0.5;
maxが80のとき以下のようになってしまいます。

a = 40 / 80 + 0.5;
a = 0.5 + 0.5;
a = 1;
あとfor文内のa * date[j]の部分はループの内一回だけ 「a」*「maxの入った配列」 になりますので、
i < a * max
i < 1 * 80
i < 80
です。つまり、「maxの入った配列」のときは「*」が80個並びます。

今回間違っている部分は四捨五入する場所です。四捨五入するのは「*」の表示個数です。

頑張ってみてください。


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

Name: 愛川  ..ぴよぴよ(851ポイント)   Date: 2009/11/30(月) 00:36   No:42941     
Title: Re:スケーリング    
以下のようになったのですが…
出力が若干うまくいきません。

#include<stdio.h>

int main(void){
int i, j, data[11], max = 0;
double a;
for(i = 0; i <= 10; i++){
scanf("%d", &data[i]);
if(data[i] > max){
max =data[i];
}
}
for(j = 0; j <= 10; j++){
printf("%2d %8d ", j, data[j]);
if(max <= 40){
for(i = 0; i < data[j]; i++){
printf("*");
}
}
else{
a = 40 * data[j] / max;
for(i = 0; i < a + 0.5; i++){
printf("*");
}
}
printf("\n");
}
return(0);
}


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

Name: 星映  ..入門者(2,900ポイント)   Date: 2009/11/30(月) 02:26   No:42946     
Title: Re:スケーリング    

>以下のようになったのですが…
>出力が若干うまくいきません。
>a = 40 * data[j] / max;
>for(i = 0; a + 0.5; i++){
> printf("*");
>}
おそらくscanfで0を入力すると0が入った配列は1になるでしょう。
なぜならi < a + 0.5が原因です。
scanfで0ならaは必然的に0になります。
i < 0 + 0.5 → i < 0.5になります。
i = 0のときは → 0 < 0.5(結果はTRUE)
そのため最低一回は 「*」を表示します。

自分なりに作ってみました。あと肝心の式の部分は(double)(〜) int(a)などと書いていますが、
便利なので使わせて頂いてます。もし分からなければ質問していただいて結構ですよ。
#define OK1~OK3の部分や#ifndef,#ifdef,#endifは無駄なおまけです。

#include<stdio.h>

//#define OK1
//#define OK2
//#define OK3

int main(void)
{
int i, j, data[11], max = 0;
double a;
for(i = 0; i <= 10; i++)
{
#ifdef OK1
scanf("%d", &data[i]);
#endif

#ifdef OK2
data[i] = i * i;
#endif

#ifdef OK3
data[i] = i * 100;
#endif

#ifndef OK1
#ifndef OK2
#ifndef OK3
printf("#defineのOK1かOK2かOK3のコメントをはずしてください\n");
printf("コメントをはずした後コンパイルしてください。\n");
return(0);
//コメントははずすだけで結構です。
#endif
#endif
#endif

if(data[i] > max)
{
max = data[i];
}
}
printf("max %d\n",max);
for(j = 0; j <= 10; j++)
{
printf("%2d %8d ", j, data[j]);
if(max <= 40)
{
for(i = 0; i < data[j]; i++)
{
printf("*");
}
}
else
{
if( 40 > (a = (double)(data[j]) / (double(max) / 40) ) )
{
a += 0.5;
}
for(i = 0; i < int(a); i++)
{
printf("*");
}
}
printf(" %d ", i );
printf("\n");
}
return(0);
}


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

Name: non  ..比類無きプログラマー(72,223ポイント)   Date: 2009/11/30(月) 09:04   No:42948     
Title: Re:スケーリング    
極力、本人のプログラムを活かすなら
for(i = 0; i <(int)( a + 0.5 ); i++){


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

Name: 愛川  ..かけだし(1,029ポイント)   Date: 2009/11/30(月) 23:59   No:42988     
Title: Re:スケーリング    
皆様、ありがとうございます。
以下のようなプログラムで合っているかと思うのですが…
無駄な処理など入っていますでしょうか?


#include<stdio.h>
int main(void){
int i, j, data[11], max;
double a;
scanf("%d", &data[0]);
max = data[0];
for(i = 1; i <= 10; i++){
scanf("%d", &data[i]);
if(data[i] > max){
max = data[i];
}
}
for(j = 0; j <= 10; j++){
printf("%2d %8d ", j, data[j]);
if(max <= 40){
for(i = 0; i < data[j]; i++){
printf("*");
}
}
else{
a = (int)(max / 40 + 0.5);
for(i = 0; i < (int)(data[j] / a + 0.5); i++){
printf("*");
}
}
printf("\n");
}
return(0);
}


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

Name: 星映  ..入門者(3,169ポイント)   Date: 2009/12/01(火) 00:52   No:42993     
Title: Re:スケーリング    
回答します。(前回は無駄な回答ごめんなさい)

>scanf("%d", &data[0]);
>max = data[0];
>for(i = 1; i <= 10; i++){
> scanf("%d", &data[i]);
> if(data[i] > max){
> max = data[i];
> }
>}
scanf("%d, &data[0]);
max = data[0];
を分けている意図が分かりません。ここは消してfor文のiの開始を0にするべきです。

>a = (int)(max / 40 + 0.5);
aにスケーリングの比率を代入する際、int型でキャストしている部分が謎です。それと比率には四捨五入は必要ないです。(「*」の表示個数をint型でキャストしているのは問題ないですが。)

以上です。頑張ってください。


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

Name: non  ..比類無きプログラマー(73,145ポイント)   Date: 2009/12/01(火) 08:43   No:42996     
Title: Re:スケーリング    
>scanf("%d, &data[0]);
>max = data[0];
>を分けている意図が分かりません。ここは消してfor文のiの開始を0にするべきです。

これは、maxに初期値を入れるためですね。今回は、点数入力に範囲があるので(0から10点)
max=0に初期化すればi=0からでOKです。





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

Name: non  ..比類無きプログラマー(73,353ポイント)   Date: 2009/12/01(火) 08:56   No:42997     
Title: Re:スケーリング    
>点数入力に範囲があるので(0から10点)
上限はなかったですね。

無駄というほどではありませんが、このような解答もあるという例で


#include<stdio.h>
int main(void){
int i, j, data[11], max=0;
double a;
for(i = 0; i <= 10; i++){
scanf("%d", &data[i]);
if(data[i] > max){
max = data[i];
}
}
a=(max>40)? max/40.0:1.0;
for(j = 0; j <= 10; j++){
printf("%2d %8d ", j, data[j]);
for(i = 0; i < (int)(data[j] / a + 0.5); i++){
printf("*");
}
printf("\n");
}
return(0);
}



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

Name: 愛川  ..かけだし(1,070ポイント)   Date: 2009/12/02(水) 00:55   No:43021 解決!     
Title: Re:スケーリング    
回答してくださった皆様、ありがとうございます。
ようやく自分でも納得いくプログラムができました。
またなにかありましたらよろしくお願いいたします。


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



Name: jay  ..ぴよぴよ(60ポイント)   Date: 2009/11/27(金) 16:45   No:42740       
Title: 弾幕シューティング    
現在、龍神録を参考にさせていただきながら弾幕シューティングを制作しています。
ゲームのシステム的なところは出来上がってきたのですが、素材が足りません。
特に背景や敵キャラ(主にボス)の画像が欲しいのですが、
どこかいいサイトはないでしょうか?


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


Name: yu  ..熟練のプログラマー(40,420ポイント)   Date: 2009/11/28(土) 12:35   No:42782     
Title: Re:弾幕シューティング    
自分もSTG作る際、素材探しに苦労しましたw
しかし、STGゲームの素材と言っても多種多様すぎるので好みがあると思いますが...
東方関係ので宜しいのであれば

弾幕風Wiki - 素材
ttp://f27.aaa.livedoor.jp/~thdmhul/pukiwiki/pukiwiki.php?%C1%C7%BA%E0

HAL900のぺぇじ - 弾幕風Tips
ttp://hal900.gotdns.com/HAL900page/

一つ目は主に弾・敵(ボス)の画像、二つ目は主に弾・背景画像が豊富です。
他にもフリー素材はたくさん公開されていると思いますので
自分で気に入ったものを探してみてはいかがでしょうか。


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

Name: jay  ..ぴよぴよ(90ポイント)   Date: 2009/11/28(土) 17:43   No:42789     
Title: Re:弾幕シューティング    
ありがとうございます。
自分でもいろいろ探してみたのですが、いいものが見つからなくて・・・
弾幕時の背景はどうにかなりそうですが、道中の背景はいまだ見つからず・・・
ほかにも良いサイトありあせんか?


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,089,314ポイント)   Date: 2009/11/29(日) 00:42   No:42811     
Title: Re:弾幕シューティング    
シューティングの背景素材になりそうなものって、私も散々探しましたが、いきついた結論は
「どこにも無い」
でした。
あったとしても自分が気に入るものでは無かったり本格的なものではなかったり。
ゲーム制作を本腰入れて作りたいならやっぱり絵の勉強をするか、協力してくれそうな絵師さんを見つけるしかなさそうです。
とりあえずフォトショかGIMPがあればしばらくカキカキ素材になりそうなもの書いてみてはどうでしょう。
私も龍神録作る時に苦労しました・・。

私は綺麗な風景を実際に徒歩で歩いて探して写真撮ったりして素材集めたりまでしました。

http://mixi.jp/view_diary.pl?id=632998941&owner_id=5717192

http://mixi.jp/view_diary.pl?id=626848349&owner_id=5717192

龍神録2面の背景はこの時できたものでした^^;
幸い秋であり、京都の近くに住んでいたのでいろいろ回りました。
素材作りはなかなか難しいですねぇ


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

Name: jay  ..入門者(2,883ポイント)   Date: 2009/11/29(日) 18:52   No:42889     
Title: Re:弾幕シューティング    
素材作りはおそらく無理ですよ(泣)
自分でペン持って絵描くならともかく
パソコンで絵を描くスキルが皆無ですから・・・
ゲーム作るといってもネットで発表するわけでもなく
学校の課題研究で作ってるだけですから
そんな理由で絵師さんを頼るのも気が引けますし
僕好みの背景は風神録みたいな自然な背景(1面や3面みたいなやつ)
上から見下ろした感じがいいです。
だから龍神録のprojectファイルに入ってたやつはそのまま使わせて頂きます
感謝します。





・・・ところでカキカキ素材って何ですか??


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

Name: yu  ..熟練のプログラマー(40,529ポイント)   Date: 2009/11/29(日) 22:41   No:42932     
Title: Re:弾幕シューティング    
>> jay様
>弾幕時の背景はどうにかなりそうですが、道中の背景はいまだ見つからず・・・

道中は確かに探すのは難しいかもしれません・・・
Dixq様も仰っているように自分で写真をとるのもいいですね。


> 僕好みの背景は風神録みたいな自然な背景

10月頃に紅葉を見に行って写真撮ったのですが、
使いたかったらどうぞ使ってくださいw
適当に撮ったのでゲームで使用するには加工が難しいかもしれませんが...

DLキーワード : kouyou
ttp://www1.axfc.net/uploader/Al/so/23409


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,090,336ポイント)   Date: 2009/11/29(日) 23:01   No:42934     
Title: Re:弾幕シューティング    
おぉ、これはもしや立山の称名滝?!
http://images.google.co.jp/images?hl=ja&q=%E7%A7%B0%E5%90%8D%E6%BB%9D&lr=lang_ja&um=1&ie=UTF-8&sa=N&tab=wi
すごい迫力ですね〜、一度行ってみたい!><
せっかく信州に居たのに大して見て回らないうちに北海道に転勤になってしまった(T_T
深々と雪が降っています・・。寒すぎです・・。まだノーマルタイヤです・・orz


素材より滝の迫力に魅せられてしまったw
バイクが好きだったので、全国の景色のいい場所をサイトで見てあさっては「行きたいな〜」と思っていました・・w


まぁ素材作りってプログラミングの集中できなくさせるものなので、
鬱陶しがりがちですが、素材作りはこれはこれで色々考えさせられて楽しいものですよね(´▽`)


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,090,382ポイント)   Date: 2009/11/29(日) 23:06   No:42936     
Title: Re:弾幕シューティング    
>カキカキ素材

あぁ、素材をカキカキするって言い方私しかしませんかね^^;
ん〜時間かけてでものんびり素材を書くって感じの意味で言いました^^;


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

Name: yu  ..熟練のプログラマー(40,759ポイント)   Date: 2009/11/29(日) 23:22   No:42938     
Title: Re:弾幕シューティング    
>> Dixq様
>おぉ、これはもしや立山の称名滝?!

何も言ってないのに、良く分かりましたねw
紅葉が良い感じでしたし、称名滝は結構近い方なので今年行ってみました。


>せっかく信州に居たのに大して見て回らないうちに北海道に転勤になってしまった(T_T
>深々と雪が降っています・・。寒すぎです・・。まだノーマルタイヤです・・orz

ブログの方も拝見させていただきましたが、もう雪が降っているんですねw
環境が大きく変わって大変ですね;体に気を付けてください。


>すごい迫力ですね〜、一度行ってみたい!><

称名滝に行くなら雨の日、またはその翌日はやめたほうがいいですよ。
滝からの水量が多すぎて近づけないときがあるのでw


>素材作りはこれはこれで色々考えさせられて楽しいものですよね(´▽`)

そうですね。表現も多種多様ですしどんな方法で素材を作っても良いものは良いですね。
効果音等でも同じことを思います。さすがに録音できる環境はありませんがw


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

Name: jay  ..入門者(3,396ポイント)   Date: 2009/11/30(月) 21:33   No:42979     
Title: Re:弾幕シューティング    
もう少し時間があれば素材を描く練習をしてもいいんですが・・・
学校は待ってくれません(泣)
しかも学校じゃ週2時間しか時間をくれないし。
高校だから期末テスト近づいてきたし。
割とピンチかも・・・
切実な問題なんですが
どなたか自分が以前使った物でもかまいませんので頂けないでしょうか?

Dixqさん
http://mixi.jp/view_diary.pl?id=632998941&owner_id=5717192
及び
http://mixi.jp/view_diary.pl?id=626848349&owner_id=5717192
紹介が必要とかで拝見できないんですが・・・
どうにかなりませんか?

>ノーマルタイヤ
北海道ならそろそろ冬用タイヤに替えた方が、って余計なお世話ですね
風邪などひかれぬよう・・・

yuさん

協力感謝します
Vistaだと何故か圧縮フォルダがまともに展開出来ないので明日学校のパソコンで開いてみます。


>東方関係ので宜しいのであれば
高校の課題研究(卒業制作みたいなもの)なんですが東方関係の素材使っていいんでしょうか?
 最も弾の画像とかから気にしだしたら手遅れなんですが・・・


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

Name: yu  ..熟練のプログラマー(40,900ポイント)   Date: 2009/12/01(火) 20:52   No:43013     
Title: Re:弾幕シューティング    
>>jay様
>高校の課題研究(卒業制作みたいなもの)なんですが東方関係の素材使っていいんでしょうか?

自分は卒業制作等はまだ先の話ですが、
自分だったら、学校で教官に提出するものには絶対に同人関係のものは使わないと思います。
そちらの場を考えないで発言した個人的な意見です^^;

後、卒業研究は地味に楽しみだったりします...w


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



Name: ラッコ  ..ぴよぴよ(395ポイント)   Date: 2009/11/28(土) 17:51   No:42790       
Title: 画像を移動させる際の計算について    
こんばんは。

今回質問したいのは, 画像を移動させるための計算についてです。

移動させる画像は 縦4 横3の
0 1 2
3 4 5
6 7 8
9 10 11
という感じの画像です。

これを0→1→2→0→1→2・・・という風に動かしたいのですが
計算方法がよくわかりません。

ch.img = image[( ch.x % 32 + ch.y % 32 ) / 8 + ch.muki * 4];

この計算式では, 現在移動させようとしている画像は移動させられませんし
どういう計算式にすればよいのかさっぱり・・・

ヒントだけでも教えていただければ幸いです。


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


Name: kazuoni [URL]  ..ハッカー(115,474ポイント)   Date: 2009/11/28(土) 18:47   No:42794     
Title: Re:画像を移動させる際の計算について    
ch.img = image[( ch.x % 32 + ch.y % 32 ) / 11 + ch.muki * 3];

でとりあえず動くかと思います。


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

Name: ラッコ  ..ぴよぴよ(479ポイント)   Date: 2009/11/28(土) 21:13   No:42798     
Title: Re:画像を移動させる際の計算について    
ご回答ありがとうございます。

>>ch.img = image[( ch.x % 32 + ch.y % 32 ) / 11 + ch.muki * 3];
あれ?
これって32を11で割れてないですよね?
何故綺麗の動くのですかね・・・?


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

Name: kazuoni [URL]  ..ハッカー(115,537ポイント)   Date: 2009/11/28(土) 22:49   No:42802     
Title: Re:画像を移動させる際の計算について    
>これって32を11で割れてないですよね?

[/]は除算、[%]は剰余算です。
なので、
[0〜10]/11=0
[11〜21]/11=1
[22〜31]/11=2
となってます。


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

Name: 星映  ..ぴよぴよ(359ポイント)   Date: 2009/11/28(土) 23:18   No:42803     
Title: Re:画像を移動させる際の計算について    

>ch.img = image[( ch.x % 32 + ch.y % 32 ) / 11 + ch.muki * 3];

こんな場合はいかがでしょう?
ch.x = 31;
ch.y = 31;
ch.muki = 3;(3が最大値でいいですよね?)
ch.img = image[(31 % 32 + 31 % 32) / 11 + 3 * 3];
ch.img = image[(62)/11 + 9];
ch.img = image[5 + 9];
ch.img = image[14];(???)

(ch.x % 32 + ch.y % 32) / 11ではなくて
(ch.x + ch.y) % 32 / 11では無いでしょうか?
上記の値として
ch.img = image[(31 + 31) % 32 / 11 + 3 * 3]
ch.img = image[(62) % 32 / 11 + 9]
ch.img = image[30 / 11 + 9]
ch.img = image[2 + 9]
ch.img = image[11]


私がルールを知らないだけならば、申し訳ありません。


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

Name: ラッコ  ..ぴよぴよ(747ポイント)   Date: 2009/11/28(土) 23:41   No:42805     
Title: Re:画像を移動させる際の計算について    
お二人ともご回答ありがとうございます。

kazuoniさん >>
なるほど。そういう風に分けられている、ということですね!
完全に、ではないかもしれませんが何となくわかったような気がします!
ご回答ありがとうございました!


星映さん >>
ch.img = image[( ch.x % 32 + ch.y % 32 ) / 11 + ch.muki * 3];
という式では, ちゃんとした画像が描画されない・・・ということですかね・・・?

中々難しいですね・・・
星映さんが記述してくださったソースを参考に色々試してみたいと思います。
できたらここで報告させていただきますね。


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


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

Name: mats  ..かけだし(1,392ポイント)   Date: 2009/11/28(土) 23:55   No:42807     
Title: Re:画像を移動させる際の計算について    
>こんな場合はいかがでしょう?
>ch.x = 31;
>ch.y = 31;

ラッコさんの実装にもよりますが,
こちらのサイトで紹介している移動方法ならばch.xとch.yのどちらか片方は常に32の倍数になるので,
kazuoniさんの方法で大丈夫だと思われます.


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

Name: ラッコ  ..ぴよぴよ(794ポイント)   Date: 2009/11/29(日) 00:05   No:42808     
Title: Re:画像を移動させる際の計算について    
mats さん>>
ご回答ありがとうございます。

なるほど。
kazuoniさんのやり方で大丈夫なんですね。

教えてくれてありがとうございます!


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

Name: 星映  ..かけだし(1,444ポイント)   Date: 2009/11/29(日) 01:47   No:42814     
Title: Re:画像を移動させる際の計算について    
マップ一区画の移動だったんですね!

確かに一区画の移動ならX座標とY座標は同時に変化しませんもんね。
無駄な疑問いだかせて申し訳なかったです。


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

Name: ラッコ  ..ぴよぴよ(974ポイント)   Date: 2009/12/01(火) 18:30   No:43009     
Title: Re:画像を移動させる際の計算について    
しばらくご返答できなくてすいませんでした。

星映 さん>>
ご回答ありがとうございます。

マップ一区画の移動でした。
詳しく明記してなくて申し訳ありません。。


皆さんのおかげで, 自分が想像していた動きを実装することができました!!
皆様本当にご教授ありがとうございました!!

これからもわからないことがあるかもしれませんが, その時はまたよろしくお願いいたします。


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

Name: ラッコ  ..ぴよぴよ(993ポイント)   Date: 2009/12/01(火) 18:31   No:43010 解決!     
Title: Re:画像を移動させる際の計算について    
すいません。。
解決にさせるの忘れてました。。。


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



Name: よーみし  ..ぴよぴよ(8ポイント)   Date: 2009/12/01(火) 10:55   No:42999       
Title: 開けられない    
こんにちは。いまダウンロードしたばかりで、Ryujin.slnを開こうとしたら、開けません。
どうしたらいいですか?


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


Name: non  ..比類無きプログラマー(73,560ポイント)   Date: 2009/12/01(火) 11:02   No:43001     
Title: Re:開けられない    
Visual C++を起動してから、「開く」−「プロジェクト」で試してください。


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

Name: jay  ..入門者(3,447ポイント)   Date: 2009/12/01(火) 18:26   No:43008     
Title: Re:開けられない    
念のため確認しますがVisual C++はダウンロード済みですよね?
projectは解凍済みですよね?
maydatフォルダを移動させたりしてませんよね?


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



Name: スタートメニュー  ..かけだし(1,283ポイント)   Date: 2009/11/21(土) 15:11   No:42432       
Title: 弾の速度制限    
只今、敵が放つ弾幕のスピードについてやっているのですが、
”時間が経つにつれてスピードが変わる+一定の速度以上からしか弾を出さない”書き方を調べています。
上記説明が少々わかりにくいので
t*0.1で1以上 
のようなspdの書き方を教えていただきたいしだいです。

尚、
shot[n].bullet[k].spd =t*0.1>1;
このように書くと1に満たない弾は止まってしまいます。

ご意見よろしくお願いします。


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,086,913ポイント)   Date: 2009/11/21(土) 21:48   No:42450     
Title: Re:弾の速度制限    
うむむ・・すみません意図がいまいちよく理解出来ていません。

時間がたつにつれてスピードを変化させたいなら、カウンタによってスピードを変化させればいいですね。
セットするスピードもその仰っているスピード以下にならないように計算すればいいのではないでしょうか?

「t*0.1で1以上」という意味がわかりません。
弾幕が始まってからの時間ですか?

>shot[n].bullet[k].spd =t*0.1>1;
>このように書くと1に満たない弾は止まってしまいます。

このような書き方は出来ないと思います(出来ないというよりおそらく思った通りにいかない)
もう少し詳しくわかりやすく、やりたいことを教えて頂けると何かアドバイス出来るかも知れません


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

Name: チルチル  ..比類無きプログラマー(78,074ポイント)   Date: 2009/11/21(土) 22:11   No:42452     
Title: Re:弾の速度制限    
もしかして東方でよくある「後から撃った弾が先に撃った弾を追い抜く」ような感じですか?
だったら
shot[n].bullet[k].spd=1+t*0.1;
で良いんじゃないでしょうか?
まあ長時間撃つならtを%でも使って調整する必要がありますが・・


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

Name: ALFA  ..ぴよぴよ(507ポイント)   Date: 2009/11/21(土) 23:39   No:42457     
Title: Re:弾の速度制限    
if構文等で
・弾速が上限の速度に到達していない場合は、弾が射出されてからの時間に対して一定の値で加速して移動
・弾速が上限の速度に到達している場合はそのままの速度で移動

のように条件分岐すればいいのでしょうか……ね。


if(shot[n].bullet[k].spd <1)
{
shot[n].bullet[k].spd=0.1 * t;
}
if(shot[n].bullet[k].spd <= 1)
{
shot[n].bullet[k].spd = 1;
}


とりあえず上記のものだと最大速が1になってると思います。
私も始めたばかりなのでこの程度が限界で申し訳ないです。


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

Name: チルチル  ..比類無きプログラマー(78,180ポイント)   Date: 2009/11/22(日) 00:39   No:42460     
Title: Re:弾の速度制限    
確かに「発射してから加速する」という意味にも取れますね・・

それなら
shot[n].bullet[k].spd=1+t*0.1;
でも行けそうですが

初期値の他に最大値もあるとすると・・
shot[n].bullet[k].spd=(t<20)?1+t*0.1:3;
見たいな感じでしょうかね?


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

Name: スタートメニュー  ..かけだし(1,571ポイント)   Date: 2009/11/22(日) 15:42   No:42486     
Title: Re:弾の速度制限    
皆様色々なご回答本当に感謝いたします。
自分の説明下手で本当に申し訳ございません。

追い越し弾ですね。言葉が見つかりませんでした。
チルチルさんのshot[n].bullet[k].spd=1+t*0.1;参考にさせていただきました。
ありがとうございました。

問題解決と同時に問題が発生しました。
shot[n].bullet[k].spd=1+t*0.1;でやったところ最初は追い越し弾になるのですが、
後々統一性がなくなってしまいました。

1発目 一定のスピード
2発目 1発目を追い越すスピード
3発目 2発目を追い越すスピード
4発目 3発目を追い越すスピード
5発目 2発目と同じスピード
6発目 5発目を追い越すスピード
7発目 6発目を追い越すスピード
8発目 2発目と同じスピード
9発目 8発目を追い越すスピード

こんな感じです。
ご意見よろしくお願いします。


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

Name: チルチル  ..比類無きプログラマー(78,509ポイント)   Date: 2009/11/22(日) 16:20   No:42489     
Title: Re:弾の速度制限    
地霊殿EXボスの通常攻撃みたいなのをイメージしているのですが、合っているでしょうか?
発射時の初速が変化するだけで、飛んで行く途中で加速はしないんですよね?

統一性となると

shot[n].bullet[k].spd=1+t*0.1;
これを書いてある場所が気になりますね
登録時と計算時のどっちに書いてありますか?

それからtの中身がどうやって決まっているかも気になります
上のを見る限りは%で元に戻しているように見えますが・・

あとはどんな弾幕が作りたいのかを教えて頂ければ的確な回答ができるかもしれません


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

Name: スタートメニュー  ..かけだし(1,797ポイント)   Date: 2009/11/23(月) 01:35   No:42535     
Title: Re:弾の速度制限    
チルチルさんご返事ありがとうございます。
書いてある場所などの参照は龍神録60章の敵の弾幕(shotH.ccp)のいじっているだけですので…。
ちなみに今は作りたい弾幕は別にないです。
というのも、まだ全然
shot[n].bullet[k].knd
shot[n].bullet[k].angle
shot[n].bullet[k].flag
shot[n].bullet[k].x
shot[n].bullet[k].y
shot[n].bullet[k].col
shot[n].bullet[k].cnt
shot[n].bullet[k].spd
とか
(t>=0 && t<100 && t%5==0)
(int i=0;i<15;i++)
base_angle[0]
などを理解できていないので今は各種をいじって結果どうなるかなどを確認しつつ学んでいます。

それで全方向弾幕やnWAY弾や追い越し弾などを作っている次第です。



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

Name: チルチル  ..比類無きプログラマー(80,181ポイント)   Date: 2009/11/23(月) 09:42   No:42538     
Title: Re:弾の速度制限    
あ〜なるほどそういう事でしたか

ちなみに後々統一性がなくなる問題は解決したでしょうか?
敵の弾幕程度なら関数を見せていただければ原因がわかると思いますが

あと9発撃っていますが9発で終わる弾幕なのでしょうか?
それとも加速しながら延々と打ち続けるのでしょうか?
もしくは一定周期で速度が戻るのでしょうか?

それから統一性がある状態はどんな動きを期待しているのでしょうか?


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

Name: Tatu  ..上級者(18,708ポイント)   Date: 2009/11/23(月) 13:14   No:42540     
Title: Re:弾の速度制限    
添付画像のような感じの弾幕を作りたいのでしょうか?


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

Name: スタートメニュー  ..入門者(2,995ポイント)   Date: 2009/11/26(木) 07:55   No:42669     
Title: Re:弾の速度制限    
チルチルさん、Tatuさん
時間が空いてしまって申し訳ないです。

チルチルさんへ
実際は永遠と撃ち続ける設定でしたが、今は下記のとおりになっておりしっかり追い越し弾に
なってくれているみたいです。(回転がかかっており確認しづらいかもしれません。)

もしかしたら永遠と撃つことに問題があったのでしょうか。


void shot_bullet_H000(int n){
int t=shot[n].cnt;
int k;
if(t>=0 && t<100 && t%5==0){
double angle=shotatan2(n);
for(int i=0;i<15;i++){
if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
shot[n].bullet[k].knd =8;
shot[n].bullet[k].angle =boss_shot.base_angle[0]+PI2/15*i+t;
shot[n].bullet[k].flag =1;
shot[n].bullet[k].x =enemy[shot[n].num].x;
shot[n].bullet[k].y =enemy[shot[n].num].y;
shot[n].bullet[k].col =0;
shot[n].bullet[k].cnt =1;
shot[n].bullet[k].spd =3+t*0.035;
se_flag[0]=1;
}
}
}
if(t>=0 && t<100 && t%5==0){
double angle=shotatan2(n);
for(int i=0;i<15;i++){
if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
shot[n].bullet[k].knd =8;
shot[n].bullet[k].angle =boss_shot.base_angle[0]+PI2/15*i-t;
shot[n].bullet[k].flag =1;
shot[n].bullet[k].x =enemy[shot[n].num].x;
shot[n].bullet[k].y =enemy[shot[n].num].y;
shot[n].bullet[k].col =1;
shot[n].bullet[k].cnt =1;
shot[n].bullet[k].spd =3+t*0.035;
se_flag[0]=1;
}
}
}
for(int i=0;i<SHOT_BULLET_MAX;i++){//全弾分
if(shot[n].bullet[i].flag>0){//登録されている弾があれば
int state=shot[n].bullet[i].state;
int cnt=shot[n].bullet[i].cnt;
if(10<cnt && cnt<120){//30〜120カウントなら
shot[n].bullet[i].spd-=1.2/90.0;//90カウントかけて1.2減らす
shot[n].bullet[i].angle+=(PI/2)/27.0*(state?-1:1);//90カウントかけて90°傾ける
}
}
}
}


Tatuさんへ
それは鍵型追い越し弾でしょうか?
そのような感じの弾幕も作ってみたいです。
もしよろしければ教えてください。


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

Name: スタートメニュー  ..入門者(3,249ポイント)   Date: 2009/11/26(木) 08:05   No:42670     
Title: Re:弾の速度制限    
すいません、ひとつ質問忘れてました。
shot[n].bullet[k].angle =
についてなんですが。
ただ単に敵のいる位置から真下に弾を出させる場合どう書いたらいいでしょうか。
10とか20とか試したのですが、少し変えるだけで全然違う方向に撃つので、
規則性がわかりません。

ご意見お願いいたします。


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

Name: softya  ..熟練のプログラマー(47,383ポイント)   Date: 2009/11/26(木) 16:20   No:42686     
Title: Re:弾の速度制限    
angleの数値の意味を理解されていないと思います。
角度ではありますが、ラジアン(弧度法)角です。
http://www.s-yamaga.jp/nanimono/sonota/kodoho.htm
度数法のつもりで数値を入れてもうまく動きませんよ。
1度=π/180ラジアンです。


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

Name: スタートメニュー  ..入門者(3,227ポイント)   Date: 2009/11/27(金) 18:41   No:42751 解決!     
Title: Re:弾の速度制限    
ラジアンでしたか。
ありがとうございました。


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

Name: Tatu  ..上級者(20,893ポイント)   Date: 2009/11/27(金) 21:52   No:42760     
Title: Re:弾の速度制限    


かぎ型追い越し弾のコードです。
投稿されたコードからの変更は以下の通りです。
1.見た目がわかりやすいように二色ある弾のうち一色のみをうつようにした
2.弾が曲がらないようにした
3.スピードを変更
後ろに前のレスの添付画像のコードをのせます。

void shot_bullet_H000(int n){
int t=shot[n].cnt;
int k;
if(t==0){
shot[n].base_angle[0]=shotatan2(n);
}
if(t>=0 && t<100 && t%5==0){
for(int i=0;i<15;i++){
if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
shot[n].bullet[k].knd =8;
shot[n].bullet[k].angle =shot[n].base_angle[0]+PI2/15*i+t;
shot[n].bullet[k].flag =1;
shot[n].bullet[k].x =enemy[shot[n].num].x;
shot[n].bullet[k].y =enemy[shot[n].num].y;
shot[n].bullet[k].col =0;
shot[n].bullet[k].cnt =1;
shot[n].bullet[k].spd =1+t*0.035;
se_flag[0]=1;
}
}
}
}

前のレスの添付画像の弾幕

/*
弾発射関数
way個のknd番目の種類のcol番目の色の弾を座標(x,y)からb_angleの方向を中心に発射角度をそれぞれd_angleだけずらし、
速度をspd,状態をstateにしてとばす。この弾はtillまで画面外に出ても消えず、
effが1ならば加算ブレンドして描画され、sflagが1ならば発射音がなる。
*/
void boss_bullet_on(int way,int knd,int col,double x,double y,double b_angle,double d_angle,double spd,int state,int till,int eff=0,int sflag=1){
int i=0,k;
for(i=0;i<way;i++){
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].knd = knd;//弾の種類
if(knd==7) boss_shot.bullet[k].kaiten=1;
else boss_shot.bullet[k].kaiten=0;
boss_shot.bullet[k].col = col;//弾の色
boss_shot.bullet[k].flag = 1;
boss_shot.bullet[k].cnt = 0;
boss_shot.bullet[k].x = x;//座標
boss_shot.bullet[k].y = y;
boss_shot.bullet[k].angle = b_angle+d_angle*(i - way/2);//角度:bが基準、dが間隔
boss_shot.bullet[k].spd = spd;//スピード
boss_shot.bullet[k].state = state;//弾の状態
boss_shot.bullet[k].till = till;//弾が画面外に出ても消えない時間
boss_shot.bullet[k].eff = eff;//加算ブレンドするか否か
if(sflag==1)se_flag[0]=1;
}
}
}

void boss_shot_bulletT106(){
int i,t=boss_shot.cnt%300;
if(t==0){
boss_shot.base_angle[0]=bossatan2()+PI/8;//基準となる角度をセットする
boss_shot.base_spd[0]=1.0;//発射スピードを戻す
}
if(t>=0 && t<80){
if(t%4==0) boss_bullet_on(8,6,1,boss.x,boss.y,boss_shot.base_angle[0],PI2/8,boss_shot.base_spd[0],0,0);
boss_shot.base_angle[0]+=PI/4 /80;//発射角度を時計まわりに動かす
boss_shot.base_spd[0]+=4.0/80;//発射スピードを上げる
}
if(t==100){
boss_shot.base_angle[0]=bossatan2()-PI/8;//基準となる角度をセットする
boss_shot.base_spd[0]=1.0;//発射スピードを戻す
}
if(t>=100 && t<180){
if(t%4==0) boss_bullet_on(8,6,1,boss.x,boss.y,boss_shot.base_angle[0],PI2/8,boss_shot.base_spd[0],0,0);
boss_shot.base_angle[0]-=PI/4 /80;//発射角度を反時計まわりに動かす
boss_shot.base_spd[0]+=4.0/80;//発射スピードを上げる
}
if(t==200){
//50個の弾をばらばらな速度、方向にとばす
for(i=0;i<50;i++){
boss_bullet_on(1,7,1,boss.x,boss.y,PI/2+rang(PI),0,3+rang(1),0,0);
}
//ボスをランダムに移動させる
move_boss_pos(64,64,FMX-64,FMY/2-32,50,60);
}
}


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

Name: 星映  ..ぴよぴよ(158ポイント)   Date: 2009/11/28(土) 19:11   No:42795     
Title: Re:弾の速度制限    
はじめまして。

自分は現在東方弾幕シューティング作ってる者です。
掲示板内では問題は解決しているようですが一つ気になった
部分があったので記載しておきますね。
(はっきり言ってどうでもいいかもしれませんが)

>shot[n].bullet[k].spd =t*0.1>1;
気になったのはこの式がなぜ1未満のとき動かないかです。
既に分かったことならば大変失礼な内容になってしまいますが、
t*0.1>1の部分は判定式ですので、t*0.1が1以上でなければ当然falseを返します。
falseはint型等で0になるため動かなくなります。



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

Name: スタートメニュー  ..入門者(3,299ポイント)   Date: 2009/12/01(火) 13:55   No:43002     
Title: Re:弾の速度制限    
Tatuさん星映さん
ご返事頂いたのに返事が遅くなって申し訳ございません。
インフルエンザにかかってしまった次第です。

Tatuさん
わざわざコードを載せてもらいありがとうございます。
これで作れる弾幕がまた広がりました。

星映さん
原因の理由がわかりました。ありがとうございます。


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



Name: yatta  ..ぴよぴよ(585ポイント)   Date: 2009/12/01(火) 10:58   No:43000 解決!       
Title: 無題    
nonさんkonioさん、アドバイスをありがとうございました。
アドバイスを参考にして、while(1)やdo while文を使わずにフラグを立てておくやり方で解決できました。
正常にCを含む文字列を入力したら、ループから抜け出せる状態になり、問題は解決できました。

これからも頑張ります。


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




Name: しいたけ  ..かけだし(1,205ポイント)   Date: 2009/11/30(月) 14:02   No:42959       
Title: 並び順    
こんにちは。
作成しているもので、教えてほしいことがあるので投稿させていただきました。
当方の環境は、WindowsXP。コンパイラはVC2008。DXライブラリを使用しています。

一組目と二組目での並び順を表示するプログラムを作成しています。

int x[5];
int y[5];
retu1[3]
retu2[3]

xとyは座標となっています。
例えば

1 2
3 4 5

という並びならば、
retu1[0] = 1
retu1[1] = 2
retu2[0] = 3
retu2[1] = 4
retu2[2] = 5
となっています。そして、これ以上増やすことはできません。

そこで悩んでしまったのが、この並びを判定するプログラムです。
現在は、


if(kazu == 3) // 選ばれた人数。4人選ばれたらkazu == 4となる
{
 if(retu1[0] == 1)
 {
  if(retu1[1] == 2)
  {
   if(retu2[0] == 3)
   {
    x[0] = 0;
    y[0] = 0;
    x[1] = 10;
    y[1] = 0;
    x[2] = 0;
    y[2] = 10;
    func1(x[0], y[0]); // retu1[0]の表示
    func2(x[1], y[1]); // retu1[1]の表示
    func3(x[2], y[2]); // retu2[0]の表示
   }
  }
 }
}

結果
1 2
3


としています。(func は表示をさせる関数です。実際には画像を表示させています。)
もしも並びが

1 2
3 4 5

と、連番ならば簡単になるかもしれませんが、このプログラムは

3 1 5
2 4

という並びもできるようにしています。
プログラムでは

if(kazu == 5)
{
 if(retu1[0] == 3)
 {
  if(retu1[1] == 1)
  {
   if(retu1[2] == 5)
   {
    if(retu2[0] == 2)
    {
     if(retu2[1] == 4)
     {
      x[0] = 0;
      y[0] = 0;
      x[1] = 10;
      y[1] = 0;
      x[2] = 20;
      y[2] = 0;
      x[3] = 0;
      y[3] = 10;
      x[4] = 10;
      y[4] = 10;
      func3(x[0], y[0]); // retu1[2]の表示
      func1(x[1], y[1]); // retu1[0]の表示
      func5(x[2], y[2]); // retu1[1]の表示
      func2(x[3], y[3]); // retu2[1]の表示
      func4(x[4], y[4]); // retu2[0]の表示
     }
    }
   }
  }
 }
}

このように記述しています。
ですが、これだと一つ一つ判定させていくと大変で膨大な数になってしまいます。
これを何とか簡単に書くことは出来ないでしょうか?お力を貸してください。


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


Name: softya  ..熟練のプログラマー(52,015ポイント)   Date: 2009/11/30(月) 14:52   No:42962     
Title: Re:並び順    
ごめんなさい。並びのルールがイマイチ分かりません。
列と数から、どのようにして並び順を作っているのかルール性が分かりません。
x[0] = 0;y[0] = 0;とfunc3(x[0], y[0]); // retu1[2]の表示ってのも関連性が良く分かりません。
ルールを箇条書きにしてもらえないでしょうか。



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

Name: しいたけ  ..かけだし(1,479ポイント)   Date: 2009/11/30(月) 18:08   No:42970     
Title: Re:並び順    
softya様。分かりづらくて申し訳ありません。読み返してみると確かに分からないですね。


・func1(int x, int y)〜func5(int x, int y)という関数があり、画像を表示させる関数。引数は上に書いてあるソースのx,yが入る。x, yは座標で、この座標を元に画像を表示させる。

・retu1[i],retu2[i] の i に入る数値は0,1,2で、左詰にする。

・retu1[0] == 1の場合、func1を動かす。retu[0] == 2の場合、func2を動かす。

・retu1[1] == 3 の場合func3を動かす。[]の中が1か2の場合、[0]には1〜5の数値のどれかが入っていて、func1〜func5のどれかが動いている。絶対にretu[0]に値が入っていないのに、retu[1] == 3だけでは動かしてはいけない。(二つ上の左詰ということです。)

・x, y は、
retu1であり、
[0]の場合、x = 0, y = 0;
[1]の場合、x = 10, y = 0;
[2]の場合、x = 20, y = 0;
retu2であり
[0]の場合、x = 0, y = 10;
[1]の場合、x = 10, y = 10;
[2]の場合、x = 20, y = 10;
と、左から順に表示させるような座標の値を入れる。

・kazuとは、5人までの制限であり、kazuが3の場合三人。kazuが5の場合は五人で並んでいるということを表しています。また、5人以上は並べないようになっています。

以上がルールとなっています。

プログラム書かずに簡単に言うと、5人の中から何人か選択して、それを一列目か二列目に並べる(表示させる)
列は一列に三人まで、必ず左詰にする。
ということです。最初からこう書いた方が分かりやすかったですね。すみません...


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

Name: non  ..比類無きプログラマー(72,725ポイント)   Date: 2009/11/30(月) 18:39   No:42972     
Title: Re:並び順    
確認ですが、retu1[]やretu2[]には既に表示したい番号が格納されており、
その番号が格納されるretu1やretu2のindexにより表示される位置(x,y座標)が決まっている。
で、この格納されている番号(1〜5)に応じてfunc1〜func5の関数を呼び出す。
で、あってますか?

あってるとしたら、仕様を次のように変更することは可能ですか?
1 retu1[]やretu2[]に、番号が入ってない場合は0が入っていると考えて良いか。

2 retu1[]とretu2[]の配列を一つにまとめて、retu[2][3]ではいけないのか。
  または、1次元配列にして retu[6]ではいけないのか。

3 func1〜func5は別の関数名でなければいけないのか?
 例えば、func(番号、x、y)の引数ではいけないのか?



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

Name: しいたけ  ..かけだし(1,834ポイント)   Date: 2009/11/30(月) 19:44   No:42973     
Title: Re:並び順    
non様

>retu1[]やretu2[]には既に表示したい番号が格納されて...
はい、その通りです。
厳密に言うと、他の場所(ここで書いていないところ)で1から5までの数値を入れています。ここは今回のこととはあまり関係ないので省略しました。


1 それは、retu1[0]や、retu2[3]の値ということですよね。その通りで、番号が入っていない場合は0になっています。(0で初期化しています)

2 二次元配列も考えていたのですが、自分ではどういうプログラムにしようか分からずこうしてしまいました。当然、二次元配列でも問題ありません。retu[6]は考えませんでした。後々、一組目と二組目で違うことをしようと思っているのですが、その場合retu[0〜2]とretu[3〜5]で同じことが出きるならば、問題ありません。

3 func1〜func5は個別に違う動作をさせます。なので、座標(何番目か)だけを取得して後は、別々の動作をさせるためにまとめることはできません。

以上です。宜しくお願いします。


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

Name: non  ..比類無きプログラマー(73,021ポイント)   Date: 2009/11/30(月) 20:49   No:42977     
Title: Re:並び順    
こんなんでどうでしょ。

#include <stdio.h>
void func(int no,int x,int y)
{
printf("func%d( %d , %d )\n",no,x,y);
}
int main(void)
{
struct point{
int y;
int x;
};
struct point p[6]={{0,0},{0,10},{0,20},{10,0},{10,10},{10,20}};
int retu[6]={3,1,5,2,4,0};
int i;
for(i=0;i<6;i++)
if(retu[i]!=0)
func(retu[i],p[i].x,p[i].y);
return 0;
}

>3 func1〜func5は個別に違う動作をさせます。なので、座標(何番目か)だけを取得して後は、別々の動作をさせるためにまとめることはできません。

であれば、funcの関数内でswitch文でわけてください。


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

Name: しいたけ  ..かけだし(2,063ポイント)   Date: 2009/11/30(月) 23:36   No:42985     
Title: Re:並び順    
non様

ありがとうございます。全体を一つの列で考えると、確かにこう考えられますね。
ただ、列の並び方なのですが、これは固定ではなく指定することができるようにしています。
1 2 3 4 5 の中から一人ずつ選択していき、一列目か二列目に左詰で入れていくというものです。
つまり

3 1 5
2 4

になることもあれば、

3 1
5 2 4

になることもあります。
こういったために列を二つ作っていました。大変申し訳ございません。non様の書いていただいたソースを元に改変していたらこのことを思い出しました。

この場合は、やはり列を二つ作ると分かりやすいかと思うのですが、どのようにすれば良いのでしょうか。
お手数ですが、宜しくお願いします。


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

Name: softya  ..熟練のプログラマー(52,503ポイント)   Date: 2009/11/30(月) 23:58   No:42987     
Title: Re:並び順    
nonさんに、ほとんどやっていただきましたが、2列版を書いてみました。
こんな感じで良いんですよね?


#include <stdio.h>

void func(int no,int x,int y)
{
printf("func%d( %d , %d )\n",no,x,y);
}

int main(void)
{
struct point{
int y;
int x;
};

struct point p[2][6]={ {{0,0},{0,10},{0,20}}, {{10,0},{10,10},{10,20}} };

int retu[2][3]={ {3,1,0}, {2,4,5} };
int i,j;
for(i=0;i<2;i++) {
for(j=0;j<3;j++) {
if(retu[i][j]!=0) {
func(retu[i][j],p[i][j].x,p[i][j].y);
}
}
}
return 0;
}


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

Name: しいたけ  ..かけだし(2,069ポイント)   Date: 2009/12/01(火) 00:11   No:42989     
Title: Re:並び順    
softya様

ありがとうございます。
こちらを元にソースを改変してみます。

それと、後一つ。これが長いコードを書いていた原因となるところであり、躓いていたところでした。
例えば、
3 1 5
2 4
の並びの場合、

二列目の 2, 4のxを 5, 15にしたいのです。

3 1 5
 2 4
こういった具合になります。

仮に列に一人しかいなかったら

  1
2 5 4
こういった具合になります。(1のxは10になります

つまり、列にいる人数に応じて、xの数値を変えたいのです。
もし宜しければ、こちらの方も宜しくお願いします。
お手数おかけしてすみません。


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

Name: softya  ..熟練のプログラマー(53,003ポイント)   Date: 2009/12/01(火) 00:40   No:42991     
Title: Re:並び順    
いや、次々仕様を変更されても・・・。
ある程度まず自力でやってみてください。
ヒントと言うか参考になるコードは私とnonさんので色々とヒントになると思います。
やった上で分からない件はお答えします。
すいまんせん、今日は寝ます。おやすみなさい。


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

Name: しいたけ  ..かけだし(2,140ポイント)   Date: 2009/12/01(火) 05:31   No:42995     
Title: Re:並び順    
softya様

確かにそうですね。すみません。
二次元配列のコードを書いていただいて少し見えてきたので、勢いで質問してしまいました。
自分で少しやってみます。


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

Name: non  ..比類無きプログラマー(73,500ポイント)   Date: 2009/12/01(火) 09:12   No:42998     
Title: Re:並び順    
> non様
>
> 3 1 5
> 2 4
>
> になることもあれば、
>
> 3 1
> 5 2 4
>
> になることもあります。
> こういったために列を二つ作っていました。

int retu[6]={3,1,0,5,2,4};
にすれば、良いだけのこと。2次元配列の方がわかりやすいならそれでもいいけど、
仕様は、なぜそうしなければいけないのかをよく考えて決めるようにしましょう。
後で、追加された仕様を見ると、
struct point p[6]={{0,0},{0,10},{0,20},{10,0},{10,10},{10,20}};
これも、必要ないですね。座標は計算で求めることになりそうです。
もしくは、配置パターンに応じた座標を用意するかです。






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



Name: ぬっち  ..初心者(8,490ポイント)   Date: 2009/11/18(水) 09:09   No:42243       
Title: DXライブラリで炎を再現    
DXライブラリを使ったメラメラと燃える炎の
サンプルあれば見たいのですが、ないでしょうか?
どうしても揺らめきと加算合成ぐあいがうまくいかなくて困ってます・・


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


Name: Dixq (管理人)  ..ウィザード(1,085,712ポイント)   Date: 2009/11/18(水) 16:31   No:42259     
Title: Re:DXライブラリで炎を再現    
携帯なので、詳しくかけませんが、
DrawModiGraphで適当に勢いよく上向きに炎の元となる画像を変形させ、変形する角度をランダムニ変えながら、バイリニアにして、何枚も加算ブレンドうまくやればできる気がしますがどうでしょう?
すごい適当なコメントですがf^_^;
ロケットの噴射を作ったことありますが、適当に変形して、適当に加算ブレンドするだけで、
案外それっぽく見えますよw


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

Name: ぬっち  ..初心者(8,521ポイント)   Date: 2009/11/18(水) 17:40   No:42266     
Title: Re:DXライブラリで炎を再現    
是非、ロケットの噴射のサンプルでも構いませんので
見せてもらえないでしょうか?炎って難しい・・


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

Name: Dixq (管理人)  ..ウィザード(1,085,785ポイント)   Date: 2009/11/18(水) 18:36   No:42271     
Title: Re:DXライブラリで炎を再現    
う、無いです;
消してしまう位あっさり作れたものなんで、簡単に出来ると思いますよ。
確か、描画部分は2行位で書いた気がしますf^_^;

今パソコンが使えないのです、すみません‥


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

Name: ぬっち  ..初心者(8,540ポイント)   Date: 2009/11/19(木) 09:54   No:42306     
Title: Re:DXライブラリで炎を再現    
2行・・・ですか・・
凄く気になります・・


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

Name: Justy  ..伝説なるハッカー(463,866ポイント)   Date: 2009/11/20(金) 02:11   No:42360     
Title: Re:DXライブラリで炎を再現    
 DXライブラリではないのですが、即興でサンプルイメージ(動画・要divx)を作ってみました。
 あんまりセンスないんで、これは火にみえないかもしれませんが……。


 使っているテクスチャは1枚です。
 Photoshopで 512x512くらいのサイズで雲模様フィルタを実行して作った
テクスチャを 256x256にしてリサイズします。

 それを○で選択し選択範囲を適当にぼかしてから周囲を切り取り
透明化したものを使っています。


 エフェクトの構成としては3つあります。

1 加算なしの炎

 出現地点はX軸上の一定範囲内のランダムで、加算なしの通常描画、5:8の縦長、
1フレームに10個ずつ出現させ、それぞれを15フレームで消しています。
 
 速度は1つ1つは等速で真上方向に向けていますが、速度はそれぞれで
ばらつきをもたせ、進むにつれ縮小をかけています。
 カラーは [255, 20, 20, 150]で、進むにつれ縮小し、透明度を上げています。


2 加算ありの炎

 ほとんど1と同じですが、発生が5、消滅が 15で、出現位置の範囲が1の炎より
少し大きくなっており、スケールも 4:6で、カラーは [200, 0, 0 50〜150]です。

3 煙

 動きは2の炎とほぼ同じで、発生が3、加算なし、カラーが
[100, 100, 100, 50〜150]になっています。


 この3つをそれぞれの出現時に描画プライオリティをランダムで設定し、
奥から順番に書けば添付の動画のようになるかと。

 あとは火の勢いとか燃え方にもよるのですが、テクスチャアニメーションだけで
表現してもいいですし、上記のような動きのアレンジと組み合わせても良い感じのものが
できそうです。


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

Name: ぬっち  ..初心者(8,570ポイント)   Date: 2009/11/20(金) 17:45   No:42377     
Title: Re:DXライブラリで炎を再現    
Justyさんありがとうございます。
ただ、やっぱりDXライブラリでのプログラム自体がみたいです・・


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

Name: 通りすがり  ..上級者(17,895ポイント)   Date: 2009/11/24(火) 01:56   No:42568     
Title: Re:DXライブラリで炎を再現    
私も是非みたいです

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

Name: ティラミス  ..ぴよぴよ(37ポイント)   Date: 2009/11/24(火) 13:53   No:42570     
Title: Re:DXライブラリで炎を再現    
炎のエフェクトは
DXライブラリだと加算ありで、6行で書けました。


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

Name: Q  ..ぴよぴよ(764ポイント)   Date: 2009/11/25(水) 03:06   No:42636     
Title: Re:DXライブラリで炎を再現    
どんな6行なんですか?

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

Name: Dixq (管理人) [URL]  ..ウィザード(1,088,107ポイント)   Date: 2009/11/25(水) 22:30   No:42661     
Title: Re:DXライブラリで炎を再現    
なんかすごい適当ですが、作ってみました^^;
実質炎に関係あるのは2〜3行ですかね。
こんなんでも一応ロケットの炎には見えるんではないかと。

焚火のような炎については作ったことはないです。
まぁこれも変形と加算組み合わせたら出来そうですが

http://dixq.net/zip/FireSample.zip
(VC2008のプロジェクトとソース、実行ファイル同梱)


それからこの辺フォトショで炎の素材作るの参考になるかも。

こうやって炎の素材を何種類か作ってから、
それをゆらゆら勢いよく上に向かって変形させ、いくつもそれを重ねるようにすれば、
焚火のような表現も出来そうです。
やったことないので、想像ですが。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,088,182ポイント)   Date: 2009/11/25(水) 22:35   No:42663     
Title: Re:DXライブラリで炎を再現    
>>Justyさん

おぉ、素晴らしいですね^^
さすがJustyさん、レベルが違う・・w

エフェクト作りって楽しいですよね。
3Dゲームとかやってると、滝とかキャンプファイアーとか、竜巻とか・・
「これってプログラムでどうやって表現するんだろう」
とか常々考えてしまう・・・病気ですw


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

Name: Justy  ..伝説なるハッカー(467,156ポイント)   Date: 2009/11/26(木) 01:31   No:42666     
Title: Re:DXライブラリで炎を再現    

> おぉ、素晴らしいですね

 いやいや、管理人さんのもなかなかですよ。
 何より短いコードで状況に合った表現が出来ているところが GREATです。



> これってプログラムでどうやって表現するんだろう

 わかりますw
 最近はめっきり作ることはなくなったのですが、「おっ」と思うエフェクトを
見たときはいろいろ考えてしまいますね。

 今回のも一口に火といってもどういうデザインコンセプト上のどういう背景の上で
何がどう燃えているのかで、表現方法やパラメータが変わります。
 そういう意味で、何を燃やそうか考えながらエフェクトを作るのは楽しいですね。



 で、DXライブラリで作ってみました。
 ふたを開けてみたら、前回のとは結構違うものになりました。
 相変わらず、火に見えるかどうかちょっと微妙なところもありますが
前の動画のやつよりは多少はマシになった……ような気がします。

ttp://toku.xdisc.net/cgi/up2/oiu/xs12304.zip.html
ファイル名 : xs12304.zip
解凍PASS : effect_fire


 diskの中に実行ファイルが入っています。
 
 ドラッグで位置を、ホイール回転で大きさを変更できますので、適当に位置を合わせて
下さい。

 ホイールクリックすると一時停止で再度押すと再開です。
 一時停止中にホイール回転をすると1フレームずつフレームを進めることができます。
 どう動いているのか諸バレです。

 あと、右クリックで煙の ON/OFFです。完全に蛇足です。


 ソリューション・プロジェクトファイルは VisualStudio2008SP1で、作られています。
 デバッグで実行する場合は、作業ディレクトリを diskに設定して下さい。
 
 コードの方ですが、火そのものを管理しているのは Effect::Fireクラスで、
火を構成する要素は Effect::FireDetails名前空間内にある各クラスが担当しています。
 前回の3つのパートとは役割が少し変わって2つの加算と1つの煙になりましたが、
原理的には前にと同じで、スケールかけて収束させているだけです。
 3つの要素は(中身はほとんど一緒なのに)それぞれクラスに分かれているので、
処理は追いやすいかと思います。

 ちなみに、DrawExtendGraph3Dを使って DrawModiGraphFで4点出すのが面倒だった
為なので、計算すれば置き換えができるはずです。


 しかし、まぁこのエフェクトは2Dで使う場合には少し高コストですね。
 テクスチャを 64x64まで小さくし、発生数も抑えたので前のよりは軽くなって
いるのですがそれでもまだ重そうです。

 その場合やはり状況に合うならテクスチャアニメにするのがいいかと思います。


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

Name: けんたろうちゃん  ..初心者(5,167ポイント)   Date: 2009/11/27(金) 05:17   No:42719     
Title: Re:DXライブラリで炎を再現    
上級者の方にとっては、そこまで難しい事ではないかもしれませんが、
私のような初心者には非常に参考になるテクニックです。
こういったエフェクトテクニック集みたいなものがあれば、とても便利でうれしいです。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,088,588ポイント)   Date: 2009/11/28(土) 18:12   No:42791     
Title: Re:DXライブラリで炎を再現    
>>Justyさん

おぉ、素晴らしい!
すごく炎に見えます。
さすがクオリティが違うな〜^^;

ホイール回転のコマ送りまで・・。
わかりやすいですね。
なるほど〜こうやって炎を表現してるんですね。
ん〜〜エフェクトって面白いですね〜、
何かエフェクト作成について勉強したいんですが、
本屋に行ってもそういう本も見かけないし、
サイトを回ってもたいして詳しく解説しているところがないし・・・、
みんな試行錯誤で作ってるんですかね?

>>けんたろうちゃんさん

私も同意見でまさに探しています。
サンプルプログラミングの館の本格版みたいなサイトがあったらいいんですけどね〜・・。

>>Justyさん

あ、このプログラム、サンプルプログラミングの館に掲載させて頂けないでしょうか^^;


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

Name: けんたろうちゃん  ..初心者(5,178ポイント)   Date: 2009/11/28(土) 22:18   No:42800     
Title: Re:DXライブラリで炎を再現    
いやいやw
私からしたらDixqさんは十分すぎるほど上級者ですよw
龍神録、AeroBeat、その他どのゲームもエフェクトで原理を知りたいものがたくさんあります


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,088,926ポイント)   Date: 2009/11/28(土) 23:53   No:42806     
Title: Re:DXライブラリで炎を再現    
私なんかいつも人に聞いたり真似したり、試行錯誤したりばっかりですよ。
DXライブラリの質問掲示板とか利用しまくりですし。
エフェクトなんやかんや既存システムのパクリばっかりですしね^^;

龍神録は東方から、エアロビートはjubeatやIIDX16なんか何度も見ながら作りました。
RemicalSoftのロゴ表示はこういうところから

</embed>

「このエフェクトかっこいいな〜!」と思ったらソッコーVC立ち上げて試行錯誤やってみないと気が済まないタチなんで、エフェクト作りはよく好んでやります。

色々作ってるうちに「あの時作ったエフェクト応用できそうだな」ってのが、
もしこの先たまっていけば、
色々出来ることは増えるかも知れませんね。(今のとこ全然増えていませんが)

ということで、ゲームやったり動画見たりしている時に気に入ったエフェクトがあれば、
どうなってるのか観察して実現試みているうちに作れるようになるのではないでしょうか。

・・・と適当なレスを書いてみたものの、私もエフェクトの作り方は勉強したいのに、
そういう知識を得られる情報が見つからず苦労しています;


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

Name: Justy  ..伝説なるハッカー(467,812ポイント)   Date: 2009/11/29(日) 22:14   No:42927     
Title: Re:DXライブラリで炎を再現    
 遅くなりました。


>このプログラム、サンプルプログラミングの館に掲載させて頂けないでしょうか^^;

 でしたらこちらをお願いします。
 MSVC9SP1以外でビルドが通るようにし、いろいろ抜けていた処理とか
コメントをいれたものです。

ttp://www.dotup.org/uploda/www.dotup.org409903.zip.html
DLPass : efire
ZipPass : なし


>何かエフェクト作成について勉強したいんですが

 今エフェクトって結構シェーダに移ってますので、そちらの方なら
結構本が出ていたような気がしますが、DXライブラリでも使えるエフェクトと
なるとそういう関連の本はあまり見かけないですね。



> みんな試行錯誤で作ってるんですかね?

 慣れによるところもありますがそうだと思います。
 なので、効率よくトライ&テストできる環境をいかに作るかで、
効率が変わってくるのじゃないかと。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,090,532ポイント)   Date: 2009/11/29(日) 23:09   No:42937     
Title: Re:DXライブラリで炎を再現    
ありがとうございます^^
今の時間帯重いのかつながらないので、また後日拝見します〜!
ご提供ありがとうございます☆


なるほど、2Dエフェクトって需要はなさそうですね。
それよりも3Dエフェクトの方が大事なのか・・。
最近ちょっと色んなグラフィカルなライブラリの勉強しているので、
3Dも含めて環境に依存しないエフェクトの作り方色々と勉強してみます☆


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

Name: Justy  ..伝説なるハッカー(467,878ポイント)   Date: 2009/11/29(日) 23:47   No:42939     
Title: Re:DXライブラリで炎を再現    
 さっきは普通にアクセスできてましたが、なんか重くなってますね。
 こちらにもアップしておきましたので、お暇な時にでも。
 
ttp://www1.axfc.net/uploader/He/so/254646.zip&key=efire


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

Name: ぬっち  ..初心者(8,808ポイント)   Date: 2009/11/30(月) 03:16   No:42947     
Title: Re:DXライブラリで炎を再現    
>Justyさん
ありがとうございます!
揺らめき方が本物の炎みたいで、もの凄く驚きました。
プログラムでここまで表現できるとは思わなかったので少し感激しました・・

一つお願いがあるのですが、
このプログラムはマウスで炎を色々と調整できるようなのですが
そのマウスで調整できるようになっているプログラムが絡んで
炎のプログラムがややこしくなってしまって、分かりづらくて困ってるのですが
これを炎だけを描画するプログラムサンプル(マウス操作ではなく値を変えるだけで調整できるよう)を
変えて(作成して)いただけないでしょうか?よろしくお願いします><


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

Name: kazuoni [URL]  ..ハッカー(115,713ポイント)   Date: 2009/11/30(月) 13:48   No:42958     
Title: Re:DXライブラリで炎を再現    
横から失礼します。

>マウス操作ではなく値を変えるだけで調整できるよう
炎の管理とマウスの管理は切り離されていますので、
MouseControlの部分をみて、必要なところ(例えばSetPosition、SetScaleなど)
を自分のコードに書き込めばよいかと。

いやはや、これは見事な炎です。
スケールをもう少しいじれるようにすれば、縦長炎、横長炎、
風向きの方向、風力というメンバを加えれば、風に流れる炎、
などなど、変えることも容易な気がします。(管理の仕方が素晴らしいです^^;)

自分のプログラムの書き方が、どんどんJustyさんの真似をしている気が(ry
いつも大変参考にさせてもらっています!

失礼しました。。


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

Name: Justy  ..伝説なるハッカー(468,773ポイント)   Date: 2009/12/01(火) 02:09   No:42994     
Title: Re:DXライブラリで炎を再現    
ぬっちさん
> 値を変えるだけで調整できるよう

 kazuoniさんが仰っている通り、MouseControlのマウス制御周辺をカットし、
直値指定に書き換えれば値を変えるだけで調整できるようにはなりますが。



> そのマウスで調整できるようになっているプログラムが絡んで
> 炎のプログラムがややこしくなってしまって

 多分ややこしくなってるのはそこではないような気がします。
 要らないと思ったところはどんどん削りながら、もうちょっと解析・分析してみて下さい。




kazuoniさん
> 変えることも容易な気がします

 そうですね。
 縦長横長は密度の問題があるとちょっと単純にはいかないかもしれませんが、
風なんかはすぐ作れるでしょうね。



> いつも大変参考にさせてもらっています

 そう言って貰えるとすごく嬉しいです。
 が、今回はサンプルということで、newしたポインタをlistに突っ込んで仮想関数で
処理してしまったり、同じような処理を用途毎にクラスに分けたりと
いろいろ実行効率とか無視して書いているので、あまり参考にされないほうが
いいかもしれません……。

 そのあたりも含めて、少し書き直してみます。


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



Name: asa  ..ぴよぴよ(51ポイント)   Date: 2009/11/30(月) 21:41   No:42980       
Title: 無題    
環境はWindowsXP,VisualC++2008です。
初歩的な質問ですいません。
int a[1000000000]
のようなサイズの配列を作るにはどうすればよいでしょうか?
上記の場合だと当たり前ですが、コンパイルできません。


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,090,742ポイント)   Date: 2009/11/30(月) 21:50   No:42981     
Title: Re:無題    
mallocで作れますし、intの前にstaticと付けると利用できるサイズは上がりますが、
それは本当に必要なサイズですか?

int型4バイトだとすると、それを用意するだけで4Gバイトも必要になります。
4GBも配列を用意する必要があるようなプログラムはそもそも見直すべきではないでしょうか。
単に「大きな」という意味で示されたのなら、
グローバル変数にするか、
static変数にするか、
mallocで動的に確保して下さい。
mallocの使い方はググれば沢山出てきます。


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

Name: softya  ..熟練のプログラマー(52,319ポイント)   Date: 2009/11/30(月) 22:18   No:42982     
Title: Re:無題    
1000000000個も必要かどうかは別にして本当に宣言したいなら、まず64ビット版のOSにする必要ありです。
それとコンパイラも64ビット対応版を用意しないとダメですね。実メモリも8GBぐらいは載せてください。
あとは、Dixq (管理人)さんの言われるとおりやれば大丈夫です。
処理時間を考えるとアルゴリズムの考え直しをしたほうが良い気はしますけど・・・。



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

Name: asa  ..ぴよぴよ(77ポイント)   Date: 2009/11/30(月) 22:21   No:42983 解決!     
Title: Re:無題    
そうですよね。アルゴリズムを考え直してみます。


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



Name: jay  ..ぴよぴよ(253ポイント)   Date: 2009/11/28(土) 18:33   No:42792       
Title: 弾幕って・・・    
龍神録プログラミングの館で50章まで勉強した後もシューティングゲームの制作を続けているのですが、
自分なりの弾幕というものが上手く作れません。
東方projectに出てくる弾幕を真似て作ることは出来るのですが
オリジナルを作ろうと思うと無駄に簡単すぎたり、無駄に難しすぎたり
不格好になったりしてしまいます。
どうすれば上手くオリジナルを作ることができるでしょうか?
オリジナルを作ったことのある経験者は上手な作り方や綺麗な弾幕を作るコツを教えて頂けないでしょうか?


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


Name: 星映  ..ぴよぴよ(228ポイント)   Date: 2009/11/28(土) 20:01   No:42796     
Title: Re:弾幕って・・・    
そんなに大した情報にならないかもしれませんが、
私が考えた弾幕はそのほとんどが、目に映った景色や
動きなどをもとにしています。
私が特に目をつけるのは、数学的な模様やリズムの流れなどです。

人間は統率のとれた動きは美しいと感じます。(兵隊の行進や、波のように見えるお辞儀
左右対称な動きなど)
また色合いによっても美しさを感じます。(虹色や半透明や水晶のような輝き、色の補間など)

参考までに一応静止画で見ても変ではないものを添付します。(コレがいいとは限らないですが)
静止画なので少し弾幕を説明しますね。
1.画面の中心から円状に弾がでます。
2.自キャラの周りを囲む4つの魔方陣
3.自キャラが画面中央に近づくほど魔方陣は自キャラから離れていく。
4.自キャラが画面中央から離れるほど魔方陣は自キャラに近づく
5.魔方陣からはホーミング弾が打ち出される。

この弾幕は放出(画面中央から)と集合(自キャラへのホーミング)をイメージしています。
難易度の調節は、自キャラを取り巻く魔法陣が行っています。画面中央に自キャラが近づけば
魔方陣は離れてホーミングの発射位置も離れますが、画面中央からでる円状の弾幕に当たりやすくなります。
反対であれば魔方陣のホーミングに当たりやすくなります。
ちなみにこの弾幕はみょんについてくる半霊から思いつきました。

弾幕を作るときは机上で線を描いてそれを式に起こすなどして、その動きにアレンジを加えていっています。

上述がたいした参考にはならないと思いますが、頑張ってください。
あと、ディズニーランドのイルミを見ていたらイルミネーションを弾幕で作りたくなりました(>w<)


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

Name: チルチル  ..比類無きプログラマー(81,405ポイント)   Date: 2009/11/28(土) 22:39   No:42801     
Title: Re:弾幕って・・・    
まあオリジナル性や難易度は作った本人では公平な判断が下しにくいので
他の人にプレイしてもらって問題点を指摘してもらうのが良いんじゃないでしょうか?

オリジナルを容易にする方法としては機能面でもオリジナルを作るのが効果的かもしれません
永夜抄の使い魔みたいな他に無い機能があれば弾幕も自然と他に無いものになると思います
そうなると今度はオリジナル性のある機能を考えると言うジレンマが発生しますが・・

簡単な方法としては本家に無い弾を追加するとか背景を変えるとかですね
弾とか背景が変わるだけで全然違う弾幕に見えたりしますよ

あとは無駄に簡単すぎた弾幕は前半に回して
無駄に難しすぎた弾幕は後半に回して調整するとか

ちなみに私は弾幕を作る時は頭の中でひたすら妄想しますね

綺麗な弾幕を作るコツとしては自分の性格を反映させるのが良いかもしれません
そうすればオリジナル性も上がりますしね

私は飛び道具が四方八方から相手に喰らい付くようなのが好きなので
弾幕も自然とそういうものになっていきます

他には本家をやり込むとか弾幕風の動画でも見て知識を増やすとかでしょうかね・・


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

Name: jay  ..かけだし(1,487ポイント)   Date: 2009/11/28(土) 23:33   No:42804     
Title: Re:弾幕って・・・    
星映さん
>人間は統率のとれた動きは美しいと感じます。(兵隊の行進や、波のように見えるお辞儀
左右対称な動きなど)
また色合いによっても美しさを感じます。(虹色や半透明や水晶のような輝き、色の補間など)
ここを参考にさせていただきます。
チルチルさん
>他の人にプレイしてもらって問題点を指摘してもらうのが良いんじゃないでしょうか?

いままで身近な人にだけやってもらってました、
(龍神録仕様で)コードを書きますのでぜひお願いします。

>私は飛び道具が四方八方から相手に喰らい付くようなのが好きなので
弾幕も自然とそういうものになっていきます

なんか見た目に面白みが無いので没にしたけど以前言葉通りのものを作ったことがあります
それを改良した物のコードを書いてみます。

double bossatan4(double x,double y){//指定座標と自機
return atan2(ch.y-y,ch.x-x);
}

void boss_shot_bulletH018(){
#define TM018 120
int s,i,k,t=boss_shot.cnt%TM018;
double angle;
if(t==0){
for(i=0;i<36;i++){
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].col = 2;
boss_shot.bullet[k].x = FX;
boss_shot.bullet[k].y = FY;
boss_shot.bullet[k].knd = 3;
boss_shot.bullet[k].angle = PI2/36*i;
boss_shot.bullet[k].flag = 1;
boss_shot.bullet[k].cnt = 0;
boss_shot.bullet[k].spd = 1.5;
se_flag[0]=1;
}
}
}
if(t==30){
angle=bossatan4(FX,FMY);
for(s=0;s<2;s++){
for(i=0;i<12;i++){
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].col = s;
boss_shot.bullet[k].x = FX;
boss_shot.bullet[k].y = FMY;
boss_shot.bullet[k].knd = 6;
boss_shot.bullet[k].angle = angle+PI2/12*i;
boss_shot.bullet[k].flag = 1;
boss_shot.bullet[k].cnt = 0;
boss_shot.bullet[k].spd =1+s;
se_flag[0]=1;
}
}
}
}
if(t==60){
for(i=0;i<16;i++){
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].col = 6;
boss_shot.bullet[k].x = FMX;
boss_shot.bullet[k].y = FY;
boss_shot.bullet[k].knd = 13;
boss_shot.bullet[k].angle = PI2/16*i;
boss_shot.bullet[k].flag = 1;
boss_shot.bullet[k].cnt = 0;
boss_shot.bullet[k].spd = 3.5;
se_flag[0]=1;
}
}
}

if(t==80 || t==84 || t==88 || t==92 || t==96 || t==100){
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].col = 2;
boss_shot.bullet[k].x = FMX;
boss_shot.bullet[k].y = FMY;
boss_shot.bullet[k].knd = 6;
boss_shot.bullet[k].angle = angle
=bossatan4(FMX,FMY);
boss_shot.bullet[k].flag = 1;
boss_shot.bullet[k].cnt = 0;
boss_shot.bullet[k].spd = 3;
se_flag[0]=1;
}
}
}

>他には本家をやり込むとか弾幕風の動画でも見て知識を増やすとかでしょうかね・・

真似をするのも勉強の内といいますがそれは駄目でしょうか?
本家はそれなりにやりこんでいますが・・


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

Name: チルチル  ..比類無きプログラマー(81,511ポイント)   Date: 2009/11/29(日) 00:14   No:42809     
Title: Re:弾幕って・・・    
>なんか見た目に面白みが無いので没にしたけど以前言葉通りのものを作ったことがあります
>それを改良した物のコードを書いてみます。

では感想を言わせていただきます

私は本家のイージーをクリアするのが限界ですが
難易度は私がギリギリ避けられるぐらいで良いです

ただ画面の中心付近でウロウロする事になって
どことなく安定しないので不安になりました

それから弾が一定の間隔で発射されるので
休める時がないので少し疲れました

一周ごとに少し発射をやめるとスタミナが続くと思います

あとは同じような動きが続くと人間は思考力が低下するらしいので
時間経過などで弾が増えたりすると飽きないです

何か違和感を感じたのは弾の並びに規則性が少ない所ですね

あと関係無いですが私の好きなイメージは「嫌われ者のフィロソフィ」見たいな感じですね
弾が四方から飛んで来ると言うよりは弾の変化が迫ってくる感じです

>真似をするのも勉強の内といいますがそれは駄目でしょうか?

真似をするのもアリだと思いますよ
それも実力の向上に繋がりますからね

最近思ったのは良い弾幕ほど真似しにくい気がするって事です
自分が見せられた時に真似しにくい弾幕を作ると良い弾幕になるかもしれません
そういう風に意識すると細かい所にも気を付けるようになりますしね

それに色々な弾幕を知れば弾幕を合体させて新しい弾幕も作れますし
他と被らない所が見えてきますよ

そして弾幕はBGMとかとリズムが合っていないと映えないんですよね
本家はリズムと合っているので、本家をやりこめば
このBGM、この背景、このキャラで映える弾幕はコレだ〜
って言うのが自然に浮かんで来るようになると思いますよ

そうすれば最終的には弾幕を出す状況を見れば弾幕が瞬時に浮かんできますね
もう考えるとかじゃなくてキャラが頭の中で勝手に弾幕を始めます、自分はそれを再現するだけですね
こうなると弾幕作りは楽しいですよ〜

それから弾幕風の動画とか見ると
良い弾幕には「無駄な動きの多さ」と「それを気付かせない工夫」がある気がします

そもそも弾幕なんだから本来は避ける隙間なんて作らずに相手を瞬殺すれば良いのに
わざわざ避けれるルートを作って避けるのを楽しむわけですから
何かしらの無駄な動きを自然に取り入れると避けるのが楽しくなります

星蓮船EXなんかも自機に弾を当てる事とはズレた所で色々とやっていますが
プレイしていても違和感を感じません、それと同じではないでしょうか?

なのでjayさんも弾幕の中に意味の無い遊び心を少し入れてみれば
自然と良い弾幕に仕上がって行くと思いますよ


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

Name: 星映  ..かけだし(1,405ポイント)   Date: 2009/11/29(日) 01:41   No:42813     
Title: Re:弾幕って・・・    
>いままで身近な人にだけやってもらってました、
>(龍神録仕様で)コードを書きますのでぜひお願いします。

レビューしますね。

弾幕としては、見た目はいいと思います。特に弾の色合いが良かったです。
プログラムの記述からみても、30フレーム間隔が取れていました。(右下からでてくる弾も
90フレームをとっています)この場合は開始を75フレーム付近で行うと裏打ちが取れます。
ただ、左側にくらべ右側の弾の数が若干少なく感じました。

>真似をするのも勉強の内といいますがそれは駄目でしょうか?
真似をしないと成長しませんもんね。音楽でも英語でも同じですし、"まねぶ"とも言いますし。
ですが真似ばかりでは成長はできないので、アレンジを考えるなどをするといいでしょう。(たぶん)

チルチルさんも述べていますが、弾幕は自然と思いつくようになりますよ。私も始めは大した物は作れませんでしたが、次第に音楽を聞いたり絵やキャラクターを見るだけで思いつくようになりました。

最後に誠に勝手ながらjayさんの弾幕をアレンジしてみました。アレンジというのはとても大事なことだと思っています。現に神主も音楽作るときアレンジしているようですし。
では頑張ってくださいね。
(やはり他の人のアルゴリズムは自分のためになります。ありがとうございました。)

//難易度高くない?
double bossatan4(double x,double y)
{//指定座標と自機
return atan2(ch.y-y,ch.x-x);
}

void boss_shot_bulletH018(){
#define TM018 150
int s,i,k,t=boss_shot.cnt%TM018;
double angle;
if(t==0)
{
for(i=0;i<36;i++)
{
if((k=search_boss_shot())!=-1)
{
boss_shot.bullet[k].col = 2;
boss_shot.bullet[k].x = FX+boss_shot.cnt%360;
boss_shot.bullet[k].y = FY+boss_shot.cnt%360;
boss_shot.bullet[k].knd = 3;
boss_shot.bullet[k].angle = PI2/36*i;
boss_shot.bullet[k].flag = 1;
boss_shot.bullet[k].cnt = 0;
boss_shot.bullet[k].spd = 1.5;
se_flag[0]=1;
}
}
}
if(t==30)
{
angle=bossatan4(FX,FMY);
for(s=0;s<2;s++)
{
for(i=0;i<12;i++)
{
if((k=search_boss_shot())!=-1)
{
boss_shot.bullet[k].col = s;
boss_shot.bullet[k].x = FX +boss_shot.cnt%360;
boss_shot.bullet[k].y = FMY-boss_shot.cnt%360;
boss_shot.bullet[k].knd = 6;
boss_shot.bullet[k].angle = angle+PI2/12*i;
boss_shot.bullet[k].flag = 1;
boss_shot.bullet[k].cnt = 0;
boss_shot.bullet[k].spd =1+s;
se_flag[0]=1;
}
}
}
}
if(t==60)
{
for(i=0;i<16;i++)
{
if((k=search_boss_shot())!=-1)
{
boss_shot.bullet[k].col = 2;
boss_shot.bullet[k].x = FMX-boss_shot.cnt%360;
boss_shot.bullet[k].y = FY +boss_shot.cnt%360;
boss_shot.bullet[k].knd = 2;
boss_shot.bullet[k].angle = PI2/16*i;
boss_shot.bullet[k].flag = 1;
boss_shot.bullet[k].cnt = 0;
boss_shot.bullet[k].spd = 3.5;
se_flag[0]=1;
}
}
}

if(t==74 || t==78 || t==82 || t==86 || t==90 || t==94)
{
if((k=search_boss_shot())!=-1)
{
boss_shot.bullet[k].col = 2;
boss_shot.bullet[k].x = FMX-boss_shot.cnt%360;
boss_shot.bullet[k].y = FMY-boss_shot.cnt%360;
boss_shot.bullet[k].knd = 6;
boss_shot.bullet[k].angle = angle
=bossatan4(FMX-boss_shot.cnt%360,FMY-boss_shot.cnt%360);
boss_shot.bullet[k].flag = 1;
boss_shot.bullet[k].cnt = 0;
boss_shot.bullet[k].spd = 3;
se_flag[0]=1;
}
}
}


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

Name: jay  ..入門者(2,640ポイント)   Date: 2009/11/29(日) 18:42   No:42884     
Title: Re:弾幕って・・・    
チルチルさん
>一周ごとに少し発射をやめるとスタミナが続くと思います
成る程、本家も  まとめて発射→少し待つ→また発射
の繰り返しとかよくありますしね。

>時間経過などで弾が増えたりすると飽きないです
いわゆる発狂ですね。

>自然に浮かんで来るようになると思いますよ
既に一つの境地ですね、羨ましい。

>意味の無い遊び心
つまり弾幕の魅せる部分ですね

星映さん
>次第に音楽を聞いたり絵やキャラクターを見るだけで思いつくようになりました。
ホントに羨ましいですね、やっぱり境地?

>見た目はいいと思います
改良する前は酷かったんです、これが。

>難易度高くない?
高いです、普通に高いです、下手すればBランク入りするかも(基準はなんだ)

>真似をしないと成長しませんもんね
>アレンジを考えるなどをするといいでしょう
つまり  真似て弾幕づくりに慣れる→アレンジで自分らしい弾幕を見つける→オリジナル制作
ですね

>”まねぶ”ですか・・・

真似てみました
東方永夜抄より
void boss_shot_bulletH019(){
#define TM019 432
int i,n,k,t=boss_shot.cnt%TM019;
double angle;
if(t%12==0){
for(n=0;n<8;n++){
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].knd =8;
boss_shot.bullet[k].col =2;
boss_shot.bullet[k].x =boss.x;
boss_shot.bullet[k].y =boss.y;
boss_shot.bullet[k].flag =1;
boss_shot.bullet[k].angle =(PI2/8*n)-(0.2*t);
boss_shot.bullet[k].cnt =0;
boss_shot.bullet[k].spd =2;
boss_shot.bullet[k].state = 0;
se_flag[0]=1;
}
}
}
if(t%16==0){
for(i=0;i<4;i++){
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].knd =3;
boss_shot.bullet[k].col =1;
boss_shot.bullet[k].x =boss.x;
boss_shot.bullet[k].y =boss.y;
boss_shot.bullet[k].flag =1;
boss_shot.bullet[k].angle =(PI2/4*i+PI/4)+(0.4*t);
boss_shot.bullet[k].cnt =0;
boss_shot.bullet[k].spd =3;
boss_shot.bullet[k].state =1;
se_flag[0]=1;
}
}
}
for(i=0;i<BOSS_BULLET_MAX;i++){
if(boss_shot.bullet[i].flag>0){
if(boss_shot.bullet[i].state==1){
boss_shot.bullet[i].spd-=0.01;
}
}
}
for(i=0;i<BOSS_BULLET_MAX;i++){
if(boss_shot.bullet[i].flag>0){
if(boss_shot.bullet[i].state==1){
if(boss_shot.bullet[i].y > FMY-9){
boss_shot.bullet[i].spd=0.5;
boss_shot.bullet[i].col=0;
boss_shot.bullet[i].state=0;
boss_shot.bullet[i].angle = angle
=bossatan4(boss_shot.bullet[i].x,boss_shot.bullet[i].y);
}
}
}
}
for(i=0;i<BOSS_BULLET_MAX;i++){
if(boss_shot.bullet[i].flag>0){
if(boss_shot.bullet[i].state==1){
if(boss_shot.bullet[i].y > FMY-86 &&(boss_shot.bullet[i].x>FMX-5 || boss_shot.bullet[i].x<FX+5)){
boss_shot.bullet[i].spd=0.5;
boss_shot.bullet[i].col=0;
boss_shot.bullet[i].state=0;
boss_shot.bullet[i].angle = angle
=bossatan4(boss_shot.bullet[i].x,boss_shot.bullet[i].y);
}
}
}
}
}

全く同じものは作れませんが、そっくりなものなら・・・
ただアレンジしようにも本家が完璧すぎて手の加えようが・・・


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

Name: チルチル  ..比類無きプログラマー(81,548ポイント)   Date: 2009/11/29(日) 19:05   No:42894     
Title: Re:弾幕って・・・    
いやいやアレンジなんて必要ないぐらいですよ
今でも十分jayさんらしさが出ている気がします


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

Name: 星映  ..かけだし(2,088ポイント)   Date: 2009/11/29(日) 22:17   No:42928     
Title: Re:弾幕って・・・    
>真似てみました
>東方永夜抄より

表現が上手いです。特に赤い剣が緊迫感を際立たせてます。(多分そういう弾幕なのだと思う)
ところで、この弾幕を作る際に何を考えましたか?
恐らく同じ動きになるように考えたはずです。さらに弾の色合いも気にしたはずです。
仮に赤い剣の色が黄色だったらどうでしょうか?妹紅の炎というイメージは消えます。
あと赤色は暴走や怒りなどを表現できる色です。妹紅の憎み?などの感情表現ができます。しかも画面端から
自分を狙うという執念。
キャラクター設定が変わればどうでしょうか?もちろん弾幕の形も色も変化します。(本家は個性だらけ)

では次に私の見解でのアレンジを述べます。
アレンジは"派生"という見かたもできます。キャラクターに何か統一した弾幕を派生させればそのキャラクターは○○な性格なんだなどと思わせることもできます。
"派生"という見かたをしなければ"協調"や"変化"や"合成"等の見かたもできます。
そこで統率した動きを"協調"、元が分からない動きを"変化"、没にしたい弾幕を混ぜた動き"合成"と私は
勝手に呼んでいます。これらを意識することで何を強調したいか明白にするという目的でそう呼んでます。
(増幅した動き?は"派生"と呼んでます。う〜ん、変化すればアレンジなのかな?)

オリジナル弾幕は自分で考えたときからオリジナルです。そのオリジナルをいろんな分野の情報からアレンジできれば良い弾幕はできるのでないでしょうか。(そのための基盤作りが真似ぶ)

あくまで一個人の見解なので参考までに。というか話がまとまっていないような。。。


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

Name: jay  ..入門者(3,001ポイント)   Date: 2009/11/30(月) 20:56   No:42978 解決!     
Title: Re:弾幕って・・・    
つまり一言でアレンジといっても色々あると・・・
とりあえずは真似とアレンジでもう少し頑張ってみます。
色々参考になりました、お二人とも感謝します。
とりあえず当面の目標は期限内の完成かな。
また近いうちにこのようなプチテストプレイをお願いすると思いますので
その時はよろしくお願いします。


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



Name: nowe  ..ぴよぴよ(122ポイント)   Date: 2009/11/30(月) 20:15   No:42974       
Title: 無題    
#include<stdio.h>

int fukaishisuu(double t,double h)
{
double fukai = 0.81 * t + 0.01 * h * (0.99 * t - 14.3) + 46.3
return fukai;
}

int main(void)
{
double t,h,fukai;

printf("気温を入力してください/n");
scanf("%lf",&t);

printf("湿度を入力してください/n");
scanf("%lf",&h);

fukai = fukaishisuu(t,h);

if(fukai < 60)
printf("could");
if(fukai <= 60 || fukai >= 75)
printf("comfort");
if(fukai >= 75)
printf("discomfort");

return 0;
}


↑という不快指数を計算してくれるプログラムを作ったのですが
In function `fukaishisuu`
syntax error before "return"
と返され実行できません。
何が間違っているかさっぱりなんです。
是非おしえてください


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


Name: Naohiro19  ..かけだし(1,158ポイント)   Date: 2009/11/30(月) 20:29   No:42975     
Title: Re:無題    
fukaishisuu関数のdouble fukaの末尾にセミコロンがないのと
fukaishisuu関数のリターン値がintになってるのでdoubleに修正
すれば警告もエラーも0のはずです。


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

Name: nowe  ..ぴよぴよ(137ポイント)   Date: 2009/11/30(月) 20:32   No:42976 解決!     
Title: Re:無題    
できました!

ありがとうございます


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



Name: dic  ..プログラマー(39,758ポイント)   Date: 2009/11/27(金) 19:25   No:42754       
Title: vector<string> が保持するメモリについて    
プログラムとしては前回の「ファイル出力がうまくいかない」と連結させるのですが、
話としては別になるので、新たに質問します

下のコードを実行すると


#include <iostream>
#pragma warning( disable: 4786 )
#include <string>
#include <vector>
using namespace std;


void hoge2()
{
printf( "-hoge 2 -\n" );

vector<string> v;
char buf[200002];

int i, r, l, s;
for( s=0; s<10000; s++ )
{
l = rand()%10000;
for( i=0; i<l; i++ )
buf[i] = rand()%10;
strcat( buf, "\n" );
v.push_back( buf );
}
printf( "size:%d\n", v.begin()-v.end() );
}


void hoge1()
{
printf( "-hoge 1 -\n" );

vector<string> v;
char buf[102];

int i, r, l, s;
for( s=0; s<100; s++ )
{
l = rand()%100;
for( i=0; i<l; i++ )
buf[i] = rand()%10;
strcat( buf, "\n" );
v.push_back( buf );
}
printf( "size:%d\n", v.begin()-v.end() );
}

int main()
{
hoge1();
hoge2();

return 0;
}


関数hoge1 hoge2 での v が使用しているメモリの量を知りたいのです
v.begin() - v.end() で使用しているメモリアドレスからサイズを計算するのですが、
ランダムな数をpush_backしてるので、ランダムなメモリの量を使用すると思いました

しかし、画像のように結果がでて、先頭のアドレスだけを保持しているのでしょうか
どうやったら vector<string> v; が使用しているメモリの量をはかれるのでしょうか?


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


Name: たいちう  ..プログラマー(36,783ポイント)   Date: 2009/11/27(金) 20:37   No:42757     
Title: Re:vector<string> が保持するメモリについて    
> しかし、画像のように結果がでて、先頭のアドレスだけを保持しているのでしょうか

少なくともdicさんの環境ではそのようです。
環境を書きましょうよ。

> どうやったら vector<string> v; が使用しているメモリの量をはかれるのでしょうか?

その方法は用意されていません。実装に依存しますし。
何の為にメモリ使用量が必要なのかによって代替案は変わってきます。
文字列の分のデータをバイト単位で知りたいならば、全要素の長さを合計するとかですし、
vectorの仕組みが知りたいならば、公開されているソースコードを解析すればよいでしょう。

大雑把な理解で良いならば、仮説を立てて検証すれば、検証できた範囲で
正しいと仮定することができます。
dicさんがやったのが、ちょうどこれですね。最初の仮説が反証されて、
新しい仮説を手にしたところですね。


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

Name: たかぎ [URL]  ..ハッカー(124,544ポイント)   Date: 2009/11/27(金) 21:08   No:42759     
Title: Re:vector<string> が保持するメモリについて    
std::vector<std::string>::capacityを使えばよいのでは?


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

Name: dic  ..プログラマー(39,826ポイント)   Date: 2009/11/27(金) 23:42   No:42772 解決!     
Title: Re:vector<string> が保持するメモリについて    
>たいちう さん
正確に把握しようとするとそうなりますね

>たかぎ さん
今回はおおまかでいいので、使用しているメモリ量が分かればよいので
std::vector<std::string>::capacity() を使うことにします


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

Name: たいちう  ..プログラマー(37,090ポイント)   Date: 2009/11/30(月) 09:59   No:42949     
Title: Re:vector<string> が保持するメモリについて    
void	hoge2()

{
printf( "-hoge 2 -\n" );

vector<string> v;
char buf[200002];

int i, r, l, s;
int total = 0;
for( s=0; s<10000; s++ )
{
l = rand()%10000;
for( i=0; i<l; i++ )
buf[i] = rand()%10;
strcat( buf, "\n" );
v.push_back( buf );
total += l + 1;
}
printf( "size:%d\n", v.begin()-v.end() );
cout << "capacity : " << v.capacity() << endl;
cout << "total : " << total << endl;
}

私がdicさんの意図を誤解してましたか?
上述のtotalが意図するものに近く、capacityで得られる値とは、かけ離れると思っていたのですが。
もちろんcapacityが目的に適うならそれで結構です。


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

Name: dic  ..熟練のプログラマー(40,330ポイント)   Date: 2009/11/30(月) 16:46   No:42968     
Title: Re:vector<string> が保持するメモリについて    
>たいちうさん
すいません 色々考えた結果 私のミスでループ文がおかしかったです

>for( s=0; s<10000; s++ )
ここが変で、結果がかけ離れていたものが結果として出てました

書き直したものを残しておきます



#include <iostream>
#include <stdio.h>
#include <string>
#include <vector>
using namespace std;


void hoge4()
{
vector<string> v;
int i, l, t;
t = 0;
for( i=0; i<10; i++ )
{
l = rand()%10;
int a;
for( a=0; a<l; a++ )
{
v.push_back( "hoge" );
}
t += l;
}

printf( "size:%d\n", v.size() );
printf( "capa:%d\n", v.capacity() );
printf( "tota:%d\n", t );
printf( "addr:%d\n", v.end() - v.begin() );
}

void hoge3()
{
vector<char> v;
int i;
int total = 0;
for( i=0; i<10; i++ ){
v.push_back( (char)i );
total += 1;
}
printf( "size:%d\n", v.size() );
printf( "capa:%d\n", v.capacity() );
printf( "tota:%d\n", total );
printf( "addr:%d\n", v.end() - v.begin() );
}


void main()
{
hoge3();
hoge4();
}


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



Name: ruru re  ..ぴよぴよ(122ポイント)   Date: 2009/11/27(金) 10:53   No:42725       
Title: 高速フーリエ変換    
私は、高速フーリエ変換(FFT)のプログラムを作っているのですがどうも上手くいきません。
私が作りたいプログラムは FFTを用いたパワースペクトル表示するプログラムでプログラムに入出力も加えたいと思っています。
どうにかFFTプログラムでパワースペクトルはできたんですがVBで動かしているんですが調子がよくありません。 プログラム間違っているところ指摘してください


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


Name: Naohiro19  ..かけだし(1,092ポイント)   Date: 2009/11/29(日) 10:03   No:42819     
Title: Re:高速フーリエ変換    
(121): error C2440: '=' : 'void *' から 'double *' に変換できません。
(122): error C2440: '=' : 'void *' から 'int *' に変換できません。
'void*' から非 'void' 型への変換には明示的なキャストが必要です。


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

Name: ruru re  ..ぴよぴよ(162ポイント)   Date: 2009/11/30(月) 13:02   No:42956     
Title: Re:高速フーリエ変換    
Naohiro19さん ありがとうございます エラーがどのように出るのは確認済みなんですが
そのエラーを取り除くアドバイス等をお願いします


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

Name: toyo  ..熟練のプログラマー(45,560ポイント)   Date: 2009/11/30(月) 16:36   No:42967     
Title: Re:高速フーリエ変換    
'void*' から非 'void' 型への変換には明示的なキャストが必要です。
はC++のエラーですね
ざっと眺めた感じではCでコンパイルしても大丈夫そうなのでCでコンパイルすれば解決します
VBってVisualC++の間違いでしょうか
それならファイル名の拡張子を.cppから.cに変更すれば出来ます


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



Name: tt  ..ぴよぴよ(35ポイント)   Date: 2009/11/30(月) 11:57   No:42950       
Title: 乱数を発生させたい    
0から65536まで乱数で発生させるにはどのようにしたらよいのでしょうか?
もちろんC言語です
よろしくお願いします。


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


Name: Dixq (管理人)  ..ウィザード(1,090,557ポイント)   Date: 2009/11/30(月) 12:09   No:42951     
Title: Re:乱数を発生させたい    
環境は何ですか?
リナックスやウィンドウズ、そのコンパイラなど


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

Name: しかばね  ..ぴよぴよ(6ポイント)   Date: 2009/11/30(月) 12:09   No:42952     
Title: Re:乱数を発生させたい    
環境はなんですか

規約を読んで下さい。


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

Name: バグ  ..ハッカー(174,673ポイント)   Date: 2009/11/30(月) 12:20   No:42953     
Title: Re:乱数を発生させたい    
「乱数発生アルゴリズム」でググれば色々とヒットしますよ


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

Name: softya  ..熟練のプログラマー(51,723ポイント)   Date: 2009/11/30(月) 12:20   No:42954     
Title: Re:乱数を発生させたい    
精度次第で色々方法があります。
http://ja.wikipedia.org/wiki/%E6%93%AC%E4%BC%BC%E4%B9%B1%E6%95%B0

>0から65536まで乱数で発生させるにはどのようにしたらよいのでしょうか?
65536(0x10000)は17bit必要なので勝手な解釈で65535(0xffff)までとさせてもらいます。

65535までと言うことで、簡単な方法です。
unsigned short randam()
{
static unsigned short rand = 441;
rand *= 17567;
rand += 5;
return rand;
}
単純なので、4096周期で同じ数値列に戻ります。0〜65535を完全網羅できません。
もっと精度がほしかったら、また別の方法をご紹介します。


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

Name: tt  ..ぴよぴよ(76ポイント)   Date: 2009/11/30(月) 12:45   No:42955     
Title: Re:乱数を発生させたい    
環境はwindowsです。
みなさんありがとうございます。
単純な関数はないのですかね?


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

Name: softya  ..熟練のプログラマー(51,855ポイント)   Date: 2009/11/30(月) 13:10   No:42957     
Title: Re:乱数を発生させたい    
私のがお望みじゃないのはわかりました。

では、規約に従ってください。
>使っているOS名・コンパイラ名・ライブラリ名も明記しましょう。

求めてる単純さと言うか使い方の例を書いてください。
こんな風に使いたいと具体的に。


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

Name: non  ..比類無きプログラマー(72,429ポイント)   Date: 2009/11/30(月) 15:55   No:42966     
Title: Re:乱数を発生させたい    
どこまで、理解されて質問されているのかわからないので、
とりあえず、次のプログラムを動かしてみてください。

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i;
printf("RAND_MAX=%d\n",RAND_MAX);
for(i=0;i<100;i++)
printf("%7d ",rand());
return 0;
}

RAND_MAX はいくらが表示されましたか?このRAND_MAXはコンパイラなどの環境によって
変わります。ですから、みなさんが環境をとしつこく言われているわけです。
RAND_MAXが32767の環境が一番多く、0から32767までなら上のように簡単です。
0から65536までほしいと言われるので、一度の乱数発生では作れずに、いろんな方法が
あるわけです。また、発生した乱数がどれだけ均一であることを要求しているかによっても
作り方が変わってきます。ですから、目的は何だって話になります。



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



Name: kaito  ..ぴよぴよ(229ポイント)   Date: 2009/11/30(月) 14:11   No:42960       
Title: 領域をわける方法    
区分した領域に分けたいです。
例えば65536のうち
1.5
2.4
3.50
4.40
5.170
6.150
7.1220
8.610
9.7710
10.8978
11.46599

が出現数とします。この場合どのように分けたら都合がよく区分できますが?
ちょっと思いつかないので、よろしくお願いいたします。上の例じゃなくてもっと簡単なものでもよいです。
C言語じゃなくても、こんな分け方があるよって方でもお願いします。


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


Name: softya  ..熟練のプログラマー(51,922ポイント)   Date: 2009/11/30(月) 14:18   No:42961     
Title: Re:領域をわける方法    
まず、規約と注意事項をよく読んでください。
マルチポストは原則禁止です。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1333564758


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

Name: kaito  ..ぴよぴよ(180ポイント)   Date: 2009/11/30(月) 15:25   No:42963     
Title: Re:領域をわける方法    
すいません、是非知りたい質問なので、すいませんでした。
softyaさん知っていたら、上のアドレスでも答えてくれるとありがたいです。


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

Name: softya  ..熟練のプログラマー(52,144ポイント)   Date: 2009/11/30(月) 15:35   No:42964     
Title: Re:領域をわける方法    
マルチポストの件を解決してもらえば、ここでならお手伝いします。
他のを全て閉じて、今後同じ事をしない様にしてください。
その他「規約と注意事項」に違反が無いか再確認してください。

その上で、そもそもルールが良く分からないので例として1.5の時どんな区分に分けるのか具体例をお願いします。領域に分けるって行為自体も意味が分かりません。出現数?って何が出現するんでしょう?


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

Name: Mist  ..比類無きプログラマー(72,586ポイント)   Date: 2009/11/30(月) 15:50   No:42965     
Title: Re:領域をわける方法    
区分した後のデータをどう使うのかを説明しないと、都合のいい区分なんて誰にも分からないと思うよ。

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



Name: サック  ..ぴよぴよ(256ポイント)   Date: 2009/11/29(日) 16:58   No:42857       
Title: 文字のバブルソート    
こんにちは。質問なんですが、文字配列を昇順(a,b,c,…順)に並び替えるプログラムをバブルソートとポインタを使って記述しなさい、という問題を学校の宿題でやっています。そこで、以下のようなプログラムを作ってみたんですが、実行して文字を入力しても昇順に並び変えられていなく、そのままの順番で表示されてしまいます。どこを直せば昇順になるか教えてほしいです。
#include<stdio.h>
void sort(char a[],int n){
int aa,k,m;
char *pa=a+1;
for(m=n;m>=2;m--){
for(k=1;k<n;k++){
if(*pa>*(pa+2)){
aa=*(pa+2);
*(pa+2)=*pa;
*pa=aa;
a[k]=*pa++;
}
}
}
}
main(){
int n,m;
char a[100];
printf("データ数を入力してください:");
scanf("%d",&n);getchar();
for(m=1;m<=n;m++){
printf("a[%d]=???",m);
scanf("%c",&a[m]);getchar();
}
for(m=1;m<=n;m++){
printf("%c",a[m]);
}
}




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


Name: やっくん  ..中級者(13,441ポイント)   Date: 2009/11/29(日) 17:30   No:42867     
Title: Re:文字のバブルソート    
sort()関数をメイン側で呼び出してないからではないでしょうか?

あと、もしできるならば記事の編集をしてソースコードを
<pre>

</pre>
で挟んでもらっていいでしょうか。
そうしなければインデントされないので見にくくなってしまいます。


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

Name: サック  ..ぴよぴよ(383ポイント)   Date: 2009/11/29(日) 18:24   No:42880     
Title: Re:文字のバブルソート    
やっくんさんコメントありがとうございます。みにくくて申し訳ありません。sort(a,n)を入れてみたのですが、実行結果が以下のようになってしまいます。どうすればよいのでしょうか??
データ数を入力してください:3
a[1]=???f
a[2]=???g
a[3]=???a
フフフPress any key to continue


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

Name: non  ..比類無きプログラマー(71,913ポイント)   Date: 2009/11/29(日) 18:51   No:42887     
Title: Re:文字のバブルソート    
環境ともう一度、プログラムを添付してください。


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

Name: サック  ..ぴよぴよ(788ポイント)   Date: 2009/11/29(日) 19:13   No:42895     
Title: Re:文字のバブルソート    
文字を昇順に並び変えるプログラムで、バブルソートとポインタを使って記述しなさいという問題です。作ったプログラムは以下の通りです。
#include<stdio.h>
void sort(char a[],int n){
int aa,k,m;
char *pa=a+1;
for(m=n;m>=2;m--){
for(k=1;k<n;k++){
if(*pa>*(pa+2)){
aa=*(pa+2);
*(pa+2)=*pa;
*pa=aa;
a[k]=*pa++;
}
}
}
}
main(){
int n,m;
char a[100];
printf("データ数を入力してください:");
scanf("%d",&n);getchar();
for(m=1;m<=n;m++){
printf("a[%d]=???",m);
scanf("%c",&a[m]);getchar();
}
sort(a,n);
for(m=1;m<=n;m++){
printf("%c",a[m]);
}
}
これを実行すると、以下のようにまってしまいます。
データ数を入力してください:3
a[1]=???c
a[2]=???b
a[3]=???a
フフフPress any key to continue
コメントお願いします。



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

Name: Mist  ..比類無きプログラマー(72,538ポイント)   Date: 2009/11/29(日) 19:21   No:42896     
Title: Re:文字のバブルソート    

#include<stdio.h>
void sort(char a[],int n){
int aa,k,m;
char *pa=a+1;
for(m=n;m>=2;m--){
for(k=1;k<n;k++){
if(*pa>*(pa+2)){
aa=*(pa+2);
*(pa+2)=*pa;
*pa=aa;
a[k]=*pa++;
}
}
}
}
main(){
int n,m;
char a[100];
printf("データ数を入力してください:");
scanf("%d",&n);getchar();
for(m=1;m<=n;m++){
printf("a[%d]=???",m);
scanf("%c",&a[m]);getchar();
}
sort(a,n);
for(m=1;m<=n;m++){
printf("%c",a[m]);
}
}

貼りなおしました。
規約をよく読んで環境かいてください。


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

Name: サック  ..ぴよぴよ(822ポイント)   Date: 2009/11/29(日) 19:32   No:42898     
Title: Re:文字のバブルソート    
環境はwindows,コンパイル名はVC++です。よりしくお願いします

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

Name: non  ..比類無きプログラマー(72,140ポイント)   Date: 2009/11/29(日) 20:40   No:42906     
Title: Re:文字のバブルソート    
サックさんの作ったsort関数とと配列の表記で解いたプログラムを比較できるように
並べて書いてみました。

void sort(char a[],int n){
int aa,k,m;
char *pa=a+1;
for(m=n;m>=2;m--){
for(k=1;k<n;k++){
if(*pa>*(pa+2)){
aa=*(pa+2);
*(pa+2)=*pa;
*pa=aa;
a[k]=*pa++;
}
}
}
}
void sort(char a[], int n)
{
int k,m;
char aa;
for(m=n;m>=2;m--){
for (k=1 ; k < m; k++) {
if (a[k] > a[k+1]) {
aa = a[k];
a[k] = a[k+1];
a[k+1]= aa;
}
}
}
}



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

Name: サック  ..かけだし(1,096ポイント)   Date: 2009/11/29(日) 23:03   No:42935     
Title: Re:文字のバブルソート    
比較して作ってみましたが実行結果がうまくいきません。
#include<stdio.h>
void sort(char a[],int n){
int k,m;
char aa,*p=a+1;
for(m=n;m>=1;m--){
for(k=1;k<m;k++){
if(*p>*(p+1)){
aa=*(p+1);
*(p+1)=*p;
*p=aa;
}
}
}
}
main(){
int n,k;
char a[100];
printf("データ数を入力してください:");
scanf("%d",&n);getchar();
for(k=1;k<=n;k++){
printf("a[%d]=???",k);
scanf("%c",&a[k]);getchar();
}
sort(a,n);
for(k=1;k<=n;k++){
printf("%c",a[k]);
}
}
データ数を入力してください:3
a[1]=???c
a[2]=???b
a[3]=???a
bcaPress any key to continue





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

Name: やっくん  ..中級者(14,273ポイント)   Date: 2009/11/30(月) 01:14   No:42945     
Title: Re:文字のバブルソート    
>サックさん
sort関数でchar型のポインタ*pを宣言してそれを用いて、ソート処理を行っていますが、ポインタpが指しているアドレスが常に同じとなっています。

for(m=n;m>=1;m--){
for(k=1;k<m;k++){
if(*p>*(p+1)){
aa=*(p+1);
*(p+1)=*p;
*p=aa;
++p;
}
}

++p;このようにすることで次のアドレス(次の配列の要素と捉えて良いです)を指します。
ですが、↑に書いた通りにしてもきちんと動きません。
バブルソートを少しわかりにくいかもしれませんが図で表すと、

    (要素)
比較 123456  (比べる順序)
1回目:○○○○○○ 6と5→5と4→4と3→3と2→2と1
2回目:■○○○○○ 6と5→5と4→4と3→3と2 
3回目:■■○○○○ 6と5→5と4→4と3
4回目:■■■○○○ 6と5→5と4
5回目:■■■■○○ 6と5
6回目:■■■■■■ 完成



○が比べて変更する部分で、■は並べ終わった数値です。
(比べる順序)に書いてるように後ろから比べていくことにします。
そうすると、一列比べ終わるごとに一番最初の方から小さい値が入っていきます。
これをポインタを使って表現すると、
まず6番目を指すポインタpをセットします。
一つ前の要素5番目はp-1で表されます。
次に5番目と4番目を見たいのですが、サックさんの書き方ですと、ポインタで指している場所を変えてないため、また6番目と5番目を比較してしまいます。ですのでポインタをずらす必要があります。
1個ずつポインタをずらしていき、2番目と1番目までこの方法で比較した場合、ポインタは2番目を指しているはずです。
そうすると2回目の比較に移行するする際に不都合が起きてしまいます(6番目を比較したいのに2番目を指している)。ですので6番目にポインタを戻してあげる必要があります。
あとはこれの繰り返しで並べ替えることができます。

あと、ソースコードが見にくくなっているのはソースコードを<Pre>〜</Pre>で囲んでいないからですよ。

<Pre>
#include<stdio.h>

ー略ー

</Pre>
と記せばきれいにインデントされたままになりますよ。
<>は半角です。


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



Name: 天和  ..入門者(2,577ポイント)   Date: 2009/11/29(日) 08:39   No:42815       
Title: コマンドプロンプト    
前回同じタイトルで質問をしたものですが・・・・
(コマンドプロンプトをつかって
-n 3 -s "hello" と入力するか-s"hello" -n 3と入力したら
""の間の言葉を
-nの分だけ繰り返すプログラムを作りなさい
上記の場合はhello hello helloと出てきたら成功です
とのことですがさっぱりわかりませんそもそも""のあいだ文章だけをいう認識をどうやってプログラムすればいいか・・・
一応ヒントでは
#include<stdio.h>
int main(int argc char **argv
{
while(argc--)printf("%s\n", *argv++);
return 0;
}
とのことですが・・・)
前回高木さんの回答を下にやろうとしていたのですが
自分の使っているVISUAL C++では
#include <stdlib.h>
が使えないためまたgetoptも使おうとしたのですが
同じく使えないためサイド質問させていただきました
ヒントの↓は
#include<stdio.h> 

int main(int argc char **argv
{
while(argc--)printf("%s\n", *argv++);
return 0;
}

コンパイルで実行するとプログラムを書いたアプリケーションファイルの場所のアドレスが出てきますが
コマンドプロンプトで実行するとプログラムを書いたファイル名が出てきます(ファイル名はtest.exeです)
そして例えばコマンドプロンプトで (アプリケーションのあるアドレス)> test.exe asと打つと(半角スペースあけておかなければならない)
test.exe
as
と表示されます。いったいポインタ以外に何を使うんでしょうか?


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


Name: 朽木  ..中級者(11,095ポイント)   Date: 2009/11/29(日) 09:30   No:42816     
Title: Re:コマンドプロンプト    
前スレ見てないので何の話かは分からないんですが

一文字目が '-' で二文字目が 's' か 'n' かどうかを調べれば話が早いのでは?

あと、""のあいだって、"の次の文字から"がくるまでですよね


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

Name: 天和  ..入門者(2,897ポイント)   Date: 2009/11/29(日) 09:47   No:42817     
Title: Re:コマンドプロンプト    
>朽木さん
前すれはhttp://www.play21.jp/board/formz.cgi?action=res&resno=42691&page=&lognum=&id=dixq&rln=42723
です
>あと、""のあいだって、"の次の文字から"がくるまでですよね
はいそのとおりです
調べるのはgetcharとかつかえばいいんでしょうがそのごその回数分コピーしなければならないので
それが困っています。


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

Name: non  ..比類無きプログラマー(71,511ポイント)   Date: 2009/11/29(日) 10:03   No:42818     
Title: Re:コマンドプロンプト    
タカギさんのプログラムが動かないのですか?
>#include <stdlib.h>が使えないため

そんなことはないのでは?
VisualC++2008ですよね。
stdbool.hでエラーが出るのならわかるのですが。


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

Name: 天和  ..入門者(2,867ポイント)   Date: 2009/11/29(日) 10:15   No:42820     
Title: Re:コマンドプロンプト    
失礼しました
使えないのは
unistd.h(getoptにつかう)
とstdbool.hでしたすいません


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

Name: たかぎ [URL]  ..ハッカー(124,805ポイント)   Date: 2009/11/29(日) 10:24   No:42821     
Title: Re:コマンドプロンプト    
> 自分の使っているVISUAL C++では

そんな情報は今回始めて出ました。
情報を後だしするのではなく、最初から規約を守って必要な情報を提示するようにしましょう。


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

Name: non  ..比類無きプログラマー(71,497ポイント)   Date: 2009/11/29(日) 10:30   No:42822     
Title: Re:コマンドプロンプト    
stdbool.hをコメントアウトして試してみてください。


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

Name: 天和  ..入門者(3,618ポイント)   Date: 2009/11/29(日) 11:06   No:42823     
Title: Re:コマンドプロンプト    
>高木さん
すいませんまさかコンパイラによって使えないヘッダーがあるとは思わなかったものですから。
>nonさん
コメントアウトしたところ実行はするのですがすぐに終わってしまいます(もしかしたらコメントアウト
を勘違いしてるかもしれませんのでソースを載せて起きます)

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
#include <limits.h>
/*#include <stdbool.h>*/

bool str_to_ui(const char *s, unsigned int *pi)
{
while (isspace((unsigned char)*s))
++s;
if (!isdigit((unsigned char)*s))
return false;

char *endptr;
errno = 0;
unsigned long t = strtoul(s, &endptr, 10);
if (errno != 0 || t > UINT_MAX || *endptr != '\0')
return false;
*pi = (unsigned int)t;
return true;
}

int main(int argc, char *argv[])
{
unsigned int n = 0;
const char *s = "";

for (int i = 1; i < argc; i++)
{
const char *arg = argv[i];
if (arg[0] == '-')
{
switch (arg[1])
{
case 'n':
if (arg[2] != '\0')
{
if (!str_to_ui(&arg[2], &n))
return EXIT_FAILURE;
}
else if (++i >= argc || !str_to_ui(argv[i], &n))
{
return EXIT_FAILURE;
}
break;
case 's':
if (arg[2] != '\0')
{
s = &arg[2];
}
else if (++i >= argc)
{
return EXIT_FAILURE;
}
else
{
s = argv[i];
}
break;
default:
return EXIT_FAILURE;
}
}
else
{
return EXIT_FAILURE;
}
}

for (int i = 0; i < n; i++)
{
fputs(s, stdout);
fputc(i < n - 1 ? ' ' : '\n', stdout);
}
return EXIT_SUCCESS;
}


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

Name: softya  ..熟練のプログラマー(49,702ポイント)   Date: 2009/11/29(日) 12:54   No:42825     
Title: Re:コマンドプロンプト    
たかぎさんのコードはC99準拠で書かれていますので、あくまで参考に留め自力でご存知のC言語の文法の範囲で書き直してください。よい勉強になると思います。
stdbool.hもC99のヘッダなため、C99に対応していないVisualC++では存在しません。

VisualC++で書き直す必要のあるもの
・bool boolは定義されていない。intで代用。
・true 真は0で無ければ良い。1で代用。
・false 偽は0であれば良い。0で代用。
・for (int i = 1; i < argc; i++) for文中でint宣言できない。外に出す。
・for (int i = 0; i < n; i++) 同上


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

Name: non  ..比類無きプログラマー(71,569ポイント)   Date: 2009/11/29(日) 12:57   No:42826     
Title: Re:コマンドプロンプト    
実行のやり方は?
まさかとは思うけど、パラメータを与えてないということはないですよね。
>(コマンドプロンプトをつかって
>-n 3 -s "hello" と入力するか-s"hello" -n 3と入力したら


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

Name: softya  ..熟練のプログラマー(49,852ポイント)   Date: 2009/11/29(日) 13:02   No:42827     
Title: Re:コマンドプロンプト    
[追記]
ちなみに、stdbool.hをコメントアウトしてC++コンパイラでコンパイルするとC99基準で書かれているコードでもコンパイルが通ってしまいます。エラーが出なかったならC++でコンパイルしている事になりますね。
C99準拠の文法である事を天和さんが自覚しているなら問題ないです。

ちなみに何もおきないのは、パラメータをちゃんと入力していないのでは?
私のところでは、たかぎさんのプログラムはちゃんと動きました。


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

Name: たかぎ [URL]  ..ハッカー(124,856ポイント)   Date: 2009/11/29(日) 13:08   No:42828     
Title: Re:コマンドプロンプト    
> ちなみに、stdbool.hをコメントアウトしてC++コンパイラでコンパイルするとC99基準で書かれているコードでもコンパイルが通ってしまいます。エラーが出なかったならC++でコンパイルしている事になりますね。
> C99準拠の文法である事を天和さんが自覚しているなら問題ないです。

CとC++の区別がついていない人は多いですからね。
そうした現状を踏まえて、↓のような記事を書いていたりもするわけですが...
http://www.kijineko.co.jp/tech/cpp2c



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

Name: softya  ..熟練のプログラマー(49,741ポイント)   Date: 2009/11/29(日) 13:24   No:42829     
Title: Re:コマンドプロンプト    
天和さんの書いている事を見て不思議に思うことがありました。

>調べるのはgetcharとかつかえばいいんでしょうがそのごその回数分コピーしなければならないので
>それが困っています。

getcharはstdinからの入力で使うもので、今回の起動パラメータ入力では使えません。
もしかして、stdinから入力できると思っていませんか?


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

Name: たかぎ [URL]  ..ハッカー(125,030ポイント)   Date: 2009/11/29(日) 13:34   No:42831     
Title: Re:コマンドプロンプト    
> getcharはstdinからの入力で使うもので、今回の起動パラメータ入力では使えません。
> もしかして、stdinから入力できると思っていませんか?

またしても後だし条件で...

#include <stdio.h>

int main(int argc, char *argv[])
{
if (argc > 1)
{
FILE *stream = popen(argv[0], "w");
int i;
for (i = 1; i < argc; i++)
fprintf(stream, "%s\n", argv[i]);
}
else
{
/* 標準入力を処理 */
}
return 0;
}

のようなことを想定しているのでは?


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

Name: 天和  ..入門者(3,792ポイント)   Date: 2009/11/29(日) 13:49   No:42833     
Title: Re:コマンドプロンプト    
>softyaさん
すいませんそもそもパラメータって何ですか?
調べても媒介変数としか出てこないんですが。

>nonさん
>実行のやり方は?
>まさかとは思うけど、パラメータを与えてないということはないですよね
???普通に>-n 3 -s "hello" と入力するか-s"hello" -n 3と入力するだけですよ?
(もちろん数字や言葉は自由に変えれる)ただエラー処理は課題に適当に促してくださいと書いてあるんですが・・・


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

Name: softya  ..熟練のプログラマー(50,003ポイント)   Date: 2009/11/29(日) 15:29   No:42837     
Title: Re:コマンドプロンプト    
みんなザックリとパラメータと呼んでますが、正確には「コマンドライン引数」と呼びます。
http://www9.plala.or.jp/sgwr-t/c/sec11-4.html
http://www.geocities.jp/ky_webid/c/045.html

>-n 3 -s "hello"
と言う書き方は、コマンドライン引数の書き方としてはかなり一般的な書き方です。


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

Name: 天和  ..入門者(3,839ポイント)   Date: 2009/11/29(日) 16:03   No:42838     
Title: Re:コマンドプロンプト    
>softyaさん
はいパラメータの設定はまったくやってませんね
どうやらリンク先ではプログラムの引数で何かやるみたいですがどこにあるんでしょう?
(画像から)


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

Name: box  ..ハッカー(146,703ポイント)   Date: 2009/11/29(日) 16:09   No:42839     
Title: Re:コマンドプロンプト    
>例えばコマンドプロンプトで (アプリケーションのあるアドレス)> test.exe asと打つと(半角スペースあけておかなければならない)

実行時、プログラム名の直後に、スペースを1個以上あけながら

実行プログラム -n 3 -s "hello" <Enter>

と入力する仕様である、ということは理解されているのですよね?>質問者さん


# hello の前後のダブルクォーテーションは必要なのだろうか?


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

Name: 天和  ..入門者(3,976ポイント)   Date: 2009/11/29(日) 16:14   No:42841     
Title: Re:コマンドプロンプト    
>boxさん
>実行時、プログラム名の直後に、スペースを1個以上あけながら

>実行プログラム -n 3 -s "hello" <Enter>

>と入力する仕様である、ということは理解されているのですよね?>質問者さん
はい理解してます層じゃないと〜はバッチとして認識されませんとかでますので

># hello の前後のダブルクォーテーションは必要なのだろうか?
もちろんですそれが今回の課題ですこれが例えば"good"だとしたらその間の文字を-nの数字の後の回だけ
繰り返さなければならないですから
例(-n 5 -s "good")だったら
good good good good goodと出なければなりません


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

Name: box  ..ハッカー(146,565ポイント)   Date: 2009/11/29(日) 16:19   No:42843     
Title: Re:コマンドプロンプト    
>例(-n 5 -s "good")だったら
>good good goodと出なければなりません

コマンドライン引数で
good と入力するだけで、文字列データの中に「good」が入ることは
理解されていますね?

つまり、"good" と入力すると、文字列データ「そのもの」にダブルクォーテーションを含みます。
good を所定の回数だけ出力するには、文字列データの最初と最後の
ダブルクォーテーションを自分で取り除く必要があります。この点も大丈夫ですね?



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

Name: 天和  ..入門者(4,153ポイント)   Date: 2009/11/29(日) 16:29   No:42845     
Title: Re:コマンドプロンプト    
>boxさん
>コマンドライン引数で
>good と入力するだけで、文字列データの中に「good」が入ることは
>理解されていますね?

はい理解してます

>つまり、"good" と入力すると、文字列データ「そのもの」にダブルクォーテーションを含みます。
good を所定の回数だけ出力するには、文字列データの最初と最後の
ダブルクォーテーションを自分で取り除く必要があります。この点も大丈夫ですね?


問題はそこなんですよねそもそもどうやってコマンドライン使ってそれを可能にするかですが・・・


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

Name: non  ..比類無きプログラマー(71,672ポイント)   Date: 2009/11/29(日) 16:30   No:42846     
Title: Re:コマンドプロンプト    
よくわかりませんねぇ。
コマンドプロントウィンドウを出して、実行ファイル(test.exe)を
探して、そのディレクトリに移動して下さい。
私は、VisualC++を使ってないからよくわからないけど、ありますか?
Release でなくてもよかったのですかね?

あるなら、
プロンプトの後に
>test -n 3 -s "hello"
と入力してください。


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

Name: たかぎ [URL]  ..ハッカー(125,065ポイント)   Date: 2009/11/29(日) 16:32   No:42847     
Title: Re:コマンドプロンプト    
ダブルクォーテーションを取り除く必要があるかどうか、最初に自分で貼付けられたヒントと称するプログラムで確認してみては?


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

Name: box  ..ハッカー(146,373ポイント)   Date: 2009/11/29(日) 16:37   No:42848     
Title: Re:コマンドプロンプト    
仮に、コマンドライン引数の与え方を

実行ファイル名 -n 回数 -s "出力したい文字列"

の形式に固定します。実際の仕様は、回数と出力したい文字列の順序が
逆でもかまわないようになっていますが、簡単のためです。

このとき、main関数の第1引数argcの値は5で、
第2引数argv[]の値は、順に

argv[1]:-n
argv[2]:回数の文字列
argv[3]:-s
argv[4]:"出力したい文字列"

であることを確認するだけのプログラムを書いてみてください。


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

Name: softya  ..熟練のプログラマー(50,247ポイント)   Date: 2009/11/29(日) 16:45   No:42850     
Title: Re:コマンドプロンプト    
>はいパラメータの設定はまったくやってませんね
>どうやらリンク先ではプログラムの引数で何かやるみたいですがどこにあるんでしょう?

デバッグのタブで設定します。
コマンド引数ってのがそれです。

># hello の前後のダブルクォーテーションは必要なのだろうか?
>ダブルクォーテーションを自分で取り除く必要があります。この点も大丈夫ですね?
boxさんも間違っています。
いちどやってみれば分かりますよ。


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

Name: 天和  ..入門者(4,251ポイント)   Date: 2009/11/29(日) 16:46   No:42852     
Title: Re:コマンドプロンプト    
>高木さん
あれ?””が消えて表示される・・・・
>>boxさん
#include<stdio.h>

int main(int argc, char *argv[]){
int i;
i = 0;
while(i < argc){
printf("argv[%d]%s\n",i ,argv[i]);
i++;
}
return 0;
}

こうですか?


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

Name: たかぎ [URL]  ..ハッカー(125,102ポイント)   Date: 2009/11/29(日) 16:47   No:42853     
Title: Re:コマンドプロンプト    
こういうことがあるので、初心者が十分に理解しないままIDEに手を出すのはお勧めしません。
まったく本質ではないところで、これほど混乱しているわけですから。


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

Name: non  ..比類無きプログラマー(71,717ポイント)   Date: 2009/11/29(日) 16:51   No:42854     
Title: Re:コマンドプロンプト    
ようするに最初のヒントを試していなかったってことですね。
あれほど、前のスレッドで結果はどうですかって尋ねられていたのにね。


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

Name: たかぎ [URL]  ..ハッカー(125,131ポイント)   Date: 2009/11/29(日) 16:52   No:42855     
Title: Re:コマンドプロンプト    
> あれほど、前のスレッドで結果はどうですかって尋ねられていたのにね。

C言語より先に国語を勉強したほうがよい典型的な例のようです。


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

Name: softya  ..熟練のプログラマー(50,192ポイント)   Date: 2009/11/29(日) 16:55   No:42856     
Title: Re:コマンドプロンプト    
ダブルクオートの存在意義は、
1.test -n 3 -s "hello boy"
2.test -n 3 -s hello boy
の2つの違いを試してみると分かります。

> あれほど、前のスレッドで結果はどうですかって尋ねられていたのにね。
私も試すように何度も言ったんですけどね。


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

Name: box  ..ハッカー(146,401ポイント)   Date: 2009/11/29(日) 17:01   No:42858     
Title: Re:コマンドプロンプト    
>boxさんも間違っています。
>いちどやってみれば分かりますよ。

はい。間違っていました。


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

Name: box  ..ハッカー(146,467ポイント)   Date: 2009/11/29(日) 17:06   No:42860     
Title: Re:コマンドプロンプト    
> こうですか?

for文で書く方が簡単かとは思いますが、
それと同じ効果を持つwhile文で書いていますので、
コマンドライン引数の内容を確認するコードとして正しいです。

ていうか、ご自分でも確認されたのですよね?


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

Name: 天和  ..入門者(4,341ポイント)   Date: 2009/11/29(日) 17:19   No:42863     
Title: Re:コマンドプロンプト    
>>ALL
ほんとすいません・・・実行してもファイル名とかがでるだけでまさか”が消えるとは思わなかったもので・・・
>>softyaさん
違い確認できました
””で囲まれてる間はスペース無視ではいるようですね
(画像参照)
>boxさん
はいまあ・・・一応念のためにと


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

Name: たかぎ [URL]  ..ハッカー(125,209ポイント)   Date: 2009/11/29(日) 17:28   No:42865     
Title: Re:コマンドプロンプト    
ところで話を最初に戻すと...

> -n 3 -s "hello" と入力するか-s"hello" -n 3と入力したら

とのことですから、後者は -s と "hello" の間に空白がありません。
つまり、

argv[1]-shello

となると思います。
それでも正しく処理できないといけないわけです。
私が書いたコードが倍ぐらい複雑になってしまった理由はここにあります。


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

Name: non  ..比類無きプログラマー(71,893ポイント)   Date: 2009/11/29(日) 17:32   No:42868     
Title: Re:コマンドプロンプト    
>私が書いたコードが倍ぐらい複雑になってしまった理由はここにあります。

ですよね。だから、-sの後にスペースがあるのかないのか質問しました。
質問者と次元が違いすぎましたね。



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

Name: 天和  ..入門者(4,367ポイント)   Date: 2009/11/29(日) 17:34   No:42869     
Title: Re:コマンドプロンプト    
>高木さん
すいません・・・スペース入力を忘れたばっかりに


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

Name: box  ..ハッカー(147,139ポイント)   Date: 2009/11/29(日) 17:36   No:42870     
Title: Re:コマンドプロンプト    
実行ファイル名 -n 回数 -s 文字列
または
実行ファイル名 -s 文字列 -n 回数
のいずれかの形式で文字列と出力回数を与えます。

ということは、
argv[1]が"-n"で、かつ、argv[3]が"-s"であるか、(※1)
または、
argv[1]が"-s"で、かつ、argv[3]が"-n"である(※2)
のいずれかであることを求めています。
これ以外は、コマンドライン引数の与え方が間違っていますので、
エラーメッセージか何かを出して終了します。

さて、(※1)のケースでは、
argv[2]に回数(数値ではなくて文字列)が、
argv[4]に出力したい文字列が入っています。
argv[2]の文字列を数値に変換する必要があります。
安直なのはatoi関数とかatol関数を使うことですが、
識者のかたがたから「エラーチェックしてへんやんけ」という
突っ込みが入りそうですので、ここはstrtol関数を使うのがよさそうです。
これで、回数(数値)と文字列を得ることができました。
後は、for文か何かでその回数だけループさせ、そのループの中で
文字列を出力すればよいです。

(※2)のケースは、(※1)のargv[2]とargv[4]とを逆にすればよいです。


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

Name: たかぎ [URL]  ..ハッカー(125,189ポイント)   Date: 2009/11/29(日) 17:36   No:42871     
Title: Re:コマンドプロンプト    
> すいません・・・スペース入力を忘れたばっかりに

まあ、半角/全角を混在させる人に比べればずっとましです。


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

Name: softya  ..熟練のプログラマー(50,402ポイント)   Date: 2009/11/29(日) 17:37   No:42872     
Title: Re:コマンドプロンプト    
>それでも正しく処理できないといけないわけです。
>私が書いたコードが倍ぐらい複雑になってしまった理由はここにあります。

この問題は、コマンドライン引数の使い方とポインタの学習だと思うので、たかぎさんの複雑なコードがいる状況が不思議でなりません。
-s"hello" -n 3
自体が間違いじゃないかと疑っています。


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

Name: たかぎ [URL]  ..ハッカー(125,611ポイント)   Date: 2009/11/29(日) 17:49   No:42874     
Title: Re:コマンドプロンプト    
boxさん
> 安直なのはatoi関数とかatol関数を使うことですが、
> 識者のかたがたから「エラーチェックしてへんやんけ」という
> 突っ込みが入りそうですので、ここはstrtol関数を使うのがよさそうです。

atoi/atolにせよ、strtol/strtoulにせよ、符号を許してしまうのでどうかと思います。-n +3 のようにしてもよいならかまいませんが...。
また、-n " 3" のように指定されるかもしれません。
私のコードでは、符号を許さないようにしたため、さらに倍ぐらい複雑になってしまいました。

softyaさん
> この問題は、コマンドライン引数の使い方とポインタの学習だと思うので、たかぎさんの複雑なコードがいる状況が不思議でなりません。

天和さんがどういう立場の人で、どこまでわかっていて、どんな目的で取り組んでいるのかさっぱりわかりませんので、そういう決めつけはよくないのでは?


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

Name: softya  ..熟練のプログラマー(50,444ポイント)   Date: 2009/11/29(日) 17:58   No:42875     
Title: Re:コマンドプロンプト    
>天和さんがどういう立場の人で、どこまでわかっていて、どんな目的で取り組んでいるのかさっぱりわかりませんので、そういう決めつけはよくないのでは?

たしかに、そうですね。
とりあえず天和さん、問題の出所などを明確にしてもらうと本質的な問題に集中できますのでお願いします。
調べてみたところ、天和さんが参考にしている明解C言語にはこんな演習は無いみたいですが。


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

Name: box  ..ハッカー(147,102ポイント)   Date: 2009/11/29(日) 17:59   No:42876     
Title: Re:コマンドプロンプト    
あまり細かいことを言い出すときりがなくなりそうです。
ここはstrtolあたりを使うことでじゅうぶんではないかと思います。


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

Name: 天和  ..入門者(4,680ポイント)   Date: 2009/11/29(日) 18:04   No:42877     
Title: Re:コマンドプロンプト    
>>softyaさん
>たしかに、そうですね。
とりあえず天和さん、問題の出所などを明確にしてもらうと本質的な問題に集中できますのでお願いします。
調べてみたところ、天和さんが参考にしている明解C言語にはこんな演習は無いみたいですが。

とりあえず問題自体は大学の先生が作ったオリジナル問題なので出所はちょっとわかりません
そしてsoftyaさんのいうとおりポインタの練習とコマンドラインの練習のためにつくったようです
(課題名がコマンドライン・スイッチの実装になっているため)
またsoftyaさんのいうとおり-s"hello" -n 3 は間違いです-s "hello" -n 3
ときちんと半角スペース入れるのが正解です。まさか半角スペース一個でここまでもんだいになるとは
思わなかったのでほんとすいません。


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

Name: 天和  ..初心者(5,755ポイント)   Date: 2009/11/29(日) 18:16   No:42878     
Title: Re:コマンドプロンプト    
一応自分なりにプログラム組んでみました(かなりだめだめですが・・・)

#include<stadio.h>
int main(int argc, char *argv[]){
int i;
int x;
i = 0;
x = 0;
while(i < argc){ /*まずこの中に-nが入ってないか探す*/
if(argv[i] = '-n')/*もしも文字列に-nがはいっていたらつぎの数値の分だけ繰り返す変数を代入しなさい*/
{i++;       /*もし-nがあったら次の配列は確実に数字なので文字列を繰り返す分のxにその数値を代入する*/
x = argv[i];
break;}
i++;
}
i = 0;
while(i < x){/*さきほどやった-nの分だけ繰り返しなさい*/
while(i < argc){/*まずこの中に-sが入ってないか探しなおかつあったらなら次の配列を出力しなさい*/
if(argv[i] = '-s')
{i++;
printf("%s\n", argv[i]);/*もし-sがあったら次の配列は確実コピーしたい文字列なのでなのでそれをしゅつりょくしなさい*/
break;}
i++;
}
i = 0;/* while(i < x)がなりたつまでiに0を代入しさっきと同じ作業を繰り返しなさい*/
}
return 0;
}

エラー内容
1>c:\users\ozaki\desktop\c++\project\switch\switch\switch.cpp(8) : error C2440: '=' : 'int' から 'char *' に変換できません。
1> 整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。
1>c:\users\ozaki\desktop\c++\project\switch\switch\switch.cpp(9) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>c:\users\ozaki\desktop\c++\project\switch\switch\switch.cpp(9) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>c:\users\ozaki\desktop\c++\project\switch\switch\switch.cpp(9) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>c:\users\ozaki\desktop\c++\project\switch\switch\switch.cpp(9) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>c:\users\ozaki\desktop\c++\project\switch\switch\switch.cpp(9) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>c:\users\ozaki\desktop\c++\project\switch\switch\switch.cpp(9) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>c:\users\ozaki\desktop\c++\project\switch\switch\switch.cpp(9) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>c:\users\ozaki\desktop\c++\project\switch\switch\switch.cpp(10) : error C2065: '       ' : 定義されていない識別子です。
1>c:\users\ozaki\desktop\c++\project\switch\switch\switch.cpp(10) : error C2146: 構文エラー : ';' が、識別子 'x' の前に必要です。
1>c:\users\ozaki\desktop\c++\project\switch\switch\switch.cpp(10) : error C2440: '=' : 'char *' から 'int' に変換できません。
1> この変換が可能なコンテキストはありません。
1>c:\users\ozaki\desktop\c++\project\switch\switch\switch.cpp(17) : error C2440: '=' : 'int' から 'char *' に変換できません。
1> 整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。
1>ビルドログは "file://c:\Users\ozaki\Desktop\C++\project\switch\switch\Debug\BuildLog.htm" に保存されました。
1>switch - エラー 12、警告 0
charからint二変換できないといっているので
これ→<stdlib.h> int atoi(const char *argv)を使うんでしょうか?


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

Name: たかぎ [URL]  ..ハッカー(125,657ポイント)   Date: 2009/11/29(日) 18:19   No:42879     
Title: Re:コマンドプロンプト    
ものすごく基本的なことですが...

> 1>c:\users\ozaki\desktop\c++\project\switch\switch\switch.cpp

C++なのでしょうか?

改めて規約を熟読した上で、必要な情報をきちんと提示してください。


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

Name: 天和  ..初心者(5,792ポイント)   Date: 2009/11/29(日) 18:25   No:42881     
Title: Re:コマンドプロンプト    
いえつかっているのはVISUAL C++ですが
習っているのはあくまでC言語です。
OSはwindows VISTAです


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

Name: たかぎ [URL]  ..ハッカー(125,746ポイント)   Date: 2009/11/29(日) 18:31   No:42883     
Title: Re:コマンドプロンプト    
> 習っているのはあくまでC言語です。

では、なぜC++でコンパイルしているのですか?

何度も言いますが、
改めて規約を熟読した上で、必要な情報をきちんと提示してください。

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

Name: 天和  ..初心者(5,879ポイント)   Date: 2009/11/29(日) 18:49   No:42885     
Title: Re:コマンドプロンプト    
最初、プログラムをやるときにすすめられたコンパイラが
VISUAL C++なんです大学でもVISUAL c++はつかってもいいですか?
ときいたら「いいよ」といわれたのでC言語の授業でもこのコンパイラを使っています。


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

Name: softya  ..熟練のプログラマー(50,831ポイント)   Date: 2009/11/29(日) 18:50   No:42886     
Title: Re:コマンドプロンプト    
如何にも学生が書くであろうコードを作ってみました。
天和さんが書いたコードを見る限り、たどり着くのはずいぶん先になりそうなので。

次のことを守ってください。
1.このコードをそのまま教授には提出しないでください。
2.エラー処理が一切ありません。自分で習った範囲でエラー処理を追加してください。
3.わざとバグが作ってあります。
4.コメントを自分で入れてください。
5.使っている関数が使っても良いかは、習っている事と照らし合わせて考えてみてください。
よろしくお願いします。

ちなみに
ViusalC++でC言語としてコンパイルするためには、
・ファイルの拡張子を.cとする

・「プロジェクト」→「xxxのプロパティ」→「構成のプロパティ」→「C/C++」→「詳細」→「コンパイル言語の選択」で「Cコードとしてコンパイル(/TC)」を選択。
のどちらかの方法で行ってください。


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

Name: たかぎ [URL]  ..ハッカー(125,797ポイント)   Date: 2009/11/29(日) 18:51   No:42888     
Title: Re:コマンドプロンプト    
Visual C++を使うこと自体は問題ありません。
なぜ、Cではなく、C++でコンパイルしているんですか? と尋ねているのです。


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

Name: non  ..比類無きプログラマー(71,936ポイント)   Date: 2009/11/29(日) 18:52   No:42890     
Title: Re:コマンドプロンプト    
天和さんへ
学校で使っているコンパイラは何ですか?


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

Name: 天和  ..初心者(5,963ポイント)   Date: 2009/11/29(日) 18:56   No:42891     
Title: Re:コマンドプロンプト    
学校で標準使用されているのは
macのUNIX?というやつなんですが(実際はターミナルでコマンド入れてやるコンパイラ)
実際、みんな使っているコンパイラはばらばらで上記のターミナルだったりxcodeだったり
自分みたいにVISUAL C++だったりします。(学校でもプライベートでも使用してます)


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

Name: 天和  ..初心者(5,995ポイント)   Date: 2009/11/29(日) 18:58   No:42892     
Title: Re:コマンドプロンプト    
>softyaさん
かしこまりましたルールを守って使わせていただきます。


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

Name: たかぎ [URL]  ..ハッカー(125,886ポイント)   Date: 2009/11/29(日) 19:03   No:42893     
Title: Re:コマンドプロンプト    
天和さんは学生なのでしょうか?
問題は大学の先生が作ったらしいですが、だからといって天和さんが学生ということにはなりませんよね。

> macのUNIX?というやつなんですが(実際はターミナルでコマンド入れてやるコンパイラ)
> 実際、みんな使っているコンパイラはばらばらで上記のターミナルだったりxcodeだったり
> 自分みたいにVISUAL C++だったりします。(学校でもプライベートでも使用してます)

PCは自前なのでしょうか?
さっぱり状況がわかりませんが、Visual StudioのようなIDE(統合開発環境)は、わかっていて使うならよいのですが、そうでないなら本質ではない部分で頻繁に混乱することになると思います。
たとえうまくいっても、半分も理解できていない場合があります。
初心者向きではないんです。
今回も、どうやらCとC++の使い分けも分からなかったようですが、コマンドラインコンパイラならこんな問題が起きる可能性は激減します。


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

Name: 天和  ..初心者(6,416ポイント)   Date: 2009/11/29(日) 19:22   No:42897     
Title: Re:コマンドプロンプト    
>高木さん
自分大学の学生です
>PCは自前なのでしょうか?
さっぱり状況がわかりませんが、Visual StudioのようなIDE(統合開発環境)は、わかっていて使うならよいのですが、そうでないなら本質ではない部分で頻繁に混乱することになると思います。
たとえうまくいっても、半分も理解できていない場合があります。
初心者向きではないんです。
今回も、どうやらCとC++の使い分けも分からなかったようですが、コマンドラインコンパイラならこんな問題が起きる可能性は激減します。

PCは大学から支給されているやつをつかっています(ただし今現在書き込みをしているのは自宅のPCです)
もちろんどっちともウィンドウズビスタですが大学から支給されているのはmacもつかえます


Visual StudioのようなIDE(統合開発環境)ですがやはりやめたほうがよいのでしょうか?
マックのUNIX?(ターミナルでやるもの)もあるんですがあちらはコンパイルした後デバックしたり
エラーがないかチェックするのにいちいちコンパイルから抜け出してコマンドうったりしないといけないので・・・(xcodeというのもありますがあれもたぶんIDE?)


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

Name: たかぎ [URL]  ..ハッカー(126,064ポイント)   Date: 2009/11/29(日) 19:35   No:42899     
Title: Re:コマンドプロンプト    
> PCは大学から支給されているやつをつかっています(ただし今現在書き込みをしているのは自宅のPCです)
> もちろんどっちともウィンドウズビスタですが大学から支給されているのはmacもつかえます

大体分かってきました。
つまり、Macを使って、BootCampかVMware FusionあたりでVistaを起動しているわけですね。

> Visual StudioのようなIDE(統合開発環境)ですがやはりやめたほうがよいのでしょうか?

もし、大学の講義がGCCで行われているのであれば、とりあえずはGCCを使うほうがよいと思います。

> マックのUNIX?(ターミナルでやるもの)もあるんですがあちらはコンパイルした後デバックしたり
> エラーがないかチェックするのにいちいちコンパイルから抜け出してコマンドうったりしないといけないので・・・(xcodeというのもありますがあれもたぶんIDE?)

コンパイルから抜けるという意味がわかりません。
コンパイルが終わらないとデバッグできないと思いますが...

それから、この程度のプログラムであれば、デバッガの出番はないと思います。
printfデバッグでも十分ですね。


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

Name: softya  ..熟練のプログラマー(51,155ポイント)   Date: 2009/11/29(日) 20:13   No:42903     
Title: Re:コマンドプロンプト    
天和さんのコードの最大の問題点だけ指摘しておきます。
if(argv[i] = '-s')は重症な理解不足です。
文字リテラルと、文字列の区別が出来ていませんのでちゃんと勉強してください。
文字リテラルは数値データ。文字列はchar*型のデータです。
特に文字列はポインタと密接に結びつきますので、ポインタの理解のためにも文字列について調べてください。

>Visual StudioのようなIDE(統合開発環境)ですがやはりやめたほうがよいのでしょうか?
どちらかと言うと、たかぎさんが問題にしたいのはあいまいな開発環境を許可した教授であって天和さんに罪はありません。たかぎさんと意見は違いますが、私の書いたC言語でコンパイルする方法を守っていただければ問題ないと思います。



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

Name: 天和  ..初心者(6,812ポイント)   Date: 2009/11/29(日) 20:21   No:42904     
Title: Re:コマンドプロンプト    
>たかぎさん
すいませんGCCというのはMACのターミナルのことでしょうか?

えーとソースをある程度修正してきましたが・・・


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
int i;
int y;
i = 1;
y = 1;
int x;
x = 0;
while(i < argc )
{
if( 0 == strcmp(argv[i],"-n") ) /* もし-nだったらつぎの配列に行きなさい*/
{i++;
int atoi(const char *argv);/*-nのつぎは必ず数字なのでxに繰り返す分を代入させる*/
x = argv[i];
break;}
i++;
}
i = 0;
while(y < x){
while(i < argc)
{
if( 0 == strcmp(argv[i],"-s") ) /*もしも-sがあったら次の配列に行きなさい*/
{i++;
printf("%s ", argv[i]);/*つぎのはいれつは必ず繰り返させたい文字なのでそれを出力させなさい*/
break;}
i++;
}
i = 0;
y++;}
return 0;
}

エラー内容
1>c:\users\ozaki\desktop\c++\project\switch2\switch2\switch.cpp(17) : error C2440: '=' : 'char *' から 'int' に変換できません。
1> この変換が可能なコンテキストはありません。
1>ビルドログは "file://c:\Users\ozaki\Desktop\C++\project\switch2\switch2\Debug\BuildLog.htm" に保存されました。
1>switch2 - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
です
int atoi(const char *argv);/*-nのつぎは必ず数字なのでxに繰り返す分を代入させる*/
をやっているのになぜcharからintに変換できない?


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

Name: 天和  ..初心者(6,854ポイント)   Date: 2009/11/29(日) 20:45   No:42907     
Title: Re:コマンドプロンプト    
失礼
上のソースコードはsoftyaさんの書き込み見る前に修正してますので
if(argv[i] = '-s')は修正してませんので。


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

Name: box  ..ハッカー(147,436ポイント)   Date: 2009/11/29(日) 20:53   No:42909     
Title: Re:コマンドプロンプト    
もしよかったら、私の42870をごらんになってください。
あくまでも一つの例ですけれど。

とにかく、問題を小分けにして解決していきましょう。
1)コマンドライン引数の並びが正しいかどうかをチェック
  ・エラーのとき、プログラムを終了
2)コマンドライン引数から、出力回数を示す文字列と、出力したい文字列を取得
3)出力回数を示す文字列を数値に変換
4)前項で数値に変換した値の回数だけ、2)で取得した文字列を出力


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

Name: Hermit  ..プログラマー(25,862ポイント)   Date: 2009/11/29(日) 21:10   No:42912     
Title: Re:コマンドプロンプト    
たぶんその部分は、
 

if (0 == strcmp(argv[i], "-n")) { /* もし-nだったらつぎの配列に行きなさい */
i++;
x = atoi(argv[i]); /* ここでプロトタイプ宣言するのは変です */
/*-nのつぎは必ず数字なのでxに繰り返す分を代入させる*/
break;
}

でいいのではないかな。



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

Name: たかぎ [URL]  ..ハッカー(126,112ポイント)   Date: 2009/11/29(日) 21:21   No:42916     
Title: Re:コマンドプロンプト    
softyaさん
> たかぎさんと意見は違いますが、

意見はいろいろあってよいと思います。
ただ、今回にかぎれば...

> 私の書いたC言語でコンパイルする方法を守っていただければ問題ないと思います。

上記のアドバイスは伝わっていないようです。


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

Name: たかぎ [URL]  ..ハッカー(126,290ポイント)   Date: 2009/11/29(日) 21:32   No:42917     
Title: Re:コマンドプロンプト    
> すいませんGCCというのはMACのターミナルのことでしょうか?

GCCというのは、GNU Compiler Collectionの意味です。ターミナルではありません。
Xcodeについてくるのは、C, C++, Objective-C, Objective-C++に対応したコンパイラです。

ターミナルから、gccというコマンドを打ちますが、これがGCCでCまたはObjective-Cをコンパイルするときのコマンドです。
C++またはObjective-C++をコンパイルするときはg++というコマンドを使います。


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

Name: 天和  ..初心者(7,956ポイント)   Date: 2009/11/29(日) 21:44   No:42920     
Title: Re:コマンドプロンプト    
>高木さん

>>私の書いたC言語でコンパイルする方法を守っていただければ問題ないと思います。

>上記のアドバイスは伝わっていないようです。

いや、C言語にしたとたんとんでもなくエラーがでまして・・・
#include <stdio.h>

#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
int y;
i = 1;
y = 1;
int x;
x = 0;
while(i < argc )
{
if( 0 == strcmp(argv[i],"-n") ) /* もし-nだったらつぎの配列に行きなさい*/
{i++;
int atoi(const char *argv);/*-nのつぎは必ず数字なのでxに繰り返す分を代入させる*/
x = argv[i];
break;}
i++;
}
i = 0;
while(y < x){
while(i < argc)
{
if( 0 == strcmp(argv[i],"-s") ) /*もしも-sがあったら次の配列に行きなさい*/
{i++;
printf("%s ", argv[i]);/*つぎのはいれつは必ず繰り返させたい文字なのでそれを出力させなさい*/
break;}
i++;
}
i = 0;
y++;}
return 0;
}

エラー内容
1>------ ビルド開始: プロジェクト: switch2, 構成: Debug Win32 ------
1>コンパイルしています...
1>switch.cpp
1>c:\users\ozaki\desktop\c++\project\switch2\switch2\switch.cpp(10) : error C2143: 構文エラー : ';' が '型' の前にありません。
1>c:\users\ozaki\desktop\c++\project\switch2\switch2\switch.cpp(11) : error C2065: 'x' : 定義されていない識別子です。
1>c:\users\ozaki\desktop\c++\project\switch2\switch2\switch.cpp(16) : error C2143: 構文エラー : ';' が '型' の前にありません。
1>c:\users\ozaki\desktop\c++\project\switch2\switch2\switch.cpp(17) : error C2065: 'x' : 定義されていない識別子です。
1>c:\users\ozaki\desktop\c++\project\switch2\switch2\switch.cpp(17) : warning C4047: '=' : 間接参照のレベルが 'int' と 'char *' で異なっています。
1>c:\users\ozaki\desktop\c++\project\switch2\switch2\switch.cpp(22) : error C2065: 'x' : 定義されていない識別子です。
1>ビルドログは "file://c:\Users\ozaki\Desktop\C++\project\switch2\switch2\Debug\BuildLog.htm" に保存されました。
1>switch2 - エラー 5、警告 1
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
例えば
1>c:\users\ozaki\desktop\c++\project\switch2\switch2\switch.cpp(10) : error C2143: 構文エラー : ';' が '型' の前にありません。
y = 1;
int x;←これではだめなの?
x = 0;
とか


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

Name: 天和  ..初心者(8,124ポイント)   Date: 2009/11/29(日) 21:52   No:42922     
Title: Re:コマンドプロンプト    
>Hermitさん
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
int i;
int y;
i = 1;
y = 1;
int x;
x = 0;
while(i < argc )
{
if( 0 == strcmp(argv[i],"-n") ) /* もし-nだったらつぎの配列に行きなさい*/
{i++;
x = atoi(argv[i]);/*-nのつぎは必ず数字なのでxに繰り返す分を代入させる*/
break;}
i++;
}
i = 0;
while(y < x + 1){
while(i < argc)
{
if( 0 == strcmp(argv[i],"-s") ) /*もしも-sがあったら次の配列に行きなさい*/
{i++;
printf("%s ", argv[i]);/*つぎのはいれつは必ず繰り返させたい文字なのでそれを出力させなさい*/
break;}
i++;
}
i = 0;
y++;}
return 0;
}
でできましたありがとうございます。(c++)で
ってあれ?C言語にしても急にエラーがなくなった。
なんでだろう?


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

Name: たかぎ [URL]  ..ハッカー(126,427ポイント)   Date: 2009/11/29(日) 21:54   No:42923     
Title: Re:コマンドプロンプト    
> いや、C言語にしたとたんとんでもなくエラーがでまして・・・

規約にもあるように、「今行いたいことは何か」がよく分かりません。
C言語でプログラムを書くのであれば、C言語としてコンパイルするのが当然です。
C++とCは別の言語ですので、C++としてコンパイルしても無意味です。

> y = 1;
> int x;←これではだめなの?
> x = 0;
> とか

結局振り出しに戻ってしまいますが、C99ならOKです(この部分だけの話です)。
GCCの場合、-std=c99または-std=gnu99オプションを付けてコンパイルしてください。
Visual C++では(C言語としては)コンパイルできません。


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

Name: Hermit  ..プログラマー(26,072ポイント)   Date: 2009/11/29(日) 21:59   No:42924     
Title: Re:コマンドプロンプト    
・・・・・

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

Name: 天和  ..初心者(8,570ポイント)   Date: 2009/11/29(日) 22:00   No:42925 解決!     
Title: Re:コマンドプロンプト    
すいませんなぜかC言語にしても急にエラーがなくなりました。

最後に自分のへまなせいでたかぎさんに余分なプログラムを書くようさせてしまい申し訳ありませんでした
またsoftyaさん、nonさんを含むみなさまにもあきられながらも最後まで回答していただきまことにありがとうございました。
そして最後の最後で助け舟を出してくれたhermitさんありがとうございましたおかけで最後の仕上げができました。
では今日はここで閉め知らせていただきますみなさんありがとうございました。


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

Name: たかぎ [URL]  ..ハッカー(126,442ポイント)   Date: 2009/11/29(日) 22:06   No:42926     
Title: Re:コマンドプロンプト    
> すいませんなぜかC言語にしても急にエラーがなくなりました。

多分、何かの間違いです。


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

Name: softya  ..熟練のプログラマー(51,554ポイント)   Date: 2009/11/29(日) 22:17   No:42929     
Title: Re:コマンドプロンプト    
y = 1;
int x;←これではだめなの?
x = 0;

VC++のC言語だとだめですね。
宣言は、実行文より先にしてください。

>上記のアドバイスは伝わっていないようです。
エラーが出るから止めるってのは間違ってますね。
とりあえず、C言語には年代別に規格がありましてC89,C95,C99と呼ばれています。
問題なのは、C99規格で書いて良いかって事です。VC++2008のCコンパイラは、C95をほぼ網羅してますが、C99には準拠していません。
もし、C99で書きたいなら私も高木さん推薦のgccを選ぶべきだと思いますね。C++でC99もどきのコンパイルは止めたほうが良いです。VC++でコンパイルが通っても、gccでコンパイルが通らないコード作っても提出できないですからね。
あるいは、C95規格に則って書いてコードを書いてVC++のCコンパイラでもコンパイルが通るようにする事です。そうすればgccでもコンパイルが通ります。どちらかを選んでください。


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

Name: Hermit  ..プログラマー(26,657ポイント)   Date: 2009/11/29(日) 22:18   No:42930     
Title: Re:コマンドプロンプト    
とりあえず、どうにかなったみたいですね。
終わったみたいなので、私だったらこんな感じに書くかなって事で書いて遊んでみました。
 

#include <stdio.h>
#include <string.h>
#define NSTR "-n"
#define SSTR "-s"

e_exit(err)
int err;
{
fprintf(stderr,"Error");
exit(err);
}
main(argc,argv)
int argc;
char *argv[];
{
int argcount;
size_t optlen;
int n = 0;
char *s = "error\n";
// set -n
optlen = strlen(NSTR);
for (argcount = 1; argcount < argc; argcount++) {
if (strncmp(NSTR,argv[argcount],optlen) == 0) {
char *optstr = &argv[argcount][optlen];
if (*optstr == '\0') {
optstr = argv[argcount+1];
if (optstr == NULL)
e_exit(1);
}
n = atoi(optstr);
}
}
// set -s
optlen = strlen(SSTR);
for (argcount = 1; argcount < argc; argcount++) {
if (strncmp(SSTR,argv[argcount],optlen) == 0) {
char *ptr = &argv[argcount][optlen];
if (*ptr == '\0')
s = argv[argcount+1] ? argv[argcount+1] : s;
else
s = ptr;
}
}
// printf("-n = %d\n-s = %s\n",n,s);
while (n-- > 0)
printf("%s%c",s,n?' ':'\n');
return 0;
}

オプションがもっと増えるようだったら、
関数処理にするでしょうが、高々2個なので、
同じような処理を二つ羅列してます。
エラー処理は適当です(^^;


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

Name: たかぎ [URL]  ..ハッカー(126,377ポイント)   Date: 2009/11/29(日) 22:23   No:42931     
Title: Re:コマンドプロンプト    
Hermitさん
//で始まる1行コメントのC99からの仕様ですね。
Visual C+でもコンパイルはできますが、そういう問題ではない気がします。
それに、C99だとintの省略はできませんし。


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

Name: Hermit  ..プログラマー(26,753ポイント)   Date: 2009/11/30(月) 00:41   No:42942     
Title: Re:コマンドプロンプト    
ターゲットは VC++ だと書いてあったと思いましたが違ってましたか?
まあ、動かなければそれなりに動くようにするのが、プログラマだから、
気になるなら、質問するんじゃないでしょうか。

という意味で、新旧織り交ぜて描いています(えがいています)


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




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +