C言語何でも質問掲示板


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

規約と使い方

 
   どなたかよろしくお願 ....   
     ・[14423] バグ 
     ・[14424] しりうす〜 
     ・[14425] レイ 
     ・[14426] たかぎ 
     ・[14427] バグ 
     ・[14428] たかぎ 
     ・[14430] レイ 
     ・[14431] しりうす〜 
     ・[14432] レイ 
     ・[14433] たかぎ 
     ・[14470] はいぜる 
     ・[14478] やそ 
     ・[14479] しりうす〜 
   ゲーム終了   
     ・[14456] やそ 
     ・[14464] はね 
     ・[14477] やそ 
   敵のショット位置につ ....   
     ・[14051] 雷 
     ・[14052] やそ 
     ・[14068] TNB 
     ・[14071] TNB 
     ・[14073] やそ 
     ・[14074] TNB 
     ・[14077] やそ 
     ・[14093] 雷 
     ・[14103] 管理人 
     ・[14253] パソピ 
     ・[14255] 管理人 
     ・[14256] パソピ 
     ・[14257] 管理人 
     ・[14258] パソピ 
     ・[14417] パソピ 
     ・[14420] 雷 
     ・[14457] パソピ 
     ・[14458] 雷 
     ・[14473] パソピ 
     ・[14476] 雷 
   初歩的な質問と思いま ....   
     ・[14444] 雷 
     ・[14446] たかぎ 
     ・[14447] レイ 
     ・[14449] 雷 
     ・[14450] Mist 
     ・[14451] たかぎ 
     ・[14459] taku.net 
     ・[14461] レイ 
     ・[14468] tkmakwins15 
   int型を文字列に変換す ....   
     ・[14462] へろり 
     ・[14466] きつね 
   メニュー画面を作って ....   
     ・[14442] 雷 
     ・[14463] 管理人 
   [C]バイナリファイルか ....   
     ・[14454] やそ 
     ・[14455] しりうす〜 
   空白文字について   
     ・[14329] box 
     ・[14331] たかぎ 
     ・[14333] 雷 
     ・[14334] box 
     ・[14335] 雷 
     ・[14336] 雷 
     ・[14337] たかぎ 
     ・[14338] 雷 
     ・[14339] 雷 
     ・[14342] たかぎ 
     ・[14343] 雷 
     ・[14344] たかぎ 
     ・[14345] 雷 
     ・[14346] たかぎ 
     ・[14367] 雷 
     ・[14376] たかぎ 
     ・[14391] 雷 
     ・[14440] 雷 
     ・[14445] たかぎ 
     ・[14448] 雷 
   シューティングゲーム ....   
     ・[14382] YuO 
     ・[14408] 初心者 
     ・[14434] taku.net 
     ・[14439] 初心者 
     ・[14441] 雷 
   高速なrotate関数   
     ・[14379] 組木紙織 
     ・[14380] Justy 
     ・[14381] Justy 
     ・[14384] たかぎ 
     ・[14386] 組木紙織 
     ・[14389] たかぎ 
     ・[14390] たかぎ 
     ・[14414] 組木紙織 
     ・[14415] たかぎ 
     ・[14435] Hermit 
     ・[14436] たかぎ 
     ・[14437] Hermit 
   C言語についての質問で ....   
     ・[14321] 雷 
     ・[14322] たかぎ 
     ・[14324] ユウ 
     ・[14325] たかぎ 
     ・[14326] たかぎ 
     ・[14429] ユウ 
   自機への当たり判定   
     ・[14419] 雷 
     ・[14421] やそ 
     ・[144181205207651] しょう 
     ・[144181209734728] さ 
   落ち物ゲームの連鎖処 ....   
     ・[14410] シュバ 
     ・[14411] バグ 
     ・[14412] バグ 
     ・[14413] シュバ 
     ・[14416] シュバ 
   会社の宿題なんです   
     ・[14394] バグ 
     ・[14395] 通りすがり 
     ・[14396] たかぎ 
     ・[14397] ロート 
     ・[14398] たかぎ 
     ・[14407] Hermit 
   ライブラリについて   
     ・[14400] 雷 
     ・[14402] きつね 
     ・[14403] たかぎ 
     ・[14404] バグ 
     ・[14405] きつね 
   課題なんですが、教え ....   
     ・[14387] やそ 
     ・[14388] たかぎ 
   課題なんですが・・・   
     ・[14364] tkmakwins15 
     ・[14365] えあろ 
     ・[14366] box 
     ・[14368] 雷 
     ・[14369] えあろ 
     ・[14370] box 
     ・[14371] box 
     ・[14373] えあろ 
     ・[14374] box 
     ・[14375] えあろ 
     ・[14377] えあろ 
     ・[14385] たかぎ 
   C++/一定時間経過→次 ....   
     ・[14355] バグ 
     ・[14356] やそ 
     ・[14358] にゅうもんしゃ 
     ・[14359] バグ 
     ・[14360] 憂煉 
     ・[14361] バグ 
     ・[14362] GPGA 
   超初心者なんですが… ....   
     ・[14349] Justy 
     ・[14353] 黒 
     ・[14357] 黒 
   アニメーションについ ....   
     ・[14350] 管理人 
     ・[14352] ф魔理沙ф 
   書き忘れ?   
     ・[14312] 管理人 
     ・[14318] Ryu 
     ・[14351] 管理人 
   標準関数atofについて   
     ・[14233] box 
     ・[14234] たか 
     ・[14235] box 
     ・[14236] たかぎ 
     ・[14237] box 
     ・[14238] たかぎ 
     ・[14242] PK 
     ・[14244] たかぎ 
     ・[14261] PK 
     ・[14262] たかぎ 
     ・[14317] たか 
     ・[14332] たかぎ 
     ・[14341] たか 
   フレームスキップの実 ....   
     ・[14162] 管理人 
     ・[14164] 管理人 
     ・[14170] taku.net 
     ・[14176] 管理人 
     ・[14216] taku.net 
     ・[14225] 管理人 
     ・[14239] taku.net 
     ・[14245] 管理人 
     ・[14280] 管理人 
     ・[14340] taku.net 
   課題なんですが、お願 ....   
     ・[14062] けるびん 
     ・[14067] やそ 
     ・[14070] やそ 
     ・[14083] 紫乃 
     ・[14084] 紫乃 
     ・[14085] 紫乃 
     ・[14108] 紫乃 
     ・[14110] YuO 
     ・[14111] やそ 
     ・[14113] 紫乃 
     ・[14171] 紫乃 
     ・[14174] Justy 
     ・[14221] 紫乃 
     ・[14224] YuO 
     ・[14330] 紫乃 
   おもったような表示が ....   
     ・[14320] 雷 
     ・[14323] box 
   ダウンロード違法化に ....   
     ・[14279] 管理人 
     ・[14284] たかぎ 
     ・[14316] 雷 
   スペックについての「 ....   
     ・[14268] 管理人 
     ・[14271] GPGA 
     ・[14272] 匿名 
     ・[14274] 木霊 
     ・[14275] YuO 
     ・[14281] 管理人 
     ・[14282] parapara 
     ・[14283] メル 
     ・[14285] 管理人 
     ・[14286] arekku 
     ・[14287] 組木紙織 
     ・[14292] GPGA 
     ・[14299] 雷 
     ・[14300] クロカモ 
     ・[14301] 組木紙織 
     ・[14303] tkmakwins15 
     ・[14305] Justy 
     ・[14307] 木霊 
     ・[14308] 管理人 
     ・[14313] parapara 
     ・[14314] lbfuvab 
   こんな宿題が出ました ....   
     ・[14005] parapara 
     ・[14040] parapara 
     ・[14041] やそ 
     ・[14066] PK 
     ・[14168] のぶ 
     ・[14169] 組木紙織 
     ・[14217] 組木紙織 
     ・[14218] 組木紙織 
     ・[14220] たかぎ 
     ・[14240] PK 
     ・[14289] のぶ 
     ・[14290] のぶ 
     ・[14293] 組木紙織 
     ・[14309] のぶ 
     ・[14310] 組木紙織 
   音・画像の読み込みに ....   
     ・[14265] 管理人 
     ・[14270] GPGA 
     ・[14273] 管理人 
     ・[14306] サッシ 
   ** 雑談版 **   
     ・[14249] 管理人 
     ・[14259] tkmakwins15 
     ・[14260] クロカモ 
     ・[14264] 管理人 
     ・[14266] クロカモ 
     ・[14269] 管理人 
     ・[14295] tkmakwins15 
     ・[14296] 管理人 
     ・[14297] たかぎ 
     ・[14298] クロカモ 
     ・[14302] tkmakwins15 
   C言語のif文   
   無題   
     ・[14277] たにさん 
     ・[14288] へろり 

Name: レイ  ..ぴよぴよ(0ポイント)   Date: 2008/02/20(水) 16:47   No:14422       
Title: どなたかよろしくお願いします☆    
メモ帳でC言語のソースを作り、ソースのある場所に「これはブドウです。」という文を入れコマンドプロンプトでそのファイルを起動させると 「意味不明な語句 ブドウ」と出力し、エンターを押すと1.野菜 2.果物 の選択肢が出力され 2.を押しエンターを押すと「登録されました」と出力されるプログラムをつくりたいのですが、どなたかわかる方よろしくお願いします(^^)☆


Name: バグ  ..比類無きプログラマー(76,569ポイント)   Date: 2008/02/20(水) 16:55   No:14423     
Title: Re:どなたかよろしくお願いします☆    
質問の意味がよく分かりません…(@_@;)

>>メモ帳でC言語のソースを作り、ソースのある場所に「これはブドウです。」という文を入れコマンドプロンプトでそのファイルを起動させると…

1:ソースを作るだけなのですか?コンパイルしたりはしないのでしょうか?もし、実行ファイルを作成するならば開発環境を提示してください。

2:『そのファイル』とはどのファイルでしょうか?

3:『ファイルを起動させる』というのがどういう事でしょうか?


>>「意味不明な語句 ブドウ」と出力し、エンターを押すと1.野菜 2.果物 の選択肢が出力され 2.を押しエンターを押すと「登録されました」と出力されるプログラムをつくりたいのですが、どなたかわかる方よろしくお願いします(^^)☆


もう少し詳しい状況説明をよろしくお願いします(^^)☆


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

Name: しりうす〜  ..入門者(3,215ポイント)   Date: 2008/02/20(水) 17:03   No:14424     
Title: Re:どなたかよろしくお願いします☆    
ん?
名前変わってらっしゃるみたいですけど、先週の問題はもう解決したんでしょうか?
先週の問題解決してるなら、コマンドプロンプトからの起動くらいしか躓きそうな所は無いと思うのですが。


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

Name: レイ  ..ぴよぴよ(186ポイント)   Date: 2008/02/20(水) 17:34   No:14425     
Title: Re:どなたかよろしくお願いします☆    
バグさんへ☆
ソースを作り、メモ帳に「これはブドウです」で保存し、コマンドプロンプトでコンパイルし起動させ保存したファイル名を入力すると「意味不明な語句 ブドウ」と出力させたいです。で、エンターを押すと1.野菜 2.果物 の選択肢が出力され 2.を押しエンターを押すと「登録されました」と出力されるプログラムをつくりたいです。
しりうす〜さんへ☆
解決いたしました!


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

Name: たかぎ [URL]  ..プログラマー(32,795ポイント)   Date: 2008/02/20(水) 17:39   No:14426     
Title: Re:どなたかよろしくお願いします☆    
> ソースのある場所に「これはブドウです。」という文を入れ

ソースファイルが存在するディレクトリの意味ですか?
ソース中の特定の箇所の意味ですか?

> コマンドプロンプトで

このコマンドプロンプトは、Windowsのcmd.exeの意味ですか?
あるいは一般的なコマンドプロンプトの意味ですか?

> そのファイルを起動させると

インタープリタか何かで起動させるのでしょうか?
コンパイルするという意味でしょうか?
あるいは、もっと別の意味でしょうか?

>  「意味不明な語句 ブドウ」と出力し、
> エンターを押すと1.野菜 2.果物 の選択肢が出力され
> エンターを押すと「登録されました」と出力される

どこに、出力するのでしょうか?

> 2.を押し

「2.」というキーか何かがあるプラットフォームなのでしょうか?

> どなたかわかる方よろしくお願いします(^^)☆

今のままでは残念ながら分かりません。
多分こうだろうと解釈したソースを貼っておきます。
#include <stdio.h>

#include <stdlib.h>

/* 「これはブドウです。」 ← ある場所 */

int main(void)
{
puts("「意味不明な語句 ブドウ」");

int c = getchar();
if (c != '\n') return EXIT_FAILURE;
puts("1.野菜 2.果物");

char s[sizeof("2.") + 1];
char format[256];
sprintf(format, "%%%us%%c", sizeof(s));
scanf(format, s, &c);
if (c != '\n') return EXIT_FAILURE;
puts("「登録されました」");

return EXIT_SUCCESS;
}


全く自信はありません。


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

Name: バグ  ..比類無きプログラマー(76,793ポイント)   Date: 2008/02/20(水) 17:42   No:14427     
Title: Re:どなたかよろしくお願いします☆    
つまり…

1:あらかじめ『これはブドウです』と入力されたテキストファイルを作成しておく
2:プログラムを実行すると、文字の入力待ち状態になる
3:入力された文字が1で作成されたファイルのパスであれば『これはブドウです』という文字列から『ブドウ』というキーワードを抜き出して『意味不明な語句 ブドウ』と表示する
4:エンターが入力されるまで待ち、『1.野菜 2.果物』と画面に表示して1か2を入力させる
5:2を選択した場合に『登録されました』と表示する

という流れでよいのでしょうか?


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

Name: たかぎ [URL]  ..プログラマー(33,121ポイント)   Date: 2008/02/20(水) 17:42   No:14428     
Title: Re:どなたかよろしくお願いします☆    
一部修正します。
#include <stdio.h>

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

/* 「これはブドウです。」 ← ある場所 */

int main(void)
{
puts("「意味不明な語句 ブドウ」");

int c = getchar();
if (c != '\n') return EXIT_FAILURE;
puts("1.野菜 2.果物");

char s[sizeof("2.") + 1];
char format[256];
sprintf(format, "%%%us%%c", sizeof(s));
scanf(format, s, &c);
if (strcmp(s, "2.") != 0 || c != '\n') return EXIT_FAILURE;
puts("「登録されました」");

return EXIT_SUCCESS;
}


いずれにせよ、自信はありません。


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

Name: レイ  ..ぴよぴよ(196ポイント)   Date: 2008/02/20(水) 17:55   No:14430     
Title: Re:どなたかよろしくお願いします☆    
バグさんへ
あ、その通りです(^^;)…


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

Name: しりうす〜  ..入門者(3,461ポイント)   Date: 2008/02/20(水) 18:19   No:14431     
Title: Re:どなたかよろしくお願いします☆    
課題の意図をまるっきり無視して作るなら、たかぎさんの載せて下さっているプログラムにファイル名("これはブドウです。"と書いたファイル名をソースにべた書きで)の判定を入れれば完成ですw

課題の意図を汲むと"これはブドウです。"の文章から"ブドウ"を切り出す際の条件が無いと、プログラムが組みにくいのかな("ブドウ"が出るまで文字列比較で良いとはいえ、汎用性考える人からすると。発展系で"オレンジ"とかもありそうですし)。

前回の問題で文字の入出力はできてるみたいですので、もう少しですね。
頑張ってください。



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

Name: レイ  ..ぴよぴよ(332ポイント)   Date: 2008/02/20(水) 18:25   No:14432     
Title: Re:どなたかよろしくお願いします☆    
たかぎさんへ
ありがとうございます。自分の最終的目標は、ワードやメモ帳などの文章から、名詞や専門用語を抜き出すプログロムを作ることです。そして、抜き出された語句を表示し、自分が数字キーをたたいて 車 人 モノ 植物などに振り分け登録、保存しコンピュータが日々知識を蓄え文字で会話できるようなプログラムをつくりたいです☆
今後ともよろしくお願いします(^^)


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

Name: たかぎ [URL]  ..プログラマー(33,232ポイント)   Date: 2008/02/20(水) 19:29   No:14433     
Title: Re:どなたかよろしくお願いします☆    
最初の質問内容からは予想もつかない話になっていますが...

自然な文を解析するには、「形態素解析」について調べるとよいでしょう。
「茶筌」というツールないしはライブラリがありますので、使えるかもしれません。



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

Name: はいぜる  ..ぴよぴよ(19ポイント)   Date: 2008/02/22(金) 09:40   No:14470     
Title: Re:どなたかよろしくお願いします☆    
正直なところ面白半分でみていましたが(失礼)

>>コンピュータが日々知識を蓄え文字で会話できるようなプログラム
というのには少し興味をいだきました。
がんばってください(・・b


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

Name: やそ  ..上級者(24,387ポイント)   Date: 2008/02/22(金) 13:26   No:14478     
Title: Re:どなたかよろしくお願いします☆    
車に搭載してKIT2000(ナイトライダー)のようにおしゃべりしたいね^^


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

Name: しりうす〜  ..入門者(3,676ポイント)   Date: 2008/02/22(金) 13:33   No:14479     
Title: Re:どなたかよろしくお願いします☆    
<a href="http://www.din.or.jp/~ohzaki/uzura.htm" target="_blank">

こんなのもありましたねぇ。
利用者の話題が特定の分野に偏ると、なかなか笑える発言がされてたり。



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



Name: c  ..ぴよぴよ(297ポイント)   Date: 2008/02/21(木) 10:56   No:14452       
Title: ゲーム終了    
シューティングの館のサンプルを使って作成したいのですが、シューティング(サンプル)の最後の敵が消えたら『ゲームクリア』と表示させたいのですがどうしたら良いですか?自分なりに頑張ってやろうと思っているのですが、どこをどう変えて良いのかさっぱりわかりません。どういう風に書いたら良いかどうか教えてもらえませんか?(ソースはサンプルのままです)

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


Name: やそ  ..上級者(24,271ポイント)   Date: 2008/02/21(木) 17:04   No:14456     
Title: Re:ゲーム終了    
敵の出現は
EnemyCalc()
でswitch文で判断されていると思います。
ゲーム開始○秒後に出現する敵・・・etc

でゲームの最後に出現する敵がいますよね。
その敵が出現後(counterで分かりますね)以降
敵が全て消滅したらenemy[s].flagが全て0ならゲームクリアと言う判断じゃだめでしょうか?
最後の敵の出現がcounterが20000として

if(counter>=20000){
for(s=0;s<100;s++){
if(enemy[s].flag==1)
break;
}
}

if(s==100)
ゲームクリア

みたいな感じでしょうか?(ウソかもしれません。シューティング作ったことないし^^;)


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

Name: はね  ..初心者(5,767ポイント)   Date: 2008/02/22(金) 02:19   No:14464     
Title: Re:ゲーム終了    
私も同じことを考えたことがありまして、
その時は最後の敵のフラグを普段出現する敵のフラグではない数字にしてみました。
例えば、出現していない=0 ザコ出現=1 ボス出現=2のようにし、

if(敵を倒したら)
if(その敵のフラグが2なら)
クリアー

のような処理をさせてみました。
参考までにどうぞ


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

Name: やそ  ..上級者(24,354ポイント)   Date: 2008/02/22(金) 13:22   No:14477     
Title: Re:ゲーム終了    
ボス敵がいて、他にどんな雑魚がいようとボスさえ倒せばゲームクリアという形なら
はねさんの案でもいけるんじゃないでしょうか。

私は最後の敵と言う表現しか聞いていないので、他の敵と立場が同じと考えた場合の案でした。


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



Name: TNB  ..ぴよぴよ(88ポイント)   Date: 2008/02/05(火) 12:39   No:14048       
Title: 敵のショット位置について    
初めまして、いつも拝見させてもらってます。ここのソースファイルを写していたんですが、敵が移動しても敵のショットの出る場所が変わりません。また、敵を倒してもショットが出続けるんですけど、どうすればいいか教えてください。

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


Name:  ..上級者(23,627ポイント)   Date: 2008/02/05(火) 13:51   No:14051     
Title: Re:敵のショット位置について    
敵の現在位置をショットの初期位置に設定する。
条件文を利用して、敵が死んだ場合のフラグを立てる。
フラグにしたがって弾を発射するかどうか決める。

ソースないので、これぐらいかな?


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

Name: やそ  ..上級者(20,443ポイント)   Date: 2008/02/05(火) 14:45   No:14052     
Title: Re:敵のショット位置について    
ソースがないのでなんとも断定できませんが、

シューティングゲームの館に
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
弾が持つべき構造体の情報は以下これだけあります。

 ・弾が発射されたかどうかを示すflag

 ・弾がどんなパターンの動きをするか示すpattern

 ・弾が発射されて何カウントたったかカウントするcount

 ・弾が何の画像であるか示すimg

 ・弾が発射した瞬間の初期座標を示す mem_ex , mem_ey ※1

 ・弾が発射した瞬間のプレイヤーの座標を示すmem_px , mem_py ※2

 ・敵が弾を発射した時の位置と、プレイヤーの位置から計算した弾の飛んでくる角度ラジアンを示すAngle[ENEMY_TOTAL_SHOT_NUM];//[200] ※3

 ・そして、先ほど構造体で示した、200個のココの弾情報EnemyShots[ENEMY_TOTAL_SHOT_NUM]; //[200] ※4

沢山ありますが、全部で弾が持つべき情報はこれだけあります。

※1:発射した瞬間の初期座標は、敵が発射するわけですから、その時の敵の座標になります。

※2:プレイヤーがいる場所へショットをうつパターンの時に必要になります。

※3:時間差で弾を発射するときもあるので、角度を格納する変数は弾の数だけ用意する。

※4:構造体の中に、構造体をここで宣言しています。

これらの事を実際プログラムで宣言するとこうなります。

//個々の弾が持つ情報

typedef struct{
int flag;
double x,y;
} ENEMY_SHOTS_t;

//1組の弾が持つ情報
typedef struct{
int flag,pattern,counter,img;
double mem_ex,mem_ey,mem_px,mem_py,Angle[ENEMY_TOTAL_SHOT_NUM];//[200];
ENEMY_SHOTS_t EnemyShots[ENEMY_TOTAL_SHOT_NUM];//[200];
} ENEMY_SHOT_t;

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
とありますのでもう一度読み返されることをオススメします。
(以上、宣伝でした(笑))


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

Name: TNB  ..ぴよぴよ(20ポイント)   Date: 2008/02/06(水) 12:00   No:14068     
Title: Re:敵のショット位置について    
返信遅れてすいません。わかりました。もう一度よく見直してみます。また質問などでてくると思いますが宜しくお願いします。

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

Name: TNB  ..ぴよぴよ(868ポイント)   Date: 2008/02/06(水) 14:36   No:14071     
Title: Re:敵のショット位置について    
シューティングの館のソース見てきました、多分ここだと思うんですけど
void EnemyShotPattern2(int i){
for(int j=0;j<10;j++){//計10発撃つ
if(EnemyShot[i].counter==20*j){//20カウントに1回ずつ発射。
EnemyShot[i].EnemyShots[j].flag=1;//発射フラグをたてる
EnemyShot[i].EnemyShots[j].x=EnemyShot[i].mem_ex;//弾の初期座標に敵の座標を代入
EnemyShot[i].EnemyShots[j].y=EnemyShot[i].mem_ey;//y同様
//敵とプレイヤーとの角度を計算
EnemyShot[i].Angle[0] = atan2(EnemyShot[i].mem_py-EnemyShot                     [i].mem_ey,EnemyShot[i].mem_px-EnemyShot[i].mem_ex);
StopSoundMem(sound_enemy_shot[0]);//前の音がかぶさらないようにショットの音を                             消し
PlaySoundMem(sound_enemy_shot[0],DX_PLAYTYPE_BACK);//ショット音を流す
}
EnemyShot[i].EnemyShots[j].x+=PATTERN1SPEED*cos(EnemyShot[i].Angle[0]);//x座標の増                                            加
EnemyShot[i].EnemyShots[j].y+=PATTERN1SPEED*sin(EnemyShot[i].Angle[0]);//y座標の増                                      加
}
}

これだと、敵が移動しながら弾を発射すると、最初に弾を発射した座標からしか弾が発射されません。移動しながら弾を撃つ場合、どうすればいいか、教えてもらえると助かります。


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

Name: やそ  ..上級者(21,558ポイント)   Date: 2008/02/06(水) 15:48   No:14073     
Title: Re:敵のショット位置について    
弾を撃つことだけ見れば、TNB さんの思っている通り
「最初に弾を発射した座標からしか弾が発射されません。」
となるかもしれません。

問題は
EnemyShot[i].mem_ex

に敵の座標をいつ入れるのか。のほうじゃないでしょうか?

概念説明のところに、

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
発射させるのは簡単です。発射フラグを立てるだけです。

つまりenemy[i].flag=1;をするのです。

ただ、発射に際して、先ほど構造体で宣言しただらだらした情報を色々初期化する必要があります。

一つ一つみていってください。


void EnemyPattern2(int i){
int j;
if(enemy[i].counter<50)
enemy[i].y+=4.0f;

if(enemy[i].counter==75){//エネミーカウンターが75の時
for(j=0;j < ENEMY_TOTAL_NUM ;j++)//発射されていない弾を探す。
if(EnemyShot[j].flag==0)//あったらそこでiを保持してブレイク
break;
EnemyShot[j].flag=1;//発射フラグを立てる
EnemyShot[j].mem_ex=enemy[i].x;//弾の初期x座標を敵の座標から設定する
EnemyShot[j].mem_ey=enemy[i].y;//同様y

EnemyShot[j].mem_px=Player.x;//うつ瞬間のプレイヤーの座標を記憶
EnemyShot[j].mem_py=Player.y;//同様y
EnemyShot[j].counter=0;//カウンターを初期化
EnemyShot[j].pattern=1;//ショットパターン1とする※1
EnemyShot[j].img=0;//画像タイプは0とする※2
}

if(enemy[i].counter>100)
enemy[i].y-=4.0f;
}

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
があります。(敵の移動パターンルーチン)
コレをしっかり記述してあれば、敵の移動によってきちんと弾座標に反映されるはずです。

どうでしょうか?


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

Name: TNB  ..ぴよぴよ(978ポイント)   Date: 2008/02/06(水) 16:43   No:14074     
Title: Re:敵のショット位置について    
返信有難うございます。やそさんの書いてくださったソースはenemy.cppのやつですよね?赤色にのソースの部分をどこかに代入すればいいんでしょうか?普通にコンパイルして実行しても、連続射撃の弾は最初に発射された座標から出てきてしまうんですが。

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

Name: やそ  ..上級者(21,727ポイント)   Date: 2008/02/06(水) 17:40   No:14077     
Title: Re:敵のショット位置について    
連続ショットですか。まあ、連続であろうと単独のボムであろうと関係なさそうですが。

どこかに代入すれば・・・ってどこにも書いてないんですか?
敵は移動するんですよね?
敵の実体(画)が移動しているなら、その移動の仕方にあった移動パターンの関数を通過していますよね?
その移動パターンの関数に追加すればいいんじゃないですか?

敵がある地点から弾を撃つ
弾発射
敵移動
弾発射
敵移動



と言う流れで処理が行われていれば、必ず反映されるはずなんですが・・・

これ以上はTNBさんがソースをさらさない限り突き詰められません^^;
(なんか意識のずれもチョット感じていたり・・・)


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

Name:  ..上級者(23,490ポイント)   Date: 2008/02/07(木) 03:02   No:14093     
Title: Re:敵のショット位置について    
各関数や変数は何をしているのかの説明を自分で付け加える。
弾が発射される座標を示しているのを見つける。
これが、いつ更新されているか見つける。
その更新しているときが、毎回呼ばれているか?
そのとき、代入されている座標は?

適当に抜き出して切り貼りしたってプログラムにはならないので、各々が何を示しているかを意識してみてください^^
多分大変かと思いますが、何度もそうやって見ていると自然となれるはずです。


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

Name: 管理人  ..伝説のハッカー(509,857ポイント)   Date: 2008/02/07(木) 14:56   No:14103     
Title: Re:敵のショット位置について    
本当にあちこちで、混乱されている方がいらっしゃるようで、責任感じています;

シューティングの館は近々全く違うものにリニューアル予定です。
しばしお待ち下さい・・。

サンプルソースの中で、
「敵の情報」と「ショットの情報」とは全く分離して作られています。
そのせいで、敵が死んでもショットには影響しません。

敵の情報は
「こういう風に出て、ここでAを発射」
という感じ。

ショットの情報は
「受け取った座標でAを発射し続ける」
と言う感じ。

そこで、ショット情報に「どの敵(n)から発射されたものか」を示す変数を追加し、
nの敵が死んだら、そのショットはもう登録しない、起動計算のみ行うように変更してください。


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

Name: パソピ  ..かけだし(1,809ポイント)   Date: 2008/02/13(水) 11:48   No:14253     
Title: Re:敵のショット位置について    
ショット位置についての過去ログを調べているとここに行き着いたので質問させてください。

>ショット情報に「どの敵(n)から発射されたものか」を示す変数を追加し、
nの敵が死んだら、そのショットはもう登録しない、起動計算のみ行うように変更してください。

とありますが、これは「シューティングゲームの館」で公開している「enemy.cpp」のソース内のswitch文

void EnemyCalcDisp(){
int i;
for(i=0;i<100;i++)
if(enemy[i].flag==0)
break;
switch(counter){//今回はパターン2の動きだけさせる
case 50:
enemy[i].pattern=2; //どういう軌道を描くか
enemy[i].flag=1; //出現フラグを立てる
enemy[i].counter=0;//出現して何カウント目か測るカウンター初期化
enemy[i].size=0.5f;//敵の大きさ
enemy[i].x=100.0; //xの初期座標
enemy[i].y=-10.0; //yの初期座標
break;
default:
break;
}

int enemy_img[8]={0,1,2,3,4,3,2,1};
for(i=0;i<100;i++){
if(enemy[i].flag==1){
enemy[i].counter++;
DrawRotaGraph( (int)enemy[i].x , (int)enemy[i].y , enemy[i].size , 0.0f , img_enemy1[enemy_img[counter%32/4]] , TRUE ) ;
if(enemy[i].x<0.0-MONSTER1_X_SIZE/2.0*enemy[i].size || enemy[i].x>420.0+MONSTER1_X_SIZE/2.0*enemy[i].size ||
enemy[i].y<0.0-MONSTER1_Y_SIZE/2.0*enemy[i].size || enemy[i].y<0.0-MONSTER1_Y_SIZE/2.0*enemy[i].size)
enemy[i].flag=0;
}
}
}

の中にある、enemy[i]をenemy_shot.cppに認識させるという事なのでしょうか?
それとも新しい変数をenemy_shot.cpp内に作るという事でしょうか?


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

Name: 管理人 [URL]  ..伝説のハッカー(520,079ポイント)   Date: 2008/02/13(水) 12:41   No:14255     
Title: Re:敵のショット位置について    
ショット情報と敵情報は全く違うものとして扱っています。
よって、どの敵から発射された弾かという情報は弾に持たせないといけません。
enemy[i]のiが敵のIDだとするなら、そのIDを弾情報に持たせ、
そのIDが無効になったら(敵が倒されたら)、
EnemyShotPattern関数で弾を登録しないようにしないといけません。


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

Name: パソピ  ..入門者(3,915ポイント)   Date: 2008/02/13(水) 14:25   No:14256     
Title: Re:敵のショット位置について    
回答ありがとうございます。

敵のIDを弾情報に持たせるには、
EnemyShot[ENEMY_TOTAL_NUM]の構造体にenemy[ENEMY_TOTAL_NUM]を追加することで可能になるのではないかと私は考えたのですが、どうやら間違っているようで・・・

下記はGlobalVariable.hとenemy_shot.cppのソースです。


----------------------------GlobalVariable.h-----------------------------------

//敵
typedef struct{
double x,y,size;
int flag,counter,hp,pattern,range;
} BODY_enemy_t;

BODY_enemy_t enemy[ENEMY_TOTAL_NUM]; //[100]


//個々の弾の情報
typedef struct{
int flag;
double x,y,angle,disp_angle,speed;
} ENEMY_SHOTS_t;

//ENEMY_SHOTS_t EnemyShots[ENEMY_TOTAL_SHOT_NUM]; //[200];


//1組の弾の情報
typedef struct{
int flag,pattern,counter,img;
// double mem_ex,mem_ey,mem_px,mem_py,Angle[ENEMY_TOTAL_SHOT_NUM]; //[200];
double mem_ex,mem_ey,mem_px,mem_py,Enx[60],Eny[60]; //[200];
ENEMY_SHOTS_t EnemyShots[ENEMY_TOTAL_SHOT_NUM]; //[200];
BODY_enemy_t enemy[ENEMY_TOTAL_NUM]; //[100]
} ENEMY_SHOT_t;

ENEMY_SHOT_t EnemyShot[ENEMY_TOTAL_NUM]; //[100];



-----------------------------------enemy_shot.cpp--------------------------------------
//敵のショットパターン3
void EnemyShotPattern3(int i){
for(int j=0;j<10;j++){
if(EnemyShot[i].counter==20*j){
if(EnemyShot[i].enemy[i].flag=1){ //弾を発射する敵が出たら
EnemyShot[i].EnemyShots[j].flag=1; //発射フラグを立てる
EnemyShot[i].EnemyShots[j].x=EnemyShot[i].mem_ex;
EnemyShot[i].EnemyShots[j].y=EnemyShot[i].mem_ey;
//現在のプレイヤーの座標と、弾の初期座標からそれぞれ角度を計算する。
EnemyShot[i].EnemyShots[j].angle = atan2(Player.y-EnemyShot[i].mem_ey, Player.x-EnemyShot[i].mem_ex);
StopSoundMem(sound_enemy_shot[0]);
PlaySoundMem(sound_enemy_shot[0],DX_PLAYTYPE_BACK);
}
EnemyShot[i].EnemyShots[j].x+=PATTERN1SPEED*cos(EnemyShot[i].EnemyShots[j].angle);
EnemyShot[i].EnemyShots[j].y+=PATTERN1SPEED*sin(EnemyShot[i].EnemyShots[j].angle);
}else{
break; //敵のフラグが1以外(倒されたら)ループを抜ける
}
}
}


このようにソースを変更してみたのですが、発射された弾はその場で停滞するような動作になってしまいました。
質問ばかりで申し訳ありませんが、回答よろしくお願いします。



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

Name: 管理人 [URL]  ..伝説のハッカー(520,305ポイント)   Date: 2008/02/13(水) 16:52   No:14257     
Title: Re:敵のショット位置について    

一番簡単なのは・・

typedef struct{
int flag,id;
double x,y,angle,disp_angle,speed;
} ENEMY_SHOTS_t;

ここにidを追加し、どの敵から発射されたものかを記憶します。
敵は弾にあたったらflagを2にします。
敵の描画はflagが1の時のみ行います。
idの敵のflagが2の時は発射しないようにします。
全ての弾が画面外になったら、idの敵のフラグは0にします。


・・とこれが一番早い実装ではないでしょうか。

しかし、お遊び程度しか対応しないこのコード・・。
本格的に作ることが出来ません。
もし本格的に作るのならば、「ステージの作り方」のトピの最後にあるサンプルを参考に、ご自分でお作りになったほうがいいかもしれません(_ _|||)
HPの更新が遅くなってすみません(汗




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

Name: パソピ  ..入門者(3,762ポイント)   Date: 2008/02/13(水) 17:53   No:14258     
Title: Re:敵のショット位置について    
すばやい回答ありがとうございます。
管理人さんの方法で試してみようと思います。

管理人さんも色々忙しいと思うので、更新できないのは仕方ないと思います。
しかし、管理人さんのHPはかなり参考にしていますし、私にとってとても役立っています。
これからもサイト運営頑張ってください!!

また分からない事があったら質問をするかもしれませんが、そのときはよろしくお願いしますm(_ _)m


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

Name: パソピ  ..初心者(5,275ポイント)   Date: 2008/02/20(水) 11:17   No:14417     
Title: Re:敵のショット位置について    
またまた失礼します。
敵のショット位置について考察していたのですが、どうもうまくいきません。if文の分岐がちゃんとしていないのが原因だと思うのですが、なかなか解決しないためまた質問させてください。


先日アドバイスをいただいたことを参考に、敵の弾情報に変数idをもたせ、それをショットパターン内のif文で分岐させようと考えたプログラムです。これだと今までのように、ショットの動作に入ってしまった敵を倒しても弾が出続けてしまいます。

お忙しいとは思いますが、回答のほうよろしくお願いします。


------------------------------------GlobalVariable.h-----------------------------------------------
//敵
typedef struct{
double x,y,size;
int flag,counter,hp,pattern,range;
} BODY_enemy_t;

BODY_enemy_t enemy[ENEMY_TOTAL_NUM]; //[100]


//個々の弾の情報
typedef struct{
int flag,id;
double x,y,angle,disp_angle,speed;
} ENEMY_SHOTS_t;

//ENEMY_SHOTS_t EnemyShots[ENEMY_TOTAL_SHOT_NUM]; //[200];


//1組の弾の情報
typedef struct{
int flag,pattern,counter,img;
double mem_ex,mem_ey,mem_px,mem_py,Enx[60],Eny[60]; //[200];
ENEMY_SHOTS_t EnemyShots[ENEMY_TOTAL_SHOT_NUM]; //[200];
BODY_enemy_t enemy[ENEMY_TOTAL_NUM]; //[100]
} ENEMY_SHOT_t;

ENEMY_SHOT_t EnemyShot[ENEMY_TOTAL_NUM]; //[100];


------------------------------------player.cpp-----------------------------------------------
//自機のショットと敵の当たり判定処理
void CollisionDetection(){
for(int i=0;i<PLAYER_MAX_SHOT1;i++){ //ショットの全列分
for(int j=0;j<PLAYER_MAX_SHOT2;j++){ //1列全弾分
if(PlayerShot[i][j].flag==1){ //その弾が発射中なら
for(int s=0;s<ENEMY_TOTAL_NUM;s++){ //全敵100体分
if(enemy[s].flag==1){ //その敵が出現中なら
double x,y;
int range;
x=(int)(PlayerShot[i][j].x-enemy[s].x);
y=(int)(PlayerShot[i][j].y-enemy[s].y);
switch(i){
case 0: //0列目と
case 5: //5列目と
case 6: //6列目の
range=12; //大きさは半径12
break;
default:
range=9; //大きさは半径9
break;
}

//当たり判定処理
if((int)sqrt(x*x+y*y) < range+enemy[s].range){ //当たり判定内なら
PlayerShot[i][j].flag=0;
enemy[s].hp--;
if(enemy[s].hp==0){
EnemyShot[i].EnemyShots[j].id=enemy[s].flag=2;
enemy[s].flag=0; //表示フラグを戻す
//EnemyShot[s].flag=0;
PlayerShot[i][j].flag=0; //当たった弾を消す
if(CheckSoundMem(sound_enemy_death)==1){ //消滅音が鳴っていなかったら
StopSoundMem(sound_enemy_death); //とめて
}
PlaySoundMem(sound_enemy_death, DX_PLAYTYPE_BACK); //消滅音を鳴らす
}
}
}
}
}
}
}
}

------------------------------------enemy_shot.cpp-----------------------------------------------
void EnemyShotPattern3(int i){
for(int s=0;s<ENEMY_TOTAL_NUM;s++){
if(enemy[s].flag==1){
break;
}
}
for(int j=0;j<10;j++){
EnemyShot[i].EnemyShots[j].id=enemy[s].flag=1;
if(EnemyShot[i].counter==20*j){
if(EnemyShot[i].EnemyShots[j].id=enemy[s].flag==1){
printfDx("1"); //テスト用に表示
EnemyShot[i].EnemyShots[j].flag=1;
EnemyShot[i].EnemyShots[j].x=EnemyShot[i].mem_ex;
EnemyShot[i].EnemyShots[j].y=EnemyShot[i].mem_ey;
//現在のプレイヤーの座標と、弾の初期座標からそれぞれ角度を計算する。
EnemyShot[i].EnemyShots[j].angle = atan2(Player.y-EnemyShot[i].mem_ey, Player.x-EnemyShot[i].mem_ex);
StopSoundMem(sound_enemy_shot[0]);
PlaySoundMem(sound_enemy_shot[0],DX_PLAYTYPE_BACK);
}
if(EnemyShot[i].EnemyShots[j].id=enemy[s].flag==2){
printfDx("2"); //テスト用に表示
}
}
EnemyShot[i].EnemyShots[j].x+=PATTERN1SPEED*cos(EnemyShot[i].EnemyShots[j].angle);
EnemyShot[i].EnemyShots[j].y+=PATTERN1SPEED*sin(EnemyShot[i].EnemyShots[j].angle);
}
}



同じ質問ばかりで申し訳ありませんが、よろしくお願いします。


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

Name:  ..プログラマー(27,857ポイント)   Date: 2008/02/20(水) 15:55   No:14420     
Title: Re:敵のショット位置について    
EnemyShotPattern3 はいつ呼び出されていますか?

>//当たり判定処理
の後で呼び出さないと、いくら変数を変更しても無駄ではないでしょうか?

処理順として、
味方のキーが押されているか
 押されたときの処理
味方が過去に撃った弾が敵に当たっているか
 あたっていたら、敵の削除(ここで弾のフラグをOFFへ
敵の弾が味方にあたっていないか
 あたっていたら、その処置
敵が弾を発射するタイミングであるかどうか判定
 YESは一発発射(連射は時間によって遅らせたほうが良いかと思いますがどうでしょうか?


例えば、一秒間に6発打つ
タイマーでカウントして、前回のカウントからどれだけ変化しているか、
 弾を撃つ回数を超えていないかどうか
  1/6秒経過したかどうか
   していたら、発射 & 発射した時間を保存
   そして、この弾は何発目かを保存

こんな感じ?
時間を使って処理するので、キャラクター(敵味方)は時間を持つものとして変数を作る。
自分の処理順が回ってくるたびに、時間を取得して
 現在取得した時間 − 過去の時間 =x
として、それぞれのキャラが持っている時間から引く
 キャラの時間 -= x
弾を一発撃つたびにキャラの時間に1/6秒追加する
 ・・・ += 1/6

こんな処理を考えてみてはどうでしょうか?
ただ、敵が多くなると処理速度が遅くなりそうなので、全然実用化出来そうにないんですが・・・ww

あと、(ここが一番まとも!?
enemy_shot.cppの
for(int j=0;j<10;j++){
でまわしているところが、打ってるところかな?って思うのですが・・・これだと当たり判定処理あるんでしょうか?


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

Name: パソピ  ..初心者(6,165ポイント)   Date: 2008/02/21(木) 18:32   No:14457     
Title: Re:敵のショット位置について    
回答ありがとうございます。
返事が遅れてしまい申し訳ありません。


>EnemyShotPattern3 はいつ呼び出されていますか?
これは、enemy.cppのほうに書いてあるEnemypattern2のなかで呼び出しています。
ほぼサンプルのままですが…

-----------------------------enemy.cpp-----------------------------------

//敵のパターン2
void EnemyPattern2(int i){
if(enemy[i].counter<50){
enemy[i].y+=4.0f;
}
if(enemy[i].counter==75){
for(int j=0;j<ENEMY_TOTAL_NUM;j++){
if(EnemyShot[j].flag==0){
break;
}
}
EnemyShot[j].mem_ex=enemy[i].x; //敵のx座標
EnemyShot[j].mem_ey=enemy[i].y; //敵のy座標
EnemyShot[j].mem_px=Player.x; //プレイヤーのx座標
EnemyShot[j].mem_py=Player.y; //プレイヤーのy座標
EnemyShot[j].counter=0; //弾が発射されてからのカウンターの初期化
EnemyShot[j].flag=1; //弾が発射されたことを示すフラグを1に

EnemyShot[j].pattern=3; //ショットパターンは3を指定

EnemyShot[j].img=0; //弾の画像

}
if(enemy[i].counter>200){
enemy[i].y-=4.0f;
}
}





雷さんのアドバイスが私の頭でこんがらがっているので、勉強して理解したいと思います。
すみません…orz


>あと、(ここが一番まとも!?
>enemy_shot.cppの
>for(int j=0;j<10;j++){
>でまわしているところが、打ってるところかな?って思うのですが・・・これだと当たり判定処理あるんでしょうか?

そのとおりです。シューティングゲームの館にある「プレイヤーのいる方向に弾を10個発射」というプログラムを少し改変したものです。

plyaer.cppの中の
EnemyShot[i].EnemyShots[j].id=enemy[s].flag=2;
で、idに敵の情報を入れ、enemy_shot.cppの中でif分岐させようと考えています。
おそらくここのif文の処理が原因だと思います。



せっかく回答していただいたのに返信がかなり遅れてしまってすみませんでしたm(_ _)m


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

Name:  ..プログラマー(28,998ポイント)   Date: 2008/02/21(木) 22:35   No:14458     
Title: Re:敵のショット位置について    
説明へたですいません^^;
いいたかったことを実装してみた。

弾がそろってない、絵が入ってない
など、いろいろありますが・・・・・・・

とりあえず実行は出来ます。
エンターで途切れます(敵の攻撃…みたいなものが

これでわかってもらえるかな?

シューティングの館はほとんどやっていないので、構成がさっぱりです^^;


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

Name: パソピ  ..初心者(6,300ポイント)   Date: 2008/02/22(金) 10:39   No:14473     
Title: Re:敵のショット位置について    
雷さんおはようございます。

雷さんのソースコードをダウンロードし、弾と絵を用意して実行してみたところ、エンターを押すことで弾が途切れました。このソースコードを参考にしてプログラムを組んでみようと思います。
回答ありがとうございましたm(_ _)m

また質問するときがあるかもしれませんが、そのときはよろしくお願いします。


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

Name:  ..プログラマー(28,760ポイント)   Date: 2008/02/22(金) 11:12   No:14476     
Title: Re:敵のショット位置について    
参考になるようでしたら、とてもうれしいです^^

本当はシューティングの館のを改良しようかな…って思ってたんですが、
やったことがなかったので、何が何しているかがわかりませんでした^^;

僕自身質問する立場の人間なので、回答が全然なっていなかったりすると思いますが…w

頑張ってくださいね!!!!!


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



Name: レイ  ..ぴよぴよ(283ポイント)   Date: 2008/02/21(木) 02:33   No:14443       
Title: 初歩的な質問と思いますが(×o×)↓    
printf("\n人体の構造と機能\n");
とソースで作った場合コマンドプロンプトでコンパイルして起動したら 人体の国「と機能n と文字化けするのですがなにか対策はありますか?どなたかよろしくおねがいします。


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


Name:  ..プログラマー(28,702ポイント)   Date: 2008/02/21(木) 03:00   No:14444     
Title: Re:初歩的な質問と思いますが(×o×)↓    
前回同様意味不明です

ソース一度全部載せて


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

Name: たかぎ [URL]  ..プログラマー(33,481ポイント)   Date: 2008/02/21(木) 08:34   No:14446     
Title: Re:初歩的な質問と思いますが(×o×)↓    
ひどい言い方に見えるかもしれませんが...

C言語より先に、日本語を勉強した方がよいと思います。


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

Name: レイ  ..ぴよぴよ(665ポイント)   Date: 2008/02/21(木) 09:41   No:14447     
Title: Re:初歩的な質問と思いますが(×o×)↓    
#include <stdio.h>

int main(void)
{
char str[80];
int i;

printf("臨床工学技士の科目\n");
gets(str);
for (i = 0; str[i]; i++)
printf("%c", str[i]);

printf("専門基礎科目\n専門科目\n");
gets(str);
for (i = 0; str[i]; i++)
printf("%c", str[i]);

printf("専門基礎科目からいきます\n");
gets(str);
for (i = 0; str[i]; i++)
printf("%c", str[i]);

printf("医学概論\n公衆衛生学\n人体の構造と機能\n病理学概論\n臨床生化学\n臨床免疫学\n臨床薬理学\n情報処理工学\n医用電気工学\n医用電子工学\n医用機械工学\n生体物性工学\n生体材料工学\n");
gets(str);
for (i = 0; str[i]; i++)
printf("%c", str[i]);
return 0;
}

このソースで人体の構造と機能 という語句が人体の国「と機能n と出力されてしまいます。


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

Name:  ..プログラマー(28,898ポイント)   Date: 2008/02/21(木) 09:54   No:14449     
Title: Re:初歩的な質問と思いますが(×o×)↓    
・・・getsが何してるか僕にはわからない。こんな風に使用していいの?
・・・forは止まるの?

この使い方が正しいなら、多分strの大きさが足りないのかな?
そもそも、何がさせたいんだろ??????


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

Name: Mist  ..ぴよぴよ(117ポイント)   Date: 2008/02/21(木) 10:30   No:14450     
Title: Re:初歩的な質問と思いますが(×o×)↓    
質問する前に規約をしっかり読みましょう。

解決のヒント
SHIFT-JIS環境では「構(0x8d,0x5c)」や「能(0x94,0x5c)」のように文字コードに\(0x5c)が含まれる文字列は正しく表示されない場合があります。


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

Name: たかぎ [URL]  ..プログラマー(33,722ポイント)   Date: 2008/02/21(木) 10:32   No:14451     
Title: Re:初歩的な質問と思いますが(×o×)↓    
プログラムは意味不明ですが、質問の現象は再現しました。
処理系不明なので推測の域を出ませんが、多分当たっているでしょう。

> 人体の構造と機能

のうち、「構」と「能」は、シフトJISでは2バイト目が0x5cになる、いわゆる「ダメ文字」です。
そのため、シフトJISに対応しているコンパイラでは

> 人体の国「と機能n

のように文字化けします。

もし、GCCを使っており、そのバージョンが3.4以上であれば、-finput-charset=cp932 -fexec-charset=cp932というオプションを付ければ問題は解消するはずです。
ただし、この対応を行っても、プログラムの意味不明なところはいかんともしがたいと思います。


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

Name: taku.net  ..入門者(3,185ポイント)   Date: 2008/02/21(木) 23:53   No:14459     
Title: Re:初歩的な質問と思いますが(×o×)↓    
とりあえずレイさんが作っているプログラムの意図が知りたいですね^^;
サンプルを改造して「こんなことも出来る」っていうのを確かめてるんですか?

#レイさん、シフトJISの意味はわかります…よね?


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

Name: レイ  ..ぴよぴよ(674ポイント)   Date: 2008/02/22(金) 02:02   No:14461     
Title: Re:初歩的な質問と思いますが(×o×)↓    
シフトJISわかりません。

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

Name: tkmakwins15 [URL]  ..熟練のプログラマー(57,299ポイント)   Date: 2008/02/22(金) 04:56   No:14468     
Title: Re:初歩的な質問と思いますが(×o×)↓    
シフトJISとは日本語をコンピューターで表現する時の文字コードです。

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



Name: きつね  ..ぴよぴよ(536ポイント)   Date: 2008/02/22(金) 01:57   No:14460       
Title: int型を文字列に変換する方法    
文字列をint型に変換するという関数は見つけられたのですが
その逆のint型を文字列に変換するという関数はあるのでしょうか?
もしあったら教えてくださいm(_ _)m


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


Name: へろり  ..入門者(3,253ポイント)   Date: 2008/02/22(金) 02:16   No:14462     
Title: Re:int型を文字列に変換する方法    
sprintf()ではだめですか。

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

Name: きつね  ..ぴよぴよ(547ポイント)   Date: 2008/02/22(金) 02:42   No:14466 解決!     
Title: Re:int型を文字列に変換する方法    
ありがとうございます!
うまくいきましたw


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



Name: タツラー  ..ぴよぴよ(138ポイント)   Date: 2008/02/20(水) 23:10   No:14438       
Title: メニュー画面を作っているのですが・・・    
はじめまして
今、メニュー画面を作っているのですが、
上下キーで選んでいるものを変えれるようにするところまではいけたのですが、
↑のキーを押して、今選択しているものの1つ上のものを選ぼうとしたとき、
少し長く押してしまっただけで、2個上のものを選択してしまったりします。
ボタンを押したときに少し時間がたたないとダメなように設定してみると、
上に2個いくということはなくなりましたが、上を押して、すぐに下を押すと反応しないなどの不具合がでてしまいます。
何かいい方法はありませんか?


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


Name:  ..プログラマー(28,685ポイント)   Date: 2008/02/21(木) 01:15   No:14442     
Title: Re:メニュー画面を作っているのですが・・・    
それぞれのキーにフラグを設定して、キーが押された瞬間関数を呼び出して、それの成否で処理を決める。

押されているのが過去押されたキーと同じの場合のみ時間をとらせる・・・ではどうかな
関数の例として:

void Key( int *old_key, int *now_key){
if(old_key == now_key)
return 1;
return 0;
}


フラグが面倒そうですが、一定時間がたったらOKってするとか?
void Key(int old_time, int now_time){

if( old_time - now_time > 0.6 * 1000 ){
old_time = now_time;
return 1;
}
return 0;
}


どっちも検証も動作保障も何もありませんが参考になるかな?


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

Name: 管理人  ..伝説のハッカー(523,827ポイント)   Date: 2008/02/22(金) 02:17   No:14463     
Title: Re:メニュー画面を作っているのですが・・・    
http://dixq.net/g/#s0

この辺参考になるかと思います。


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



Name: PPN  ..ぴよぴよ(281ポイント)   Date: 2008/02/21(木) 11:58   No:14453       
Title: [C]バイナリファイルから任意のバイト列を検索し、その文字列の次バイトを上書きするプログラム    
こんにちは。
はじめて利用させていただきます。

C言語は授業+独学で勉強中ですが、
まだまだ初心者レベルです。

学校で、C言語の課題が出されており、
以下の機能をもつプログラムを作成しなければならないのですが、
行き詰ってしまったので質問をさせてください。
 ・バイナリファイルを開く
 ・任意のバイト列を入力する
 ・バイナリファイル内より、任意のバイト列を検索する
 ・該当するバイト列が存在した場合、そのバイト列の次1バイトのデータを書き換える

参考書、Web等調べて作成中しているのですが、
現状、
 ・バイナリファイルを開く
 ・任意のバイト列を入力する
この2つの機能についてはコードを書けました。

しかし、
 ・バイナリファイル内より、任意のバイト列を検索する
 ・該当するバイト列が存在した場合、そのバイト列の次1バイトのデータを書き換える
この2つに関しては手も足も出ない状況です。

使用OSはXP Pro SP2(32bit)
開発環境はVisual C++ 2008 Express Editionです。

どのようにコードを書けばよいか、
教えていただけますでしょうか?

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


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


Name: やそ  ..上級者(24,042ポイント)   Date: 2008/02/21(木) 12:34   No:14454     
Title: Re:[C]バイナリファイルから任意のバイト列を検索し、その文字列の次バイトを上書きするプログラム    
課題ということで、高度な検索は求められていないと思います。
ならば
入力した文字列とバイナリファイルからの読み込みを1文字づつ比較すればよいと思います。

それよりも、
「 ・該当するバイト列が存在した場合、そのバイト列の次1バイトのデータを書き換える 」
についてはこちらでも手も足も出ないです。
なぜなら、どんな値に書き換えるのでしょう?




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

Name: しりうす〜  ..入門者(3,601ポイント)   Date: 2008/02/21(木) 13:28   No:14455     
Title: Re:[C]バイナリファイルから任意のバイト列を検索し、その文字列の次バイトを上書きするプログラム    
たぶん、言葉に惑わされて難しく考えてるんじゃないかなと予想。
ファイル内の検索とか文字の書換えとかは、ファイル操作で行うわけではないのでは(そう指示されていない限り)。

こんな感じでいけると思う。

1:ファイルを開く(無ければ作成)
2:ファイルに何か書き込む(ついでに閉じる?)
3:ファイルを開いてメモリに中身を"全部"読み込む
4:メモリ内に指定のバイト列が存在するか比較する(見つかったなら書換え処理を行う)
5:元ファイルに上書き処理でメモリの中身を書き出す(元ファイルを削除して作り直してもOK?)



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



Name:  ..上級者(24,902ポイント)   Date: 2008/02/16(土) 21:53   No:14327       
Title: 空白文字について    
int c;
c=fgetc(fp);
if((c != '\n') && (c != ' ') && (c != ' ') ){ //スペースが見つかったとき、行を変える

}
としたとき、全角のスペースだけが無視されてしまいます。
どなたか、ご教授お願いします。

!(isspace(c))ではできませんでした。

以下ソースコード(必要ないと思いますが…

void Load_File::get_file(){
int c;
char str[256];
FILE *fp;

if( (fp =fopen("test.txt", "r")) == NULL ){
cout << "エラー"<<endl;
}

int i=0,j=0;
bool frag=false;
while( (c = fgetc(fp)) != EOF ){
memset( &n_v, NULL, sizeof(n_v));
if((c != '\n') && (c != ' ') && (c != ' ') ){ //スペースが見つかったとき、行を変える
str[j]=c;
j++;
}else
frag = true;

if( frag==true ){
if(j>0){
str[j]='\0';
memcpy( n_v.ss , str , sizeof(str) ); //文字列のコピー
v.push_back(n_v); //vへの追加
i++;
}
j=0;
frag=false;
}
}
fclose(fp);
}

<!--12-->


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


Name: box  ..ハッカー(107,138ポイント)   Date: 2008/02/16(土) 22:18   No:14329     
Title: Re:空白文字について    

> if((c != '\n') && (c != ' ') && (c != ' ') ){ //スペースが見つかったとき、行を変える

この判定方法はまずいでしょうね。
例えばシフトJISの場合、全角空白はx8140の2バイトで表わします。
cがx81だったら、次の1文字を読んで、それがx40だったとき、
当該2バイトが全角空白であると判断できると思います。



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

Name: たかぎ [URL]  ..プログラマー(30,670ポイント)   Date: 2008/02/16(土) 23:28   No:14331     
Title: Re:空白文字について    
ロケールを正しく設定した上で、
wint_t c; 

c=fgetwc(fp);
if((c != L'\n') && (c != L' ') && (c != L' ') ){


とすれば上手くいく可能性があります。
ただし、厳密には環境に依存しますので、まずは環境を明らかにしてください。


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

Name:  ..上級者(24,936ポイント)   Date: 2008/02/17(日) 00:09   No:14333     
Title: Re:空白文字について    
以下のようにすると、できました。
ありがとうございます。
0x81 は全角文字をあらわすため、後ろにスペースなどは来ず、
以下のような処理をしてしまっても良いのでしょうか?
** ソースコードの一部 **

int i=0, j=0, space=0;
bool frag=false;
while( (c = fgetc(fp)) != EOF ){
if( !(isspace(c)) ){ //スペースなどが見つかったとき、行を変える
if( !(c == 0x81)){
str[j]=c;
j++;
}else{
space = c;
if((c=fgetc(fp))==0x40){
frag = true;
}else{
str[j]=space;
j++;
str[j]=c;
}
}


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

Name: box  ..ハッカー(107,175ポイント)   Date: 2008/02/17(日) 00:19   No:14334     
Title: Re:空白文字について    
00:09のコードでは変数frag(旗という意味ならflagです)の使い方が
わかりませんので、何ともいえません。


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

Name:  ..プログラマー(25,087ポイント)   Date: 2008/02/17(日) 00:19   No:14335     
Title: Re:空白文字について    
>たかぎさん
回答ありがとうございます。

>厳密には環境に依存しますので、まずは環境を明らかにしてください。
Windows2000以上では問題なく動作してほしいと思っていますが、それ以外にも大きく影響を受けるのでしょうか?

>ロケールを正しく設定した上で、
どのような設定が必要なのかわからないので、教えてはいただけないでしょうか?


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

Name:  ..プログラマー(25,388ポイント)   Date: 2008/02/17(日) 00:24   No:14336     
Title: Re:空白文字について    
ご回答ありがとうございます。
frag は flag のつもりで使っていました。
教えていただきありがとうございます。

以下のような方法で、使用環境(例えばパソコンを買い換えるとか)をした場合には問題が生じる可能性があるのでしょうか?

void Load_File::get_file(){
int c;
char str[256];
FILE *fp;

if( (fp =fopen("test.txt", "r")) == NULL ){
cout << "エラー"<<endl;
}

int i=0, j=0, space=0;
bool flag=false;
while( (c = fgetc(fp)) != EOF ){
if( !(isspace(c)) ){ //スペースなどが見つかったとき、行を変える
if( !(c == 0x81)){
str[j]=c;
j++;
}else{
space = c;
if((c=fgetc(fp))==0x40){
flag = true;
}else{
str[j]=space;
j++;
str[j]=c;
j++;
}
}
}else
flag = true;

if( flag==true ){
if(j>0){
str[j]='\0';
memcpy( n_v.ss , str , sizeof(str) ); //文字列のコピー
v.push_back(n_v); //vへの追加
memset( &n_v, NULL, sizeof(n_v)); //コピー後初期化
i++;
}
j=0;
flag=false;
}
}
fclose(fp);
}



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

Name: たかぎ [URL]  ..プログラマー(30,809ポイント)   Date: 2008/02/17(日) 00:26   No:14337     
Title: Re:空白文字について    
> Windows2000以上では問題なく動作してほしいと思っていますが、それ以外にも大きく影響を受けるのでしょうか?

コンパイラとコンパイルオプションの影響を受けます。

> どのような設定が必要なのかわからないので、教えてはいただけないでしょうか?

setlocaleを使います。


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

Name:  ..プログラマー(25,495ポイント)   Date: 2008/02/17(日) 00:35   No:14338     
Title: Re:空白文字について    
ご回答ありがとうございます。
コンパイラはVC++2005
コンパイルオプションは設定の変更をしていません。
プロジェクトのプロパティの文字セットをマルチバイトに変更しています。

setlocaleは初めて知ったので、検索してわからないところがあったとき、また質問させてもらってもよろしいですか?


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

Name:  ..プログラマー(25,623ポイント)   Date: 2008/02/17(日) 01:30   No:14339     
Title: Re:空白文字について    
wint_t c;
c=fgetwc(fp);
if((c != L'\n') && (c != L' ') && (c != L' ') ){

以上の設定をしたら、全角空白は除けたようなのですが、ワイド文字の変換はうまくできなかったので(僕の力不足です)、ワイド文字を使用しないですることはできないでしょうか?



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

Name: たかぎ [URL]  ..プログラマー(30,835ポイント)   Date: 2008/02/17(日) 11:32   No:14342     
Title: Re:空白文字について    
> ワイド文字を使用しないですることはできないでしょうか?

ワイド文字を使わないのであれば、多バイト文字として処理するしかありません。
非常に面倒なので、ワイド文字を使うほうが楽だと思うのですが...


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

Name:  ..プログラマー(26,368ポイント)   Date: 2008/02/17(日) 16:25   No:14343     
Title: Re:空白文字について    
setlocale(LC_CTYPE, "jpn");
をメインループで宣言しています。

以下のように設定したのですが、MB_CUR_MAXが使用できませんでした。
<stdlib.h>をインクルードすれば良いと書いてあったので↓(多分
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/MB_CUR_MAX.3.html

#include <iostream>
#include <vector>
#include <stdlib.h> //atof, ワイド文字
#pragma warning(disable : 4996)
using namespace std;

#define str_size 256


がインクルード&宣言してあります。

後、ワイド文字とは関係ないと思うのですが、

void Load_File::disp(){
for(int i=0; i< (int)v.size(); i++)
//cout<< "["<< i <<"]:\t"<< v[i].ss<<endl;
printf("%s\n",v[i].ss);
}

この、 // でコメント化しているのを実行すると、表示されません。
この理由も合せて教えていただけないでしょうか?

** 以下ソースコードの一部 **
不明箇所色の変更

void Load_File::get_file(){
FILE *fp;

if( (fp =fopen("test.txt", "r")) == NULL ){
cout << "エラー"<<endl;
}


wint_t c;
char str[str_size],use_wstr[ 5 ]={0}; //MB_CUR_MAXが使用できない
int j=0, space=0, w;

//flag : 配列のコピーをするかどうか : true 行う
bool flag=false;

while( (c=fgetwc(fp)) != WEOF ){
if((c != L'\n') && (c != L' ') && (c != L' ') ){
w = wctomb(use_wstr,c);
for(int k=0; k<w; k++){
str[j]=use_wstr[k];
j++;
}
}else{
flag = true;
}
if( flag==true ){
if(j>0){
str[j]='\0';
memcpy( n_v.ss , str , sizeof(str) ); //文字列のコピー
v.push_back(n_v); //vへの追加
memset( &n_v, '\0', sizeof(n_v)); //コピー後初期化
memset( str, '\0', sizeof(str));
}
j=0;
flag=false;
}
}
fclose(fp);
}


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

Name: たかぎ [URL]  ..プログラマー(31,395ポイント)   Date: 2008/02/17(日) 17:03   No:14344     
Title: Re:空白文字について    
> setlocale(LC_CTYPE, "jpn");
> をメインループで宣言しています。

Visual C++の場合、"jpn"ではなく"Japanese"だったと思います。OSが日本語設定であれば、""でも大丈夫なはずです。

> 以下のように設定したのですが、MB_CUR_MAXが使用できませんでした。
> char str[str_size],use_wstr[ 5 ]={0}; //MB_CUR_MAXが使用できない

↑これはダメです。MB_CUR_MAX は定数式ではないので、配列の要素に使用することができません。
代わりに、<limits.h> または <climits> で定義される MB_LEN_MAX を使用してください。

ところで、いったん wctomb で多バイト文字に変換していますが、こんなことをしなくても、全部ワイド文字で扱えばよいかと思います。
str を char の配列ではなく wchar_t の配列にするか、C++ であれば std::wstring にするのもよいでしょう。


> //cout<< "["<< i <<"]:\t"<< v[i].ss<<endl;
> この、 // でコメント化しているのを実行すると、表示されません。

v の型が不明なので正確なことはわかりません。
正確な情報を教えてください。



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

Name:  ..プログラマー(26,516ポイント)   Date: 2008/02/17(日) 22:51   No:14345     
Title: Re:空白文字について    
ご回答ありがとうございます。

vは構造体のvectorです。

typedef struct vec{
char ss[str_size];
}VEC;

vector<VEC> v;

setlocale(LC_CTYPE, "jpn");をデバッカで見ると
setlocale が返されました。 0x00a161a4 "Japanese_Japan.932"
と表示されるので、問題ないのではないでしょうか?

>↑これはダメです。MB_CUR_MAX は定数式ではないので、配列の要素に使用することができません。
>代わりに、<limits.h> または <climits> で定義される MB_LEN_MAX を使用してください。
できました。ありがとうございます。

>ところで、いったん wctomb で多バイト文字に変換していますが、こんなことをしなくても、全部ワイド文字で扱えばよいかと思います。
>str を char の配列ではなく wchar_t の配列にするか、C++ であれば std::wstring にするのもよいでしょう。

ワイド文字は良くわからず、charで対応できるならそれで良いか、と考えていました。
質問なのですが、wchar_t と char はどのように違うのでしょうか?同じように使用してしまってもいいのでしょうか?
char は
char ss[10][256]; などとしてよく使用しているのですが、これを wchar_t ss[10][256] と行っても問題はないのでしょうか?
手元にある本では
「C言語入門者が一般のプログラミングでこれらの機能を活用する機会は少ないものです。ここでは知識として紹介します」
新訂 新C言語入門〜シニア編〜より

と書いてあり、説明も一ページぐらいだったので、使わないほうが良いのでは?と思っているのですが、ワイド文字を利用したほうがいいのでしょうか?
利用したほうが良いのであれば、ワイド文字が分かりやすそうな本を教えていただけませんか?
(他にもプログラマーになるのであれば是非読んでおいた方が良い本もできればお願いします。)

wstring ( つまり、string ) は全く理解していないので使用を避けています。
C++はアクセス制御子がなんとなくわかる程度なので、良さそうな参考書を探している最中です。
今参考にしているのは、猫でもわかる(ネット上)と14歳からはじめるC++ その他ウェブページです。
こちらも、よろしければお勧めを教えていただけないでしょうか?


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

Name: たかぎ  ..プログラマー(31,965ポイント)   Date: 2008/02/17(日) 23:20   No:14346     
Title: Re:空白文字について    
> setlocale(LC_CTYPE, "jpn");をデバッカで見ると
> setlocale が返されました。 0x00a161a4 "Japanese_Japan.932"
> と表示されるので、問題ないのではないでしょうか?

ここは記憶が不確かなので、問題ないならそれでよいと思います。

> 質問なのですが、wchar_t と char はどのように違うのでしょうか?

Visual C++に限れば、wchar_t は Unicode を扱うための型です。サロゲートを無視すれば、漢字なども1要素として扱うことができるので非常に楽になります。

> 同じように使用してしまってもいいのでしょうか?

より簡単になるという点、そして、ワイド文字(列)の場合はそれ専用の関数を使う必要がある点がことなります。例えば、ワイド文字列のコピーは strcpy ではなく wcscpy を使用します。
std::wstring を使うのであれば、std::string と同じメンバを備えていますので、ほぼ同じに扱えると考えてよいでしょう。

> char ss[10][256]; などとしてよく使用しているのですが、これを wchar_t ss[10][256] と行っても問題はないのでしょうか?

問題ありません。

> 「C言語入門者が一般のプログラミングでこれらの機能を活用する機会は少ないものです。ここでは知識として紹介します」
> 新訂 新C言語入門〜シニア編〜より

それはその著者の解釈です。
入門者云々ではなく、数年前まではワイド文字(列)用ライブラリのサポート状況が必ずしもよくありませんでした。Visual C++はまだよかったのですが、GCCなどでは使えないことが多々あったのです。しかし、現在では主要な処理系はほぼサポートが行き届くようになりましたので、移植性の観点からも大きな問題はなくなりました。

> 利用したほうが良いのであれば、ワイド文字が分かりやすそうな本を教えていただけませんか?

何も専用の本を読むほどのことではありません。
ライブラリのドキュメントを読めば十分です。

ワイド文字(列)を使うときの注意点としては、

1. リテラルを書くときに L を付ける(L'あ', L"漢字" など)。
2. 専用のライブラリを用いる。
3. 稀にワイド文字列が使えない関数がある(fopen など)。
4. 外部に対する入出力ではロケールを設定する必要がある。
5. テキストストリームとバイナリストリームの区別がない環境でも、ワイド文字(列)入出力では違い出る。

ぐらいです。


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

Name:  ..プログラマー(26,827ポイント)   Date: 2008/02/18(月) 22:33   No:14367     
Title: Re:空白文字について    
丁寧なお答えありがとうございます。
これから、色々な所をワイド文字に変更していきたいと思います。

とても初歩的な質問なのですが、
>ライブラリのドキュメント
は何を指しているのでしょうか?
デバッカで追っていけるものでいいのでしょうか?
MSDNのHPにある、ライブラリのことなのでしょうか?
今まで、新しい関数は本でたまたま見つけたり、掲示板や知り合いに聞いたり、WEBページからリンクでどんどん見つけていく方法しかとったことがありません。
方法があれば是非教えてください。

>サロゲートを無視すれば
少し調べてみたのですが、まだ理解が及ばなさそうなので無視したいのですが、気づかないうちに問題が生じたりするものなのでしょうか?
このあたりまで理解しないとワイド文字は使用しないほうがいいのでしょうか?


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

Name: たかぎ [URL]  ..プログラマー(32,037ポイント)   Date: 2008/02/18(月) 23:42   No:14376     
Title: Re:空白文字について    
> >ライブラリのドキュメント
> は何を指しているのでしょうか?

これについては、Visual C++に限れば

> MSDNのHPにある、ライブラリのことなのでしょうか?

と考えてよいでしょう。
移植性を考えるなら、言語規格に目を通す必要があります。

> このあたりまで理解しないとワイド文字は使用しないほうがいいのでしょうか?

よほど特殊な文字(古代や中世の文字など)を扱うのでなければ、サロゲートを気にすることはないでしょう。一応、そのようなものがあることだけ、記憶の片隅に置いておくことをお勧めします。


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

Name:  ..プログラマー(26,958ポイント)   Date: 2008/02/19(火) 10:47   No:14391 解決!     
Title: Re:空白文字について    
ありがとうございました。

がんばって使用していきたいと思います。



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

Name:  ..プログラマー(28,426ポイント)   Date: 2008/02/21(木) 00:59   No:14440     
Title: Re:空白文字について    
ファイルのロードをすべてワイド文字で出来るようにしてみようとしたのですが、
wmemcpy( n_v.ss, str, sizeof(n_v));
この位置で
rep movsd ;N - move all of our dwords
この場所に飛んでエラーとなるのですが、データが全部移行できる領域がないと解釈して
wsccpy( n_v.ss , str);
にしたところ、今度は関数終了時に、strが破損した、見たいなエラー(↓)
Stack around the variable 'str' was corrupted
と表示されます。

以上の点について、教えていただけないでしょうか?


/* 以下ソースファイルの一部(問題の関数) */

void Load_File::get_file(){
FILE *fp;

if( (fp =fopen("test.txt", "r")) == NULL ){
cout << "エラー"<<endl;
}

setlocale(LC_CTYPE, "jpn");

wint_t c;
wchar_t str[str_size]={0},use_wstr[ MB_LEN_MAX ]={0};
//wstring str;
int j=0, space=0, w=0;

//flag : 配列のコピーをするかどうか : true 行う
bool flag=false;

while( (c=fgetwc(fp)) != WEOF ){
if((c != L'\n') && (c != L' ') && (c != L' ') ){
str[j] = c;
j++;
}else{
flag = true;
}
if( flag==true ){
if(j>0){
str[j] = L'\0';
wmemcpy( n_v.ss, str, sizeof(n_v));
v.push_back(n_v); //vへの追加
memset( &n_v, '\0', sizeof(n_v)); //コピー後初期化
wmemset( str, L'\0', sizeof(str) );
}
flag=false;
j=0;
}
}

fclose(fp);
}


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

Name: たかぎ [URL]  ..プログラマー(33,467ポイント)   Date: 2008/02/21(木) 08:31   No:14445     
Title: Re:空白文字について    
> wmemcpy( n_v.ss, str, sizeof(n_v));

↑は、意味的には

wcscpy( n_v.ss, str );

ではないのですか?
どうしても wmemcpy を使うのであれば、

wmemcpy( n_v.ss, str, sizeof(n_v.ss)/sizeof(n_v.ss[0]) );

とすべきです。


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

Name:  ..プログラマー(28,806ポイント)   Date: 2008/02/21(木) 09:47   No:14448 解決!     
Title: Re:空白文字について    
ご回答ありがとうございます。

はい。
動作としては、wcscpy();と同じ事をしようとしていました。
>wmemcpy( n_v.ss, str, sizeof(n_v.ss)/sizeof(n_v.ss[0]) );
文字の個数であることをすっかり忘れてしまっていました。
ありがとうございます。



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



Name: 初心者  ..初心者(6,637ポイント)   Date: 2008/02/18(月) 23:00   No:14372       
Title: シューティングゲームの館について・・・    
みなさん初めまして。気になったことがあるので質問させていただきました。
このサイトの、シューティングゲームの館の「2. FPSを表示する」についてです。この中に
void FpsTimeFanction(){
if(FpsTime_i== 0)
FpsTime[0]=GetNowCount(); //1周目の時間取得
if(FpsTime_i==49){
FpsTime[1]=GetNowCount(); //50周目の時間取得
Fps = 1000.0f / ((FpsTime[1] - FpsTime[0]) / 50.0f);//測定した値からfpsを計算
FpsTime_i=0;//カウントを初期化
}
else
FpsTime_i++;//現在何周目かカウント
if(Fps != 0)
DrawFormatString(565,460,color_white,"FPS %.1f",Fps); //fpsを表示
return;
}

という記述がありますが、この6行目あたりに、数字の横に「f」がついてますがこれはいったい何でしょうか??どなたかよろしくお願いします。


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


Name: YuO  ..上級者(18,525ポイント)   Date: 2008/02/19(火) 01:15   No:14382     
Title: Re:シューティングゲームの館について・・・    
Fまたはfはfloat型の定数であることを示すサフィックスです。

同様のサフィックスに,
・unsigned型/unsigned long型/unsigned long long型のいずれかの定数を意味するU/u
・long型/long long型のいずれか,またはlong double型の定数を意味するL/l (8進整数,16進整数ではunsigned long型/unsigned long long型も含む)
・long long型の定数を意味するLL/ll (8進整数,16進整数ではunsigned long long型も含む)
・unsinged long型/unsigned long long型のいずれかの定数を意味するul/uL/Ul/UL/lu/lU/Lu/LU
・unsigned long long型の定数を意味するull/uLL/Ull/ULL/llu/llU/LLu/LLU
があります。
# いずれかとあるものは,定数の値と型の表すことのできる範囲で決定されます。


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

Name: 初心者  ..初心者(6,667ポイント)   Date: 2008/02/19(火) 22:39   No:14408     
Title: Re:シューティングゲームの館について・・・    
分かったようでよく分かりませんが、とりあえずつけないといけないんですね。ありがとうございました。

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

Name: taku.net  ..入門者(3,125ポイント)   Date: 2008/02/20(水) 19:46   No:14434     
Title: Re:シューティングゲームの館について・・・    
つけないといけないわけではありません。
小数点以下がある数値はfをつけなかった場合double型で扱われます(小数点以下がない場合int型)。
しかしFpsの表示はどうせ小数点以下2桁まで丸めるため、double型ほどの精度は要求されません。
だから最後にfをつけてるんじゃないですかね。
#fつけないといけませんでしたっけ?


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

Name: 初心者  ..初心者(6,709ポイント)   Date: 2008/02/20(水) 23:31   No:14439     
Title: Re:シューティングゲームの館について・・・    
コメントありがとうございます。なんとなく分かりました!#fは・・・分からないです・・・

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

Name:  ..プログラマー(28,437ポイント)   Date: 2008/02/21(木) 01:00   No:14441     
Title: Re:シューティングゲームの館について・・・    
f を消してみて、動いたら問題なし ですw

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



Name: 組木紙織  ..プログラマー(39,849ポイント)   Date: 2008/02/19(火) 00:03   No:14378       
Title: 高速なrotate関数    
以前ここの掲示板でrotateが話題になったことがあり、いくつかの実装方法が出ていたと思います。
それでどの実装が一番高速であるのか?が少し気になっていました。

私もいくつか考えたのですが、同じような方法しか考え付かなかったので
色々な意見を出してもらえたら(かつ競争ができたら)と思い投稿をしました。

みんなが同じ環境ではないので基準が必要だと思います。
独習Cで共用体を使ったrotateがあったので、この実装を基準にし、(一番遅い実装だとおもうので)
何倍の速度が出たか?
を、速度の指標(Speed)として行こうかと思います。

コードの条件としては

1:C99の規格にそったものであること。
2:unsigned char 用の左回転関数を実装すること。
3:インターフェイスは void rotate(unsigned char *)であること。
4:添付ファイルrotate.cのrotate()を変更すること。

ぐらいでしょうか。


#活性化の助けになってくれればよいと思います。


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


Name: 組木紙織  ..プログラマー(39,920ポイント)   Date: 2008/02/19(火) 00:12   No:14379     
Title: Re:高速なrotate関数    
基準
平均 :3.667800秒

自作
平均 :0.813200秒

speed 4.510

コード:

void rotate(unsigned char *c)
{
if(signed char(*c)<0){
*c = (*c)<<1;
*c = *c | 1;
}else{
*c = (*c)<<1;
}
}


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

Name: Justy  ..ハッカー(175,625ポイント)   Date: 2008/02/19(火) 00:44   No:14380     
Title: Re:高速なrotate関数    
 そんな早くはないですが。

基準 平均 3.14980
自作 平均 0.6468
Speed 4.8698



void rotate(unsigned char *c)
{
unsigned char v = *c;
unsigned char b = v & (1 << (CHAR_BIT-1));
*c = unsigned char((v << 1) | b >> (CHAR_BIT-1));
}


# rotateの意図はこれで合ってます?


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

Name: Justy  ..ハッカー(175,443ポイント)   Date: 2008/02/19(火) 00:55   No:14381     
Title: Re:高速なrotate関数    
> そんな早くはないですが。
 と思いましたが、うちの CPUでこれ以上早く動くコードってあるのでしょうか、と。
 asmコードも一緒に出してみたのですが、これ以上どう縮めたらいいのかちょっと
すぐには思いつきません。



mov al, BYTE PTR [ecx]
mov dl, al
shr dl, 7
shl al, 1
or dl, al
mov BYTE PTR [ecx], dl


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

Name: たかぎ [URL]  ..プログラマー(31,992ポイント)   Date: 2008/02/19(火) 08:22   No:14384     
Title: Re:高速なrotate関数    
基準として提示されたプログラムは、main関数がC99ではコンパイルできません。
C++でコンパイルしたのではないですか?


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

Name: 組木紙織  ..プログラマー(39,930ポイント)   Date: 2008/02/19(火) 08:42   No:14386     
Title: Re:高速なrotate関数    
>C++でコンパイルしたのではないですか?

コンパイルした環境はVS2005 です。
拡張子を .c。。。ではなくて.cppにしていました。

すみません。

修正したものをあげておきます。
といってもキャストの仕方を変えただけですが。


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

Name: たかぎ [URL]  ..プログラマー(32,150ポイント)   Date: 2008/02/19(火) 10:15   No:14389     
Title: Re:高速なrotate関数    
rotate を main より先に記述してもよいのであれば...
inline void rotate(unsigned char *c)

{
unsigned int temp = *c;
*c = temp << 1 | (temp >> (CHAR_BIT - 1));
}


とすることで、

基準 平均 1.281200
自作 平均 0.143800
Speed 8.909597

です。
ある程度チューニングしていくと、関数の呼び出しにかかる時間が一番コストがかかるようになります。
コンパイルには Cygwin上のGCC 3.4.4 を使用し、-std=c99 -O2 オプションを付けました。


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

Name: たかぎ [URL]  ..プログラマー(31,956ポイント)   Date: 2008/02/19(火) 10:24   No:14390     
Title: Re:高速なrotate関数    
インライン関数を使うかどうかは別として、処理系によっては、
void rotate(unsigned char *c)

{
unsigned int temp = *c << 1;
if (temp > UCHAR_MAX) temp |= 1;
*c = temp;
}


とした方が高速になる場合があります。
プロセッサによっては、1ビットのシフト命令しかない場合があるからです。
# そんなプロセッサの場合は、専用のローテート命令を使った方がよいのでしょうが、C99の範囲ということなので...


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

Name: 組木紙織  ..熟練のプログラマー(40,073ポイント)   Date: 2008/02/20(水) 00:09   No:14414     
Title: Re:高速なrotate関数    
>ある程度チューニングしていくと、関数の呼び出しにかかる時間が一番コストがかかるようになります

私の環境VS2005 Microsoft Visual Studio 2005 Standard E

ではややインラインした方が時間がかかるようです。
0.88→0.90
と約0.02秒よけいに時間がかかるようです。
コンパイラオプションは/O2です。

コンパイラオプションを/O2 /Oyにしたら

0.93→0.89
とインラインにしたら速くなるようです。
コンパイラオプションが面白いと思った瞬間です。

#C99対応のコンパイラを使ってないのにC99を指定してた。 自分の環境ぐらいは把握しておかないと。


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

Name: たかぎ [URL]  ..プログラマー(32,451ポイント)   Date: 2008/02/20(水) 10:35   No:14415     
Title: Re:高速なrotate関数    
> 0.88→0.90
> と約0.02秒よけいに時間がかかるようです。
> コンパイラオプションは/O2です。
>
> コンパイラオプションを/O2 /Oyにしたら
>
> 0.93→0.89
> とインラインにしたら速くなるようです。

この程度では有意な差とはいえません。
実際に、Visual C++ 2005 で __forceinline を付けた場合と付けない場合それぞれについて、/O2 でコンパイル結果を確認しましたが、いずれもインライン置換されていました。

ところで、GCCがなぜこんなに速いのか、コンパイル結果を確認してみました。
すると、rotate に渡している ch を、rotate 呼出し後に使用していないため、rotate の呼出しおよびループ自体がなくなっていました(速いはずです)。
正確に計測するためには、最後に ch の値を出力するなど、何らかの方法で使用する必要がありそうです。

また、I/Oが時間を食うことは間違いないので、
puts(sName);



は、最初の clock の呼び出しより前に行った方がよいでしょう。



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

Name: Hermit  ..上級者(18,985ポイント)   Date: 2008/02/20(水) 21:30   No:14435     
Title: Re:高速なrotate関数    
> プロセッサによっては、1ビットのシフト命令しかない場合があるからです。
2倍したらよいのでは?
Z80 等のときはそういう手もよく使ってましたけど。


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

Name: たかぎ [URL]  ..プログラマー(33,418ポイント)   Date: 2008/02/20(水) 21:43   No:14436     
Title: Re:高速なrotate関数    
> > プロセッサによっては、1ビットのシフト命令しかない場合があるからです。
> 2倍したらよいのでは?

1ビットのシフト命令は大抵あります。
それに、左シフトは2倍、というより、同じ値同士の加算で済みますが、右シフトはそうはいきません。

問題は、7ビットの右シフトのようなことが、単一の命令ではできないことが多いということです。
結果として、1ビットずつ7回シフトするようにしてみたり、4ビット + 2ビット + 1ビットというように3回シフトさせてみたりすることになります。除算を使うのは論外です。


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

Name: Hermit  ..ぴよぴよ(49ポイント)   Date: 2008/02/20(水) 22:57   No:14437     
Title: Re:高速なrotate関数    
おお、右シフトの方でしたか。
だから、ここの変更だったわけですね。
temp > UCHAR_MAX
注目点が違ってました。失礼しました。


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



Name: ユウ  ..かけだし(2,318ポイント)   Date: 2008/02/15(金) 22:57   No:14315       
Title: C言語についての質問です。どなたわかる方かよろしくお願いします。    


問題文が 「バナナの色は?」の時に 答えが黄色なのでローマ字で最初の 「k」と「i」をうった瞬間「黄色」と出力される(スイカは「S」と「U」 オレンジは「o」)プログラムを作りたいです。どなたかわかる方よろしくお願いします。
問題は全部で3問で
「バナナの色は?」答え「黄色」
「みかんの色は?」答え「オレンジ」
「砂浜で割るのは?」答え「スイカ」
をよろしくお願いします。☆


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


Name:  ..上級者(24,020ポイント)   Date: 2008/02/16(土) 15:16   No:14321     
Title: Re:C言語についての質問です。どなたわかる方かよろしくお願いします。    
入力を拾って、比較する。
丸投げですか?


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

Name: たかぎ [URL]  ..プログラマー(30,357ポイント)   Date: 2008/02/16(土) 15:48   No:14322     
Title: Re:C言語についての質問です。どなたわかる方かよろしくお願いします。    
> 問題文が 「バナナの色は?」の時に

この問題文はどう扱えばよいのですか?
どこかに表示するとか、隠しておくとか、ユーザーが入力するとか...

> 「k」と「i」を

全角ですか?

> うった

うったとは?
キーボードをたたいたらと言う意味ですか?
それとも、通信ポートを介して電文を打つという意味ですか?
あるいはもっと別の意味ですか?

> 瞬間

瞬間とは?
入力を受けてから出力するまでに許容される時間がどこまでであれば「瞬間」とみなせるのでしょうか?

> 「黄色」と出力される

どこに?
どうやって?


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

Name: ユウ  ..かけだし(2,186ポイント)   Date: 2008/02/16(土) 18:58   No:14324     
Title: Re:C言語についての質問です。どなたわかる方かよろしくお願いします。    
ありがとうございます。
問題文はコマンドプロンプトに表示させておいて、入力は半角です。あ、キーボードをたたいたらという意味です。瞬間とは2文字目をたたいたすぐ後です。答えはコマンドプロンプトに出力させたいです。追記になりますが、答え以外の2文字を入力した場合 ×マークと答えを出力させるプログラムもお願いします。(例 × オレンジ)