|
Name: dic ..比類無きプログラマー(95,757ポイント)
Date: 2010/09/08(水) 00:13
No:61247
|
|
Title: SLGを作成中ですが、DirectX周りがうまく動作しないです
|
|
現在SLGを製作中なのですが、マウスの位置情報の取得がどうも少しずれてて
うまくクリック処理ができないのです
下にできてるものをアゲておきます
メッセージボックスの嵐がでたらESC押しっぱなしで抜けてください
http://www1.axfc.net/uploader/Sc/so/151229
問題はというと2つあります
1つは、マウスの位置情報が少しずつ下にいくにつれてずれていくことです
2つめは、800x600の領域だと画面の更新(Flip)が行われるのですが、
1024x768だと、あまった部分の画面の更新がされないということです
DxDraw3を使ってるから、サポートしてないのかなぁとか思いつつも
調べる手段もなく困ってます
助言をいただけると助かります

2倍のポイントを手に入れた! 490ポイント を手に入れた。
|
|
|
|
Name: dic ..比類無きプログラマー(95,805ポイント)
Date: 2010/09/08(水) 07:45
No:61257
| 解決!
|
Title: Re:SLGを作成中ですが、DirectX周りがうまく動作しないです
|
|
解決しました
1つめは、#define の座標指定の数字が微妙に間違ってました
2つめは、この画面での画面領域設定が一箇所だと思ってましたが、複数箇所にありました
48ポイント を手に入れた。
|
|
|
|
Name: バグ ..ハッカー(212,686ポイント)
Date: 2010/09/07(火) 15:07
No:61214
|
|
Title: LifeGame作ってみた
|
|
現実逃避で作ってみました。
非常にシンプルなライフゲームです。
開発言語はC#.NETで、環境はVisualStudio2005PEです。
動作させるには、.Net Framework2.0が必要なはず…。
ソースは添付してませんが、希望者が入れば公開しますよ。
75ポイント を手に入れた。
|
|
|
|
Name: dic ..比類無きプログラマー(95,267ポイント)
Date: 2010/09/07(火) 15:46
No:61217
|
|
Title: Re:LifeGame作ってみた
|
|
ライフゲームは自作のライブラリで作ったことあるので楽しませてもらいました
世代の進め方がうまく、ボタンの配置などもよく、よくできていると思います
.NET は多分インストールされてるので・・・動きました
私のはGUI処理に1週間ほどかかりましたが、C#.NETだとどれくらい簡単か知りたいです
146ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(212,762ポイント)
Date: 2010/09/07(火) 15:56
No:61218
|
|
Title: Re:LifeGame作ってみた
|
|
>>dicさん
感想ありがとうございます。
今回のは0から組み上げましたが、総製作時間は2時間くらいでしょうか?
C#に限らずVBなんかでも、GUI周りは非常に楽に書けますよ。基本的にペタペタと貼り付けて、イベントを関連づけていくだけですから(^_^;)
76ポイント を手に入れた。
|
|
|
|
|
Name: ひよこ ..比類無きプログラマー(87,492ポイント)
Date: 2010/09/07(火) 18:53
No:61227
|
|
Title: Re:LifeGame作ってみた
|
|
これがライフゲームですか、ほとんど遊んだことのないもので…なかなか楽しいですね。
それは置いといて、ボタンとかすごいですね。私はボタンとか使ったことがないですが、
シンプルにできていていいですね。
8ポイント を落としてしまった。
|
|
|
|
|
Name: バグ ..ハッカー(212,931ポイント)
Date: 2010/09/07(火) 19:08
No:61229
|
|
Title: Re:LifeGame作ってみた
|
|
>>ひよこさん
>>シエルさん
基本的にライフゲームは、自分の好きなようにセルを設置したら「見てるだけ」なんですよ。
楽しみ方は人それぞれです。
私は、適当にセルを配置して、あとは自動再生して、ぼーっと眺めつつ、動きが少なくなったら介入(自動再生中にもセルの設置はできますので)して、神様気分を味わったり…そういう歪んだ遊び方をしています(笑)
169ポイント を手に入れた。
|
|
|
|
|
Name: へろり ..プログラマー(36,151ポイント)
Date: 2010/09/07(火) 19:22
No:61230
|
|
Title: Re:LifeGame作ってみた
|
|
高専時代に、100x100マスほどの巨大なグライダー銃を発見したことがありますが、友人からは絶対先に見つけた人がいると言われて悔しい思いをした覚えがあります。
そういえば、グライダーのキャッチボールをするような配置はまだ発見されてませんよね?
2倍のポイントを手に入れた! 212ポイント を手に入れた。
|
|
|
|
|
Name: パコネコ ..熟練のプログラマー(40,595ポイント)
Date: 2010/09/07(火) 19:32
No:61232
|
|
Title: Re:LifeGame作ってみた
|
|
私もやらせてもらいました。
自分で作ったのより全然やりやすかったです。
おんなじルールのゲームなのに…
100×100のグライダーってでかいですね…自分で形を探すのも楽しみの1つですよね。
(基本適当に書きながら「うねうね」うごくのを眺めてるだけですけど、なんだか見いっちゃうんですよね)
116ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(213,052ポイント)
Date: 2010/09/08(水) 00:29
No:61249
|
|
Title: Re:LifeGame作ってみた
|
|
>>へろりさん
100x100のグライダーガンは凄いですね(^_^;)
>>パコネコさん
最小限の手間しか掛けてはいませんが、操作部に関しては自分自身がストレスを感じないものにしようと考えて調整しています。
以前作って、ここで公開もされているコンソールアプリ版のライフゲームでは操作性に難有りでしたので余計に気を遣ってみました。
121ポイント を手に入れた。
|
|
|
|
Name: タクロウ ..ぴよぴよ(241ポイント)
Date: 2010/09/05(日) 12:14
No:60980
|
|
Title: 助けてください。
|
|
高校でc++の宿題が出たのですが、完成しなく困っています。
どなたか助けてください。締め切りは9月7日です。
宿題の内容はゲームを作ることです。添付したファイルが先生から配られたサンプルです。このくらいのレベルのものを作りたいと思っています。
私は主人公が魔物(何体か現れる)を倒していくゲームを作ろうと思っています。
主人公と魔物にはそれぞれ体力があって、攻撃すると減り、魔物の体力が0になれば倒せたり、魔物を倒すと主人公の体力があがる機能をつけようと思っています。
ゲームの流れは、ゲーム説明→コマンドで行動を選択(→魔物が現れる→倒す→主人公のステータスがあがっていく→主人公の英雄度が一定の数に達したらゲームクリア
としたいです。
主人公に
攻撃力(攻撃ポイント)、魔力(魔法ポイント)、体力(HPのようなもの)、英雄度(レベルのようなもの)といったステータスをつけ、魔物を倒していくにつれそれが上昇し、英雄度が一定の数値に達したらクリア としたいです。
また
・魔物を何体か出現させるシステム(ステータスや名前の違う魔物)
・攻撃すると体力が減るシステム(戦闘に入り、攻撃 魔法 などで相手を攻撃 魔物の体力を減らす)
・体力が0になると倒れるシステム(主人公と魔物のどちらかの体力が0になると次のステップに移るようにしたい)
・倒すと主人公の体力があがるシステム(魔物を倒すと、主人公のステータスが上昇する)
をどのように作ればいいのかわかりません。
環境はXcodeです。(MacOS)
現在の知識レベルに関してですが、%で示すことが難しいです。
c++の前にphpをやったことがあるので、構造は理解できます。サンプルファイルがどのような構造になっているかは完全にわかります。
先生からいただいたサンプル(sample.txt)
私の作りかけのプログラム(aiueo.cpp)
を添付しました。

241ポイント を手に入れた。
|
|
|
|
Name: softya [URL] ..ハッカー(212,843ポイント)
Date: 2010/09/05(日) 12:43
No:60982
|
|
Title: Re:助けてください。
|
|
まず締切りを明確にしてくださいね。
それと現在のC++の知識レベルを出来るだけ細かく書いてください。
(クラス理解度30%やポインタ理解度10%とか)
それとここはtxtやzipなら添付可能です。活用してください。
>魔物を何体か出現させるか
>攻撃すると体力が減るシステム
>体力が0になると倒れるシステム
>倒すと主人公の体力があがるシステム
ここに関してはアルゴリズムとか仕様の問題ですので細かく検討する必要があります。
日本語でどの様にしたら良いか書けますか?
できるだけ細かく書いてみてください。
ゲームの流れについても、書いてみてください。
52ポイント を手に入れた。
|
|
|
|
|
Name: softya [URL] ..ハッカー(213,792ポイント)
Date: 2010/09/05(日) 14:18
No:60990
|
|
Title: Re:助けてください。
|
|
更新されたことに今まで気づきませんでした。
返信の形で、書いてくださいね。
タイトルももとに戻すことをお勧めします。
>宿題の内容はゲームを作ることです。添付したファイルが先生から配られたサンプルです。このくらいのレベルのものを作りたいと思っています。
時間的にはむちゃくちゃ厳しいですね。
>c++の前にphpをやったことがあるので、構造は理解できます。サンプルファイルがどのような構造になっているかは完全にわかります。
構造ということはアルゴリズムは分かりますか?
何となく分かる気がするのと、同じものが見ずに書けるのでは理解度が全く違います。
たとえば、
void Uranaishi::SettokuryokuWoAgeru(int p) // pは使用するパワー
でやっていることは日本語で説明できますか?
それで日本語で書いたあと元を見ずに同じものが書けますか?
理解しているというのは、同じものが書ける状態を言います。
>私は主人公が魔物(何体か現れる)を倒していくゲームを作ろうと思っています。
>主人公と魔物にはそれぞれ体力があって、攻撃すると減り、魔物の体力が0になれば倒せたり、魔物を倒すと主人公の体力があがる機能をつけようと思っています。
>ゲームの流れは、ゲーム説明→コマンドで行動を選択(→魔物が現れる→倒す→主人公のステータスがあがっていく→主人公の英雄度が一定の数に達したらゲームクリアとしたいです。
うーん。
まだ具体的ではないですね。
こうしましょう。
こうやって動くとんだとテキストで良いので架空の(→魔物が現れる→倒す→主人公のステータスがあがっていく)までのテキストのやりとりを実際に書いてみてください。
>主人公に
>攻撃力(攻撃ポイント)、魔力(魔法ポイント)、体力(HPのようなもの)、英雄度(レベルのようなもの)といったステータスをつけ、魔物を倒していくにつれそれが上昇し、英雄度が一定の数値に達したらクリア としたいです。
それぞれの値は何に使いますか?
攻撃力
魔力
体力
英雄度 ← なんの条件で上がるのでしょうか?
攻撃力、魔力、体力と英雄度の関係式は?
プログラムの作り方以前に決めておくべきことですね。
自分で攻略本を書くつもりで考えてみてください。
888ポイント を手に入れた。
|
|
|
|
|
Name: タクロウ ..ぴよぴよ(270ポイント)
Date: 2010/09/05(日) 15:29
No:61009
|
|
Title: Re:助けてください。
|
|
ご回答ありがとうございます。
現在外出中でして、思い出す限りですとvoid〜の部分は条件によって説得力をあげるものだったと思います。入力したある数値が一定の数値を超えるか超えないかとかでプラスされる説得力変わるものだった気がします。
攻撃力は主人公の力量を表します。高ければ敵に与えるダメージも高くなります。(10〜100)
魔力は行動を起こすと消費します。(10〜50)
体力は主人公の体力そのものです。0になったらゲームオーバー。高ければ死ににくくなります(10〜100)
英雄度は主人公のレベルです。10まであがればゲームクリアとなります(0〜10)
体力と攻撃力は敵をたおすと5〜10のレンジでランダムに上昇し、英雄度は1〜2のレンジでランダムに上昇します。
ゲーム展開は、まずゲーム説得がはじまります。その次にコマンドで行動を選択します。1筋トレ(攻撃力をあげる)、2眠る(体力をあげる)、3何もしない
行動を起こすと魔力を〜3消費し、1、2はそれぞれ体力と攻撃力を上昇させます。
2〜3ターンに一度魔物が現れます。(毎回ランダムで、主人公のステータスに似たもの)
次に戦闘フェーズに入ります。
コマンドで何をするか選択します。
1、攻撃(攻撃力に応じて相手の体力をへらします。)
2、逃げる(戦闘を終わらせます)
(行動を起こせば魔力を消費します)
負ければゲームオーバー
これを主人公の体力か魔力が0になるまで繰り返します。
英雄度が10になるとゲームクリアです。
29ポイント を手に入れた。
|
|
|
|
|
Name: softya [URL] ..ハッカー(214,529ポイント)
Date: 2010/09/05(日) 15:43
No:61013
|
|
Title: Re:助けてください。
|
|
>思い出す限りですとvoid〜の部分は条件によって説得力をあげるものだったと思います。入力したある数値が一定の数値を超えるか超えないかとかでプラスされる説得力変わるものだった気がします。
同じものは見ずに書けると考えて良いですね?
>攻撃力は主人公の力量を表します。高ければ敵に与えるダメージも高くなります。(10〜100)
ダメージの計算式をお願いします。
>魔力は行動を起こすと消費します。(10〜50)
魔力の消費量はどうやって決まりますか?
と言うより時間がないので具体的に全てのパターンと数値を急いで決めてください。
>体力は主人公の体力そのものです。0になったらゲームオーバー。高ければ死ににくくなります(10〜100)
それでは現在値と最大値を保持する必要があるのですね?
それとも、現在値だけですか?
>英雄度は主人公のレベルです。10まであがればゲームクリアとなります(0〜10)
体力と攻撃力は敵をたおすと5〜10のレンジでランダムに上昇し、英雄度は1〜2のレンジでランダムに上昇します。
はい。それはOKですね。
>ゲーム展開は、まずゲーム説得がはじまります。その次にコマンドで行動を選択します。1筋トレ(攻撃力をあげる)、2眠る(体力をあげる)、3何もしない
>行動を起こすと魔力を〜3消費し、1、2はそれぞれ体力と攻撃力を上昇させます。
魔力の回復はレベルアップだけですか?
>2〜3ターンに一度魔物が現れます。(毎回ランダムで、主人公のステータスに似たもの)
>次に戦闘フェーズに入ります。
これは乱数で良いですね。
魔物の決定方法がないですね。検討をお願いします。
あと魔物パラメータも。
>コマンドで何をするか選択します。
>1、攻撃(攻撃力に応じて相手の体力をへらします。)
>2、逃げる(戦闘を終わらせます)
>(行動を起こせば魔力を消費します)
>負ければゲームオーバー
これはOKだと思います。
>これを主人公の体力か魔力が0になるまで繰り返します。
>英雄度が10になるとゲームクリアです。
じゃあ、まず足らない分を検討してみてください。
それと戦闘は後回しにして主人公の行動側から作ってみましょか。
616ポイント を手に入れた。
|
|
|
|
|
Name: タクロウ ..ぴよぴよ(500ポイント)
Date: 2010/09/05(日) 16:08
No:61016
|
|
Title: Re:助けてください。
|
|
携帯電話から投稿しているので見づらいかもしれません。
はい。構いません。
攻撃力は初期値は10(〜99)
戦闘で勝つか筋トレで4〜6のレンジでランダムに上昇します。
アタックダメージは現在の攻撃力の30〜50%の値をランダムに出力しまし。
魔力は初期値10(〜50)魔力を上昇させるには戦闘に勝つしかありません。勝ったときに2か3、行動しても2か3消費します。
体力は初期値10(〜99)戦闘で勝つか眠るで4〜6のレンジでランダムに上昇します。
体力は現在値のみです。
英雄度は初期値0(〜10)戦闘に勝つと1か2上昇します。
魔物のステータス主人公同様、攻撃力、魔力、体力です。ダメージ値などの計算式も同じですが、それぞれの値は現在の主人公のステータスの60〜80%です。
230ポイント を手に入れた。
|
|
|
|
|
Name: softya [URL] ..ハッカー(214,746ポイント)
Date: 2010/09/05(日) 16:22
No:61019
|
|
Title: Re:助けてください。
|
|
抜けがないか自分で再確認してみてください。
パラメータが出揃ったと思うので、まず行動を作ってみましょう。
擬似プログラムで良いので、簡単にプログラムを書いてみるのをお勧めします。
[擬似プログラム]
説明(略)
入力待ち
while( 体力がnot0 and 魔力がnot0 and 英雄度<10 )の間ループ
cinで行動番号を得る。
if( 行動番号が1 )
筋トレ関数()
if( 行動番号が2 )
眠る関数()
if( モンスター出現? )
戦闘処理の関数()
whileここまで
って感じです。
わざと省略している部分もあるので自分で補完してみてください。
178ポイント を手に入れた。
|
|
|
|
|
Name: タクロウ ..ぴよぴよ(558ポイント)
Date: 2010/09/05(日) 16:43
No:61021
|
|
Title: Re:助けてください。
|
|
ありがとうございます。本当に感謝しています。
プログラムを書いてみようと思います。
できる限り頑張ってみますが、もし出来なかった時はもう一度私に救いの手をさしのべてやってください・・
58ポイント を手に入れた。
|
|
|
|
|
Name: タクロウ ..ぴよぴよ(501ポイント)
Date: 2010/09/05(日) 19:41
No:61042
|
|
Title: Re:助けてください。
|
|
ここまでやってみました。(ファイルを添付しました)
出たエラーと、やりかけのプロラムを添付しました。
朝からずっとやっていて、現在頭があまり回っていないきがします。
かなりしょぼいミスもあるでしょうが、教えていただけるとうれしいです。
57ポイント を落としてしまった。
|
|
|
|
|
Name: タクロウ ..ぴよぴよ(558ポイント)
Date: 2010/09/05(日) 21:11
No:61048
|
|
Title: Re:助けてください。
|
|
だいたいのエラーを修正しましたが、error: expected primary-expression before ‘.’ tokenというエラーだけがとれません。どういうことなのでしょうか?
また、魔王との戦闘の書き方を教えてくださいませんか?
57ポイント を手に入れた。
|
|
|
|
|
Name: softya [URL] ..ハッカー(215,152ポイント)
Date: 2010/09/05(日) 21:38
No:61052
|
|
Title: Re:助けてください。
|
|
エラー箇所は、参照できないものを参照しているせいです、
Mamonoのインスタンス生成時に引数にJonnyのパラメータを渡す様にしてください。
//コンストラクタ
Mamono(int power,int tairyoku) :Name("魔物"), Maryoku(20)
{
Power = (int)(power * 0.6); // or 0.7 or 0.8
Tairyoku = (int)(tairyoku * 0.6); // or 0.7 or 0.8)
}
あと orって書いてあるところは乱数で生成するようにしてください。
0.6 or 0.7 or 0.8なら((double)(rand()%3 + 6) / 10.0)です。
それとint型とdouble型の演算が混在してますので、ちゃんとキャストしてください。
233ポイント を手に入れた。
|
|
|
|
|
Name: タクロウ ..ぴよぴよ(568ポイント)
Date: 2010/09/05(日) 21:57
No:61054
|
|
Title: Re:助けてください。
|
|
どうしても残りのエラーが修正できません。。
手伝ってくだいませんか?
10ポイント を手に入れた。
|
|
|
|
|
Name: タクロウ ..ぴよぴよ(674ポイント)
Date: 2010/09/05(日) 22:36
No:61064
|
|
Title: Re:助けてください。
|
|
softyaさんいつもありがとうございます。感謝しています。
エラーはなくなったのですが、実行しても主人公がコマンドで行動を選択する場面ば表示されません。なぜでしょうか?
現在の状態のファイルを添付しました。
106ポイント を手に入れた。
|
|
|
|
|
Name: nazu ..ぴよぴよ(121ポイント)
Date: 2010/09/06(月) 03:29
No:61082
|
|
Title: Re:助けてください。
|
|
初めまして。
アドバイスするのも初めてなので、不安ですが
273行目の、while文に問題があります。
//体力がゼロになるか、英雄度が10になるまで繰り返す
while(you.GetTairyoku() < 0 && you.GetMaryoku() < 0 && you.GetEiyuudo() < 10)
while文は評価が真の間ループします。
このプログラムの仕様を見る限り、体力と魔力が0になるまでコマンドを実行でき、
英雄度が10になるとゲームクリアとのことですので、もう一度この部分を見直してください。
ざっと見ただけなので、見落としているかも知れません。
121ポイント を手に入れた。
|
|
|
|
|
Name: タクロウ ..ぴよぴよ(735ポイント)
Date: 2010/09/06(月) 22:44
No:61150
|
|
Title: Re:助けてください。
|
|
一応完成しました。
正常に動いています。
「ここをこうしたほうが良い」とかいうアドバイスがありましたら、教えてくださると助かります。
61ポイント を手に入れた。
|
|
|
|
Name: なつ ..ぴよぴよ(646ポイント)
Date: 2010/09/06(月) 16:43
No:61120
|
|
Title: つまづいてます。助けてください。
|
|
こんにちは。
またまた、お世話になります。
今回は、C#でエクセルのセルに画像を入力しようとしてます。
既存のソースに下記を加えたのですが、「objectにWorkbooksの定義がありません」っていうエラーが帰ってきます。下記を、単体でしたときはできていたのですが・・・。
よろしくお願いします。
Excel.Range range;
Excel.Shapes shapes;
Excel.Shape shape;
//ES_Appli = new Excel.Application();
ES_WBook = E_Appli.Workbooks.Open(saveFile, Type.Missing, Type.Missing, Type.Missing
, Type.Missing, Type.Missing, Type.Missing
, Type.Missing, Type.Missing, Type.Missing
, Type.Missing, Type.Missing, Type.Missing);
E_Sheet = (Excel.Worksheet)ES_WBook.ActiveSheet;
range = E_Sheet.get_Range("A1", Type.Missing);
shapes = E_Sheet.Shapes;
shape = shapes.AddPicture(@"パス", Office.MsoTriState.msoFalse, Office.MsoTriState.msoTrue, 420, 0, 85, 15);
297ポイント を手に入れた。
|
|
|
|
Name: なつ ..ぴよぴよ(829ポイント)
Date: 2010/09/06(月) 17:22
No:61124
|
|
Title: Re:つまづいてます。助けてください。
|
|
返答ありがとうございます。
>E_Appliの定義はどうなっていますか。 おそらく,そこが
>Excel.Application E_Appli;のようになっていないのだと思います
Excel.Application E_Appliってなってないです。ただ、メンバー変数で「private object E_Appli」ってなってます。
エクセルの操作ソースの中をいじってるんですが、「Excel.Application」の定義がまったくなくってわからないんです。
新しく定義すると画面が固まっちゃってます・・・。
183ポイント を手に入れた。
|
|
|
|
|
Name: YuO ..熟練のプログラマー(47,054ポイント)
Date: 2010/09/06(月) 17:48
No:61126
|
|
Title: Re:つまづいてます。助けてください。
|
|
> Excel.Application E_Appliってなってないです。ただ、メンバー変数で「private object E_Appli」ってなってます。
なぜExcel.Application型 (Excel 2010だとMicrosoft.Office.Interop.Excel.Application型) ではなくobject型で定義しているのですか。
PIA (or 非推奨だがIA) を使わないのであれば,C#の場合は頑張ってリフレクションでディスパッチしていくしかないはずです。
C# 4.0ならdynamicがありますが……。
# PIA: プライマリ相互運用アセンブリ (Primary Interop Assembly), IA: 相互運用アセンブリ (Interop Assembly)
142ポイント を手に入れた。
|
|
|
|
|
Name: なつ ..ぴよぴよ(875ポイント)
Date: 2010/09/07(火) 20:37
No:61234
|
|
Title: Re:つまづいてます。助けてください。
|
|
返信、遅くなってすみません。
なぜ、object型なのかは分らないですが、他にもやりかたがあるようなので考えてみます。
46ポイント を手に入れた。
|
|
|
|
Name: パコネコ ..プログラマー(39,550ポイント)
Date: 2010/09/06(月) 23:42
No:61159
|
|
Title: 警告について(fscanfとか)
|
|
/*
f:\猫様\猫様\mein.cpp(275): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
c:\program files\microsoft visual studio 10.0\vc\include\stdio.h(234) : 'fopen' の宣言を確認してください。
f:\猫様\猫様\mein.cpp(277): warning C4996: 'fscanf': This function or variable may be unsafe. Consider using fscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
c:\program files\microsoft visual studio 10.0\vc\include\stdio.h(253) : 'fscanf' の宣言を確認してください。
f:\猫様\猫様\mein.cpp(292): warning C4996: 'fscanf': This function or variable may be unsafe. Consider using fscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
c:\program files\microsoft visual studio 10.0\vc\include\stdio.h(253) : 'fscanf' の宣言を確認してください。
f:\猫様\猫様\mein.cpp(297): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
c:\program files\microsoft visual studio 10.0\vc\include\stdio.h(234) : 'fopen' の宣言を確認してください。
f:\猫様\猫様\mein.cpp(300): warning C4996: 'fscanf': This function or variable may be unsafe. Consider using fscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
c:\program files\microsoft visual studio 10.0\vc\include\stdio.h(253) : 'fscanf' の宣言を確認してください。
f:\猫様\猫様\mein.cpp(310): warning C4996: 'fscanf': This function or variable may be unsafe. Consider using fscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
c:\program files\microsoft visual studio 10.0\vc\include\stdio.h(253) : 'fscanf' の宣言を確認してください。
f:\猫様\猫様\mein.cpp(366): warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
c:\program files\microsoft visual studio 10.0\vc\include\stdio.h(371) : 'sprintf' の宣言を確認してください。
f:\猫様\猫様\mein.cpp(369): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
c:\program files\microsoft visual studio 10.0\vc\include\stdio.h(234) : 'fopen' の宣言を確認してください。
f:\猫様\猫様\mein.cpp(371): warning C4996: 'fscanf': This function or variable may be unsafe. Consider using fscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online
help for details.
c:\program files\microsoft visual studio 10.0\vc\include\stdio.h(253) : 'fscanf' の宣言を確認してください。
f:\猫様\猫様\mein.cpp(377): warning C4996: 'fscanf': This function or variable may be unsafe. Consider using fscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
c:\program files\microsoft visual studio 10.0\vc\include\stdio.h(253) : 'fscanf' の宣言を確認してください。
f:\猫様\猫様\mein.cpp(381): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
c:\program files\microsoft visual studio 10.0\vc\include\stdio.h(234) : 'fopen' の宣言を確認してください。
f:\猫様\猫様\mein.cpp(384): warning C4996: 'fscanf': This function or variable may be unsafe. Consider using fscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
c:\program files\microsoft visual studio 10.0\vc\include\stdio.h(253) : 'fscanf' の宣言を確認してください。
*/
とおそらく使っているすべてのファイル関係に警告が出ているようなのですが何が原因なのかわかりません。
(確認してみましたが難しくて…)
上が長くなってすいません…
こんな感じに使ってます(全部じゃないです)
FILE *fp;
/*画像*/
int map_img[gazou_max];
for(a=0;a<gazou_max;a++){
sprintf(buff,"パコネコゲーム用/map_img/床%d.bmp",a);
map_img[a]=LoadGraph(buff);
}
fp=fopen("パコネコゲーム用/map_データ/マップパラメーター.txt","r");
do{
fscanf(fp,"%d",&a);
if(a!=1000)
fscanf(fp,"%d %d %d %d",
&kakuninn[a][0],
&kakuninn[a][1],
&kakuninn[a][2],
&kakuninn[a][3]);
}while(a!=1000);
fclose(fp);
使い方に問題ありでしょうか?
1,627ポイント を手に入れた。
|
|
|
|
Name: MNS ..プログラマー(39,927ポイント)
Date: 2010/09/07(火) 06:07
No:61195
|
|
Title: Re:警告について(fscanfとか)
|
|
'fscanf': This function or variable may be unsafe. Consider using fscanf_s instead.
To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
→'fscanf': この関数もしくは変数は危険です。代わりにfscanf_sを使うことを検討してください。
警告を無効にするには、_CRT_SECURE_NO_WARNINGSを使用してください。詳細はオンラインヘルプを参照してください。
日本語にするとたぶんこんな感じです。
fscanfの使い方が悪いのではなく、その関数自体の危険性に警告が出されています。
標準関数は何かと危険を孕んでいることが多いので、
マイクロソフトは、自社が独自に開発した関数を使うことを推奨しています。
ですが、使い方が正しいのであれば、特に気にする必要はないと思います。
195ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..熟練のプログラマー(58,394ポイント)
Date: 2010/09/07(火) 06:46
No:61196
|
|
Title: Re:警告について(fscanfとか)
|
|
警告は内容を理解していたら無視してもいいです
ファイルの先頭に
#define _CRT_SECURE_NO_WARNINGS
と書けば表示を抑制できます
ファイルが多ければプロジェクトのプロパティでプリプロセッサの定義に追加してもいいです
66ポイント を手に入れた。
|
|
|
|
|
Name: パコネコ ..熟練のプログラマー(40,425ポイント)
Date: 2010/09/07(火) 17:13
No:61220
|
|
Title: Re:警告について(fscanfとか)
|
|
なるほど!
皆さんありがとうございました。
今まで勉強していた時は危険を含んでいることを知りませんでした。
時間ができましたら、シエルさんの張っていただいた場所のものも使えるように勉強しておきます。
ところで、(ものによるでしょうけど)危険とはどういったものなのでしょうか?
今まで聞いたこともなかったのですが…(知りませんでした。)
ファイルが壊れてしまうなどでしょうか?
今後に生かすべく、勉強したいので
例だけでもいいので教えていただけないでしょうか?
172ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..ハッカー(226,573ポイント)
Date: 2010/09/07(火) 18:10
No:61222
|
|
Title: Re:警告について(fscanfとか)
|
|
「国際標準規格の関数は糞なので、マイクロソフトが用意してあげたもっと優れた独自関数を使え」という警告ですね。
このアドバイスに従うと、わずかに安全性が向上することがある代わりに、関数は遅く、移植性のないものになります。
C1Xにも、似たような関数の仕様がありますが、微妙に異なるのでやはり互換性はありません。
得るものと失うものを比較して、どうするかを決めるとよいでしょう。
> ところで、(ものによるでしょうけど)危険とはどういったものなのでしょうか?
建前としてはメモリへの不正アクセスでしょうが、実際には他社の処理系に乗り換えられる危険があるということです。
ちなみ、fscanfをfscanf_sに変えたところで、元々危険ではない部分は間違いを犯しやすくなり、本当に危険な部分はそのままだったりします。
http://www.kijineko.co.jp/node/307
294ポイント を手に入れた。
|
|
|
|
|
Name: パコネコ ..熟練のプログラマー(40,479ポイント)
Date: 2010/09/07(火) 18:43
No:61226
| 解決!
|
Title: Re:警告について(fscanfとか)
|
|
なるほど、
わかりやすい例ありがとうございました。
使えるようになっておいてもいいとは思いますが、あまり使う必要はなさそうですね。
つまらないミスしてもいやですし…
ありがとうございました。
54ポイント を手に入れた。
|
|
|
|
Name: dic ..比類無きプログラマー(95,050ポイント)
Date: 2010/09/07(火) 10:30
No:61203
|
|
Title: 新しいクラス(ファイル)追加できない
|
|
現在自分用のライブラリができたので、これに新しくファイルを追加して、
クラスを追加したのですが、コンパイルがうまくいかないです
色々試したのですが、再帰コンパイルになったり、クラスが見つからなかったりと
原因が分かりません
ちょっとソースが多いですが、インクルード関係だけなので、それほど修正するところはないと思うので
ソースを全部アップしてみます
新しいファイルCGame.cpp から main.h をインクルード
main.h で CGame.h をインクルードしているのですが
今度はグローバル変数ようの EXTN extern がうまくマクロ展開されないので私の力では
どうしようもなくなってしまいました
どうすれば、うまく CGame.cpp と CGame.h が追加できるでしょうか?
下がソースコードになります
http://www1.axfc.net/uploader/Sc/so/151048
開発環境は Visual C++ 6.0 です

353ポイント を手に入れた。
|
|
|
|
Name: うしお ..かけだし(1,546ポイント)
Date: 2010/09/07(火) 12:42
No:61206
|
|
Title: Re:新しいクラス(ファイル)追加できない
|
|
class CGameManager : public BaseObject
{
public:
void Init();
void Release();
void Draw();
void Move();
};←セミコロンがついていませんでした
73ポイント を手に入れた。
|
|
|
|
|
Name: dic ..比類無きプログラマー(95,121ポイント)
Date: 2010/09/07(火) 15:34
No:61216
| 解決!
|
Title: Re:新しいクラス(ファイル)追加できない
|
|
>うしおさん
うおおおお そんなミスが
いつもいつもそこのセミコロン忘れるんですよ
解決しました ありがとうございました
71ポイント を手に入れた。
|
|
|
|
Name: みけCAT ..入門者(4,528ポイント)
Date: 2010/09/05(日) 18:00
No:61034
|
|
Title: 第9回日本情報オリンピック予選 問題6
|
|
学校に提出するレポートとして、情報オリンピックの問題を複数の方法で解き、
実行速度を比較するということをしています。
今第9回日本情報オリンピック予選
http://www.ioi-jp.org/joi/2009/2010-yo-prob_and_sol/index.html
の問題6をやっています。
解説の解法2と解法3のプログラムは書けたのですが、解法1がわからなくて困っています。
とくに「プレゼントの少ない状態から順に値を決めていけば最終状態の数がわかる.」
というところがわかりません。
解説できる人がいたらお願いします。
解法2と解法3のプログラムを添付しておきます。
標準入力から読み込み、標準出力に出力します。
2009-yo-t6-1.cが解法3、2009-yo-t6-2.cが解法2です。
280ポイント を手に入れた。
|
|
|
|
Name: ookami ..熟練のプログラマー(51,303ポイント)
Date: 2010/09/07(火) 13:00
No:61207
|
|
Title: Re:第9回日本情報オリンピック予選 問題6
|
|
興味深い問題ですね。
でも読んでいるうちに頭がモヨモヨしてきたため、
以下、わけのわからないことを書くかもしれません。よろ☆しくw
--
> 現在すでに拾ったプレゼントの組み合わせと最後にプレゼントを拾った家の組み合わせを状態とし
というのを、「入力1」の場合で考えて見ます。
4 4
1 1 1 1
1 0 0 1
1 0 0 1
1 1 1 2
4 * 4の広さで、教会[2]が右下にあって、それぞれ上下左右の辺に家[1]があり、残りは空き地[0]ですね。
便宜上、家に 1 2 3 ... 9 A B と番号を振ります。
1 2 3 4
5 6
7 8
9 A B
教会からスタートして、最初に考えられるのは、
B(last:B) / 8(last:8)
の2通り。次の状態は、Bからは A or 3 に 、 8からは 7 or 6 にいけるので、
B A(last:A) / B 3(last:3) / 8 7(last:7) / 8 6(last:6)
の4通り。次の状態は...
--
みたいに考えるんじゃないですかね。
「プレゼントの少ない状態から順」にもしっくり来る気がします。
217ポイント を手に入れた。
|
|
|
|
Name: 麻耶 ..ぴよぴよ(653ポイント)
Date: 2010/09/05(日) 21:52
No:61053
|
|
Title: 画像に動きをつける
|
|
お世話になってます。
また、こちらに書き込んでしまいすみません;
画像を分割して読み込み、動きを付けたいと思うのですが
イマイチ分からないので教えて下さい。
添付した画像を使って動きを付けたいのですが
int image[2];
LoadDivGraph( "○○.bmp" , 2 , 2 , 60 , 60 , image ) ;
これで良いのでしょうか?
ゲームプログラミングの館のほうを見てやってみたんですが
縦の画像枚数が無いのであえて書かなかったのですが
大丈夫ですかね・・。
51ポイント を落としてしまった。
|
|
|
|
Name: DecentLove ..上級者(17,592ポイント)
Date: 2010/09/05(日) 22:00
No:61055
|
|
Title: Re:画像に動きをつける
|
|
>LoadDivGraph( "○○.bmp" , 2 , 2 , 60 , 60 , image ) ;
>これで良いのでしょうか?
>ゲームプログラミングの館のほうを見てやってみたんですが
>縦の画像枚数が無いのであえて書かなかったのですが
そんなことしちゃいけませんよ。絶対エラーになります。
とりあえず、縦の枚数はかならず「1」になるはずですよ。縦*横で2。この場合は1*2になるはずです。
1*2で分割画像総数2枚になります。
LoadDivGraph( "○○.bmp" ,2 , 1 , 2 , 60 , 60 , image ) ;
にしましょう。 
139ポイント を手に入れた。
|
|
|
|
|
Name: 麻耶 ..ぴよぴよ(734ポイント)
Date: 2010/09/05(日) 22:04
No:61056
|
|
Title: Re:画像に動きをつける
|
|
DecentLoveさん
なるほど・・!ありがとうございます!
1で良かったんですね。
また、↑の画像を2枚にわけて
それを関数で1つの画像にして動きをつけることって出来ますか・・?
81ポイント を手に入れた。
|
|
|
|
|
Name: DecentLove ..上級者(17,811ポイント)
Date: 2010/09/05(日) 22:14
No:61059
|
|
Title: Re:画像に動きをつける
|
|
動きをつけるとは、どういうことでしょう?
交互に描画するということになりますかね?
僕もC++初心者なのであまり的確なことはできませんが、
龍神録プログラミングの館のコードの1つに
void calc_ch(){
ch.cnt++;
ch.img=(ch.cnt%24)/6;
}
とあります。
ch.imgが描画する画像を表しています。
このコードは一定周期で描画する画像を変更していますので、キャラの服が風にたなびく映像を描画できます。
なので、この場合 メインループの中に
int i ;
とでも1つ宣言しておいて
i++;
image = i%2 ;
というのを追加すれば2つの画像を交互に描画できるはずです。
もしかしたら、色々間違ってるかもしれません。
219ポイント を手に入れた。
|
|
|
|
|
Name: 麻耶 ..ぴよぴよ(852ポイント)
Date: 2010/09/05(日) 22:32
No:61062
|
|
Title: Re:画像に動きをつける
|
|
DecentLoveさん
お早いお返事ありがとうございます!
我侭なことを言って大変お手数かけてしまい申し訳ないのですが
11章で自キャラと敵キャラの変更をしたいのですが
画像を変える場合はload.cpp main.cpp graph.cppを変更すれば大丈夫でしょうか・・。
色々と書いてしまいすみません;
118ポイント を手に入れた。
|
|
|
|
|
Name: 麻耶 ..ぴよぴよ(952ポイント)
Date: 2010/09/06(月) 00:24
No:61075
|
|
Title: Re:画像に動きをつける
|
|
見当たるところ全部変えてみたんですが
なかなか上手くいかなくて・・;
デバッグ実行した時もエラーの警告は出ずに
デバッグしたときの画面に画像が表示されなくてorz
何がいけないんでしょうか;
100ポイント を手に入れた。
|
|
|
|
|
Name: 麻耶 ..かけだし(1,672ポイント)
Date: 2010/09/06(月) 13:58
No:61115
|
|
Title: Re:画像に動きをつける
|
|
最終的に一番上の画像を添付した画像みたいにエンジンら辺をパカパカさせたいのですが
load.cppはコレであってますでしょうか・・・。何度やっても画像が出なくてわからなくて;
ファイル名はk5.pngで、一番上の画像を使っています。
#include "../include/GV.h"
void load(){
img_board[10] = LoadGraph("../dat/img/board/10.png");
img_board[11] = LoadGraph("../dat/img/board/11.png");
img_board[12] = LoadGraph("../dat/img/board/12.png");
img_board[20] = LoadGraph("../dat/img/board/20.png");
LoadDivGraph( "../dat/img/char/k5.png" , 2 , 1 , 2 , 60 , 60 ,img_ch[0]) ;
LoadDivGraph( "../dat/img/enemy/0.png" , 9 , 3 , 3 , 32 , 32 , img_enemy[0] ) ;
}
//敵の出現情報をエクセルから読み込んで格納する関数
void load_story(){
int n,num,i,fp;
char fname[32]={"../dat/csv/11章/storyH0.csv"};
int input[64];
char inputc[64];
fp = FileRead_open(fname);//ファイル読み込み
if(fp == NULL){
printfDx("read error\n");
return;
}
for(i=0;i<2;i++)//最初の2行読み飛ばす
while(FileRead_getc(fp)!='\n');
n=0 , num=0;
while(1){
for(i=0;i<64;i++){
inputc[i]=input[i]=FileRead_getc(fp);//1文字取得する
if(inputc[i]=='/'){//スラッシュがあれば
while(FileRead_getc(fp)!='\n');//改行までループ
i=-1;//カウンタを最初に戻して
continue;
}
if(input[i]==',' || input[i]=='\n'){//カンマか改行なら
inputc[i]='\0';//そこまでを文字列とし
break;
}
if(input[i]==EOF){//ファイルの終わりなら
goto EXFILE;//終了
}
}
switch(num){
case 0: enemy_order[n].cnt =atoi(inputc);break;
case 1: enemy_order[n].pattern =atoi(inputc);break;
case 2: enemy_order[n].knd =atoi(inputc);break;
case 3: enemy_order[n].x =atof(inputc);break;
case 4: enemy_order[n].y =atof(inputc);break;
case 5: enemy_order[n].sp =atof(inputc);break;
case 6: enemy_order[n].bltime =atoi(inputc);break;
case 7: enemy_order[n].blknd =atoi(inputc);break;
case 8: enemy_order[n].col =atoi(inputc);break;
case 9: enemy_order[n].hp =atoi(inputc);break;
case 10:enemy_order[n].blknd2 =atoi(inputc);break;
case 11:enemy_order[n].wait =atoi(inputc);break;
case 12:enemy_order[n].item_n[0]=atoi(inputc);break;
case 13:enemy_order[n].item_n[1]=atoi(inputc);break;
case 14:enemy_order[n].item_n[2]=atoi(inputc);break;
case 15:enemy_order[n].item_n[3]=atoi(inputc);break;
case 16:enemy_order[n].item_n[4]=atoi(inputc);break;
case 17:enemy_order[n].item_n[5]=atoi(inputc);break;
}
num++;
if(num==18){
num=0;
n++;
}
}
EXFILE:
FileRead_close(fp);
}
おかしなエラーも表示されずに、ただデバッグすると画像が出てきません・・。
どこがおかしいんでしょうか・・・。 
720ポイント を手に入れた。
|
|
|
|
|
Name: 麻耶 ..かけだし(1,868ポイント)
Date: 2010/09/06(月) 22:28
No:61145
|
|
Title: Re:画像に動きをつける
|
|
DecentLove さん
親身になって色々アドバイスくださってありがとうございます;
勉強不足で逆に困らせてしまってすみませんでした;
ありがとうございます!
シエルさん
反応ありがとうございます。
パカパカ光らせるコードですか・・!
こんなこと言って申し訳ないのですが
どこら辺消せばいいですかね・・。
C言語プログラミングの館のほうを見たら
動かすのには最低16枚必要と書いてあったのですが
16枚はないとやっぱ難しいですかね・・、
2枚を交互に表示して動いてるように見せるのでは
厳しいでしょうか・・。
LoadDivGraph( "../dat/img/char/k5.png" , 2 , 1 , 2 , 60 , 60 ,img_ch[0]) ;
196ポイント を手に入れた。
|
|
|
|
|
Name: MAY ..かけだし(1,485ポイント)
Date: 2010/09/06(月) 22:36
No:61146
|
|
Title: Re:画像に動きをつける
|
|
横からすみません。
16枚必要というのは4方向×4枚という意味であって
別に16枚ないといけないわけではありません。
35ポイント を手に入れた。
|
|
|
|
|
Name: シエル [URL] ..熟練のプログラマー(69,514ポイント)
Date: 2010/09/06(月) 23:26
No:61153
|
|
Title: Re:画像に動きをつける
|
|
画像が横に2枚並んでいるのであれば、LoadDivGraph("char.png",2,2,1,54,54,gh);とかけばいいと思います。
これは総画像数が2、横分割数が2、縦分割数が1、画像一つ分の横と縦の長さが
54のものを読み込んでいるわけです。
で、以下が0.25秒ごとに画像をパカパカ切り換えてるコードです。
普段DXライブラリは一切使わないので、間違っているかもしれませんが、よろしくお願いします。
#include "DxLib.h"
int Key[256];
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
else GetHitKeyStateAll_InputKey[i]=0;
}
return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
int flag=0;
int count=0;
int gh[2];
LoadDivGraph("char.png",2,2,1,54,54,gh);
while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理 ↑画面をクリア ↑入力状態を保存 ↑ESCが押されていない
//ココ!!
if(flag){
DrawGraph(100,100,gh[0],TRUE);
}else{
DrawGraph(100,100,gh[1],TRUE);
}
if(count%15==0){//0.25秒ごとにフラグを反転
flag^=1;
}
++count;
Sleep(16);
ScreenFlip();
}
DxLib_End();
return 0;
}

737ポイント を手に入れた。
|
|
|
|
|
Name: wing ..中級者(13,273ポイント)
Date: 2010/09/06(月) 23:26
No:61154
|
|
Title: Re:画像に動きをつける
|
|
GV.hで
int img_ch[2][12]となっているのを
int img_ch[2][2]か、あるいは適切に変えていますか?
25ポイント を手に入れた。
|
|
|
|
|
Name: wing ..中級者(13,371ポイント)
Date: 2010/09/06(月) 23:34
No:61157
|
|
Title: Re:画像に動きをつける
|
|
>LoadDivGraph( "../dat/img/char/k5.png" , 2 , 1 , 2 , 60 , 60 ,img_ch[0]) ;
これは、2, 1, 2,
ではなく、2, 2, 1,ではないですか?
72ポイント を手に入れた。
|
|
|
|
|
Name: wing ..中級者(13,447ポイント)
Date: 2010/09/06(月) 23:47
No:61161
|
|
Title: Re:画像に動きをつける
|
|
すいません。
これもシエルさんがちゃんと指摘していましたね。
私は最近どうも調子が悪いようです。
本当に失礼しました。
予断ですが、最近「ギンギラパラダイス2」のリーチアクションを
まねしてみようと暇があればパチンコ屋に通っています。
ちょっとパチンコのやりすぎのようです。反省。
76ポイント を手に入れた。
|
|
|
|
|
Name: 麻耶 ..かけだし(2,033ポイント)
Date: 2010/09/07(火) 00:42
No:61174
|
|
Title: Re:画像に動きをつける
|
|
シエルさん
お手数かけてすみません・・!コードまでありがとうございますorz
load.cppを修正してみたんですがやっぱり駄目でした;
初心者な私がこんな生意気なこと言って申し訳ないのですが
LoadDivGraph("char.png",2,2,1,54,54,gh); のChar.pngって
"../dat/img/char/k5.png"で、画像を呼んだらダメですかね・・。
画像はいちばん上の隣同士になっている自機画像を使ってやってみましたが
Char.pngも"../dat/img/char/k5.png"もダメだったみたいで;:
ほかのファイルがなにか変更し忘れているんですかね・・。
165ポイント を手に入れた。
|
|
|
|
|
Name: 麻耶 ..かけだし(2,007ポイント)
Date: 2010/09/07(火) 00:43
No:61175
|
|
Title: Re:画像に動きをつける
|
|
wingさん
いえいえ!
助けて下さりありがとうございます!
26ポイント を落としてしまった。
|
|
|
|
|
Name: シエル [URL] ..熟練のプログラマー(69,952ポイント)
Date: 2010/09/07(火) 07:23
No:61197
|
|
Title: Re:画像に動きをつける
|
|
麻耶さん
駄目だったとは具体的にどう駄目だったのでしょうか?
エラーが出たのか、画像が表示されなかったのかなど、具体的に説明していただかないと、
的確なアドバイスが出来ません。
ちなみに私の先ほどのコードで動作確認はしております。
新しくプロジェクトごと作成しなおして、すべてコピペし、
プロジェクトファイルがあるフォルダに画像一つの大きさが54×54の大きさの画像が横に
2枚ならんだものをchar.pngという名前で放り込んでやれば、動きます。
2倍のポイントを手に入れた! 398ポイント を手に入れた。
|
|
|
|
Name: 森本 ..ぴよぴよ(244ポイント)
Date: 2010/09/06(月) 01:18
No:61079
|
|
Title: どこを変更すれば…(助けてください)
|
|
森本といいます。似たような質問があったんですけど他人のスレに横槍入れて質問するのも嫌だったんで新しくスレ立てました。あの、ここで配布してる龍神録プログラミングの館を見てデフォ画像が東方のキャラ(?)になってるんでそれを辞めて違う画像に差し替えたいんですけど、どこをいじれば変りますか?一応、0.pngっていう名前だったので上書きしてやってあるのでフォルダ名は変わってないんですが、静止画なんで何枚も画像がないので上書きしただけでは動かなくて(エラーになって)悩んでるんですけど・・、●●.cppのどこをいじればきちんと動くでしょうか・・? お願いします。
244ポイント を手に入れた。
|
|
|
|
Name: wind.t ..ぴよぴよ(73ポイント)
Date: 2010/09/06(月) 21:52
No:61141
|
|
Title: Re:どこを変更すれば…(助けてください)
|
|
レスがついていなかったので、ちょっと見てみました。
0.pngを差し替えるだけで、キャラ画像の変更ができましたよ。
ちょっと、森本さんが行った作業で曖昧な箇所がありますので、確認します。
このくらい読み取ってほしいと思うところが有るかもしれませんが、この手の質問を行う場合は大変重要なところですので、意識していただければと思います。
1.開発環境が不明です。分かる範囲で結構ですので、こちらは明記するべきでしょう。
ちなみに私の場合はWindows XP + Visual Studio 2008 Express Edition で確認しています。
DirectX はどのバージョンを入れていたか
また、60章のコードをコンパイルしての確認となります。
2.「0.png を上書きして・・・」はどこの 0.png なのか正確には分かりかねます。
0.png はimgフォルダ以下のサブフォルダのいくつかに存在します。
質問から察するに「dat/img/char/0.png」を指していると思われますが、もしかしたら間違って、
敵キャラ「dat/img/enemy/0.png」を変えているのでは?等と思われる可能性もありますよ。
3.「動かない」では、状況が伝わりません。
一口に動かないといっても、いろいろなシチュエーションがあります。
「動かない」とは、たとえば次のような状況ではないでしょうか?
・コンパイルは無事行われ、RyuJin.exeファイルができている
・RyuJin.exeを実行するとウィンドウは表示されるものの、黒い背景で画像が一切表示されていない
・左上に「read error」と表示されて、右側には「xx.xx:最初」などの文字がいくつか表示されている
※ xx.xx は数字で絶えず変動しています。
4.「0.png」を差し替える前は正しく動いていますか?
「動かない」といった詳細が 3 に記載している通りの現象であるならば、画像を差し替える前の
プログラムをコンパイルしても、同様のエラーになるのではないでしょうか?
その場合、これはファイルの配置に問題かと思われます。
次のように配置することで正しく動作しませんか?
project/
├60章/RyuJin.exe
└dat/
├ (cvs, img, font 等のフォルダ)
:
少し説明しますと、load.cpp にファイルパスの指定がいくつかありますよね?
たとえば8行目の "../dat/img/board/10.png" と記載しているところは「『RyuJin.exe から見て』、
一つ上のフォルダの、datフォルダの、imgフォルダの、boardフォルダの、10.png ファイル」
という意味になります(厳密にいうと『』の部分は正しくないのですが、はじめはその解釈で
よろしいかと思います)。そのため、ファイルの配置がおかしいと、各種データファイルが読み込め
ないため、至る所で問題が発生して正しく動作しません。
※このホームページは先ほど行き着いたばかりで、まだあまり深くは参照できていませんので、
外していたらゴメンササイ。
また、これ以上の回答を行えるかどうかは分かりませんので、あしからず。
73ポイント を手に入れた。
|
|
|
|
|
Name: 森本 ..ぴよぴよ(821ポイント)
Date: 2010/09/07(火) 00:05
No:61164
|
|
Title: Re:どこを変更すれば…(助けてください)
|
|
■wind.tさん
こういう質問を書き込むのも初めてだったので色々と描き忘れていたみたいで分かりづらくてすみませんでした!開発環境は、同じくXPとVisual Studio 2008 Express Edition を使っています。DirectX はたぶん最近DLしたばかりなので新しいものだと思います。
2.0.pngはdatフォルダのCharフォルダの中の自キャラ画像になります。
もう一度確認してみたんですがCharの方を変更して間違いありませんんでした。
3.動かないのは、たぶん2番の
「・RyuJin.exeを実行するとウィンドウは表示されるものの、黒い背景で画像が一切表示されていない」
これかな、と思います。画像の枚数が変わってくるので「〜.png のあとの , 2 , 2 , 14 ,」
↑数字の部分だけ変更してアニメーションつけて動くようにしてみたんですが駄目でした・・。
画像が一切表示されなかったです; (画像添付してみました・・・)
4.凄く分かりやすいです、ありがとうございます!
ただ、わかりにくくなるのが嫌だったので、同じ場所(datフォルダのimgのCharフォルダ)に
保存しているので場所も間違っていないと思うのです・・。
画像を変えたい場合って、load.cppのvoid load()の
LoadDivGraph( "../dat/img/char/0.png" , 4 , 1 , 2 , 32 , 32 ,img_ch[0]) ;
この関数を変えるだけで大丈夫ですよね・・・。
577ポイント を手に入れた。
|
|
|
|
|
Name: 森本 ..ぴよぴよ(879ポイント)
Date: 2010/09/07(火) 00:06
No:61166
|
|
Title: Re:どこを変更すれば…(助けてください)
|
|
■管理人さん
失礼な発言失礼いたしました!東方ではなかったのですね・・ごめんなさい・・。
画像はこれです・・。
58ポイント を手に入れた。
|
|
|
|
|
Name: パコネコ ..プログラマー(39,848ポイント)
Date: 2010/09/07(火) 00:19
No:61169
|
|
Title: Re:どこを変更すれば…(助けてください)
|
|
勘違いならごめんなさい
img_ch[0]
これとか?
[0]が余分とか…2次元配列ならすいません
それと
1*2=4
になってないですか?
======
間違っていた時の言いわけも書いときます。
まだ使ったことないので違ったらすいません。
LoadDirGraohは1つ目に画像ファイル、2つ目に全部の画像数、3つ目4つ目で縦横の分割数、5、6で大きさ、最後に入れる場所だと思います。
2つ目の数は3つ目*4つ目になるはずなのでその辺は間違ってるはず…
描写されない理由なのかは…わかりませんけど… 
53ポイント を手に入れた。
|
|
|
|
|
Name: wind.t ..ぴよぴよ(0ポイント)
Date: 2010/09/07(火) 03:31
No:61193
|
|
Title: Re:どこを変更すれば…(助けてください)
|
|
添付の画像と返答を見る限り、どうも私の認識とずれていると思います(私は60章を元にしていますので、背景が出ていなが、敵キャラは表示されているという点がよく分かりません)。
1.元にしたソースファイルは何章のものですか?
2.「龍神録プログラミングの館」は何章まで読まれましたか?
3.差し替えたい画像はの枚数はいくつですか?(たとえば、横4枚、縦3枚、一枚あたり73×73ピクセルのように答えてください)
→私への返信には「アニメーション」と記載されていますが、管理人さんへの返信にある添付画像は、1枚の画像となっていますので、混乱しています。
これらの認識をあわせた方が良さそうですね。
>画像を変えたい場合って、load.cppのvoid load()の
> LoadDivGraph( "../dat/img/char/0.png" , 4 , 1 , 2 , 32 , 32 ,img_ch[0]) ;
>この関数を変えるだけで大丈夫ですよね・・・。
これについては「おおむね」間違い有りません。
(60章の完成形を見る限り画像の枚数が変わると他にも変更する箇所がありますが、他の章は見ていませんのであくまで「おおむね」としています)。
私の説明も下手ですので、回り道になるようでしたらすみません。
397ポイント を落としてしまった。
|
|
|
|
Name: kara ..ぴよぴよ(597ポイント)
Date: 2010/09/06(月) 23:39
No:61158
|
|
Title: 構造体の配列、関数への構造体の引渡し
|
|
基本: 構造体の配列、関数への構造体の引渡し
基本課題 13..2
name(名前: char型配列), height(身長: float型変数), bloodType(血液型: char型変数)をメンバに持つ構造体を宣言し, 128名分が記憶可能になるようその構造体の配列を定義せよ. また,その配列に対して値を入力し,さらに表示できるようにせよ. 構造体のメンバ値を表示するには、 ひとつの構造体の各メンバの値を表示する関数を作成すること。
% ./bodyData
1人目のデータ: 立命太郎 175.5 A
2人目のデータ: 野路花子 169.0 B
3人目のデータ: 衣笠一郎 180.4 O
4人目のデータ: 0 0 0 ← 0 0 0 と入力すると終わる.
名前 身長 血液型
立命太郎 175.5 A
野路花子 169.0 B
衣笠一郎 180.4 O
%
ヒント: 各人の名前、身長、血液型のデータを1行で入力するためには、参 考12.1に示されたfgets()関数で、これらを1度に取り込 み、最初の空白までを名前とみなし、次の空白までを身長とみなし、次に改行ま でを血液型をみなせばよい。これらを別々の文字列として、必要に応じて整数や 浮動小数点数に変換し、構造体のメンバに設定すること。
ヒント: ひとつの構造体の各メンバの値を表示する関数に構造体を引渡す ことを繰り返えせばよい。
という問題でセグメントエラーが出てどうすればよいのかわかりません。デバッガはなぜかいかれているので質問させていただきます。
私が作ったソースコード↓
#include<stdio.h>
#define SIZE 256
int main(void){
int i;
struct roll{
char name[32];
float height;
char blood[3];
};
struct roll a[30];
for(i=0;;i++){
printf("%d番めのひと",i);
scanf("%s %f %s",a[i].name,a[i].height,a[i].blood);
if(a[i].name == "0" && a[i].height== 0 && a[i].blood=="0" ){
break;
}
}
int j;
for(j=0 ; j<=i ; j++){
printf("名前 身長 血液型 \n");
printf("%s %2s %s \n",a[j].name,a[j].height,a[j].blood);
}
return 0;
}
597ポイント を手に入れた。
|
|
|
|
Name: パコネコ ..プログラマー(39,720ポイント)
Date: 2010/09/06(月) 23:59
No:61163
|
|
Title: Re:構造体の配列、関数への構造体の引渡し
|
|
ミスがいくつか…
//scanf("%s %f %s",a[i].name,a[i].height,a[i].blood);
これの「a[i].height」は前に「&」をつけてあげる必要があります…多分
//if(a[i].name == "0" && a[i].height== 0 && a[i].blood=="0" ){
これは比べれましたっけ…勘違いならすいません
a[i].name[0]=='0'などに直すと通りました。
//printf("%s %2s %s \n",a[j].name,a[j].height,a[j].blood);
これの「%2s」これは2つの意味で間違ってます。
多分この「2」は小数点以下ではないでしょうか?
その場合「2」ではなく「.2」ではないといけません。
それと「s」ではなく「f」だと思います。
間違ってたらすいません、一応うごきはしました。
170ポイント を手に入れた。
|
|
|
|
|
Name: うしお ..ぴよぴよ(830ポイント)
Date: 2010/09/07(火) 00:38
No:61173
|
|
Title: Re:構造体の配列、関数への構造体の引渡し
|
|
補足のような形ですが
1、if(a[i].name == "0" && a[i].height== 0 && a[i].blood=="0" ){
break;
}
これは文字列の先頭アドレスと"0"の先頭アドレスを比較しているので一生breakされません
2、height==0 基本的にfloat型は==で比べるのは誤差の関係上あまり好ましくないとされています
139ポイント を手に入れた。
|
|
|
|
|
Name: kara ..ぴよぴよ(864ポイント)
Date: 2010/09/07(火) 01:32
No:61187
|
|
Title: Re:構造体の配列、関数への構造体の引渡し
|
|
#include<stdio.h>
#define SIZE 256
int main(void){
int i;
struct roll{
char name[32];
float height;
char blood[3];
};
struct roll a[30];
for(i=0;;i++){
printf("%d番めのひと:",i);
scanf("%s %f %s",&a[i].name,a[i].height,&a[i].blood);←ーーー変更
if(a[i].name[0] == '0' && a[i].height == 0 && a[i].blood[0]=='0' ){←ーーーー
break;
}
}
int j;
for(j=0 ; j<=i ; j++){
printf("名前 身長 血液型 \n");
printf("%s %.2f %s \n",a[j].name,a[j].height,a[j].blood); ←ーーーー
}
return 0;
}
修正しましたが、実行して000または名前・身長・血液型を入力するとセグメンテーションエラーがでます。
どうすればよいでしょうか?
267ポイント を手に入れた。
|
|
|
|
|
Name: うしお ..かけだし(1,473ポイント)
Date: 2010/09/07(火) 01:49
No:61189
|
|
Title: Re:構造体の配列、関数への構造体の引渡し
|
|
パコネコさんが指摘されていた
scanf("%s %f %s",&a[i].name,a[i].height,&a[i].blood);
の部分
a[i].heightに&がまだついていないと思います
&a[i].height
59ポイント を手に入れた。
|
|
|
|
|
Name: kara ..ぴよぴよ(882ポイント)
Date: 2010/09/07(火) 01:57
No:61190
|
|
Title: Re:構造体の配列、関数への構造体の引渡し
|
|
できました。ありがとうございます。本当に感謝です。
18ポイント を手に入れた。
|
|
|
|
Name: MAY ..かけだし(1,352ポイント)
Date: 2010/09/06(月) 13:24
No:61110
|
|
Title: 透過処理がされない
|
|
ゲームプログラミングの館の4章で、
透過処理がされないのですが
原因としては何が考えられますか?
ソースコード
#include "DxLib.h"
int Key[256];
void message_box_fullscreen(void){
/* int flag;
flag=MessageBox(
NULL ,
TEXT("フルスクリーンモードで起動しますか?") ,
TEXT("スクリーン設定") ,
MB_YESNO | MB_ICONQUESTION );
if(flag==IDNO)
*/ ChangeWindowMode( TRUE );
}
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
else GetHitKeyStateAll_InputKey[i]=0;
}
return 0;
}
//
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
message_box_fullscreen(); // フルスクリーンの設定
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1; // 初期化と裏画面化
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll_2(Key) && !Key[KEY_INPUT_ESCAPE]){
//ココ!!
LoadGraphScreen( 0 , 0 , "back.bmp" , FALSE ) ;
LoadGraphScreen( 0 , 0 , "hero.png" , TRUE ) ;
ScreenFlip();
}
DxLib_End();
return 0;
}
環境
Windows7、Borland、bccDev
547ポイント を手に入れた。
|
|
|
|
Name: 通 ..ぴよぴよ(27ポイント)
Date: 2010/09/06(月) 13:29
No:61112
|
|
Title: Re:透過処理がされない
|
|
私も初心者であまり的確な答えをいえないのですが
画像の透過処理はキャラの周りが黒に近い色であり
画像を表示する関数の最後にTRUEと付けることで、
確か出来たと思うので、間違っているかもですが
LoadGraphScreen( 0 , 0 , "back.bmp" , FALSE ) ;
こちらの最後をTRUEに変えてみては如何でしょうか。
違ってたら本当にすみません;
27ポイント を手に入れた。
|
|
|
|
|
Name: 通 ..ぴよぴよ(60ポイント)
Date: 2010/09/06(月) 13:35
No:61113
|
|
Title: Re:透過処理がされない
|
|
ごめんなさい;違ってましたね;
上記のコメントは無視してくださってかまいません;
33ポイント を手に入れた。
|
|
|
|
|
Name: HK ..初心者(6,152ポイント)
Date: 2010/09/06(月) 15:14
No:61117
|
|
Title: Re:透過処理がされない
|
|
hero.pngは自前の画像ですか?
画像を作るときに透過処理させていないのではないでしょうか?
2倍のポイントを手に入れた! 92ポイント を手に入れた。
|
|
|
|
|
Name: MAY ..かけだし(1,426ポイント)
Date: 2010/09/06(月) 20:48
No:61133
|
|
Title: Re:透過処理がされない
|
|
あ、ちなみに透過処理をさせたいのは
> LoadGraphScreen( 0 , 0 , "hero.png" , TRUE ) ;
この行です。
透過処理をさせたい所を黒(R,G,B)=(0,0,0)にしたのですができません。
2倍のポイントを手に入れた! 74ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(573,802ポイント)
Date: 2010/09/06(月) 22:49
No:61151
|
|
Title: Re:透過処理がされない
|
|
hero.pngを再度確認してみて下さい。
・ 透過したい部分が実は [R, G, B] = [0, 0, 0]になっていない
→ [0, 0, 0]に修正する
・ hero.pngのカラータイプが RGBAで保存されていて、アルファチャンネルが含まれている
→ RGB形式で保存してアルファチャンネルを削除して下さい。
→ 或いは黒い部分をアルファチャンネルで透過するように変更して下さい。
134ポイント を手に入れた。
|
|
|
|
|
Name: MAY ..かけだし(1,503ポイント)
Date: 2010/09/06(月) 23:13
No:61152
|
|
Title: Re:透過処理がされない
|
|
> ・ hero.pngのカラータイプが RGBAで保存されていて、アルファチャンネルが含まれている
> → RGB形式で保存してアルファチャンネルを削除して下さい。
> → 或いは黒い部分をアルファチャンネルで透過するように変更して下さい。
これはどのようにすればよいのでしょうか。
あまり詳しくないので…
18ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(574,435ポイント)
Date: 2010/09/06(月) 23:49
No:61162
|
|
Title: Re:透過処理がされない
|
|
お使いのグラフィックス編集ソフトは何ですか?
>hero.pngのカラータイプが RGBAで保存されていて、アルファチャンネルが含まれている
とりあえず今お使いのツールが判らないので、メジャーなツールで紹介します。
<Photoshopの場合>
・ アルファチャンネルがない
レイヤーが全て統合された状態で表示されます。
・ アルファチャンネルがある
レイヤーウインドウに「レイヤー0」というレイヤーが表示されます。
<Gimpの場合>
・ アルファチャンネルがない
チャンネルダイアログに「赤・緑・青」の3つのチャンネルだけがあります。
・ アルファチャンネルがある
チャンネルダイアログに「赤・緑・青」の3つのチャンネル以外に「アルファ値」という
チャンネルがあります。
<バイナリーエディタ>
PNGファイルを開き、ファイルの先頭から見ていって ASCII文字で IHDRと書かれたところの
次のバイトを 1バイト目としたとき10バイト目の数値を見て下さい。
・ アルファチャンネルがない
2か 3
・ アルファチャンネルがある
4か 6
もしこれでアルファチャンネルがあることが確認できたのならこのチャンネルを削除して
保存しなおす必要があります。
<Photoshopの場合>
レイヤーメニューから画像を統合し、PNGで保存して下さい。
<Gimpの場合>
レイヤーメニューの透明部分サブメニューから「アルファチャンネルを削除」を選んで
アルファチャンネルを削除、PNGで保存して下さい。
633ポイント を手に入れた。
|
|
|
|
|
Name: MAY ..かけだし(1,545ポイント)
Date: 2010/09/07(火) 00:43
No:61176
|
|
Title: Re:透過処理がされない
|
|
windowsにもともとはいっていたペイントを使ったのですが
それでも出来ますか。
42ポイント を手に入れた。
|
|
|
|
|
Name: MAY ..かけだし(1,591ポイント)
Date: 2010/09/07(火) 01:10
No:61184
| 解決!
|
Title: Re:透過処理がされない
|
|
ありがとうございます!
うまくいきました。
BMPなら透明度情報を保存しない。
PNGなら透明度情報を保存する。
ということですね。
24ポイント を手に入れた。
|
|
|
|
Name: a ..初心者(5,760ポイント)
Date: 2010/09/06(月) 18:04
No:61127
|
|
Title: 文字列を格納するバッファの長さ
|
|
基本課題 12..2
文字列yを文字列xの最後に連結する関数stringcat(char [], char [])を作成せよ.この関数を用いて、入力された2つの文字列を連結するプ ログラムを作成せよ。
注意: stringcat()を呼び出すときは,連結後の文字列がxの 配列長を超えないように注意すること.
% ./catenate
文字列x (20字まで)? Ritsumeikan
文字列y (20字まで)? BKC
連結後のx: RitsumeikanBKC ←全部で20字以内なので連結可能
% ./catenate
文字列x (20字まで)? Ritsumeikan
文字列y (20字まで)? BiwakoKusatsuCampus
字数超過のため連結不可 ←20字を超えるので連結不可能
%
という問題で、
#include<stdio.h>
#define BUFFER_SIZE 260
void string_cat(char x[],char y[]){
int i,j,k;
for(i=0;x[i]='\0';i++){
k++;
}
for(j=0;y[j]='\0';j++){
x[k] = y[j];
}
if(i+j<=20){
printf("連結後のx :%s",x);
}
else{
printf("字数超過のため連結不可");
}
}
int main(void){
char x[BUFFER_SIZE];
char y[BUFFER_SIZE];
printf("文字列x (20字まで)? ");
fgets(x,BUFFER_SIZE,stdin);
printf("文字列y (20字まで)? ");
fgets(y,BUFFER_SIZE,stdin);
string_cat(x, y);
}
というソースを書いてコンパイルして実行してみると、
文字列x (20字まで)? (入力)
文字列y (20字まで)? (入力)
しか表示されず、2つの文字列を連結した関数が表示されません。なぜでしょうか?
どこをなおすべきでしょうか?
578ポイント を手に入れた。
|
|
|
|
Name: へろり ..プログラマー(35,939ポイント)
Date: 2010/09/06(月) 18:23
No:61128
|
|
Title: Re:文字列を格納するバッファの長さ
|
|
>しか表示されず、2つの文字列を連結した関数が表示されません。なぜでしょうか?
2つの文字列を連結した関数が表示されないというのが今一つ意味不明ですが、
関数 string_cat() はちゃんと呼び出されています。
for(i=0;x[i]='\0';i++)
の文ですが、x[i] に '\0' を代入しているためループ条件が真になることはありません。
for(j=0;y[j]='\0';j++)
の文も同じですね。
それより、ソースを書く場合は<pre>タグで囲むようにしてください。
追記です。
この手のバグは1行1行処理を追っていけばすぐに分かります。
ソースレベルデバッガの導入を強く強くお勧めします。 
128ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(212,611ポイント)
Date: 2010/09/06(月) 18:44
No:61129
|
|
Title: Re:文字列を格納するバッファの長さ
|
|
というか、別の問題で同じミスをしてましたよね…
まぁ、2回やらかせば、強く印象に残りますよね。
43ポイント を落としてしまった。
|
|
|
|
|
Name: パコネコ ..プログラマー(37,923ポイント)
Date: 2010/09/06(月) 20:39
No:61132
|
|
Title: Re:文字列を格納するバッファの長さ
|
|
for(i=0;x[i]='\0';i++){
k++;
}
for(j=0;y[j]='\0';j++){
x[k] = y[j];
}
これって…x[k]にいっぱい代入されてる気がします…
[k+j-1]とかに変えてみたほうがいいと思います…
99ポイント を手に入れた。
|
|
|
|
|
Name: ココナ ..ぴよぴよ(102ポイント)
Date: 2010/09/06(月) 21:24
No:61135
|
|
Title: Re:文字列を格納するバッファの長さ
|
|
他トピで規約について指摘されていましたよね。規約を読んでから利用しましょう。
36ポイント を手に入れた。
|
|
|
|
|
Name: MAY ..かけだし(1,450ポイント)
Date: 2010/09/06(月) 21:41
No:61138
|
|
Title: Re:文字列を格納するバッファの長さ
|
|
このコードをコンパイルすると
> for(i=0;x[i]='\0';i++){
> for(j=0;y[j]='\0';j++){
この行に問題があると表示されたはずですが…
メッセージ読みました?
24ポイント を手に入れた。
|
|
|
|
|
Name: a ..初心者(5,971ポイント)
Date: 2010/09/06(月) 22:40
No:61148
|
|
Title: Re:文字列を格納するバッファの長さ
|
|
すいません。利用規約読んでなかったです。
次からはオリジナルな名前にします。それから、似たような質問を2回もしてすいません。
for(i=0;x[i]!='\0';i++){
for(j=0;y[j]!='\0';j++){
に直すとコンパイルはとおりました。
しかし、セグメントエラーがでます。デバッガで調べたいのですが、デバッガがインストールされておらず、調べられません。ちなみに、仮想でネットにつながらないVMwareを使っています。
どうすればインストールできるでしょうか?
211ポイント を手に入れた。
|
|
|
|
|
Name: 初級者 ..中級者(9,301ポイント)
Date: 2010/09/06(月) 23:32
No:61156
|
|
Title: Re:文字列を格納するバッファの長さ
|
|
k を初期化していないのは、大いに問題ありです。
他にも問題があるかもしれません。
42ポイント を手に入れた。
|
|
|
|
|
Name: a ..初心者(6,080ポイント)
Date: 2010/09/07(火) 00:05
No:61165
|
|
Title: Re:文字列を格納するバッファの長さ
|
|
パコネコさんが言うとおりx[k+j-1]にして、初級者さんのいうとおりにk=0で初期化するとコンパイルは通るのですが、実行すると2つの文字列を連結した関数が表示されず、セグメンテーションエラーがでます。
これ以上どこを直せばよいのでしょうか?
109ポイント を手に入れた。
|
|
|
|
|
Name: パコネコ ..プログラマー(39,795ポイント)
Date: 2010/09/07(火) 00:11
No:61168
|
|
Title: Re:文字列を格納するバッファの長さ
|
|
今のコードはどうなっているのですか?
どこが変更されたのか、わからないのですが…
皆様がおっしゃっている他にどこが間違ってるのかわからないのですが…
エラーのメッセージはありますか?
75ポイント を手に入れた。
|
|
|
|
|
Name: a ..初心者(6,510ポイント)
Date: 2010/09/07(火) 00:35
No:61172
|
|
Title: Re:文字列を格納するバッファの長さ
|
|
#include<stdio.h>
#define BUFFER_SIZE 260
void string_cat(char x[],char y[]){
int i,j,k;
k=0; ←ーーーーーーーーーーーーーーーーーーーー変更
for(i=0;x[i]!='\0';i++){←ーーーーーーーーーーーーー|
k++; |
} |
for(j=0;y[j]!='\0';j++){ ←ーーーーーーーーーーーーー
x[k+j-1] = y[j]; ←ーーー
k++;
}
if(i+j<=20){
printf("連結後のx :%s",x);
}
else{
printf("字数超過のため連結不可");
}
}
int main(void){
char x[BUFFER_SIZE];
char y[BUFFER_SIZE];
printf("文字列x (20字まで)? ");
fgets(x,BUFFER_SIZE,stdin);
printf("文字列y (20字まで)? ");
fgets(y,BUFFER_SIZE,stdin);
string_cat(x, y);
}
そして、実行すると
文字列x (20字まで)? (入力)
文字列y (20字まで)? (入力)
セグメンテーションエラーになります
430ポイント を手に入れた。
|
|
|
|
|
Name: パコネコ ..熟練のプログラマー(40,030ポイント)
Date: 2010/09/07(火) 00:44
No:61177
|
|
Title: Re:文字列を格納するバッファの長さ
|
|
エラーについては私では見つけれないかも…
起動した結果、矢印と大文字空欄とk++以外に間違いは見つけれませんでした。
起動できましたし…(エラーの出るような)ソース上のミスは見つけれませんでした。
すいません。
2倍のポイントを手に入れた! 182ポイント を手に入れた。
|
|
|
|
|
Name: MAY ..かけだし(1,567ポイント)
Date: 2010/09/07(火) 00:56
No:61178
|
|
Title: Re:文字列を格納するバッファの長さ
|
|
> for(j=0;y[j]!='\0';j++){ ←ーーーーーーーーーーーーー
> x[k+j-1] = y[j]; ←ーーー
> k++;
ここなんですがなぜkを増やすようにしたのですか。
22ポイント を手に入れた。
|
|
|
|
|
Name: パコネコ ..熟練のプログラマー(40,253ポイント)
Date: 2010/09/07(火) 00:58
No:61179
|
|
Title: Re:文字列を格納するバッファの長さ
|
|
セグメンテーションエラーについて調べてみたところ(さっきからわからなかった…)
「領域破壊」もしくはそれと勘違いした時に出るとのことなので、
string_cat(x, y);
これのx,yを受け止めきれてないかもしれません…(char x[],char y[])こっちが…
というか(関係ないかもですが)
#define BUFFER_SIZE 260
これってこんなに大きい必要あるのでしょうか?
getsならともかくfgetsならここまででかくする必要があるのでしょうか?
223ポイント を手に入れた。
|
|
|
|
|
Name: うしお ..かけだし(1,414ポイント)
Date: 2010/09/07(火) 01:05
No:61182
|
|
Title: Re:文字列を格納するバッファの長さ
|
|
fgetsだとどうやら改行文字も取得してしまうようですね
なので入力は
scanf("%s",x);
scanf("%s",y);
に変更し
void string_cat(char x[],char y[]){
int i,j,k;
k=0;
for(i=0;x[i]!='\0';i++){
k++;
}
for(j=0;y[j]!='\0';j++){
x[k+j] = y[j];
}
x[k+j] = '\0';
if(i+j<=20){
printf("連結後のx :%s",x);
}
else{
printf("字数超過のため連結不可");
}
}
となおすと正しく出ます
また、文字列連結後に調べて配列外にアクセスしていました、という事後報告は
良くないので、
あらかじめサイズを確認してから、連結、の流れが望ましいと思われます
2倍のポイントを手に入れた! 584ポイント を手に入れた。
|
|
|
|
|
Name: a ..初心者(6,538ポイント)
Date: 2010/09/07(火) 01:11
No:61185
| 解決!
|
Title: Re:文字列を格納するバッファの長さ
|
|
k++を消せばうまくいきました。みなさんありがとうございます。
28ポイント を手に入れた。
|
|
|
|
Name: abc ..入門者(4,863ポイント)
Date: 2010/09/06(月) 11:14
No:61102
|
|
Title: クリレポ
|
|
VS2005 VB.NETでの質問なのですが
やりたい事,クリスタルレポートでDataSet(DataTable)を使い表示(プレビュー)させたいです。
クリスタルレポートのメインレポート画面でフィールドエクスプローラにデータベースフィールドを
追加し、DataTable内のメンバをクリスタルレポートに貼り付ける所までは出来ました。
DataTable内に値をセットすればクリスタルレポートのプレビューが出来る出来ると思っていたのですが
DataTable内のメンバが表示されません。
少ない情報で申し訳ないですが、なにか怪しそうな箇所を教えてください。
170ポイント を手に入れた。
|
|
|
|
Name: abc ..入門者(4,771ポイント)
Date: 2010/09/06(月) 11:21
No:61103
|
|
Title: Re:クリレポ
|
|
追記、
Form123.CrystalReportViewer1.ReportSource = データテーブルという処理をForm123と言う画面表示の
前に入れたのですが、「レポートソースが無効です。」というポップアップが表示されます。
どの当たりの処理が関係しているのでしょうか?
92ポイント を落としてしまった。
|
|
|
|
Name: シエル [URL] ..熟練のプログラマー(68,633ポイント)
Date: 2010/09/06(月) 21:35
No:61136
|
|
Title: ドラッグされたファイルのフォルダ名を抜き出す良い方法
|
|
いつもお世話になっております。シエルです。
今回は情けない質問で申し訳ありませんが、
実行ファイルにドラッグされたファイルのディレクトリ名を取得したいのですが、
どうもうまくいかずに困っています。
現在のプログラムは下記のようになっています。
まず、コマンドライン引数のバイト数を求めて、後ろから1文字ずつ「¥」マークがあるところまで
見ていきそっから前の部分だけ引っこ抜こうと思ったのですが、
この「¥」マークを指定しても、エスケープ文字に見られてしまうらしくコンパイルできません。
何かいい方法はないでしょうか?
極力WINAPIを使用しない方法でお願い致します。
char out[200];
int i;
int length=strlen(argv[1]);
for(i=length-1;i!=-1;--i){
if('¥' == argv[1][i])//
break;
}
if(i==-1){
puts("どうやらフォルダ名が正しく取得できませんでした");
getchar();
fclose(fp);
return -1;
}else{//円マークが見つかったら
memcpy(out,argv[1],i+1);//フォルダ名をコピー
out[i+1]='\0';//終端文字を入れる。
}
情けない質問で申し訳ございませんが、よろしくお願い致します。
追記:
この掲示板だと¥マークが/に変換されるので、コード内では全角にしてます。 
367ポイント を手に入れた。
|
|
|
|
Name: シエル [URL] ..熟練のプログラマー(68,728ポイント)
Date: 2010/09/06(月) 21:44
No:61140
| 解決!
|
Title: Re:ドラッグされたファイルのフォルダ名を抜き出す良い方法
|
|
うわー。円マークって¥¥で表すんだったんですね。
そのとおりやったらいけました。お恥ずかしい><
たまに変なところが抜けてるところがあるので、
今回のような質問をしてしまうかもしれませんが、今後ともよろしくお願い致します。
95ポイント を手に入れた。
|
|
|
|
Name: Yperia ..かけだし(1,470ポイント)
Date: 2010/09/05(日) 19:18
No:61040
|
|
Title: インテリセンスが不機嫌
|
|
こんにちは。
お世話になります。
visual studio 2008 Professional Editionでプログラミングをしていたのですが、突然にインテリセンスが効かなくなってしまいました。
色々と方法を探してみたものの、未だに解決しません。
どうすれば、また復活してくれるのでしょうか。
76ポイント を手に入れた。
|
|
|
|
Name: DVDM [URL] ..熟練のプログラマー(59,698ポイント)
Date: 2010/09/05(日) 19:47
No:61043
|
|
Title: Re:インテリセンスが不機嫌
|
|
>>Yperiaさん
色々と書かれているので、もしかするとお試しになったかもしれませんが思いつく限りで書いてみます。
・リビルド
・コンパイラの再起動
・プロジェクト名.ncb のファイルを削除してからリビルド
・コンパイラをもう一度インストールし直す
こんな感じですが如何でしょうか。
121ポイント を手に入れた。
|
|
|
|
|
Name: Yperia ..かけだし(1,620ポイント)
Date: 2010/09/06(月) 21:44
No:61139
| 解決!
|
Title: Re:インテリセンスが不機嫌
|
|
それらの方法は試しました。
しかし、改善されませんでした。
ですが、今、起動してみたところ、また効いているみたいです。
特に何をしたわけではない(スリープして起動しただけ)ですので、何が良かったのか分かりません。。。
2倍のポイントを手に入れた! 150ポイント を手に入れた。
|
|
|
|
|
Name: みけCAT ..入門者(3,944ポイント)
Date: 2010/09/05(日) 14:34
No:60992
|
|
Title: Re:DXライブラリはDev-C++でも使えますか?
|
|
とりあえずhttp://dixq.net/g/02.htmlのプログラムで
ウィンドウを開くことに成功しました。
方法
http://homepage2.nifty.com/natupaji/DxLib/dxdload.htmlから
VisualC# 用パッケージとBorlandC++用のをダウンロードする
添付したzipの中のhenkan.plとmake.batをVisualC# 用パッケージのフォルダにコピー
BorlandC++用のファイルの中のDxLib.hをVisualC# 用パッケージのフォルダにコピー
perlを使うのでActivePerlを用意する
make.batを実行
適当なフォルダを作る
できたDxLib2.hをDxLib.hという名前でそのフォルダにコピー
できたlibDxLib.aを同じフォルダにできたコピー
添付したzipの中のtest.cppを同じフォルダにコピー
DxLib.hをエラーメッセージを見ながら修正
コンパイル
VisualC# 用パッケージの中のDxLib.dllを同じフォルダにコピー
test.exeを実行
265ポイント を手に入れた。
|
|
|
|
|
Name: みけCAT ..入門者(4,111ポイント)
Date: 2010/09/05(日) 14:58
No:60997
|
|
Title: Re:DXライブラリはDev-C++でも使えますか?
|
|
「ゲームプログラミングの館」http://dixq.net/g/のソースをコピペしていました。
3章まではうまくいったのですが、
4章では終了するときにデータ実行防止で強制終了されました。
5章ではGetColorが未定義と怒られ、ソースを書き変えてみても図形がうまく表示されませんでした。
素直に指定されたコンパイラを使った方がいいのでしょうか?
追記
添付ファイルには容量の関係でDxLib.dllを入れていません。
自分でダウンロードしてください。
test3.cppおよびtest3.exeが4章のファイル、
test4.cppおよびtest4.exeが5章をいじったファイルです。 
162ポイント を手に入れた。
|
|
|
|
|
Name: みけCAT ..入門者(4,170ポイント)
Date: 2010/09/05(日) 15:10
No:61001
|
|
Title: Re:DXライブラリはDev-C++でも使えますか?
|
|
自己レスです。
GetColor()なしはヘッダの変換ミスでした。
他にもいくつかの関数を変換ミスしています。
6章を試しましたが、やっぱり終了時にデータ実行防止で落ちます。
59ポイント を手に入れた。
|
|
|
|
|
Name: softya [URL] ..ハッカー(213,913ポイント)
Date: 2010/09/05(日) 15:32
No:61011
|
|
Title: Re:DXライブラリはDev-C++でも使えますか?
|
|
どこら辺で落ちているか、デバッガで確認されましたか?
DxLib_End() ;
の中でしょうか?
あと、Log.txtと言う実行ログの内容を教えてください。
2倍のポイントを手に入れた! 76ポイント を手に入れた。
|
|
|
|
|
Name: みけCAT ..入門者(4,248ポイント)
Date: 2010/09/05(日) 15:45
No:61014
|
|
Title: Re:DXライブラリはDev-C++でも使えますか?
|
|
ゲームプログラミングの館5章のソース、exeとLog.txtです。
デバッガではソースの最後の
}
を実行したときに
「生成されたプログラムでAn Access Violation(Segmentation Fault)が発生しました」
というダイアログが出ました。
このプログラムではデータ実行防止のバルーンは出ませんでした。
78ポイント を手に入れた。
|
|
|
|
Name: a ..初心者(5,091ポイント)
Date: 2010/09/06(月) 12:12
No:61105
|
|
Title: 無題
|
|
重要課題 12..3
2つのchar型配列x[],y[]に格納された文字列を入れ替えるプログラムを作 成せよ.ただし入替え処理には,関数swap_string(char [],char [])を作 成して用いること.下記の例では,2つの文字列xとyをキーボードから入力し,入 れ替えた後に表示している.
% ./stringSwap
文字列x (20字まで)? Ritsumeikan
文字列y (20字まで)? BKC
関数swap_string()を呼び出しました
入替後の x: "BKC"
入替後の y: "Ritsumeikan"
%
っていう問題が少しわかりません
私の作ったソース↓
#include<stdio.h>
#define BUFFER_SIZE 20
int swap_string(char x[],char y[]){
char temp[BUFFER_SIZE];
int i;
for(i=0;i<20;i++){
temp[i]=x[i];
}
for(i=0;i<20;i++){
y[i]=x[i];
}
for(i=0;i<20;i++){
x[i]=temp[i];
}
printf("入替後のx: ");
for(i=0;x[i]!=" ";i++){
printf("%c",x[i]);
}
for(i=0;y[i]!=" ";i++){
printf("%c",y[i]);
}
}
int main(void){
char x[BUFFER_SIZE];
char y[BUFFER_SIZE];
printf("文字列x (20字まで)? ");
fgets(x,BUFFER_SIZE,stdin);
printf("文字列y (20字まで)? ");
fgets(y,BUFFER_SIZE,stdin);
swap_string(x, y);
return 0;
}
18、21行目がエラーになります。ポインタと整数の比較を行っています。とエラー文がでますがどういうことでしょうか?どう直せばよいでしょうか?
580ポイント を手に入れた。
|
|
|
|
Name: YuO ..熟練のプログラマー(46,849ポイント)
Date: 2010/09/06(月) 12:32
No:61107
|
|
Title: Re:無題
|
|
「何行目」だけではなく,どこがその行かわかるように書いてください。
で,原因ですが……「文字」と「文字列」を区別してください。
・「文字」は1文字,「文字列」は0文字以上の文字 + 終端のナル文字
・「文字」定数は''で,「文字列」定数は""で囲む
・「文字」はchar型,「文字列」はchar *型
です。
今回,比較左辺のx[i]はcharの配列型に添字演算子を使っていますから,char型,つまり文字です (18行目)。
それに対して右辺は" "と,文字列 (char *型) を対象にしていますから,そのようなエラーになります。
文字' 'とすれば,エラーはなくなるはずです。
---- 余談 ----
仕様書的な正確さは無視しています。
文字定数に複数文字指定できるとか,文字定数はint型だとか,文字列定数はchar型の配列だとか。
また,Cでコンパイルしているならエラーではなく警告だと思います。
142ポイント を手に入れた。
|
|
|
|
|
Name: うしお ..ぴよぴよ(691ポイント)
Date: 2010/09/06(月) 12:36
No:61108
|
|
Title: Re:無題
|
|
追加ですが、
またswap_stringが戻り値を返しわすれています。
また、終端文字は\0を使うのが普通です。
なので上記のは
y[i]!='\0'と直さなければ実行時に不正な動作をする場合があるでしょう
とはいっても
for(i=0;x[i]!='\0';i++){
printf("%c",x[i]);
}
とはせずに
単純に
printf("%s",x);として終端まで表示するのが良いかもしれません
115ポイント を手に入れた。
|
|
|
|
|
Name: a ..初心者(5,148ポイント)
Date: 2010/09/06(月) 13:24
No:61111
|
|
Title: Re:コンパイルは通ったが・・・
|
|
Yuoさんの言うとおり" "を' 'に変えるとコンパイルが通りましたが、実行してみると文字化けしておかしな結果になります。まだおかしいところがあるみたいですが、どこを直せばよいと思いますか?
57ポイント を手に入れた。
|
|
|
|
|
Name: アビゲイル ..ぴよぴよ(482ポイント)
Date: 2010/09/06(月) 13:42
No:61114
|
|
Title: Re:コンパイルは通ったが・・・
|
|
ゴミを出力してるんじゃないかな?
うしおさんが書いてる通りにしてみればどうですか。
>printf("%s",x);として終端まで表示するのが良いかもしれません
後、入れ替えてません。
temp[i]=x[i];
y[i]=x[i];
x[i]=temp[i];
75ポイント を手に入れた。
|
|
|
|
|
Name: パコネコ ..プログラマー(37,824ポイント)
Date: 2010/09/06(月) 14:58
No:61116
|
|
Title: Re:コンパイルは通ったが・・・
|
|
for(i=0;i<20;i++){
temp[i]=x[i];
}
for(i=0;i<20;i++){
y[i]=x[i];
}
for(i=0;i<20;i++){
x[i]=temp[i];
}
この辺の条件書き変えたらうごきましたよ?
y[i]=x[i]//これも反対では?
x[i]も20文字確定ですか?
x[]で受け取ったときに何も入ってない場所も受け取るのでしょうか?
i<20をそれぞれx[i]!='\0'みたいなのに変更でうごきましたし…
変更前はその場所からの読み込み禁止と怒られたのですが…文字化けもいっぱいありました。
203ポイント を手に入れた。
|
|
|
|
|
Name: ookami ..熟練のプログラマー(51,219ポイント)
Date: 2010/09/06(月) 15:34
No:61118
|
|
Title: Re:コンパイルは通ったが・・・
|
|
好みもあるので、ついで程度に聞いてもらえれば。
・「C++ 文字列 コピー」あたりでググってみるといいかも。
・「swap_string」という名前からして、出題者は、
swap_string関数の中では「入れ替え処理」だけさせて、
表示まではさせない、という意図だと思います。
76ポイント を手に入れた。
|
|
|
|
|
Name: a ..初心者(5,173ポイント)
Date: 2010/09/06(月) 17:19
No:61123
|
|
Title: Re:できました!!
|
|
おかげさまでうまくいきました。本当にありがとうございます。
25ポイント を手に入れた。
|
|
|
|
Name: a ..入門者(4,250ポイント)
Date: 2010/09/06(月) 10:08
No:61095
|
|
Title: 文字列の印字
|
|
基本課題 12..1
fgets()関数を使って入力された英数字からなる文字列のうち、偶数番目の 文字だけを表示するプログラムを作成せよ。ただし,先頭文字を0番目とする.
% ./evenCharacters
文字列 (126字まで)? Ritsumeikan
偶数番目の文字: Rtuekn
%
という問題がわかりません
私が作ったソース↓
#include<stdio.h>
#define BUFFER_SIZE (126)
int main(void){
char buf[BUFFER_SIZE];
int i;
printf("文字列(126文字まで)? ");
fgets(buf,BUFFER_SIZE,stdin);
printf("偶数番目の文字: ");
for(i=0 ; buf[i]='\n' && i<126 ; i++){
if(i%2==0 ){
printf("%c",buf[i]);
}
else {}
}
printf("\n");
return 0;
}
このソースでコンパイルを通して実行ファイルを実行してみると
偶数番目の文字:□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
となります。
どこを直せばよいかわかる方おしえてください。
429ポイント を手に入れた。
|
|
|
|
Name: a ..入門者(4,462ポイント)
Date: 2010/09/06(月) 11:05
No:61100
|
|
Title: Re:できたが・・・・
|
|
おかげさまで!をつけることによってコンパイルは通りましたが、出力されるのがなぜか奇数番目の文字です。
if(i%2 != 0)にすることによって、正しく表示されるのですが、なぜそうなるのかわかりません。誰か教えてください。
2倍のポイントを手に入れた! 212ポイント を手に入れた。
|
|
|
|
|
Name: fatens ..上級者(17,975ポイント)
Date: 2010/09/06(月) 11:11
No:61101
|
|
Title: Re:できたが・・・・
|
|
>出力されるのがなぜか奇数番目の文字です。
先頭文字は0番目として扱いますが、それを踏まえた上で、奇数番目の文字が出力されますか?
42ポイント を手に入れた。
|
|
|
|
|
Name: a ..入門者(4,511ポイント)
Date: 2010/09/06(月) 12:09
No:61104
| 解決!
|
Title: Re:わかりました。
|
|
よくよく考えてみると、i=0,1,2,3(=奇数、偶数、奇数、偶数)だからiが2で割れたら奇数ってことになるんですね。ありがとうございます。たすかりました。
49ポイント を手に入れた。
|
|
|
|
Name: ookami ..熟練のプログラマー(50,258ポイント)
Date: 2010/09/01(水) 15:10
No:60776
|
|
Title: 【雑談】Lua言語って知ってますか?アンケート
|
|
お世話になっております。
ookamiです。
# integ も並行してやっていますが、今回は別の話題です。
C++をホストとして、Lua言語を走らせるツールを
作っています。
( Lua言語で実際にスクリプトを書いて実行するのは、
このツールのユーザーです。)
wikipediaによれば、
http://ja.wikipedia.org/wiki/Lua
> 2009年2月の調査では、最も人気のあるゲーム内で利用されているスクリプト言語である。
とのことなので、
「まぁよく知られた言語なんだろう」くらいに考えていたのですが、
Googleなどで「Lua 講座」とか「Lua リファレンス」とか調べても、
あまりヒットしてこないんです。
Lua言語を選択した時点で、
このツールの敷居を上げてしまって
いるのではないかと、
心配になってまいりました。
そこで、Lua言語の認知度を知りたく、トピ立てました。
皆様は、Lua言語、ご存知でしょうか。
ゲーム開発の現場で使っている、
他の用途で使われている、
知っているが使ったことは無い、
または、知りません、などなど。
ご協力お願い致します。
361ポイント を手に入れた。
|
|
|
|
Name: へろり ..プログラマー(33,999ポイント)
Date: 2010/09/01(水) 15:19
No:60779
|
|
Title: Re:【雑談】Lua言語って知ってますか?アンケート
|
|
初耳です。 グーグル先生にコードをちらっと見せてもらいましたが。
なんとも微妙そうです。
ですが、LISPのコードを初めて見た時ほどのショックはありませんね。
食わず嫌いですが、あれはどうも好きになれそうになれません。
86ポイント を落としてしまった。
|
|
|
|
|
Name: ookami ..熟練のプログラマー(50,385ポイント)
Date: 2010/09/01(水) 15:25
No:60780
|
|
Title: Re:【雑談】Lua言語って知ってますか?アンケート
|
|
# シエルさん, へろりさん
回答ありがとうございます。
> グーグル先生にコードをちらっと見せてもらいましたが。
> なんとも微妙そうです。
どちらかというと、Basicに近い気がしてます。
変数の宣言がいらないとか。
バリアント型とか。
> ですが、LISPのコードを初めて見た時ほどのショックはありませんね。
カッコだらけになるあれですねw 私もあまり。
「xmlなんかは、カッコがでかいLISPだ」という見方もあるようですが...
127ポイント を手に入れた。
|
|
|
|
|
Name: softya [URL] ..ハッカー(210,768ポイント)
Date: 2010/09/01(水) 15:29
No:60781
|
|
Title: Re:【雑談】Lua言語って知ってますか?アンケート
|
|
知っていますが使ったことがありません。
・非常にコンパクトな実装で、コルーチンがあるので使ってみたいとは思っています。
・単体で使うものとは思っていません。ゲームエンジンやマクロなど用だと思います。
・ゲームやアプリ内にスクリプトを実装したことない人には興味がないかも知れません。
・日本語書籍は3から4冊ぐらい出ていたと思います(未確認)。
あとはwikipediaに書いてあるぐらいの事しか知りません。
2倍のポイントを手に入れた! 240ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(212,206ポイント)
Date: 2010/09/01(水) 15:37
No:60784
|
|
Title: Re:【雑談】Lua言語って知ってますか?アンケート
|
|
知りません。
コルーチンが実装されてある言語は珍しいですね。
2倍のポイントを手に入れた! 52ポイント を手に入れた。
|
|
|
|
|
Name: MNS ..プログラマー(39,005ポイント)
Date: 2010/09/01(水) 15:38
No:60785
|
|
Title: Re:【雑談】Lua言語って知ってますか?アンケート
|
|
ゲームプログラミングの書籍において紹介・解説されていました。
あとは、ゲームのMODの開発言語として使われていました。
いずれもゲームプログラム関係です。
2倍のポイントを手に入れた! 150ポイント を手に入れた。
|
|
|
|
|
Name: ookami ..熟練のプログラマー(50,466ポイント)
Date: 2010/09/01(水) 16:00
No:60788
|
|
Title: Re:【雑談】Lua言語って知ってますか?アンケート
|
|
# softyaさん, たかぎさん, バグさん, MNSさん
回答ありがとうございます。
ぎゃぁー
今のところ全員が、「知らない」「聞いたことはある」ですね(´□` )
> 日本語書籍は3から4冊ぐらい
とか本格的に知名度低い線が濃厚ですねw
> アフリカーンス語やピリピノ語
吹きましたw
81ポイント を手に入れた。
|
|
|
|
|
Name: dic ..比類無きプログラマー(94,169ポイント)
Date: 2010/09/01(水) 16:37
No:60795
|
|
Title: Re:【雑談】Lua言語って知ってますか?アンケート
|
|
聞いたことはありますが Amazonさんにある本のタイトル
スクリプト言語による効率的ゲーム開発 C/C++へのLua組込み実践 (GAME DEVELO
とか、意味不明なのでまったく触ったことないです
エディタも調べたことないです
ソースも見たことないし、現在は自分用のライブラリがあるので間に合ってます
120ポイント を手に入れた。
|
|
|
|
|
Name: パコネコ ..プログラマー(37,504ポイント)
Date: 2010/09/01(水) 16:45
No:60796
|
|
Title: Re:【雑談】Lua言語って知ってますか?アンケート
|
|
聞いたことないです。
これって(片仮名だったら)「ルア言語」って読むんですか?
読み方自体わからなかったです…
50ポイント を手に入れた。
|
|
|
|
|
Name: softya [URL] ..ハッカー(210,939ポイント)
Date: 2010/09/01(水) 16:50
No:60798
|
|
Title: Re:【雑談】Lua言語って知ってますか?アンケート
|
|
うーん。ここまで無名とは。
自分のアプリやゲームエンジン/ライブラリにスクリプトを実装している人自体が少ないみたいですね。
ノベル/RPG/ARPG/SRPGとかにはスクリプトは必須だと思っていたのですが。
60ポイント を落としてしまった。
|
|
|
|
|
Name: へろり ..プログラマー(34,165ポイント)
Date: 2010/09/01(水) 17:50
No:60806
|
|
Title: Re:【雑談】Lua言語って知ってますか?アンケート
|
|
>自分のアプリやゲームエンジン/ライブラリにスクリプトを実装している人自体が少ないみたいですね。
>ノベル/RPG/ARPG/SRPGとかにはスクリプトは必須だと思っていたのですが。
私は、普段使っている自作のメモ帳にはマクロ言語を実装していますが、普通に自前で実装しましたね。
yaccとかいったパーサジェネレータを使えば、さほど難しいものではありませんから。
文法や言語機能等も目的に特化させて、自分の好きなように組めますし、やっぱりやる人は自前で用意するんじゃないですかね。
ゲームの世界はよく分かりませんが。
139ポイント を手に入れた。
|
|
|
|
|
Name: softya [URL] ..ハッカー(211,251ポイント)
Date: 2010/09/01(水) 18:04
No:60813
|
|
Title: Re:【雑談】Lua言語って知ってますか?アンケート
|
|
>私は、普段使っている自作のメモ帳にはマクロ言語を実装していますが、普通に自前で実装しましたね。
>yaccとかいったパーサジェネレータを使えば、さほど難しいものではありませんから。
私もアプリには独自実装してますね。
ゲームの場合、動作が軽い言うのも重要要素ですので下手な実装より軽いかなら採用を検討するでしょうね。
※ ノベル・ADV系は使い勝手重視なので速度よりも使いやすい独自文法って感じになると思いますが。
61ポイント を落としてしまった。
|
|
|
|
|
Name: h2so5 ..入門者(3,069ポイント)
Date: 2010/09/01(水) 18:18
No:60815
|
|
Title: Re:【雑談】Lua言語って知ってますか?アンケート
|
|
自分もスクリプト言語の組み込みをしたくていろいろと調べたことがありますが、
Luaに限らず、組み込み用のスクリプト言語の情報はかなり少ないです。
自分の知っている限りでは、
・Lua
・Squirrel
・AngelScript
・Xtal
などがありますが、まともなドキュメントは少ないです。
Luaはマシな方だと思います。
また、組み込み用のスクリプト言語はあくまでプログラマが使うためのものなので、
ユーザーが使うにはあまり向いていません。
(特にLuaは速度・信頼性重視で書きやすさは二の次なので一番向いていない)
ユーザー向けであれば、Pythonなどを使うのが普通だとおもいます
(速度や規模的にゲーム向きではないかも知れませんが、
ユーザーがスクリプトを組むタイプのアプリケーションでは結構使われているらしいです) 
2倍のポイントを手に入れた! 552ポイント を手に入れた。
|
|
|
|
|
Name: めるぽん ..上級者(19,043ポイント)
Date: 2010/09/01(水) 19:28
No:60819
|
|
Title: Re:【雑談】Lua言語って知ってますか?アンケート
|
|
Lua は知っていますが、実用したことは無いですね。
組み込み系のゲーム開発やってるので Lua や Squirrel を使いたいと思うことはよくあるのですけれども、いろんな事情が重なって使えていません。
ある程度大きい開発の場合、何らかの DSL を作るのは当たり前だと思うのですが、そのバックエンドとして Lua を使うという感じを想定しています。
Lua は個人で作ったスクリプトエンジンなんかよりよっぽど信頼性がありますし、どうしても機能が足りないと思えば Lua のコードを直接弄ればいいだけですし、文法が気にくわなかったら自作の文法→Lua コードへの変換を行えばいいだけですね。
144ポイント を手に入れた。
|
|
|
|
|
Name: ぽこ ..プログラマー(29,321ポイント)
Date: 2010/09/01(水) 20:10
No:60820
|
|
Title: Re:【雑談】Lua言語って知ってますか?アンケート
|
|
自アプリのL7のパケットを可視化するために、Wiresharkを拡張する際に
Luaを使用しました。
PythonやJavascriptに近い印象を持ったのを覚えています。
48ポイント を手に入れた。
|
|
|
|
|
Name: Mr.Vince ..かけだし(2,160ポイント)
Date: 2010/09/01(水) 23:12
No:60844
|
|
Title: Re:【雑談】Lua言語って知ってますか?アンケート
|
|
一応英語圏に住んでますが、こちらも聞いた事はありませんね…
丁度就職中なので色々あっちこっち検索してみましたが、Lua知識が要求される職場も(自分の探した限りは)無かったです。
90ポイント を手に入れた。
|
|
|
|
|
Name: y ..かけだし(1,888ポイント)
Date: 2010/09/02(木) 02:12
No:60849
|
|
Title: Re:【雑談】Lua言語って知ってますか?アンケート
|
|
Lua知ってます。
少し前に使ってました。
LuaとCを連携しやすくするためのLuaBindを使えば案外簡単に導入できたりします。
DXライブラリをLua上で使ったりとか…
コルーチンがある言語って珍しい(他にはRubyとかschemeとか)んですけど、
このコルーチンってゲームを作る上ではかなり強力な機能だったりします。
あまり日本で知られてないのは、日本のゲームはコンシューマ機向け主体で、
常に速度と容量との戦いをしなければならないのが理由の一つだと思います。
(海外のゲームはPC向け主体なので)
って言っても、ゲーム専用言語ではないので、普通のソフトウェアに組み込んでも良いんですけどね。
あまり用途ないですけど。
88ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(212,244ポイント)
Date: 2010/09/02(木) 08:49
No:60853
|
|
Title: Re:【雑談】Lua言語って知ってますか?アンケート
|
|
なにげにC#にもコルーチンありますが、有効な使い方が思いつかなくて、未だに使った事がないんですよね(^_^;)
26ポイント を手に入れた。
|
|
|
|
|
Name: ookami ..熟練のプログラマー(50,136ポイント)
Date: 2010/09/02(木) 09:56
No:60856
|
|
Title: Re:【雑談】Lua言語って知ってますか?アンケート
|
|
# バグさん,dicさん,めるぽんさん,Mr.Vinceさん,yさん,ぽこさん
回答ありがとうございます。
情報、参考にさせていただきます。
# パコネコさん
> 「ルア言語」って読むんですか?
そのようです。ポルトガル語だそうです。
# 御津凪さん
> 同じようにゲーム開発に使われたスクリプト言語として、 Squirrel があります。
Luaと比較すると、
・変数の型を明確にできたり(Luaでは整数も実数も同じ「数値」)
・クラス定義ができたり(Luaではできない。モドキならできる)
など、Squirrelの方が細かくできるようですね。
検討してみます。
# へろりさん
> 私は、普段使っている自作のメモ帳にはマクロ言語を実装していますが、普通に自前で実装しましたね。
> yaccとかいったパーサジェネレータを使えば、さほど難しいものではありませんから。
確かにオリジナル言語なら、好きなようにできますねぇ。
ただ、今回は、その言語をユーザーが使ってスクリプトを組んでもらうように
したいので、できればよく知られた言語の方が、敷居は低いのかなぁ...と。
# h2so5さん
> また、組み込み用のスクリプト言語はあくまでプログラマが使うためのものなので、
> ユーザーが使うにはあまり向いていません。
失礼しました、作っている「ツール」というのは、ゲームエンジンなんです。
このツールを使って、Luaでスクリプトを組むのは、ゲームプログラマを想定しています。
ただ、Luaの情報が少ない、となれば、使いこなしてくれるユーザーも少ない、ということで...(がっくし
Python、検討してみます。情報ありがとうございます。
# softyaさん
リンク等、参考にさせていただきます。
> Luaはさほど難しい言語でな無いので募集に書くほどの事ではないと思います。
これはえーと、「Luaは情報は少ないけど、まぁユーザーは使いこなしてくれるだろう」というような意味ですか?
348ポイント を落としてしまった。
|
|
|
|
|
Name: ookami ..熟練のプログラマー(49,961ポイント)
Date: 2010/09/02(木) 18:25
No:60867
| 解決!
|
Title: Re:【雑談】Lua言語って知ってますか?アンケート
|
|
# softyaさん
> プログラマなら楽々使いこなせるだろうって意味です。
なるほど。
プログラマといっても、アマチュアも対象にするんですが、
変数・テーブル・関数・ループあたりは、
Luaが初めてでもそんなに戸惑うことはない気がしています。
それだけ分かれば、ゲームでもそこそこの事ができますもんねw
---
このあたりで「解決!」としたいと思います。
(解決なのか...?まぁこのトピは知名度のアンケートなのでこのへんで。)
皆様、ありがとうございました! 
175ポイント を落としてしまった。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..ウィザード(1,269,417ポイント)
Date: 2010/09/03(金) 23:04
No:60931
|
|
Title: Re:【雑談】Lua言語って知ってますか?アンケート
|
|
話に乗り遅れましたorz
私の職場には私以外に同期が2人一緒に配属され、2人ともすごくプログラムに詳しいので、知っているか聞いてみました。
二人とも当然のように知っていた・・というか、むしろそのうちの一人はたまたまこちらが聞く前にLuaの話を自分から私にしてきました。
彼曰く業界(?)では、スクリプトでかける大半の部分をLuaで書いている事が多いのは事実のようです。
FF14のデータもLuaで管理されてるそうです(なんでそんな事知ってんだと思いつつ調べたら事実のようでした(汗))。
確かにモンスターの俳諧する細かなエリアや強さ調整、キャラのアビリティ調整などスクリプトとして変更可能にする必要はゲームの世界では非常によくあることでしょうね。
しかもそれを調整する人はプログラマーではない可能性が高い。
ということでLuaが使われるんでしょう。
オンラインゲームならゲームシステムが完成した後、リリース後いつまでも調整をし続けるのは当然でしょうから、スクリプトが重要なんでしょうね。
ここで知っている人が少ないのは個人でゲーム制作をしている人が多いからなのではないでしょうか?
私もよく存じませんが、Luaはシステムが完成した後、何かを調整する必要があるときに使われる物だと思います。
ですから、プロとしてやっているプログラマーであっても、作るシステムが違えば一生出会わないこともあると思います。
例えば基幹システムや医療機器や銀行のシステムなんかLuaで調整する必要があるとは思えませんし。
プログラマー以外がゲームシステムの調整を可能にする為に使われる物であるとするならば、かなり規模の大きなプロジェクトでゲーム制作に携わるか、
一人で作ったとしてもそれこそかなりの規模のゲームを作った時だけではないでしょうか。
私もゲーム制作とは関係ない職種なので、素人意見です。
419ポイント を手に入れた。
|
|
|
|
|
Name: ookami ..熟練のプログラマー(50,263ポイント)
Date: 2010/09/04(土) 22:06
No:60954
|
|
Title: Re:【雑談】Lua言語って知ってますか?アンケート
|
|
# Dixqさん
> 同期が2人一緒に配属され、2人ともすごくプログラムに詳しいので、知っているか聞いてみました。
> 二人とも当然のように知っていた
すごい...w 職場にプログラムに詳しい人がいるのが羨ましいですw
なるほど、
「ゲームの基幹部分を作る人」と
「細かい調整をやる人」を分けて考えた時に、
分かりやすいスクリプト言語が登場する...というわけですね。
上でも出ましたが、
アマチュアプログラマまで対象にすると、
「Luaだって分からん」という人も出てくるでしょうが、
掲示板などでフォローすればなんとかなるような気がしてきましたw
# softyaさん
> http://game.watch.impress.co.jp/docs/news/20090415_125504.html
> Luaスクリプトデバッガーアプリケーションを使って、ゲーム内の挙動をゲームを実行したまま編集することができる
おぉっ。「ゲームを実行したまま」挙動を変えるって、
ちょっとエキサイティングですよねw
拙作のツールでも、スクリプトのリロードができるように
しようと思っています。
たくさんリンクを掲示いただき
ありがとうございます。参考にさせていただきます。
203ポイント を手に入れた。
|
|
|
|
|
Name: ookami ..熟練のプログラマー(50,943ポイント)
Date: 2010/09/05(日) 07:17
No:60965
|
|
Title: Re:【雑談】Lua言語って知ってますか?アンケート
|
|
# やっくんさん
おぉっ。ありがとうございます。
プロの現場では意外と使われている感じなんですね。
-- 妄想 ここから
拙作のツールでLuaに出会った人が、
「Luaって何だよ...」と思いながらも頑張って習得して、
いざスクエニに就活するときに意外にもアドバンテージになり、
「あぁ[ツール]ありがとう...w」となるところを
想像してちょっと感動しました。
-- 妄想 ここまで
> ・マップの移動制御、村人の動き、会話パターンなどをテキストで書き、プログラム側で読み込ませる。
> ・エフェクトなども使用画像へのパスや動きをテキストで管理する
> こういうことをしていますが、これも簡単なスクリプトと言って言いのでしょうか?
スクリプトと言えると思います。
と思いながら不安だったのでwikipedia↓
http://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E8%A8%80%E8%AA%9E
> ソフトウェアの動作内容を、台本(script)のように記述し制御するための、簡易的なプログラミング言語である。
> 変数に型をつけないなど、動的型付け言語をスクリプト言語と呼ぶ定義もある。ただし、厳密な定義ないし区別は存在しない。
厳密な定義はないようですが、
「会話テキスト」などはまさに「スクリプト」でよい気がいたします。
ただの「設定ファイル」よりも高度に、動作を記述できるのが「スクリプト」、みたいな感じでしょうかね。
2倍のポイントを手に入れた! 680ポイント を手に入れた。
|
|
|
|
|
Name: やっくん ..プログラマー(34,766ポイント)
Date: 2010/09/05(日) 07:35
No:60967
|
|
Title: Re:【雑談】Lua言語って知ってますか?アンケート
|
|
>ookamiさん
妄想に笑いました(笑”
暇があればLua学んでみようかな・・・。
>ただの「設定ファイル」よりも高度に、動作を記述できるのが「スクリプト」、みたいな感じでしょうかね。
例えば、以下みたいな感じでしょうか?
SPEEDで1文字と1文字の描画間隔を設定
NAMEで話者の名前を表示
TALKで会話表示
SPEED:5
NAME:少年
TALK:こんにちは、
TALK:おじちゃん!!
NAME:おじさん
TALK:こんにちは
SPEED:0
NAME:少年
TALK:急いでるから、さようなら!
このように自分で、命令を作っておいて、それを読み込んだら対応する処理をさせるというような。
これならば確かに便利そうですね。
何より、後から見ても見やすいです。(上の例はちょっと微妙かもしれませんが)
48ポイント を手に入れた。
|
|
|
|
|
Name: naohiro19 ..かけだし(1,011ポイント)
Date: 2010/09/05(日) 08:19
No:60972
|
|
Title: Re:【雑談】Lua言語って知ってますか?アンケート
|
|
オープンソースのソフトにLuaを組み込むということもできます。
テトリスとかのパズルゲームでAIを制御するなんてこともできます。
12ポイント を手に入れた。
|
|
|
|
|
Name: ookami ..熟練のプログラマー(51,079ポイント)
Date: 2010/09/06(月) 10:56
No:61099
|
|
Title: Re:【雑談】Lua言語って知ってますか?アンケート
|
|
# やっくんさん
> 例えば、以下みたいな感じでしょうか?
それなら十分「スクリプト」だと思います。
まぁ、上でもあったように、厳密な定義はないようなので^^; フィーリングですw
# naohiro19さん
回答ありがとうございます。
参考にさせていただきます。
---
予想以上にたくさんの回答・情報が集まり、
ありがたい限りです。
ツール作り、がんばります。
皆様、ありがとうございました。
136ポイント を手に入れた。
|
|
|
|
Name: a ..かけだし(2,303ポイント)
Date: 2010/08/31(火) 23:56
No:60750
|
|
Title: 配列の関数への引渡し
|
|
重要課題 11..1
要素数が指定された1次元配列内の各要素の平均値を出力するプログラムを、引数 として指定された配列とその要素数から平均値を計算する関数
double average(int array[], int size)
を用いて作れ。配列の各要素は整数とし、配列の要素数の最大数は512とする。
% ./arrayAverage
input size: 4
input u[0]: 9
input u[1]: 20
input u[2]: 4
input u[3]: 11
average is 11.000000
%
という課題がわかりません。
自分が書いたソースがこれです。
/* ここからコピー */
#include <stdio.h>
# define BUFFER_SIZE (256)
int get_int(void)
{
char buf[BUFFER_SIZE];
fgets(buf, BUFFER_SIZE, stdin);
return atoi(buf);
}
/* ここまでコピー */
//平均を
double average(int aray[],int size)
{
int i;
int b;
double result;
b=0;
for(i=0;i<size;i++)
{
b += aray[i];
}
result = b / size;
return result;
}
int main()
{
//出力
int p[512],number,suuzi;
printf("input size:");
number = get_int();
for(suuzi=0;suuzi<number;suuzi++)
{
printf("input u[%d]:",suuzi);
p[suuzi] = get_int();
}
printf ("average is %f \n",average(p,number));
return 0;
}
//ここまで
これをコンパイルすると正しい平均値になりません。何がまちがっているのでしょうか?
483ポイント を落としてしまった。
|
|
|
|
Name: fatens ..上級者(18,312ポイント)
Date: 2010/09/01(水) 00:37
No:60753
|
|
Title: Re:配列の関数への引渡し
|
|
>result = b / size;
int型同士の割り算の結果はint型になるので、小数部が切り捨てられてしまいます。
result = (double)b / size;
のようにキャストすることで正しい平均値を求められると思います。
72ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..ハッカー(222,015ポイント)
Date: 2010/09/01(水) 01:12
No:60756
|
|
Title: Re:配列の関数への引渡し
|
|
整数徐算の問題以外に、オーバーフローを回避する必要もあると思います。
処理系不明なのではっきりしたことはいえませんが、累算結果を格納する変数はintmax_t型にするなどの工夫が必要です。
徐算の際も、double型ではなく、long double型にしておいたほうが無難かと思います。
50ポイント を落としてしまった。
|
|
|
|
|
Name: a ..入門者(3,759ポイント)
Date: 2010/09/01(水) 14:27
No:60764
|
|
Title: Re:配列の関数への引渡し
|
|
すいません。貼るソースを間違えました。
#include<stdio.h>
# define BUFFER_SIZE (256)
int get_int(void)
{
char buf[BUFFER_SIZE];
fgets(buf, BUFFER_SIZE, stdin);
return atoi(buf);
}
//プロトタイプ宣言
double average(int array[],int size);
//main関数
int main(void){
//サイズと各配置の入力
int array[512];
int number,i;
printf("input size : ");
number=get_int();
for(i=0 ; i<number ; i++){
printf("input u[%d] : ",i);
array[i] = get_int();
}
//average関数の呼出
printf("average is %f\n",average(array,number));
return 0;
}
//average関数
double average(int array[],int size){
//平均を計算する
int i,sum;
double ans;
for(i=0; i<size ; i++){
sum += array[i];
}
ans =(double)sum/size;
return ans;
}
このソースでコンパイルして実効ファイルを実行して、全部3で入力するとaverage is -358346330.333333と表示されます。なぜでしょうか?
480ポイント を手に入れた。
|
|
|
|
|
Name: アビゲイル ..ぴよぴよ(18ポイント)
Date: 2010/09/01(水) 14:38
No:60769
|
|
Title: Re:配列の関数への引渡し
|
|
sumを初期化しろって、VC++2010 EEコンパイラに怒られましたよ。
18ポイント を手に入れた。
|
|
|
|
|
Name: パコネコ ..プログラマー(37,517ポイント)
Date: 2010/09/01(水) 17:24
No:60801
|
|
Title: Re:配列の関数への引渡し
|
|
Study Cで起動したら(初期化は無視しました。ちょっとしたことは無視してくれる)
3.000000と出ました。(すべて3と入力)
ソースのせいではないのでは?
メモリ不足とか…は、ないですよね。
ちょっとした事のせいですかね…初期化してないとかの…
13ポイント を手に入れた。
|
|
|
|
|
Name: へろり ..プログラマー(34,292ポイント)
Date: 2010/09/01(水) 18:02
No:60810
|
|
Title: Re:配列の関数への引渡し
|
|
アビゲイルさんもおっしゃってますが、sumが初期化されていません。
初期化されていない自動変数の読みだしを行った場合の動作は未定義です。
つまり、sum += array[i]; を実行した結果、何事も無かったかのようにsumの値が0で初期化されているかのように振る舞うかもしれませんし、エラーを吐いて落ちるかもしれませんし、常に0を代入するかもしれませんし、アーキテクチャがそれを許すならば、鼻から悪魔が出てくるかもしれません。
127ポイント を手に入れた。
|
|
|
|
|
Name: a ..入門者(3,801ポイント)
Date: 2010/09/05(日) 11:27
No:60975
|
|
Title: Re:配列の関数への引渡し
|
|
sum=0にしたらうまくいきました。返事おくれてすいません。
みなさんありがとう。
15ポイント を手に入れた。
|
|
|
|
Name: kk ..ぴよぴよ(316ポイント)
Date: 2010/09/06(月) 00:44
No:61076
|
|
Title: 無題
|
|
重要課題 12..1
参考12.1に示されたfgets()を使い、入力された文字列につい て,1文字ずつその文字の種類を表示し,最後に文字数を表示するプログラムを作 成せよ.文字の種類は,大文字,小文字,数字,その他の文字の4種類とすること.
fgets()では入力された目に見える文字の最後に改行コードとヌル・バイト があるので注意すること。
% ./charType
文字列(20字まで)? Rits-1 ← 文字列を入力
1文字目は R で,大文字です.
2文字目は i で,小文字です.
3文字目は t で,小文字です.
4文字目は s で,小文字です.
5文字目は - で,その他の文字です.
6文字目は 1 で,数字です.
以上6文字です.
%
という問題でわからないことがありました
自分がつくったソース↓
#include<stdio.h>
# define BUFFER_SIZE (256);
int main(void){
char buf[BUFFER_SIZE];
int i;
printf("文字列は(20字まで)?");
fgets(buf, BUFFER_SIZE, stdin);
for(i=0;buf[i]='\n' && i < 20;i++){
if(buf[i]>65 && 90 > buf[i]){
printf("%d文字目は %c で大文字です\n",i+1,buf[i]);
break;
}
else if(buf[i]>97 && buf[i] < 122){
printf("%d文字目は %c で小文字です\n",i+1,buf[i]);
break;
}
else if(buf[i] > 48 && buf[i]){
printf("%d文字目は %c で数字です\n",i+1,buf[i]);
break;
}
else{
printf("%d文字目はその他の文字です");
break;
}
printf("以上です\n");
return 0;
}
で6、9、30行目がエラーになります。どこを直すべきかわかる方おしえてください。
316ポイント を手に入れた。
|
|
|
|
Name: 通りすがり ..上級者(22,790ポイント)
Date: 2010/09/06(月) 01:01
No:61077
|
|
Title: Re:無題
|
|
とりあえず
# define BUFFER_SIZE (256);
のところで#define定義は;はいらないと思われますよ。
24ポイント を手に入れた。
|
|
|
|
|
Name: kk ..ぴよぴよ(370ポイント)
Date: 2010/09/06(月) 08:48
No:61087
|
|
Title: Re:30行目
|
|
通りすがりさんのおかげでエラーが減りました。
ただ、30行目が「文法エラー at end of input」って表示されます。
どこを直せばよいでしょうか?
54ポイント を手に入れた。
|
|
|
|
|
Name: バグ [URL] ..ハッカー(212,521ポイント)
Date: 2010/09/06(月) 09:05
No:61090
|
|
Title: Re:30行目
|
|
中括弧を字下げしてスコープを分かりやすくしてみました。
これでエラーの原因が一目瞭然ですよね?
#include <stdio.h>
# define BUFFER_SIZE (256);
int main(void)
{
char buf[BUFFER_SIZE];
int i;
printf ("文字列は(20字まで)?");
fgets (buf, BUFFER_SIZE, stdin);
for (i = 0; buf[i] = '\n' && i < 20; i++)
{
if (buf[i] > 65 && buf[i] < 90)
{
printf ("%d文字目は %c で大文字です\n", i + 1, buf[i]);
break;
}
else if (buf[i] > 97 && buf[i] < 122)
{
printf ("%d文字目は %c で小文字です\n", i + 1, buf[i]);
break;
}
else if (buf[i] > 48 && buf[i])
{
printf ("%d文字目は %c で数字です\n", i + 1, buf[i]);
break;
}
else
{
printf ("%d文字目はその他の文字です");
break;
}
printf ("以上です\n");
return 0;
}
195ポイント を手に入れた。
|
|
|
|
|
Name: kk ..ぴよぴよ(98ポイント)
Date: 2010/09/06(月) 09:31
No:61093
| 解決!
|
Title: Re:30行目
|
|
できました。ありがとうございます。
2倍のポイントを手に入れた! 30ポイント を手に入れた。
|
|
|
|
Name: みけCAT ..入門者(4,758ポイント)
Date: 2010/09/05(日) 21:20
No:61049
|
|
Title: unsigned long long の範囲
|
|
Dev-C++ 4.9.9.2を使ってプログラムを書いています。
コンパイラはデフォルトを使用しています。
#include <stdio.h>
int main(void) {
unsigned long long a=0xffffffffffffffff;
long long b=0xffffffffffffffff;
printf("%ld %ld\n",a,b);
return 0;
}
このソースをコンパイルしてみたのですが、整数が大きすぎる(たぶん)と怒られます。
具体的なエラーメッセージはこれです。
D:\(中略)\test.c In function `main':
4 D:\(中略)\test.c [Warning] integer constant is too large for "long" type
5 D:\(中略)\test.c [Warning] integer constant is too large for "long" type
long long型のサイズは8バイトだと思ったのですが、なぜ怒られるかわかりません。
sizeof(a)は8になっています。
もしかしたら1.0fのfのようなものを付けるのかと想像したのですが、あくまで想像です。
230ポイント を手に入れた。
|
|
|
|
Name: みけCAT ..初心者(5,295ポイント)
Date: 2010/09/05(日) 21:31
No:61051
|
|
Title: Re:unsigned long long の範囲
|
|
「コンパイラを呼ぶ際、以下のオプションを付加する」欄には何も入力していません。
チェックもついていません。
-pedanticオプションを付けると以下のエラーが出ました。
In file included from C:/Dev-Cpp/include/stdio.h:26,
from D:\(中略)\test.c:1:
C:/Dev-Cpp/include/stddef.h:6:2: warning: #include_next is a GCC extension
In file included from C:/Dev-Cpp/include/stdio.h:28,
from D:\(中略)\test.c:1:
C:/Dev-Cpp/include/stdarg.h:6:2: warning: #include_next is a GCC extension
In file included from D:\(中略)\test.c:1:
C:/Dev-Cpp/include/stdio.h:330: warning: ISO C90 does not support `long long'
In file included from C:/Dev-Cpp/include/sys/types.h:21,
from C:/Dev-Cpp/include/stdio.h:399,
from D:\(中略)\test.c:1:
C:/Dev-Cpp/include/stddef.h:6:2: warning: #include_next is a GCC extension
In file included from C:/Dev-Cpp/include/stdio.h:399,
from D:\(中略)\test.c:1:
C:/Dev-Cpp/include/sys/types.h:32: warning: ISO C90 does not support `long long'
C:/Dev-Cpp/include/sys/types.h:110: warning: ISO C90 does not support `long long'
C:/Dev-Cpp/include/sys/types.h:115: warning: ISO C90 does not support `long long'
In file included from D:\(中略)\test.c:1:
C:/Dev-Cpp/include/stdio.h:416:14: warning: use of C99 long long integer constant
D:\(中略)\test.c: In function `main':
D:\(中略)\test.c:4: warning: ISO C90 does not support `long long'
D:\(中略)\test.c:4: warning: integer constant is too large for "long" type
D:\(中略)\test.c:5: warning: ISO C90 does not support `long long'
D:\(中略)\test.c:5: warning: integer constant is too large for "long" type
537ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..ハッカー(226,201ポイント)
Date: 2010/09/05(日) 22:14
No:61060
|
|
Title: Re:unsigned long long の範囲
|
|
GCCのバージョンと正確なコンパイルオプションが分からないと何ともいえないのですが、整数定数に添字 LL を付ければ警告はなくなると思います。
ところで、%ld は long 型のための書式なので、long long 型を使うときは %lld でなければなりません。
しかし、MinGW は Visual C++の printf を使っているので、%lld が使えません。
しかたがないので %I64d にすることになると思います。
78ポイント を手に入れた。
|
|
|
|
|
Name: みけCAT ..初心者(5,327ポイント)
Date: 2010/09/05(日) 22:23
No:61061
|
|
Title: Re:unsigned long long の範囲
|
|
添字LLを付けたら解決しました。
ありがとうございました。
32ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(212,326ポイント)
Date: 2010/09/06(月) 08:56
No:61088
|
|
Title: Re:unsigned long long の範囲
|
|
今回は、unsigned long long型ですから、%I64uではないのでしょうか?
勘違いだったらごめんなさい。どうしても気になったもので…(^_^;)
47ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..ハッカー(226,267ポイント)
Date: 2010/09/06(月) 09:00
No:61089
|
|
Title: Re:unsigned long long の範囲
|
|
> 今回は、unsigned long long型ですから、%I64uではないのでしょうか?
オール1のビットパターンを与えて、それが-1になることを確認したかったのでは?
符号の有無だけなら異なっても問題ないので、%I64d でよいと思うのですが、いずれにせよ、%ld ではダメです。
66ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(212,633ポイント)
Date: 2010/09/06(月) 09:07
No:61091
|
|
Title: Re:unsigned long long の範囲
|
|
>>たかぎさん
ありがとうございました。
肝心要なトピ主のソースをよく読まずにいたので、トンチンカンなことを聞いてしまいました。
失礼しましたm(_ _)m
2倍のポイントを手に入れた! 112ポイント を手に入れた。
|
|
|
|
Name: dic ..比類無きプログラマー(94,400ポイント)
Date: 2010/09/05(日) 17:06
No:61023
|
|
Title: javaを実行したいがどうやるのか分からない
|
|
いつもお世話になります
javaになってすいませんが、javaアプリケーションができたので
これをWEB上で実行させたいのですが、
この場合HTMLはどのように書けばいいのでしょうか?
現在、app02.classというjavaバイナリはできているのですが
これをWEB上にあげて、そのページを表示するとapp02.classバイナリを
実行するようにしたいです
調べてみましたが、クライアントで実行する方法と、サーバーで実行する方法が
あるようでしたが、コードまでは見つけれなかったので教えていただけないでしょうか?
195ポイント を手に入れた。
|
|
|
|
Name: たかぎ [URL] ..ハッカー(225,970ポイント)
Date: 2010/09/05(日) 17:20
No:61027
|
|
Title: Re:javaを実行したいがどうやるのか分からない
|
|
環境から明確にするべきでは?
例えば、共用のレンタルサーバーで、正攻法な動かし方が出来る可能性はほとんどありません。
GCJでコンパイルしてCGIとして動かすという強引な方法もあるので、できないとはいいませんが...
103ポイント を手に入れた。
|
|
|
|
|
Name: dic ..比類無きプログラマー(94,433ポイント)
Date: 2010/09/05(日) 17:27
No:61028
|
|
Title: Re:javaを実行したいがどうやるのか分からない
|
|
>softyaさん たかぎさん
環境は無料ホームページのところです
OSはLinuxで、PHP,CGIが使えます
アプレットではなくFrameクラスを継承したものをブラウザ上で動かしたいのです
下のようなソースになります
これをコンパイルしてできあがった app02.class をブラウザで動かす方法(HTML?だとするとアプレット?)
が知りたいです
コンパイラは JDK 1.6 のjavac.exe です
import java.awt.*;
import java.awt.event.*;
public class app02 extends Frame
{
Image pi = getToolkit().getImage( "image.jpg" );
public static void main( String[] args )
{
app02 ap = new app02();
ap.setSize( 1000, 1000 );
ap.addWindowListener( new WindowAdapter() { public void
windowClosing(WindowEvent e) { System.exit(0);}});
ap.setVisible(true);
}
public void paint( Graphics g )
{
g.drawImage( pi, 10, 10, this );
}
}
33ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..ハッカー(226,060ポイント)
Date: 2010/09/05(日) 17:29
No:61029
|
|
Title: Re:javaを実行したいがどうやるのか分からない
|
|
> 環境は無料ホームページのところです
> OSはLinuxで、PHP,CGIが使えます
だとすると、普通の方法では無理です。
やはり、GCJでコンパイルして、CGIとして動かすのが妥当ではないでしょうか?
# 私はやったことがないので、詳細まではわかりません。
2倍のポイントを手に入れた! 90ポイント を手に入れた。
|
|
|
|
|
Name: softya [URL] ..ハッカー(214,888ポイント)
Date: 2010/09/05(日) 17:45
No:61030
|
|
Title: Re:javaを実行したいがどうやるのか分からない
|
|
Frameクラスならアプレットで使えたと思います。
まぁ、語るほどJavaに詳しくないので間違ってるかも知れませんが。
どうみてもサーブレットやJSPじゃないのでCGIとしてサーバーで実行するワケではなくブラウザで実行したいんですよね?
84ポイント を手に入れた。
|
|
|
|
Name: 麻耶 ..ぴよぴよ(270ポイント)
Date: 2010/09/05(日) 14:05
No:60988
|
|
Title: キャラクターの画像
|
|
麻耶と申します。
今、縦STGを作っていて自キャラと敵キャラの画像を探しています。
ですが、なかなか見つかりません・・。
見つかっても、東方系のキャラばかりなので版権は使えないので困ってます;
検索で「自機 素材」「素材 シューティング」など色々な単語入れて
検索してみてもうまいこと見つかりません・・・。
どこか良い素材サイトさんは無いでしょうか・・?
スレ違ですみませんが、もしありましたら教えて下さい。
114ポイント を手に入れた。
|
|
|
|
Name: yu ..熟練のプログラマー(44,102ポイント)
Date: 2010/09/05(日) 14:48
No:60995
|
|
Title: Re:キャラクターの画像
|
|
版権というのがよく分からないのですが (調べても良く分からなかったorz)
・著作権的に使いたくない
・二次創作されたものを使いたくない
どちらでしょうか;
1ポイント を手に入れた。
|
|
|
|
|
Name: 麻耶 ..ぴよぴよ(432ポイント)
Date: 2010/09/05(日) 15:14
No:61003
|
|
Title: Re:キャラクターの画像
|
|
yuさん、へろりさん
説明が下手で申し訳ありません。
東方のキャラクターはオリジナルゲームを作る際に
使用したくない(出来ない)ので、
普通に素材サイトさんで配布されてるような画像を
探しているのですがどこの素材サイトさんも
此処の龍神録さんが使っているような画像みたいな
縦STG用の画像がなくて・・・。
敵キャラは前を向いてる通常の画像を使用すれば良いんですが
自キャラに使用できる画像が無くて・・。
162ポイント を手に入れた。
|
|
|
|
|
Name: yu ..熟練のプログラマー(44,163ポイント)
Date: 2010/09/05(日) 15:14
No:61004
|
|
Title: Re:キャラクターの画像
|
|
>> へろり さん
そうでしたら、東方は大丈夫なはずなんですが、(二次創作の素材であるならば)
麻耶さんはそれを分かっていて質問しているのかが分からないです;
#追記
麻耶さんの返信と盛大に被りました orz 
61ポイント を手に入れた。
|
|
|
|
|
Name: シエル [URL] ..熟練のプログラマー(68,266ポイント)
Date: 2010/09/05(日) 15:27
No:61008
|
|
Title: Re:キャラクターの画像
|
|
私も自機の画像をネット上で探しまくりましたが、ありませんでしたorz
なので、RPG用で使う小さなドット絵を自機にしちゃいましたw
一応歩いてるようなアニメーションは表現できます。
このまま見つからなければもうこれでいきます。後は頑張って自分で描くか。
71ポイント を手に入れた。
|
|
|
|
|
Name: yu ..熟練のプログラマー(44,302ポイント)
Date: 2010/09/05(日) 15:31
No:61010
|
|
Title: Re:キャラクターの画像
|
|
一次制作物としてゲームに使われていないSTG用の画像ですか・・・
確かに見かけませんね;(RPGならたくさんあるのに)
龍神録の館の規約にありますが「画像は龍の画像以外、二次使用出来ます」
となっているので、自機画像を利用することができます。
これも版権だと思いますが、駄目ですか?;
自分で作るというのが一番手っ取り早いかも?(作れるなら質問していないと思いますが;)
139ポイント を手に入れた。
|
|
|
|
|
Name: 麻耶 ..ぴよぴよ(559ポイント)
Date: 2010/09/05(日) 17:53
No:61033
|
|
Title: Re:キャラクターの画像
|
|
yuさん
すみません;説明下手すぎでしたね・・;
RPGツクールとかもあって、バリエーションが豊富ですよね。
東方やアニメ、漫画とかに登場するキャラクターじゃなくて
オリジナルで製作されてるものが良かったので、探していたんですが、
yuさんの言われた通り、貸して頂こうかな、と思います;
シエルさん
なかなか見つからないですよね;
やっぱRPGの画像の後ろ姿の画像を使ったりするほうがいいですかね・・。
絵が下手なので自分で描けないのが悔しいですorz
127ポイント を手に入れた。
|
|
|
|
|
Name: 麻耶 ..ぴよぴよ(633ポイント)
Date: 2010/09/05(日) 18:05
No:61035
|
|
Title: Re:キャラクターの画像
|
|
すみません、探してみたら自機に良さそうな素材を見つけることが出来ました!!
皆さん、ご迷惑をおかけしてすみませんでした;
ありがとうございます!
あと、質問なのですが
拡張子がGIFでも画像って大丈夫ですよね・・。
74ポイント を手に入れた。
|
|
|
|
|
Name: yu ..熟練のプログラマー(44,357ポイント)
Date: 2010/09/05(日) 18:21
No:61036
|
|
Title: Re:キャラクターの画像
|
|
見つかりましたか。おめでとうございます。
まともなアドバイスができなくて申し訳なかったです;
DXライブラリでしたら、gifは読み込めませんよ。
ペイントツールで gif を読み込み bmp, png, jpg 等に変換してから利用すればいいと思います。
55ポイント を手に入れた。
|
|
|
|
|
Name: 麻耶 ..ぴよぴよ(704ポイント)
Date: 2010/09/05(日) 18:39
No:61037
| 解決!
|
Title: Re:キャラクターの画像
|
|
yuさん
そんなことないです!お返事頂けただけでも嬉しかったです。
ありがとうございました^^*
GIFは取り込めませんでしたか;
画像を分けて読み込ませようと思います。
ありがとうございました!
71ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..ハッカー(223,828ポイント)
Date: 2010/09/04(土) 15:59
No:60941
|
|
Title: Re:【雑談】 getsは本当に危険か?
|
|
> やっぱり、素直にバッファオーバーランじゃないでしょうか。
それはそうなのですが、では、(初学者が書いたプログラムが)バッファオーバーランしたとき、具体的にどんな危険がありますか?
バッファオーバーランなら単なる配列の操作でも起きます。初学者は間違って当然ですから。
もしバッファオーバーランが決してあってはならないほど危険なものであれば、getsだけでなく配列も禁止すべきですよね。
というより、よほどコンピュータに精通していて、しかも注意深い人でなければ、Cプログラミングを学習すること自体が困難になると思います。
けれども、実際はそうではありませんね。
初学者が作ったプログラムが正しく動かないということは、あたりまえに起きることなので、それ自体は危険でも何でもないはずです。
getsを使って不具合が発生したとき、人が死ぬとか、火災が起こるとか、そこまでいかなくても世間にさまざまな迷惑をかけるとか、せめて自分のPCが破壊されるとかであれば、確かに「危険」なのですが、そうでなければ、学習の時点ではバッファオーバーランしてもよいのでは? と思うわけです。
2倍のポイントを手に入れた! 766ポイント を手に入れた。
|
|
|
|
|
Name: へろり ..プログラマー(35,010ポイント)
Date: 2010/09/04(土) 16:24
No:60942
|
|
Title: Re:【雑談】 getsは本当に危険か?
|
|
>そうでなければ、学習の時点ではバッファオーバーランしてもよいのでは? と思うわけです。
なるほど。 それはそうですね。
しかしそれを言ってしまえば、今時のOSならば、コアダンプを吐くとかエラー吐いて落ちますから、gets()関数に限らず、何をしても危険という危険は無いような気がするのですが。
OSの無い環境まで考慮するならば、そこはそれ、鼻から悪魔ですからやっぱり何とも言えないかと。
そこであえて危険と言うならば、初学者がある程度の知識・技術を獲得してもなお、最初の頃に習得した物をそのまま使い続ける、ということでは無いでしょうか。
ループカウンタとして多用される変数iですが、どうせあちこちで使うからと、グローバルスコープで使い続けていた人を知っています。
楽な方向に流されがちなのが人間ですから、こういうのはやっぱり最初にきっちり癖をつけておかないとダメな気がします。
誤解を招きそうだったので、一部書き換えてます。 
280ポイント を手に入れた。
|
|
|
|
|
Name: palladium ..中級者(10,243ポイント)
Date: 2010/09/04(土) 16:37
No:60943
|
|
Title: Re:【雑談】 getsは本当に危険か?
|
|
>バッファオーバーランしたとき、具体的にどんな危険がありますか?
Windows 98 の仮想アドレス内のカーネルパーティションは
0xC0000000 〜 0xFFFFFFFFらしいです
この部分にはシステムのコードが配置されるようです
スレッドスケジューリング、
メモリ管理、ファイルシステムサポート、
ネットワークサポート、デバイスドライバは
この領域にロードされるようです。
Windows 2000ではこの領域(3GB拡張してないとき)は
システムによって保護されているのでアクセスしようとすると
アクセス違反でアプリは強制終了となるようです。
Windows 98 の場合はシステムによってこの領域が保護されていないので
アプリはこの領域を読み書きできるようです。
「ブルー画面」の可能性もあるかもしれませんね。
258ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..ハッカー(223,992ポイント)
Date: 2010/09/04(土) 16:39
No:60944
|
|
Title: Re:【雑談】 getsは本当に危険か?
|
|
> しかしそれを言ってしまえば、今時のOSならば、コアダンプを吐くとかエラー吐いて落ちますから、gets()関数に限らず、何をしても危険という危険は無いような気がするのですが。
ネットワークがらみは必ずしもそうとはいえませんけどね。
> そこであえて危険と言うならば、初学者がある程度の知識・技術を獲得してもなお、最初の頃に習得した物をそのまま使い続ける、ということでは無いでしょうか。
これは私も考えました。確かに一理あります。
最初のころに atoi を習得すると、いくら問題があっても strtol ではなく atoi を使い続けますからね。
あと、最初からインテリセンスありきで学習したプログラマは、インテリセンスが使えない環境だと手も足も出なくなるのも、根は同じだと思います。
> 楽な方向に流されがちなのが人間ですから、こういうのはやっぱり最初にきっちり癖をつけておかないとダメな気がします。
細かい話は抜きにして、とりあえず動くものを作って楽しさを味わうのがよいのか、最初から厳密な理解を積み重ねるのがよいのか、さじ加減が難しいところです。
164ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..ハッカー(224,091ポイント)
Date: 2010/09/04(土) 16:44
No:60945
|
|
Title: Re:【雑談】 getsは本当に危険か?
|
|
> Windows 98 の場合はシステムによってこの領域が保護されていないので
> アプリはこの領域を読み書きできるようです。
> 「ブルー画面」の可能性もあるかもしれませんね。
もう古い話は忘れましたが、多くは再起動で済みますね。
MS-DOSのころは普通に暴走していましたので、頻繁にリセットボタンを押しながらプログラミングを習得したものです。
再起動しても復帰できないようなら痛いですが、そうでなければ大した問題でもない気がします。
99ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..ハッカー(224,120ポイント)
Date: 2010/09/04(土) 16:53
No:60947
|
|
Title: Re:【雑談】 getsは本当に危険か?
|
|
> 古いネタですみませんでした。
かまわないですよ。
Windows 98なんかを持ち出さなくても、μITRONの環境とかなら普通にOSの領域に書き込みできますから。
ただ、普通はクラッシュしても再起動で済んでしまいます。
29ポイント を手に入れた。
|
|
|
|
|
Name: palladium ..中級者(10,102ポイント)
Date: 2010/09/04(土) 19:14
No:60949
|
|
Title: Re:【雑談】 getsは本当に危険か?
|
|
>かまわないですよ。
ありがとうございます。
以前、剣道を習ってましたが真剣ではなく竹刀で稽古してました。(あたりまえだろw)
しかし、C言語の場合ある意味最初から真剣かもしれませんね。
>最初にきっちり癖をつけておかないとダメな気がします。
これはやっぱり大切なことのように思います。
141ポイント を落としてしまった。
|
|
|
|
|
Name: めるぽん ..上級者(18,947ポイント)
Date: 2010/09/04(土) 21:42
No:60951
|
|
Title: Re:【雑談】 getsは本当に危険か?
|
|
>バッファオーバーランなら単なる配列の操作でも起きます
gets と配列で違うのは、バッファオーバーランしたときに、悪意のあるユーザからの入力で任意の値を入れられることでしょうか。
配列でも任意の値を入れられることはあるかもしれませんが、乗っ取る側からすればそれを解析するより gets を探す方が楽そうです。
73ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..ハッカー(224,166ポイント)
Date: 2010/09/04(土) 21:47
No:60952
|
|
Title: Re:【雑談】 getsは本当に危険か?
|
|
> gets と配列で違うのは、バッファオーバーランしたときに、悪意のあるユーザからの入力で任意の値を入れられることでしょうか。
初学者が勉強で作ったプログラムを狙って、悪意のあるユーザが入力するという状況がよくわからないのですが...
46ポイント を手に入れた。
|
|
|
|
|
Name: めるぽん ..上級者(19,151ポイント)
Date: 2010/09/04(土) 22:00
No:60953
|
|
Title: Re:【雑談】 getsは本当に危険か?
|
|
そのプログラムを狙う悪意のあるユーザがどこにもいないのであれば、初学者だろうと何だろうとセキュリティのことは気にしなくていいのではないでしょうか。まあその人の学習的には良くないんでしょうけど。
可能性を考えるだけなら、会社にプログラムをやったことがない人がプログラマとして配属されていきなり適当に仕事を割り振られて必死で作ったときに gets が入っていて、それはパッケージとしてユーザに売られるものだったとか、学生が初めて作ったプログラムをこれは便利だ思って Vector とかに登録したとか・・・実際あるのかどうかは知りませんが、もしあるなら攻撃の踏み台に使われる可能性はあると思うのですけれども。
204ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..ハッカー(224,260ポイント)
Date: 2010/09/04(土) 22:10
No:60955
|
|
Title: Re:【雑談】 getsは本当に危険か?
|
|
> 会社にプログラムをやったことがない人がプログラマとして配属されていきなり適当に仕事を割り振られて必死で作ったときに gets が入っていて、それはパッケージとしてユーザに売られるものだったとか、
少なくともこれは別の問題な気がします。
安全云々以前に、素人が作ったものを客に提供するというのは倫理的にあり得ない話です。
実際やってしまう悪徳業者がいそうなのが、怖いところですが...
> 学生が初めて作ったプログラムをこれは便利だ思って Vector とかに登録したとか
これもおそらくgetsだけの問題ではないでしょうね。
94ポイント を手に入れた。
|
|
|
|
|
Name: MNS ..プログラマー(39,090ポイント)
Date: 2010/09/04(土) 22:16
No:60956
|
|
Title: Re:【雑談】 getsは本当に危険か?
|
|
初学者の方がgetsを使うという状況において、
それにバッファオーバーフローという危険が伴なうということを教えられたとして、
コード上で行える具体的な対策が、getsを使わないことくらいしかないことが、
少々問題というか、危険な気がします。
配列の場合ももちろんバッファオーバーフローの危険は伴いますが、
コード上でいくつかの対策を行うことができるので、
仮にバッファオーバーフローの原理を理解していなくても、
ある程度は、その危険を回避することが出来ますし、
対策となるコードに具体性があるので、初学者の方にとっても、
バッファオーバーフローの原理をすんなりと理解できそうな気はします。
しかし、getsの場合は特に対策のしようがない気がするので、
(要素数をなるだけ大きくする、くらいでしょうか)
何となく使って、何となく動いてしまう状況も起こりえますし、
少なからず、配列に対する理解を深めてから使うほうがよいでしょうね。
335ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..ハッカー(224,321ポイント)
Date: 2010/09/04(土) 22:21
No:60957
|
|
Title: Re:【雑談】 getsは本当に危険か?
|
|
> 少なからず、配列に対する理解を深めてから使うほうがよいでしょうね。
これは、配列の理解が深まるまでは、getcharやgetcで1文字ずつ入力すべし、という意味でしょうか?
あと、
> バッファオーバーフローという危険
についてですが、具体的にどんな実害を想定していますか?
61ポイント を手に入れた。
|
|
|
|
|
Name: MNS ..プログラマー(39,532ポイント)
Date: 2010/09/04(土) 22:37
No:60958
|
|
Title: Re:【雑談】 getsは本当に危険か?
|
|
>これは、配列の理解が深まるまでは、getcharやgetcで1文字ずつ入力すべし、という意味でしょうか?
というよりは、
バッファオーバーフローの原理が理解できない内にgetsを使うのは問題であり、
初学者の方で、配列に対する一定の理解がないのにも関わらず、
バッファオーバーフローの原理が理解できる、という方はそういないと思います。
裏を返せば、バッファオーバーフローの危険性が無い入力関数があれば、
それは使ってもよいと思います。(あるかどうかは分かりませんが)
>具体的にどんな実害を想定していますか?
最近のOSなら、保護されていないところを書き換えようとしても、
なんだかんだで大丈夫なんですかね?
それならば、実害といってはあれですが、
理由が分からないが、意図した通りにプログラムが動かない、エラーが出る。
しかし、原因がバッファオーバーフローであるということが分からない、
もしくは、バッファオーバーフローというのが原因なのは分かったが、
それが何故起きているのかが分からない。
結果として、プログラミングの学習に支障がでる、
といった状況に陥りかねないということでしょうかね。
442ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..ハッカー(224,773ポイント)
Date: 2010/09/04(土) 23:02
No:60959
|
|
Title: Re:【雑談】 getsは本当に危険か?
|
|
> 裏を返せば、バッファオーバーフローの危険性が無い入力関数があれば、
> それは使ってもよいと思います。(あるかどうかは分かりませんが)
単にバッファオーバーランを回避するだけならできますが、それで何もかもが丸く収まるわけではありませんね。
だとすると、やはり配列を理解するまでは、getchar 等で1文字ずつ入力する以外に、文字列を読み込む方法がないように思います。
> 最近のOSなら、保護されていないところを書き換えようとしても、
> なんだかんだで大丈夫なんですかね?
最悪、再起動で済む場合がほとんどでしょう。
これは最近のOSに限りません。
もっとも、プログラマブルI/Oポートを直接触れるようなプラットフォームの場合、外部回路では入力なのに無理矢理出力に設定すれば、電源とGNDを短絡させてハードウェアを破壊することはできると思います。
> 理由が分からないが、意図した通りにプログラムが動かない、エラーが出る。
> しかし、原因がバッファオーバーフローであるということが分からない、
> もしくは、バッファオーバーフローというのが原因なのは分かったが、
> それが何故起きているのかが分からない。
> 結果として、プログラミングの学習に支障がでる、
それならなおのこと、バッファオーバーランを体験して、どんな現象が起きるのかを実感し、原因究明と対策を行う経験を積んだ方が学習が進みませんか?
避けていてもいつかは直面する問題なので、初期のうちの、まだプログラムが単純で、原因究明が容易なうちに体験させるのは悪くないと思いませんか?
2倍のポイントを手に入れた! 452ポイント を手に入れた。
|
|
|
|
|
Name: MNS ..プログラマー(39,722ポイント)
Date: 2010/09/04(土) 23:39
No:60961
|
|
Title: Re:【雑談】 getsは本当に危険か?
|
|
なるほど。
バッファオーバーフローは、それほど危険な現象ではないんですね。
それならば、確かに、身を以て体験したほうが良い経験になりそうです。
>原因究明と対策を行う経験を積んだ方が学習が進みませんか?
おっしゃるとおりなのですが、この対策というものが、
果たしてgetsにおいて行えるかどうか、というのが問題な気もします。
その体験は、あくまで配列の学習過程において体験するほうが、
効果的という気がしなくもありませんね。
まあ、文字列入力は初期段階で紹介したほうが良いのかも知れませんが…
190ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..ハッカー(225,238ポイント)
Date: 2010/09/05(日) 00:25
No:60962
|
|
Title: Re:【雑談】 getsは本当に危険か?
|
|
> バッファオーバーフローは、それほど危険な現象ではないんですね。
そこまでいうといいすぎな気がしますが、多く場合はそうだといえます。
> 果たしてgetsにおいて行えるかどうか、というのが問題な気もします。
私が思いつく範囲では、2種類の状況を除いて、gets を使い続けて対策する方法はありません。
ただ、最初から答えを示してしまうのではなく、とことん対策を考えさせて、「対策できない」という結論を導かせるのは意味があると思います。
2種類の状況というのは、ひとつはファイルからのリダイレクトによる入力の場合で、それであれば事前にファイルサイズを調べることで、必要なバッファサイズを知ることができますので対策可能です(ファイルの排他制御はもちろん必要です)。
もうひとつは、1行あたりの入力文字数の制限があるようなコンソールを使う場合です。
任意の入力に対して対策可能な状況は、この二つしかないと思います。もちろん、運用で問題を回避することはできますが...
getsの使用にこだわらない場合は次の3つの対策方法があります。
1. 1行分の文字列を格納できるようにバッファを拡張する。拡張できない場合はエラーにする。
2. 事前に割り付けたバッファに格納できなかった文字は、改行まで捨てる。
3. 事前に割り付けたバッファに格納しきれない場合はエラーとし、再入力を促す。
1.は realloc で動的にバッファを拡張しなければなりませんので、当然難易度が上がります。
2.は情報を失うことになるので、それに伴う問題が生じます。
3.は、コンソールの場合は最も妥当な選択ですが、リダイレクトの場合は破綻します。
こう考えると、なかなか一筋縄ではいかないのです。
> その体験は、あくまで配列の学習過程において体験するほうが、
> 効果的という気がしなくもありませんね。
分かりやすさでいえば、そうですね。
465ポイント を手に入れた。
|
|
|
|
|
Name: 組木紙織 ..比類無きプログラマー(91,814ポイント)
Date: 2010/09/05(日) 14:33
No:60991
|
|
Title: Re:【雑談】 getsは本当に危険か?
|
|
gets()が危険というより、gets()を使うことによってバッファオーバーラン
が発生しやすくなり、その対策方法が少ないということが問題なんですね。
gets()の問題というより、gets()によって起こるバッファオーバーランの問題と解釈しなおして考えると、
実行時に起こる状況はほかの方々があげられているので、わたしは別の観点から。
デバッグ時にデバッグが難しくなる。ということをあげたいと思います。
またはRelease時とDebug時の動作が異なるときがあることです。
2倍のポイントを手に入れた! 138ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..ハッカー(225,403ポイント)
Date: 2010/09/05(日) 15:08
No:61000
|
|
Title: Re:【雑談】 getsは本当に危険か?
|
|
> gets()が危険というより、gets()を使うことによってバッファオーバーラン
> が発生しやすくなり、その対策方法が少ないということが問題なんですね。
現実の問題として、初学者が勉強で使っている状況で、バッファオーバランが発生しやすいと思いますか?
例えば、1024バイト程度の配列を用意してgetsで読み込もうとしたとき、実際のその初学者がバッファオーバーランに遭遇することがあると思いますか?
> デバッグ時にデバッグが難しくなる。ということをあげたいと思います。
予期しない事態が起きますし、振る舞いを理解することも難しいでしょうね。
> またはRelease時とDebug時の動作が異なるときがあることです。
初学者がgetsを使っている状況で、Releaseビルドをする機会がどの程度あるでしょうか?
あるいは、これが問題になるのであれば、最初からGCCでも使っておけば問題を回避できるのではないですか?
165ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..ハッカー(225,292ポイント)
Date: 2010/09/05(日) 15:10
No:61002
|
|
Title: Re:【雑談】 getsは本当に危険か?
|
|
コメントをいただいている皆さんありがとうございます。
私から、いろいろな反論をさせていただいていますが、この機会に徹底的にこの問題を議論したいからです。
悪意はありませんのでご理解ください。
引き続き、いろいろな方のご意見をいただければ幸いです。
111ポイント を落としてしまった。
|
|
|
|
|
Name: 組木紙織 ..比類無きプログラマー(92,066ポイント)
Date: 2010/09/05(日) 15:48
No:61015
|
|
Title: Re:【雑談】 getsは本当に危険か?
|
|
>現実の問題として、初学者が勉強で使っている状況で、バッファオーバランが発生しやすいと思いますか?
発生しやすいという意味では十分に大きいサイズにしておけば問題ないと思いますが、
私がはじめた時は意図的にバッファオーバーランを発生させて(当時はその用語を知りませんでしたが)
動作を見たことがあります。
>初学者がgetsを使っている状況で、Releaseビルドをする機会がどの程度あるでしょうか?
どの程度の初学者を考えているか分かりませんが、
コンパイラオプションを学ぶ機会があると思います。その時に。
252ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..ハッカー(225,414ポイント)
Date: 2010/09/05(日) 16:10
No:61017
|
|
Title: Re:【雑談】 getsは本当に危険か?
|
|
> 私がはじめた時は意図的にバッファオーバーランを発生させて(当時はその用語を知りませんでしたが)
> 動作を見たことがあります。
そういう試みは是非やるべきですね。
ただ、自分でわかっていてやったわけなので、デバッグが困難という状況にはならないと思います。
> どの程度の初学者を考えているか分かりませんが、
> コンパイラオプションを学ぶ機会があると思います。その時に。
普通にgetsを使う段階だと、Releaseビルドを行う機会はまずないと考えています。
というより、getsを普通に使うような段階だと、IDEを使うこと自体が邪魔ですね。
Debug/Releaseの切り替えは、コンパイラオプションというよりはIDEの機能ですので、なおさらReleaseビルドの機会は少ないと考えています。
122ポイント を手に入れた。
|
|
|
|
|
Name: へろり ..プログラマー(35,724ポイント)
Date: 2010/09/05(日) 16:37
No:61020
|
|
Title: Re:【雑談】 getsは本当に危険か?
|
|
>普通にgetsを使う段階だと、Releaseビルドを行う機会はまずないと考えています。
この段階というのは、学習の進行度という意味でしょうか。 ちょっと言わんとするところが不明ですが、
gets() 関数は標準入力からの入力をとても簡単に行える便利な関数ですから、これで済むなら使い続ける人もいるのでは無いでしょうか。
>というより、getsを普通に使うような段階だと、IDEを使うこと自体が邪魔ですね。
これはどういう意味でしょう。 IDEはとても便利なツールだと思いますが。
私は使い捨てのような小さなプログラムの場合は、面倒なのでいちいちIDEを使うような事はしませんが、それ以外の場合はIDEを使います。 便利ですよね?
286ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..ハッカー(225,827ポイント)
Date: 2010/09/05(日) 16:59
No:61022
|
|
Title: Re:【雑談】 getsは本当に危険か?
|
|
> この段階というのは、学習の進行度という意味でしょうか。
はい、そうです。
学習過程で、必要悪としてgetsを使うことが有益な状況では、頒布を前提とするReleaseビルドの必要はほとんどないのではないかと思います。
逆に、そんな状況で(Releaseビルドするだけならかまいませんが)頒布するのは、getsの是非以前の問題があります。
> gets() 関数は標準入力からの入力をとても簡単に行える便利な関数ですから、これで済むなら使い続ける人もいるのでは無いでしょうか。
私も使いますよ。
分かっていて使うぶんにはかまわないのです。
そうではなく、問題点が分からないまま使ってよいのは、つまり必要悪として認められるのは、学習のごく初期の段階だけではないでしょうか?
> これはどういう意味でしょう。 IDEはとても便利なツールだと思いますが。
IDEが便利なことは否定しませんし、実際にそうです。
ただ、とりあえず、Hello, World! を動かしたいだけの状況でIDEを持ち出すのは、本質とはまったく異なる部分で多大な労力を払う必要があるので、IDEはむしろ邪魔だと思うのです。
個人的には、それだけの労力を払ってもIDEを持ち出すメリットがあるのは、デバッガを使いたいか、Makefileが必要になるかしたときだと思います。
この二つは、おそらく似たようなタイミングで訪れます。この段階では、もう「初学者」とか「初心者」という呼称は卒業する時期ではないでしょうか?
413ポイント を手に入れた。
|
|
|
|
|
Name: naohiro19 ..かけだし(1,072ポイント)
Date: 2010/09/05(日) 17:07
No:61024
|
|
Title: Re:【雑談】 getsは本当に危険か?
|
|
>入力が 20 文字を超えると行バッファのオーバーランが発生し、ほとんどの場合はプログラムがクラッシュします。
だそうですね
2倍のポイントを手に入れた! 42ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..ハッカー(225,867ポイント)
Date: 2010/09/05(日) 17:15
No:61026
|
|
Title: Re:【雑談】 getsは本当に危険か?
|
|
> >入力が 20 文字を超えると行バッファのオーバーランが発生し、ほとんどの場合はプログラムがクラッシュします。
> だそうですね
すみません、意味がわかりません。
投稿する場所を間違えていませんか?
2倍のポイントを手に入れた! 40ポイント を手に入れた。
|
|
|
|
Name: 榮太郎 ..ぴよぴよ(11ポイント)
Date: 2010/09/05(日) 15:04
No:60998
|
|
Title: なぜなのでしょうか
|
|
Cの初心者でまずは練習から…ということで龍神録の通りに打っているのですが
4章のキャラ描画が表示されません
1章からひととおりやっているのですがなぜなのでしょうか
11ポイント を手に入れた。
|
|
|
|
Name: おっと ..ぴよぴよ(31ポイント)
Date: 2010/09/05(日) 15:06
No:60999
|
|
Title: Re:なぜなのでしょうか
|
|
・画像を保存されてますか?
また、画像名が間違っていませんか?
31ポイント を手に入れた。
|
|
|
|
|
Name: 榮太郎 ..ぴよぴよ(46ポイント)
Date: 2010/09/05(日) 15:23
No:61005
|
|
Title: Re:なぜなのでしょうか
|
|
龍神録のプロジェクトと素材は全てダウンロードしてあとはプログラムをコピペしてみてます
35ポイント を手に入れた。
|
|
|
|
|
Name: 榮太郎 ..ぴよぴよ(88ポイント)
Date: 2010/09/05(日) 15:37
No:61012
|
|
Title: Re:なぜなのでしょうか
|
|
そうですね
よく分かってないのにSTGなんて難易度が高すぎました
ゲームプログラミングの館などで勉強し直します
返答ありがとうございました
42ポイント を手に入れた。
|
|
|
|
Name: tune ..ぴよぴよ(0ポイント)
Date: 2010/09/05(日) 11:48
No:60977
|
|
Title: ライフゲームのアルゴリズム
|
|
はじめまして。tuneです。
僕はc言語を始めたばかりです。
ライフゲームを作りたくてソースを書いているのですが、実行結果がうまくいきません。
コンパイルはきちんとできるのですが、実行するとセルの反映がうまくいかないのです。
マップを2次元配列でつくり、1つのセルの周りを調べていって維持、誕生の条件にそうならばもう一つのパマップに反映させるというものです。
ソースのどこが間違っているのかわかりません。
OSはvisitaです。
環境はBCCで作っていて、コンパイラはBorand c++です。
#include<stdio.h>
int main()
{
int k,l,i,j;
int sum,count=0,flag=0;
int map[10][20]={
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,0},
{0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, };
int map2[10][20]={
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, };
do{
if(flag==0){
sum=0;
printf("%s\n",map);
//マップの表示
for(k=0;k<10;k++){
for(l=0;l<20;l++){
printf("%d",map[k][l]);
if(k==9 && l==19)
printf("\n");
}
printf("\n");
}
//セルの周りの状態を調べる
for(i=0;i<10;i++){
for(j=0;j<20;j++){
if(i>=1 && i<=8 && j>=1 && j<=18){
if(map[i-1][j-1]==1)
sum+=1;
if(map[i-1][j]==1)
sum+=1;
if(map[i-1][j+1]==1)
sum+=1;
if(map[i][j-1]==1)
sum+=1;
if(map[i][j+1]==1)
sum+=1;
if(map[i+1][j-1]==1)
sum+=1;
if(map[i+1][j]==1)
sum+=1;
if(map[i+1][j+1]==1)
sum+=1;
}
if(sum==3)//状態に合わせてmap2に反映
map2[i][j]=1;
else if((sum==2 || sum==3) && map[i][j]==1)
map2[i][j]=1;
else
map2[i][j]=0;
}
}
flag=1;
}
count++;
if(flag==1){
sum=0;
printf("%s\n",map2);
for(k=0;k<10;k++){
for(l=0;l<20;l++){
printf("%d",map2[k][l]);
if(k==9 && l==19)
printf("\n");
}
printf("\n");
}
for(i=0;i<10;i++){
for(j=0;j<20;j++){
if(i>=1 && i<=8 && j>=1 && j<=18){
if(map2[i-1][j-1]==1)
sum+=1;
if(map2[i-1][j]==1)
sum+=1;
if(map2[i-1][j+1]==1)
sum+=1;
if(map2[i][j-1]==1)
sum+=1;
if(map2[i][j+1]==1)
sum+=1;
if(map2[i+1][j-1]==1)
sum+=1;
if(map2[i+1][j]==1)
sum+=1;
if(map2[i+1][j+1]==1)
sum+=1;
}
if(sum==3)
map[i][j]=1;
else if((sum==2 || sum==3) && map2[i][j]==1)
map[i][j]=1;
else
map[i][j]=0;
}
}
flag=0;
}
count++;
}while(count<=10);
return 0;
}
1,536ポイント を落としてしまった。
|
|
|
|
Name: パコネコ ..プログラマー(37,575ポイント)
Date: 2010/09/05(日) 12:04
No:60979
|
|
Title: Re:ライフゲームのアルゴリズム
|
|
とりあえずできない理由とは別ですけど…
printf("%s\n",map2);
これ機能してないですよ…
printf("map2\n");
でいいと思う…
=========
私が前作ったときはmap2のデータをmapに返してたんですが…これはどうしたいんでしょうか?
//↑これは別にいいです。書いてましたから…すいません
交互に描写されるにしても、初期化しないと前のデータが残る気がします。
=========
ついでにこちらも…
printf("%s\n",map);
機能してないと思います。
printf("%s\n","map");
とかにするのもありですね…。

58ポイント を手に入れた。
|
|
|
|
|
Name: パコネコ ..プログラマー(37,621ポイント)
Date: 2010/09/05(日) 12:15
No:60981
|
|
Title: Re:ライフゲームのアルゴリズム
|
|
連続すいません
失敗の理由わかりました。
ヒントは(sumの初期化)が足りてないです。
あと、マップの初期化
46ポイント を手に入れた。
|
|
|
|
|
Name: tune ..ぴよぴよ(72ポイント)
Date: 2010/09/05(日) 13:08
No:60985
| 解決!
|
Title: Re:ライフゲームのアルゴリズム
|
|
ありがとうございました!!
無事にライフゲームを作ることができました。
初期化が足らず、前世紀のデータが残っていたのでうまくできなかったようです。
72ポイント を手に入れた。
|
|
|
|
Name: どどんぱち ..ぴよぴよ(438ポイント)
Date: 2010/09/01(水) 22:51
No:60841
|
|
Title: OpenGL ESによる描画に関する質問
|
|
連投になり申し訳ございません。
iPhone / Objective-C
OpenGL ESによる描画に関する質問です。
書籍 : 「OpenGLで作るiPhone SDKゲームプログラミング」
WEB : http://iphone.pankaku.com/book/
の最初サンプル(glTest)に
著者のBLOG
http://syokoe.net/?p=332
に記述がある方法で
端末回転に対応させる実装を追加したところ、
横に回転させて表示した場合、テクスチャ描画
やライン描画が、下半分の画面に横に3重にぶれて
表示されてしまいました。シミュレータでは問題なく
描画されますが、実機(iPhone3GS / OS 4.0.2)では
表示がおかしくなります。
OpenGL描画のバッファのサイズが縦横で
変化するせいかなと思うのですが、どのように対応するのが
よいのか悩んでいます。
アドバイス頂けたら幸いです。
よろしくお願いします。
242ポイント を手に入れた。
|
|
|
|
Name: Justy ..伝説なるハッカー(571,848ポイント)
Date: 2010/09/03(金) 02:42
No:60882
|
|
Title: Re:OpenGL ESによる描画に関する質問
|
|
>OpenGL描画のバッファのサイズが縦横で変化するせいかなと思うのですが
一応この方法で回転できるはず、なんですけどね。
何か処理を忘れているか、間違えているのか、環境的な問題なのか……。
もう一度位置からやってみてはどうでしょうか?
あ、あと
>5.ViewControllerのxibファイルを開き、EAGLViewクラスのビューを配置して大きさの調整等を行う。
は IB上でどう配置し、どのクラスの何に、アウトレットをつないだか、教えて貰えますか?
120ポイント を手に入れた。
|
|
|
|
|
Name: どどんぱち ..かけだし(1,005ポイント)
Date: 2010/09/04(土) 15:16
No:60939
| 解決!
|
Title: Re:OpenGL ESによる描画に関する質問
|
|
Justyさん
ご回答ありがとうございます。
>何か処理を忘れているか、間違えているのか、環境的な問題なのか……。
iPhone3G(GSではなくGでした) NG
iPhone4 問題なし
であることが確認できました。
powerVR MBXとPowerVR SGX の違いなのか?遅延レンダリング
という機能が影響しているのかわかりませんが、正常な場合と
ブレる場合のキャプチャー画像を添付しておきます。
>5.ViewControllerのxibファイルを開き、EAGLViewクラスのビューを配置して大きさの調整等を行う。
は IB上でどう配置し、どのクラスの何に、アウトレットをつないだか、教えて貰えますか?
OpenGL描画用のViewの方のAutosizingの画面内のスケール調整の上下と左右の矢印を
選択解除しておくと、iPhone3Gでもブレが出ずに描画されるようです。
横だけOFFにすると横方向だけぶれなくなります。
ブレル状態のソースも添付しておきますので、お気づきの点が何かありましたら
よろしくお願いします。
使用方法としては、今回、横になったから横方向へ引き伸ばすという使い方はしないので、
スケール変更はOFFにして実装することにしました。
一応、解決マークのチェックは入れておきます。
Justyさん、前回に続き、ご回答ありがとうございました。
また質問することがあると思いますが、よろしくお願い致します。
iPhone3GとiPhone4では実機での挙動が違うことが結構ありますね。
UITableViewの上にインジケーターをaddSubviewで追加して表示しようとしたら
iPhone3Gでは普通に表示されるのに、iPhone4ではテーブルの下に配置されて
インジケーターの表示が見えないと言う変な不具合もあるようですし。
この辺も情報がありましたら、よろしくお願いします。
567ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(572,748ポイント)
Date: 2010/09/05(日) 11:57
No:60978
|
|
Title: Re:OpenGL ESによる描画に関する質問
|
|
確認しました。
Autosizeingを有効にするとおかしくなりますね。
うちで作成したサンプルも同様でした。
>iPhone3GとiPhone4では実機での挙動が違うことが結構ありますね
うちに諸々3台ありますけど今のところこの手の機種間の挙動の違いに遭遇したことはないですね。
あんまり深くやってないからかもしれませんが。
UITableViewの上のインジケーターで不具合ですか。時間が合ったときにでも試してみます。
198ポイント を手に入れた。
|
|
|
|
Name: やっくん ..プログラマー(34,718ポイント)
Date: 2010/09/05(日) 06:56
No:60964
|
|
Title: プロンプト
|
|
おはようございます。
プロンプトで
Linuxでは ls
Windowsでは dir
などを用いれば、任意の階層にあるファイル名を調べることが出来ます。
これをCまたはC++で書くとどのようになりますか?
Pathを得る関数があればそれを教えていただけ無いでしょうか。
できれば、その関数の内部がどのようになっているかまで知りたいです。
今、行いたいのはある階層にあるファイルを全て逐次開いていくということです。
<環境>
Linuxならばgcc
WindowsならばVC++2008
を用いております。
よろしくお願いいたします。
<追記>
ピンポイントで行いたいことを言ってしまえば、任意のディレクトリ中のファイルの総行数をカウントしたいだけです(^^;
もし、そういうソフトがお手軽にあればそれでも構いません。
全てのファイルのパスを記述した1つのファイルを作っておき、それを読み込ませてカウントするというのでも良いのですが、ファイルを追加していく度にパスを書く手間が掛かるのは面倒なのでお手軽にいつでもカウントをできる状態にしたいです。 
120ポイント を手に入れた。
|
|
|
|
Name: へろり ..プログラマー(35,254ポイント)
Date: 2010/09/05(日) 07:25
No:60966
|
|
Title: Re:プロンプト
|
|
C言語の標準関数にそういった機能を持つ関数は無かったはずです。 多分。
gccが今手元に無いのでちょっと確認は出来ませんが、opendir()、readdir()、closedir()関数あたりが用意されていたと思います。
Windowsでしたら、GetCurrentDir()、FindFirstFile()、FindNextFile()、FindClose()APIが用意されています。
ファイルパスはOSによって表現方法が異なりますから、取得するにはOSにお伺いを立てるしかないような気がします。 多分。
2倍のポイントを手に入れた! 244ポイント を手に入れた。
|
|
|
|
|
Name: へろり ..プログラマー(35,410ポイント)
Date: 2010/09/05(日) 07:40
No:60968
|
|
Title: Re:プロンプト
|
|
こんな感じですか。
#include <windows.h>
int getCount(const char *path)
{
...
}
int main(void)
{
HANDLE hf;
WIN32_FIND_DATA fd = {0};
int total = 0;
hf = FindFirstFile("c:\\*", &fd);
do{
if(検索したのが対象となるファイルなら)
total += getCount(fd.cFileName);
}while(FindNextFile(hf, &fd));
FindClose(hf);
printf("総行数: %d\n", total);
return 0;
}
156ポイント を手に入れた。
|
|
|
|
|
Name: やっくん ..プログラマー(34,872ポイント)
Date: 2010/09/05(日) 07:47
No:60969
|
|
Title: Re:プロンプト
|
|
>へろりさん
おぉ・・・ありがとうございます!!
とりあえず、APIの詳細を一つ一つ覗いてきました。
確かにできそうですね。
Linuxの方は今は手元にないので後で、使える所に行って調べてみます。
106ポイント を手に入れた。
|
|
|
|
|
Name: やっくん ..プログラマー(34,911ポイント)
Date: 2010/09/05(日) 10:09
No:60974
|
|
Title: Re:プロンプト
|
|
バグさんありがとうございます。
.NETを触ったことはありませんが、最近ちょうど図書を借りたので調べてみます(^^
51ポイント を手に入れた。
|
|
|
|
Name: DG [URL] ..入門者(3,322ポイント)
Date: 2010/09/02(木) 22:02
No:60874
|
|
Title: VC++でDebugとReleaseで結果が異なってしまう
|
|
環境はVC++2008EE Vista32bit なのですが、
DebugとReleaseでプログラムを実行したときに結果が異なり、Releaseの時に
特定の場所で動作が停止してしまいます。
2次元配列を使っているところなので、メモリの使い方が変わったことが原因なのではないかと
思うのですが、どうにもわかりません。
2次元配列を含む構造体をファイルに保存するときに、
2次元配列の[1][〜]のとこを変えて保存しようとするだけ動作が止まってしまいます。
具体的には、
この構造体を
(CH_NUMはマクロで定義して、4になっています)
typedef struct{
int pre_chnum;
int battle_high[CH_NUM][CH_NUM];
}save_data_t;
この関数で
void savedata_write(){
FILE *fp;
errno_t err;
if( ( err = fopen_s( &fp, savefile, "wb" ) ) !=0 ) {
MessageBox(
NULL ,
TEXT("セーブデータの保存に失敗しました。") ,
TEXT("書き込み失敗") ,
MB_OK );
}
else{
fwrite( &save_data, sizeof(save_data_t), 1, fp ) ;
fclose( fp );
}
}
(save_dataは save_data_t save_data; として大域変数として宣言しています.)
ファイルに記録しているのですが、2次元配列の2行目の値
( save_data.battle_high[1][(0〜3のどれでも)] )
を変えて(この時点では停止していない) savedata_write() で保存するときに動作が停止してしまいます。
なんで[1][〜]のとこだけダメなんだろ・・・といった感じなのですが、どういうことなのでしょうか? 
579ポイント を手に入れた。
|
|
|
|
Name: めるぽん ..上級者(18,632ポイント)
Date: 2010/09/02(木) 22:37
No:60877
|
|
Title: Re:VC++でDebugとReleaseで結果が異なってしまう
|
|
適当に書いてみましたが、Debug, Release で正常にファイルが出力されました。環境は VS2008、Windows XP です。
#include <stdio.h>
const int CH_NUM = 4;
typedef struct{
int pre_chnum;
int battle_high[CH_NUM][CH_NUM];
}save_data_t;
save_data_t save_data;
void savedata_write(){
FILE *fp;
errno_t err;
if( ( err = fopen_s( &fp, "hoge.txt", "wb" ) ) !=0 ) {
}
else {
fwrite( &save_data, sizeof(save_data_t), 1, fp ) ;
fclose( fp );
}
}
int main(){
save_data.battle_high[1][2] = 10;
savedata_write();
}
DG さんのソースを見る限り特に問題があるようには見えない(見落としてるだけかもしれません)ので、もしかしたらそのコード以外の場所でおかしくなっているのかもしれません。
420ポイント を落としてしまった。
|
|
|
|
|
Name: DG [URL] ..入門者(3,584ポイント)
Date: 2010/09/03(金) 00:33
No:60878
|
|
Title: Re:VC++でDebugとReleaseで結果が異なってしまう
|
|
>>ぬるぽんさん
そうですね・・・自分も同じように問題のありそうな部分を抜き出して、そこだけで
実行してみると問題なくうごきました。
ちなみに、データのロードは以下のようにしているのですが、
void savedata_read(){
FILE *fp;
errno_t err;
if( ( err = fopen_s( &fp, savefile, "rb" ) ) !=0 ) {
memset(&save_data,0,sizeof(save_data_t));
}
else{
fread( &save_data, sizeof(save_data_t), 1, fp ) ;
fclose( fp );
}
}
これも問題なく動いているようでした。
お手上げです(;´ ェ`)
262ポイント を手に入れた。
|
|
|
|
|
Name: めるぽん ..上級者(18,655ポイント)
Date: 2010/09/03(金) 04:21
No:60887
|
|
Title: Re:VC++でDebugとReleaseで結果が異なってしまう
|
|
問題なければソースコード全体を添付していただけませんか?
23ポイント を手に入れた。
|
|
|
|
|
Name: DG [URL] ..入門者(4,013ポイント)
Date: 2010/09/03(金) 21:37
No:60914
|
|
Title: Re:VC++でDebugとReleaseで結果が異なってしまう
|
|
あまり綺麗なものではないのでちょっと恥ずかしいのですが、よろしくお願いします。
こちらからダウンロードして下さい。
http://dl.dropbox.com/u/3912563/VSB.zip
セーブデータに関わるところは、
grobal.h の一番下の部分
save.cpp
battle.cpp のbattle_end()の最後の部分とdraw_highscore()
です。
savedata_chadd()というのがありますが、これは使用していなくても例の問題は起きました。
それと、2次元配列にしているところを1次元配列にして保存したらいけるかな?っと思って
やってみたのですが、ダメでした。
実行するときにはここ
http://dl.dropbox.com/u/3912563/VAIN%20Shot%201.2.zip
からdata.dxaをプロジェクトのフォルダに入れて実行してください。
簡単な入力の説明も入っています。
それと、2次元配列で1行目の値を扱うときは、プレイヤー1の選択したキャラが
「鏡音リン」で、変数select1pの値が1のときです。
このときにデータをセーブする(COM対戦で、勝利してハイスコアをだす)ときにプログラムが
停止してしまいます。
とっとと相手を倒せるように、3番目のキャラ、「巡音ルカ」のHPはギリギリまで少なくしてあります。
429ポイント を手に入れた。
|
|
|
|
|
Name: めるぽん ..上級者(18,874ポイント)
Date: 2010/09/04(土) 06:18
No:60934
|
|
Title: Re:VC++でDebugとReleaseで結果が異なってしまう
|
|
リソースのリンクが切れていたのでソースだけで実行しましたが、rin.cpp の 847 行目と 944 行目、
for(i=0;i<200;i++) hosou_flag[i]=0;
hosou_flag は SPS_MAX 個の配列ですが、SPS_MAX は 100 と定義されているため、ここでアクセス違反が起きておかしな動作を引き起こしているようです。
2倍のポイントを手に入れた! 158ポイント を手に入れた。
|
|
|
|
|
Name: DG [URL] ..入門者(4,019ポイント)
Date: 2010/09/04(土) 23:17
No:60960
| 解決!
|
Title: Re:VC++でDebugとReleaseで結果が異なってしまう
|
|
うぉ、ありがとうございます!
いろいろやってたあとにちゃんと整理していなかったみたいです(;´ ェ`)
そんなところでメモリがぐちゃぐちゃになってしまったのが今になって影響してきていたんですね・・・
いい勉強になりました。
他人のコードを見るのは疲れるでしょうけれども、おかげさまで助かりました。
ありがとうございました。 
6ポイント を手に入れた。
|
|
|
|
Name: ぬっち ..中級者(13,035ポイント)
Date: 2010/09/03(金) 07:02
No:60889
|
|
Title: 継承かメンバ関数か
|
|
お世話になっております。
現在私は、テンプレートクラスとして3次元のベクトルクラス(STLではなく、数学のベクトル)を作成しています。
そこで、皆様の意見を頂きたいと思いましたので投稿させていただきます。
この3次元ベクトルクラスは、メンバ関数としてベクトルの回転を含んでいます。
ですが、これは右手系と左手系では関数の内部が変わってしまいます。
従って、私は両方の系に対応するために、
1. 回転を含まない3次元ベクトルクラスから、右手系・左手系専用のベクトルクラスを作成する。
2. 3次元ベクトルクラスに左手系・右手系用のメンバ関数を両方とも作成する。
3. 回転というメンバ関数に、左手系か右手系かを表すフラグを引数に取らせて、関数内部でそれぞれの処理を行うようわける。
ということを考えました。
このクラスは何度も呼び出されるため、出来るだけ実行速度を速くしたいと考えています。
これ以外の方法でも構いませんので、どのような方法がよいか意見を頂けないでしょうか?
よろしくお願いします。
2倍のポイントを手に入れた! 534ポイント を手に入れた。
|
|
|
|
Name: めるぽん ..上級者(18,716ポイント)
Date: 2010/09/03(金) 07:50
No:60892
|
|
Title: Re:継承かメンバ関数か
|
|
単純に考えるなら、使う側に対して、
型を書くときに右手系か左手系かを決定させたいなら1、
使うときに右手系か左手系かを決定させたいなら2か3ですね。
61ポイント を手に入れた。
|
|
|
|
|
Name: たいちう ..ハッカー(102,900ポイント)
Date: 2010/09/03(金) 08:00
No:60893
|
|
Title: Re:継承かメンバ関数か
|
|
本当に実行速度が大事ならば、3種類作ってみて、実行速度を比較してください。
私の予想だと有意な差は見られないと思います。
それと、回転が右手系・左手系を持つのでしょうか?
ベクトルが右手系・左手系を持つのでしょうか?
それとも、一連の計算が全て右手系(あるいは)左手系で行われるのでしょうか?
回転毎に右手系・左手系を定義するのではないならば、
「回転というメンバ関数に、左手系か右手系かを表すフラグを引数に取らせて」というのは、
設計的にどうかと思います。
ソースコードを見せてもらえれば、より具体的なアドバイスが増えると思いますよ。
77ポイント を手に入れた。
|
|
|
|
|
Name: たいちう ..ハッカー(103,007ポイント)
Date: 2010/09/03(金) 08:05
No:60894
|
|
Title: Re:継承かメンバ関数か
|
|
補足
有意な差が無いだろうという予想の根拠ですが、
回転の計算に必要な浮動小数点数(整数かも)の演算に必要な処理時間と比較して、
系の判定に必要な処理時間は無視できると思われるからです。
あくまでも予想・憶測ですが。
107ポイント を手に入れた。
|
|
|
|
|
Name: ぬっち ..中級者(13,152ポイント)
Date: 2010/09/03(金) 20:05
No:60912
| 解決!
|
Title: Re:継承かメンバ関数か
|
|
めるぽんさん、たいちうさん、たかぎさん返信ありがとうございます。
いろいろ考えた結果、2の方法で行うことにします。
さまざまなコメントをしていただきありがとうございます。
ところでたかぎさんのテンプレート引数による右手系・左手系の作成をする方法がいまだによくわからないので、このあたりをもう少し考えてみることにします。
Strategyパターンのことなのでしょうか?
117ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..ハッカー(222,678ポイント)
Date: 2010/09/03(金) 20:56
No:60913
|
|
Title: Re:継承かメンバ関数か
|
|
> ところでたかぎさんのテンプレート引数による右手系・左手系の作成をする方法がいまだによくわからないので、このあたりをもう少し考えてみることにします。
> Strategyパターンのことなのでしょうか?
Strategyパターンにできなくもないでしょうが、もっと単純な話です。
例えば、int func() という関数があった場合、
func<LH>() または func<RH>() のように、左手系か右手系かをテンプレート引数で与えればよいということです。
動的に左手系か右手系かを切り替えなければならないケースはそうないはずですので、これなら、どちらを選択するかはコンパイル時に決定され、(選択にかかる)実行時のコストはまったくありません。
2倍のポイントを手に入れた! 348ポイント を手に入れた。
|
|
|
|
|
Name: ぬっち ..中級者(13,252ポイント)
Date: 2010/09/04(土) 20:23
No:60950
| 解決!
|
Title: Re:継承かメンバ関数か
|
|
たかぎさん返信ありがとうございます。
テンプレート引数でコンパイル時に条件分岐するということですね。
この方法は試したことがないので試してみようかと思います。
貴重なコメントありがとうございました。
100ポイント を手に入れた。
|
|
|
|
Name: 猫好き ..ぴよぴよ(118ポイント)
Date: 2010/09/03(金) 11:54
No:60900
|
|
Title: メニュー画面の選択肢で
|
|
シューティングを作ろうと思って、C++ならクオリティの高いゲームが作れるということで勉強中です。
メニュー画面で選択肢の表示はできましたが、
そこからゲームのプログラムへ移行するのにどうしたらいいかわかりません。
メニュー画面では関数をつかって、DXLIBのサイトに載ってある程度のことはできました。
ゲームのプログラムはまだできていないので、竜神録のサンプルを使わせてもらっています。
よろしくお願いします。
118ポイント を手に入れた。
|
|
|
|
Name: シエル [URL] ..熟練のプログラマー(68,115ポイント)
Date: 2010/09/03(金) 11:59
No:60901
|
|
Title: Re:メニュー画面の選択肢で
|
|
switch(status){
case 0:
//初期処理
case 1:
//メニュー処理
case 2:
//ゲームメイン処理
}
として、それぞれの処理をわけておき、メニュー処理の中で選択肢に応じたstatusに遷移すればOK。
77ポイント を手に入れた。
|
|
|
|
|
Name: 猫好き ..ぴよぴよ(184ポイント)
Date: 2010/09/03(金) 14:33
No:60905
| 解決!
|
Title: Re:メニュー画面の選択肢で
|
|
>シエルさん
的確な指示ありがとうございます。
>softyaさん
なるほど。
確かに、今は高度なC++でも、私のような初心者ではうまく扱えないかもしれません。
教えてくださったサイトをよく読んでおきます。
66ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..ウィザード(1,268,998ポイント)
Date: 2010/09/03(金) 22:52
No:60930
|
|
Title: Re:メニュー画面の選択肢で
|
|
オブジェクト指向はすぐにパっと理解出来るものではないですよね。
ピュアCの経験が長ければ余計にそう思うと思います。
今の館は完全な
「ピュアC」
しかないので、次に、
「コンパイルはピュアCで出来るけど、書き方はオブジェクト指向っぽい」
設計の仕方の館を作り、次に
「完全なC++のオブジェクト指向」
の館を作れたらいいなと思っています。
・・って言うのは質問の趣旨とは関係無いですね^^;
なるべく他のモジュールに依存しないように設計すると良いプログラムになっていくと思います。
例えばメニュー画面を切り離したらシューティング画面は機能しないようなプログラムだと、
今回せっかくメニュー画面を作っても次回の作品に流用できないでしょう。
シエルさんが仰っているように制御部からある関数を呼ぶだけでメニュー画面が機能するような設計をされると良いと思います。
まずは完全に別々で作ってやり、次にくっつけて動かす。
そして共通化出来る所を探し、依存しないように共通化するように作っていくとよいと思います。
共通化出来る所と言えば例えばインターフェイス回りであったり画面・メッセージ制御などが考えられるのではないかと思います。
298ポイント を手に入れた。
|
|
|
|
|
Name: 猫好き ..ぴよぴよ(16ポイント)
Date: 2010/09/04(土) 13:31
No:60937
| 解決!
|
Title: Re:メニュー画面の選択肢で
|
|
管理人さん、解決を選択したのにわざわざ返事をしてくださってありがとうございます。
確かに、一度作れば次回作も作りたくなりますので、
汎用性の高いメニューのプログラムを作りたいです。
共通化できるところといえば、(東方みたいなやつで)
ノベル表示、立ち絵の表示などといったとこでしょうか・・・。
ひとまず、そういうことも考えながら、やってみようと思います。
168ポイント を落としてしまった。
|
|
|
|
Name: 宗一郎 ..ぴよぴよ(632ポイント)
Date: 2010/09/03(金) 15:50
No:60906
|
|
Title: flagの判断の違いについて
|
|
お世話になっておりますm(_ _)m
龍神録プログラミングの館で勉強させていただいているのですが、
flagがたっているかの判断の場合に毎度判断の条件が違いますが何か理由があるのでしょうか?
例えば、
13.敵にショットを撃たせてみよう
http://dixq.net/rp/13.html
弾丸の描画部分での
if(shot[i].flag>0){//弾幕データがオンなら
if(shot[i].bullet[j].flag!=0){//弾データがオンなら
などです。
flagの判断はだいたいは1かどうか判断しているのですよね?
もし、1かどうか判断しているのならどれか1つに統一できるのではないかと思いまして。
ほとんどこのサイトで勉強しただけなので、初心者な質問かもしれませんが、
よろしくお願いしますm(_ _)m
290ポイント を手に入れた。
|
|
|
|
Name: dic ..比類無きプログラマー(94,205ポイント)
Date: 2010/09/03(金) 16:42
No:60907
|
|
Title: Re:flagの判断の違いについて
|
|
int i; としたとき
i = 1; // オンにする
if( i > 0 )
で通りますが
i = -1; のとき
if( i != 0 )
の時もオンとみなしますね
36ポイント を手に入れた。
|
|
|
|
|
Name: 宗一郎 ..ぴよぴよ(744ポイント)
Date: 2010/09/03(金) 17:00
No:60908
|
|
Title: Re:flagの判断の違いについて
|
|
回答ありがとうございます^^
ですが、ちょっと意味合いが違うように伝わってしまったようです。
わかりずらい説明をしてすみませんm(_ _)m
私が言いたかったことは、帰ってくる数値が1か0しかないのに
条件が違う場合のことを言いたかったのです。
112ポイント を手に入れた。
|
|
|
|
|
Name: ookami ..熟練のプログラマー(50,060ポイント)
Date: 2010/09/03(金) 17:03
No:60909
|
|
Title: Re:flagの判断の違いについて
|
|
私は、同じ書き方で統一したほうがベターだと思います。
仕様変更などのとき混乱のモトになる気がいたします。
# まぁ、「flag」という名前の変数を、「0か1をとる」以外の用途に仕様変更するってことは
# なかなかない気がするので、問題になるケースは少ないかもですが^^;
99ポイント を手に入れた。
|
|
|
|
|
Name: 宗一郎 ..ぴよぴよ(794ポイント)
Date: 2010/09/03(金) 17:27
No:60910
| 解決!
|
Title: Re:flagの判断の違いについて
|
|
やっぱり同じような処理(判断など)をする場合は、統一したほうがいいんですね。
dicさん、ookamiさん
初心者な質問に回答していただきありがとうございました^^
50ポイント を手に入れた。
|
|
|
|
|
Name: ぽこ ..プログラマー(29,370ポイント)
Date: 2010/09/03(金) 19:32
No:60911
|
|
Title: Re:flagの判断の違いについて
|
|
> # まぁ、「flag」という名前の変数を、「0か1をとる」以外の用途に仕様変更するってことは
> # なかなかない気がするので、問題になるケースは少ないかもですが^^;
龍神録は仕様変更するケースに該当するんですよね。
これがまた。
32ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..ウィザード(1,268,326ポイント)
Date: 2010/09/03(金) 22:38
No:60925
|
|
Title: Re:flagの判断の違いについて
|
|
flagはC++であれば本来boolで宣言すべきですよね。
intで宣言したとしても0か1以外入れるべきではないです。入れるのであれば0以外は全て同じ条件を示すべきでしょう。
しかし龍神録では確か敵が倒れてまだ弾幕が生存していると敵のフラグが2になる瞬間があったように思います。
なるべく変数をあれこれ宣言したくなかったからこのような事をしたのですが、フラグの意味からするとおかしいですね。
(変数名をstatusとかにすればよい話かもしれませんが)
条件判定については、「偽は0」「真は0以外」ですので、
「==0」か「!=0」で統一すればよいかと思います。
110ポイント を手に入れた。
|
|
|
|
|
Name: 宗一郎 ..ぴよぴよ(946ポイント)
Date: 2010/09/03(金) 23:20
No:60932
|
|
Title: Re:flagの判断の違いについて
|
|
管理人様、ぽこさん
回答ありがとうございます^^
>龍神録では確か敵が倒れてまだ弾幕が生存していると敵のフラグが2になる瞬間があったように思います。
このところがあったので、判断がどうなっているのかなと思っていました。
これでそこのところの疑問も解消されました。
ありがとうございましたm(_ _)m
152ポイント を手に入れた。
|
|
|
|
Name: msc ..ぴよぴよ(74ポイント)
Date: 2010/09/03(金) 21:44
No:60916
|
|
Title: C言語ゲームプログラミングの館について
|
|
自分はSTG作りたいと思って「C言語ゲームプログラミングの館」のページを学習しようとして、
12. 画像を動かす。
のところまでやってみて思ったのですが。
書いてあるサンプルプログラムをコピーして実行するだけでいつかゲームができるとは到底思えません。
これは学習方法が悪いのでしょうか?
自分はC言語はfor文まではできるのですが、書いてあるサンプルプログラムの意味がほとんど理解できません。
主に関数の意味がわからないものが多いです。正直基本的なC言語の知識があればできるとは思えません。
理解できないのは自分のC言語の能力がたりないということだと思うのですが、
ではその場合後どれくらいのC言語の知識があれば自分は「C言語ゲームプログラミングの館」の内容を理解できるでしょうか?
ちなみに今は「新版 明解C言語 入門編」という本でC言語を勉強してます。
74ポイント を手に入れた。
|
|
|
|
Name: msc ..ぴよぴよ(144ポイント)
Date: 2010/09/03(金) 22:26
No:60921
|
|
Title: Re:C言語ゲームプログラミングの館について
|
|
>ねんどじんさん
いえいえとんでもないわざわざアドバイスありがとうございました。
構造体、関数自作、プリプロセッサなどがわかるまで今の本を進めようと思います。
ありがとうございました
70ポイント を手に入れた。
|
|
|
|
|
Name: softya [URL] ..ハッカー(212,419ポイント)
Date: 2010/09/03(金) 22:32
No:60923
|
|
Title: Re:C言語ゲームプログラミングの館について
|
|
こちらでC言語の分からないことを質問されるのも良いと思います。
覚え方のコツとしては、本のまま打ち込むのではなく色々変えてみると分かってくることもあります。
本で出てきた機能はすぐさま試してみるのが理解するのに一番良い方法ではないでしょうか。
69ポイント を手に入れた。
|
|
|
|
|
Name: msc ..ぴよぴよ(0ポイント)
Date: 2010/09/03(金) 22:38
No:60924
|
|
Title: Re:C言語ゲームプログラミングの館について
|
|
わかりました。ひとまず関数まで学習してまた挑戦してみようと思います
それといつか自分でゲームを作れるようになるんだなと考えればなかなかC言語も楽しいです。
>コピペをしてコンパイルをするということが出来ないので、面倒な時はネットに頼ってもいいと思います。
自分はまだまだ初心者なのでよくわかりませんがネットからコピペって学習方法としていいのでしょうか?
やはり最初はまだ短い文ばかりでどうにかなるけれど、章が進むにつれ文も長くなっていくということなのでしょうか?
そういう時はやっぱり本を見ながら手打ちは結構厳しかったりしますか?
>とりあえず入門サイトや書籍で配列や関数、余力があれば構造体やポインタの辺りを勉強して見て下さい。
どこの知識が足りないかを教えていただきとても親切に教えていただきありがとうございました
194ポイント を落としてしまった。
|
|
|
|
|
Name: シエル [URL] ..熟練のプログラマー(68,235ポイント)
Date: 2010/09/03(金) 22:43
No:60926
|
|
Title: Re:C言語ゲームプログラミングの館について
|
|
コピペするのは内容をちゃんと理解しているのであれば、やってもいいと思います。
が、初めのうちはコピペしないほうが覚えます。
私は人のソースをまずコピることはありません。
自分のソースでも完全に理解できるまでコピりません。
103ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..ウィザード(1,268,700ポイント)
Date: 2010/09/03(金) 22:44
No:60927
|
|
Title: Re:C言語ゲームプログラミングの館について
|
|
もちろん手打ちが出来るなら手打ちが一番だと思います。
ただ、softyaさんが仰っているように、手打ちするより重要なのは、書いてあるプログラムを実行しただけで満足しない事です。
色々いじくって実行結果がどう変わるのか確認し、自分が期待する動作をソースを変更して出来るようになったか確認して見て下さい。
最初のコードをコピペすることで、そちらに時間を確保できるのであれば、ある程度なれてきたらコピペもありかと思います。
まぁ慣れるまでは手打ちが一番でしょうけどね。
2倍のポイントを手に入れた! 374ポイント を手に入れた。
|
|
|
|
|
Name: msc ..ぴよぴよ(55ポイント)
Date: 2010/09/03(金) 22:52
No:60929
| 解決!
|
Title: Re:C言語ゲームプログラミングの館について
|
|
ねんどじんさん
Dixqさん
softyaさん
シエルさん
もう少しC言語について知識をつけたいと思います。
どうもありがとうございました
55ポイント を手に入れた。
|
|
|
|
Name: しろくま ..ぴよぴよ(265ポイント)
Date: 2010/09/03(金) 07:44
No:60891
|
|
Title: 龍神録の第34章以降について
|
|
龍神録の館のプログラムを参考に勉強させていただいているのですが、
配布されているprojectの35章目のプログラムについて、レーザーの描画関数に
DrawModiGraphF(//レーザーを描画
lazer[i].disppt[0].x+FX, lazer[i].disppt[0].y+FY,
lazer[i].disppt[1].x+FX, lazer[i].disppt[1].y+FY,
lazer[i].disppt[2].x+FX, lazer[i].disppt[2].y+FY,
lazer[i].disppt[3].x+FX, lazer[i].disppt[3].y+FY,
img_lazer[lazer[i].knd][lazer[i].col],TRUE
);
と書いてあったのですが、龍神録プログラミングの館にも、(これはあり得ないはずなんですが)
配布プログラムからも、lazer構造体のdispptやoutpptに数値が入れられる記述が見あたりませんでしたので、
自分の見逃しなのはわかっていますがどうかその場所を教えていただけないでしょうか
わかりにくい文ですみませんでした
265ポイント を手に入れた。
|
|
|
|
Name: Dixq (管理人) [URL] ..ウィザード(1,267,711ポイント)
Date: 2010/09/03(金) 08:06
No:60895
|
|
Title: Re:龍神録の第34章以降について
|
|
> しろくまさん
こんにちは。
いえいえ、ありえます(汗
元々細かな修正は全て紹介していなかったんです。
変更点においては、大まかな部分のみを紹介していたのですが、それでは自分でプロジェクトを作っている人には解りにくいから全部紹介してほしいというリクエストを受けて後から追加したものですから、
あちこち記載の足らない点があります。
もしほかにもあれば教えて頂けると幸いです^^;
123ポイント を手に入れた。
|
|
|
|
|
Name: しろくま ..ぴよぴよ(705ポイント)
Date: 2010/09/03(金) 21:43
No:60915
|
|
Title: Re:龍神録の第34章以降について
|
|
>>Dixqさん
返答遅くなってしまい申し訳ありません。
自分で解説を見ながらプログラムを組んでいたのですが、↑で言ったとおり
lazer構造体のdispptやoutpptに数値を入れている部分がわかりませんでした。
レーザーサンプルや反魂蝶のプログラムではstartpt変数などしかいじってないようでしたし・・
もしよければ35章のプログラムのどこでdisppt,outpptに数値を入れているのか教えていただけますか?
そしていまのところ、レーザー関連のところ以外で記載の足らない部分は無いように感じました。
2倍のポイントを手に入れた! 440ポイント を手に入れた。
|
|
|
|
|
Name: fatens ..上級者(17,933ポイント)
Date: 2010/09/03(金) 22:22
No:60920
|
|
Title: Re:龍神録の第34章以降について
|
|
>もしよければ35章のプログラムのどこでdisppt,outpptに数値を入れているのか教えていただけますか?
shot.cppのlazer_calc関数内だと思います。
56ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..ウィザード(1,268,216ポイント)
Date: 2010/09/03(金) 22:30
No:60922
|
|
Title: Re:龍神録の第34章以降について
|
|
fatensさんの仰る通りです。
もしVC++をお使いでしたら、検索を使ってみてください。
検索対象を「現在のプロジェクト」にすれば全てのファイルの中から検索してくれます。
そして、変数の意味ですが、レーザーについて紹介している章に、レーザーの上に当たり判定を赤い四角形で上書きしていますよね。
レーザーの座標4点と、当たり判定の座標4点を格納するための変数になっています。
計算式が解りにくいかもしれませんが・・。
そちらが解らなければまた聞いて下さい。
171ポイント を手に入れた。
|
|
|
|
|
Name: しろくま ..ぴよぴよ(835ポイント)
Date: 2010/09/03(金) 22:44
No:60928
| 解決!
|
Title: Re:龍神録の第34章以降について
|
|
>>fatensさん、Dixqさん
ご指摘ありがとうございます!みつかりました!
たぶんこれですべて理解できたと思います。
VC使ってますが「使われている」という言い方のほうがまだ正しいですね、検索機能については
知りませんでした。
詰まっていたところ助かりました。本当にありがとうございました。
130ポイント を手に入れた。
|
|
|
|
Name: なつ ..ぴよぴよ(22ポイント)
Date: 2010/09/01(水) 21:07
No:60825
|
|
Title: C#でエクセル操作
|
|
こんばんわ。
C#でエクセルのヘッダ部分に画像を張り付けたいんですけど、できるのでしょうか??
できるのでしたら、参考になるような分りやすいサイトを教えてください!!
よろしくお願いします。
22ポイント を手に入れた。
|
|
|
|
Name: なつ ..ぴよぴよ(73ポイント)
Date: 2010/09/02(木) 07:06
No:60851
|
|
Title: Re:C#でエクセル操作
|
|
ありがとうございます。
参考にさせていただきます。
分らなくなったら、またお願いします。
51ポイント を手に入れた。
|
|
|
|
|
Name: なつ ..ぴよぴよ(316ポイント)
Date: 2010/09/02(木) 20:06
No:60870
|
|
Title: Re:C#でエクセル操作
|
|
こんばんわ。
↑参考にしてしてみました。
でも、ヘッダに画像はつきませんでした。
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Excel.Application oXlsApp;
Excel.Worksheet oSheet;
private void button1_Click(object sender, EventArgs e)
{
// エクセル起動
oXlsApp = new Excel.Application();
// ブック追加
oXlsApp.Application.Workbooks.Add(Type.Missing);
// シート選択
oSheet = (Excel.Worksheet)oXlsApp.Worksheets[1];
oSheet.PageSetup.LeftHeaderPicture.Filename = @"xxx.bmp";
// エクセル表示
oXlsApp.Application.Visible = true;
}
}
}
ご指摘お願いします。
243ポイント を手に入れた。
|
|
|
|
|
Name: Mr.Vince ..かけだし(2,344ポイント)
Date: 2010/09/03(金) 07:11
No:60890
|
|
Title: Re:C#でエクセル操作
|
|
上のプログラムをそのまま使っているのだとしたら、1点、疑問点があります
oXlsApp.Worksheets[1]
→C#でも配列インデックスは「0」から始まります。正しいWorksheetを見ておりますでしょうか?(若しくは、そのWorksheetは存在しておりますか?)
以上で動かない場合、Visual C#環境ならば、ブレイクポイントをoXlsApp.Worksheets[1] 辺りに取り付け、ちゃんと各パーツ(Workbook、Worksheet等)が正しく設定されているかどうかをチェックすることをお勧めします。
184ポイント を手に入れた。
|
|
|
|
|
Name: YuO ..熟練のプログラマー(46,707ポイント)
Date: 2010/09/03(金) 11:23
No:60899
|
|
Title: Re:C#でエクセル操作
|
|
シートのヘッダに画像を表示する,という設定をしていないために表示されないのでしょう。
Office XPのExcel VBAのヘルプより引用しますが,
> With ActiveSheet.PageSetup.LeftHeaderPicture
> .FileName = "C:\Sample.jpg"
(省略)
> End With
>
> ' 左ヘッダーのイメージの表示を有効にします。
> ActiveSheet.PageSetup.LeftHeader = "&G"
最後のLeftHeaderに"&G"を設定することが抜けています。
で,C#でCOMを扱う上での鉄則ですが,必ずメソッド/プロパティで取得したオブジェクトは変数等に代入し,不要になった時点でMarshal.ReleaseComObjectを行ってください。
今回はExcel起動したら放ったらかすようなので問題ないのですが,COMをReleaseし忘れると,QuitしてもExcelが終了しない等の問題を抱えます。
提示されたプログラムを書き換えるなら,こうなるでしょうか。
var objects = new List<object>(); // 面倒なので,最後に一気に行うために溜める
try {
// エクセル起動
var excel = new Excel.Application();
objects.Add(excel);
// ブック追加
var books = excel.Workbooks;
objects.Add(books);
var newBook = books.Add(Type.Missing);
objects.Add(newBook);
// シート選択
var worksheets = newBook.Worksheets;
objects.Add(worksheets);
var targetSheetObject = worksheets[1]; // OfficeのCOMはVBA用なので,1から数え始める
objects.Add(targetSheetObject);
var targetSheet = (Worksheet)targetSheetObject;
// ヘッダに画像を追加
var pageSetup = targetSheet.PageSetup;
objects.Add(pageSetup);
var leftHeaderPicture = pageSetup.LeftHeaderPicture;
objects.Add(leftHeaderPicture);
leftHeaderPicture.Filename = @"xxx.bmp";
pageSetup.LeftHeader = "&G";
// エクセル表示
excel.Visible = true;
} finally {
objects.Reverse();
foreach (var obj in objects) {
try {
if (Marshal.IsComObject(obj)) Marshal.ReleaseComObject(obj);
} catch {
// finally節中なので,例外の送出は阻止する。ログ等への書き出しはあった方が良い
}
}
}
まだ調査していないのですが,C# 4.0のdynamic使ったCOMバインダでも,少なくともβ1時点ではReleaseComObjectが必須だったようです。
http://blogs.msdn.com/b/shozoa/archive/2009/06/15/considered-opinion-about-com-binder-in-dlr.aspx
C#ではRAIIが使えない上にGCがCOMと異なるため,非常に面倒ですが,Marshal.ReleaseComObject (or Marshal.FinalReleaseComObject) を忘れないようにする必要があります。
930ポイント を落としてしまった。
|
|
|
|
|
Name: なつ ..ぴよぴよ(349ポイント)
Date: 2010/09/03(金) 22:21
No:60919
| 解決!
|
Title: Re:C#でエクセル操作
|
|
Mr.Vince さん
YuO さん
ありがとうございます。
無事ヘッダに挿入できました。
33ポイント を手に入れた。
|
|
|
|
Name: HK ..初心者(5,827ポイント)
Date: 2010/09/03(金) 01:29
No:60880
|
|
Title: 3Dに関する基本知識
|
|
お世話になっております
3Dについて数点お聞きしたいのですが、あまり理解が足りてないので
見当違いなことをお聞きしているかもしれません。お許しください。
1.xファイルとは何でしょうか。
単なるモデルデータでしょうか?
モーションはついているのでしょうか?
2.モデルデータの拡張子には多くのものがありますよね?
たとえばDXlibで3dモデルを扱う場合、どういった拡張子の物を
使うのが一般的ですか? 公式を見るとxファイルを使ってるのですが、
質問1でお聞きしているように、xファイルについての理解が
足りていません。申し訳ないです。
3.DXlibで、さらにそこにモーションを加えたい場合。
VPVPwikiで配布されているようなモーションデータ(.vmd)
を使ってモデルを躍らせることは可能でしょうか。
209ポイント を手に入れた。
|
|
|
|
Name: Justy ..伝説なるハッカー(571,951ポイント)
Date: 2010/09/03(金) 03:10
No:60884
|
|
Title: Re:3Dに関する基本知識
|
|
>xファイルとは何でしょうか。
汎用的にデータ扱う為のファイルフォーマットです。
主な使われ方としては DirectX系のモデルデータなことが多いので、モデルデータだと思っていても
良いと思いますが、そうでないこともあります。
又、アニメーション(モーション)については入っていることもありますし、入っていないこともあります。
何のデータが入っているかはファイルの中を解析するか、作った人に訊くしかありません。
>DXlibで3dモデルを扱う場合、どういった拡張子の物を 使うのが一般的ですか?
まだあまり3D機能を本格的に使った作品は見たことがないので何が一般的かはわかりませんが、
公式的にはDXライブラリ独自の mv1形式を使うのを推奨している節がありますが、
あまり使われていないような気がします。
推測ですが Xファイルか mqoファイルが多いんじゃないでしょうか。
>(.vmd) を使ってモデルを躍らせることは可能でしょうか
pmd+vmdで可能なようです。
ただ読み込みルールがちょっと特殊らしいので、その辺りはマニュアルを参照して下さい。
http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_3d.html#R1N1 
103ポイント を手に入れた。
|
|
|
|
|
Name: HK ..初心者(5,955ポイント)
Date: 2010/09/03(金) 08:23
No:60896
|
|
Title: Re:3Dに関する基本知識
|
|
Justyさん
ありがとうございました。
もうひとつ質問させてください。
Irrlichtについてです。
http://irrlicht.sourceforge.net/
Dxlibの公式に、「Dxlibではプレステ2くらいの精度のゲームしか作れない」
と書いてあるのですが、一方、irrlichtのサイトの画像を見ると
プレステ2以上の綺麗なグラフィックのゲームがあるようです。
irrlichtを使ってみたいのですが、無謀でしょうか。
これを使っていく場合、何か注意する点などありますでしょうか??
128ポイント を手に入れた。
|
|
|
|
|
Name: HK ..初心者(6,060ポイント)
Date: 2010/09/03(金) 14:07
No:60904
| 解決!
|
Title: Re:3Dに関する基本知識
|
|
なるほど。
softyaさんありがとうございます。
そういえばEasy3Dは昔にHSPでかじったことがあります。
何個か、チュートリアル見ながら試しに使ってみて、
一番やりやすそうなのを使おうと思います。
ありがとうございました。
105ポイント を手に入れた。
|
|
|
|
Name: しろ ..初心者(6,762ポイント)
Date: 2010/09/01(水) 13:31
No:60759
|
|
Title: ポインタの関数での受け渡しについて
|
|
こんにちは。ポインタについてわからないところがありましたので、質問させていただきます。
int x[5]という配列があったっとして、この配列をmain関数内でfunc関数で渡すとし、func関数は次で宣言されているとします。
void func(int *z);
このとき配列の先頭へのポインタxを渡したとすると、z[0]=*z、z[1]=*(z+1)などとなりますよね。
次に同じfunc関数でxではなく、&x(すなわちxという配列全体へのポインタ)を渡すとします。このときfunc関数は次のように宣言さ
れます。
void func(int (*z)[5]);
このとき、(*z)[1]と*(z+1)は違うものだと思うのですが(なぜならzはxの配列全体を指すが、(*z)[1]は配列xの中の1番目の要素に
アクセスしている。しかし*(z+1)はそもそも配列xの外側? にアクセスしている∵zはxの配列全体をさしているので)、どうもこの
あたりのところがはっきりしません。
何を質問しているのかも微妙によくわからないところではあるのですが、このあたりについてご教授いただけますと大変助かります。
何卒よろしくお願いいたします。
ちなみにこのときのfunc関数の宣言void func(int (*z)[5])もvoid func(int (*z)[])のように書いてはいけないのでしょうか?
339ポイント を手に入れた。
|
|
|
|
Name: シエル [URL] ..熟練のプログラマー(67,314ポイント)
Date: 2010/09/01(水) 13:52
No:60760
|
|
Title: Re:ポインタの関数での受け渡しについて
|
|
>次に同じfunc関数でxではなく、&x(すなわちxという配列全体へのポインタ)を渡すとします。
>このときfunc関数は次のように宣言さ れます。
>void func(int (*z)[5]);
こんな説明どこに書いてありましたか?
70ポイント を手に入れた。
|
|
|
|
|
Name: bagu ..ぴよぴよ(359ポイント)
Date: 2010/09/01(水) 13:52
No:60761
|
|
Title: Re:ポインタの関数での受け渡しについて
|
|
>>&x(すなわちxという配列全体へのポインタ)
これはx[0]のポインタのポインタでは?
25ポイント を手に入れた。
|
|
|
|
|
Name: へろり ..プログラマー(33,193ポイント)
Date: 2010/09/01(水) 14:07
No:60762
|
|
Title: Re:ポインタの関数での受け渡しについて
|
|
>このとき、(*z)[1]と*(z+1)は違うものだと思うのですが(なぜならzはxの配列全体を指すが、(*z)[1]は配列
>の中の1番目の要素に
>アクセスしている。しかし*(z+1)はそもそも配列xの外側? にアクセスしている∵zはxの配列全体をさしてい>るので)、どうもこの
>あたりのところがはっきりしません。
(*z)[1] と *(z+1) は同じです。
zの型はint型の配列(要素数5)へのポインタです。 要するに配列へのポインタですね。
ですから、*zの型はint[5]となります。
>ちなみにこのときのfunc関数の宣言void func(int (*z)[5])もvoid func(int (*z)[])のように書いてはいけないのでしょうか?
いけません。zはあくまでも要素数5の配列へのポインタですから、要素数を省略することは許されません。
要素数が省略可能なのは配列を渡す時、その最外周の要素だけです。
追記です。
>(*z)[1] と *(z+1) は同じです。
同じな訳ないですね。
zの型はint(*)[5]なわけですから、
(*z)[1]の型はintです。
*(z+1)の型はint[5]です。
失礼いたしました。 
304ポイント を手に入れた。
|
|
|
|
|
Name: しろ ..初心者(6,932ポイント)
Date: 2010/09/01(水) 14:24
No:60763
|
|
Title: Re:ポインタの関数での受け渡しについて
|
|
>シエルさん、>baguさん
「明解C言語 実践編」という書籍にそのように記載されていました。
他の書籍を見ると、x[0]のポインタのポインタと書かれています。
>へろりさん
「明解C言語 実践編」の別のページでは、z[i]と*(z+i)は同じものとC言語で規約されていると書いてありました。
わたしも上の場合は(*z)[1]と*(z+1)は違うものだと考えました。
すでに書籍内で矛盾が発生しているわけですが……
170ポイント を手に入れた。
|
|
|
|
|
Name: へろり ..プログラマー(33,390ポイント)
Date: 2010/09/01(水) 14:28
No:60765
|
|
Title: Re:ポインタの関数での受け渡しについて
|
|
ちょっと分かりにくいので補足します。
void func(int hoge[][4])
{
...
}
main()
{
int foo[5][4];
func(foo);
}
こういう場合に省略可能です。
この時の引数 hoge[0] の型は int[4] となります。
つまり、int型の要素数4の配列の要素数5の配列である変数 foo[5][4] は、関数 func() に渡される時
int型の要素数4へのポインタに読み替えられます。
故に、関数 func() は次のように書くことも出来ます。
void func(int (*hoge)[4])
という事です。
197ポイント を手に入れた。
|
|
|
|
|
Name: へろり ..プログラマー(33,672ポイント)
Date: 2010/09/01(水) 14:30
No:60766
|
|
Title: Re:ポインタの関数での受け渡しについて
|
|
>「明解C言語 実践編」の別のページでは、z[i]と*(z+i)は同じものとC言語で規約されていると書いてあり
>ました。
>わたしも上の場合は(*z)[1]と*(z+1)は違うものだと考えました。
z[i]と*(z+i)は同じです。
(*z)[1]と*(z+1)は違います。
そして
(*z)[1] と z[i] も違います。
2倍のポイントを手に入れた! 282ポイント を手に入れた。
|
|
|
|
|
Name: MNS ..プログラマー(38,826ポイント)
Date: 2010/09/01(水) 14:31
No:60768
|
|
Title: Re:ポインタの関数での受け渡しについて
|
|
いろいろな回答があり、混乱されているかもしれませんが、
おっしゃるとおり、int x[5]; と宣言されたとき、
&xは「配列へのポインタ」を示します。
ですから、
void func(int (*z)[5]);
という書き方は正しいはずです。
ただし、&xは、「配列へのポインタ」でも、
「『5つの要素をもつ配列』へのポインタ」です。
ですから、要素数の省略はできません。
ところで、
>(*z)[1]と*(z+1)は違うものだと思うのですが
これは、同じものだとどこかに書いてあったのでしょうか?
ご指摘の通り、zは配列へのポインタであるので、
*(z+1)の型はint*になってしまい、
かつそれは、配列へのポインタであるzのアドレスの、
zのサイズ分の加算したところのアドレスを指しますから、
どうなっても(*z)[1]には相当しないはずです。
恐らく、(*z)[1]に相当するのは*(*z+1)でしょう。
2倍のポイントを手に入れた! 412ポイント を手に入れた。
|
|
|
|
|
Name: へろり ..プログラマー(33,758ポイント)
Date: 2010/09/01(水) 14:40
No:60770
|
|
Title: Re:ポインタの関数での受け渡しについて
|
|
>ご指摘の通り、zは配列へのポインタであるので、
>*(z+1)の型はint*になってしまい、
配列へのポインタですから、*演算子によりポインタ解決したら、*(z+1)の型はやっぱりint[5]ではありませんか?
追記です。
>かつそれは、配列へのポインタであるzのアドレスの、
>zのサイズ分の加算したところのアドレスを指しますから、
これはちょっと誤解を招きそうです。
正確には、(z+1) は zのアドレスからsizeof(*z)分の加算したアドレス。 ですね。 
86ポイント を手に入れた。
|
|
|
|
|
Name: シエル [URL] ..熟練のプログラマー(67,353ポイント)
Date: 2010/09/01(水) 14:50
No:60771
|
|
Title: Re:ポインタの関数での受け渡しについて
|
|
zはポインタのポインタなので、*(z+1)の型はint*ではないですかね?
でもそうだとすると、この計算はまったく関係ないメモリを参照してしまう気が。。。
よく分からなくなってきました。。。まだまだ未熟者ですね。
39ポイント を手に入れた。
|
|
|
|
|
Name: アビゲイル ..ぴよぴよ(86ポイント)
Date: 2010/09/01(水) 14:58
No:60772
|
|
Title: Re:ポインタの関数での受け渡しについて
|
|
(*z)[1] →z[0][1]
**(z+1) →z[1][0] #表現が悪かったので修正しました
void func(int (*z)[5]);
z[0]の型はint[5]だとしたら、z[1]は1int[5]分増加しますね
z[0]の型はint[]だとしたら、z[1]は1int[]分増加し・・・増加分が分かりませんね。

68ポイント を手に入れた。
|
|
|
|
|
Name: MNS ..プログラマー(38,654ポイント)
Date: 2010/09/01(水) 15:02
No:60773
|
|
Title: Re:ポインタの関数での受け渡しについて
|
|
>配列へのポインタですから、*演算子によりポインタ解決したら、
>*(z+1)の型はやっぱりint[5]ではありませんか?
そうでもないみたいなんです。
zが指すのは int (*)[5]なんですが、
では、*zの型はint [5]か、というと、これがint*なんです。
これは恐らく、式の中での配列名がその配列の先頭要素のアドレスのポインタになる、
という原則に従った結果なんでしょうが、
そういうわけで、*(z+1)の型はint*を指すみたいです。
>正確には、(z+1) は zのアドレスからsizeof(*z)分の加算したアドレス。
すいません、アドレスの計算がまだ曖昧なまま書いてしまいました。
補足ありがとうございます。
172ポイント を落としてしまった。
|
|
|
|
|
Name: へろり ..プログラマー(33,953ポイント)
Date: 2010/09/01(水) 15:02
No:60774
|
|
Title: Re:ポインタの関数での受け渡しについて
|
|
>zはポインタのポインタなので、*(z+1)の型はint*ではないですかね?
zは配列へのポインタです。 たとえば。
<pre>
void func(int (*z)[5])
{
...
}
main()
{
int x[5];
func(&x);
}
<pre>
というコードで言うと、zのアドレスと&[0]のアドレスは同じです。
配列xの先頭要素へのポインタのポインタであるとするなら、&(&x[0])となりますが、こんな事は出来ませんね。 誤解を恐れずに言うならば、配列xはスタックに確保されています。 &x[0] はスタック上のアドレスです。
では、そのポインタとなると、いったいどこのアドレスになるのでしょう。 実体を飛び越えてますね。
配列へのポインタですから、ポインタ解決したらやっぱり出てくるのは配列です。
195ポイント を手に入れた。
|
|
|
|
|
Name: しろ ..初心者(6,965ポイント)
Date: 2010/09/01(水) 15:09
No:60775
|
|
Title: Re:ポインタの関数での受け渡しについて
|
|
なかなか混乱してきました。
今仕事中ですので、帰宅次第また書き込みます。
それまでに皆様のコメントは再読させていただきます。
33ポイント を手に入れた。
|
|
|
|
|
Name: へろり ..プログラマー(34,085ポイント)
Date: 2010/09/01(水) 15:10
No:60777
|
|
Title: Re:ポインタの関数での受け渡しについて
|
|
>これは恐らく、式の中での配列名がその配列の先頭要素のアドレスのポインタになる、
>という原則に従った結果なんでしょうが、
式の中で配列名が現れた場合先頭要素へのポインタに読み替えられる規則にはいくつか例外があります。
1つに、sizeof演算子のオペランドとして現れた場合。
2つに、配列初期化時の文字列定数。
そして最後に、&アドレス演算子のオペランドとして現れた場合です。
今回のケースはこの3番目に該当すると思われますが。
132ポイント を手に入れた。
|
|
|
|
|
Name: MNS ..プログラマー(38,855ポイント)
Date: 2010/09/01(水) 15:34
No:60782
|
|
Title: Re:ポインタの関数での受け渡しについて
|
|
ふうむ、コンパイラの解釈に従うならば、
VS2010の場合ですと、*zの型はint*、同じく*(z+1)の型はint*でした。
C++の仕様がそうなのかは分かりませんが。
どうもこうも、zが配列へのポインタでありながら、
コンパイラがこれを配列として扱うかどうかなんでしょうが、
*zの型がint*と解釈された以上、
VS2010では、zはあくまで配列だという解釈なんでしょう。
(これは例外には当てはまりませんしね)
201ポイント を手に入れた。
|
|
|
|
|
Name: へろり ..プログラマー(34,026ポイント)
Date: 2010/09/01(水) 15:49
No:60786
|
|
Title: Re:ポインタの関数での受け渡しについて
|
|
ちょっと、実際に書いてみました。
環境はVisual Studio .NET 2003 です。
void func(int (*z)[5])
{
*z = NULL; //......(1)エラー
(*z)[0] = 0; //......(2)ok
z = NULL; //......(3)ok
}
main()
{
int x[5];
func(&x); //......(4)
}
*zがint*であるなら、(1)で文法エラーになる理由が分かりません。
zはあくまでも配列へのポインタで、*zは配列だと思うんですけどねぇ。
一応IDEのウォッチリストで見てみましたが、*zの型はint[4]と言ってましたし。
先の件で例外として上げたのは、(4)の部分ですね。 ここでは、先頭要素へのポインタのポインタとは読み替えられない。 と。
27ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..ハッカー(222,210ポイント)
Date: 2010/09/01(水) 15:50
No:60787
|
|
Title: Re:ポインタの関数での受け渡しについて
|
|
> VS2010の場合ですと、*zの型はint*、同じく*(z+1)の型はint*でした。
Visual Studio 2010 Professional Editionで追試してみました。
テストコードは下記のとおりです。
#include <iostream>
#include <typeinfo>
void func(int (*z)[5])
{
std::cout << typeid(*z).name() << std::endl;
std::cout << typeid(*(z+1)).name() << std::endl;
}
int main()
{
int x[5];
func(&x);
}
結果、両方とも int [5] が出力されます。
GCCでも同じ結果が得られました(文字列の形式は異なりますが、意味は同じです)。
167ポイント を手に入れた。
|
|
|
|
|
Name: MNS ..プログラマー(38,867ポイント)
Date: 2010/09/01(水) 16:12
No:60790
|
|
Title: Re:ポインタの関数での受け渡しについて
|
|
すいません、早とちりだったみたいです。
私がそう思ったのは、
int a[5] = {1,2,3,4,5};
int (*pa)[5] = &a;
int* pp = *pa;
というコードが可能だったからです。
(こういった形でしか*paの値を受け取れなかった)
でもよく考えると、
(*pa)はint[5]の配列であり、
その(*pa)自体が配列名として解釈され、
原則に従い先頭要素を指すポインタ(=int*)となった。
ということですかね。
138ポイント を落としてしまった。
|
|
|
|
|
Name: しろ ..初心者(6,864ポイント)
Date: 2010/09/02(木) 07:41
No:60852
|
|
Title: Re:ポインタの関数での受け渡しについて
|
|
すいません。返信が遅くなりました。
結局zは配列へのポインタで、*zは配列そのもののエイリアスとなるので(*z)[1]、(*z)[2]で、配列の中身にアクセスできるという解釈でよろしいでしょうか?
また*(z+1)はzのアドレスからsizeof(*z)後ろにある配列へのポインタということでしょうか(なにが入っているかはわかりませんが)。
101ポイント を落としてしまった。
|
|
|
|
|
Name: 初級者 ..中級者(9,008ポイント)
Date: 2010/09/02(木) 12:46
No:60858
|
|
Title: Re:ポインタの関数での受け渡しについて
|
|
zがポインタのとき、*zは*(z+0)とも書けますね。
これは、とりもなおさずz[0]と同じ意味ですね。
つまり、*zはその配列の先頭要素の実体そのものです。
理解できますか?
50ポイント を手に入れた。
|
|
|
|
|
Name: しろ ..初心者(6,924ポイント)
Date: 2010/09/02(木) 13:51
No:60859
|
|
Title: Re:ポインタの関数での受け渡しについて
|
|
今回zは配列全体へのポインタで(結果的にzはz[0]のアドレスと同じなんでしょうが)、そこから*zは配列の先頭要素の実体になるのではないのですか?
60ポイント を手に入れた。
|
|
|
|
|
Name: フリオ ..プログラマー(37,150ポイント)
Date: 2010/09/02(木) 14:37
No:60860
|
|
Title: Re:ポインタの関数での受け渡しについて
|
|
zは&aなので、*zはaです。
ですから、
a[i] == (*z)[i]
です。
したがって、配列の先頭要素の実体は、
(*z)[0] == *(*z) == **z
となります。
#include <stdio.h>
int main(void)
{
int a[5], i;
int (*z)[5] = &a;
for(i = 0; i < 5; ++ i) a[i] = i;
for(i = 0; i < 5; ++ i) printf("%d ", *(*z + i));
printf("\n%d\n", **z);
printf("%d\n", *z == a);
return 0;
}
195ポイント を手に入れた。
|
|
|
|
|
Name: MNS ..プログラマー(38,755ポイント)
Date: 2010/09/02(木) 15:00
No:60861
|
|
Title: Re:ポインタの関数での受け渡しについて
|
|
私のせいで、色々と誤解を招いてしまったのかも知れません。
申し訳ないです。
zは配列aへのポインタであり、zとz[0]のアドレスは同じですが、
まず、*zの型はint[5]です。つまり、*zは「配列a」自体を指します。
原則にしたがって、式の中で配列名が登場した場合、一部の例外を除いて、
それはその配列の先頭要素のアドレスを指すポインタとなります。
つまり、*zは、*zが示す配列(=配列a)の先頭要素のアドレスを指すポインタ、
&a[0]となります。("式の中でのa"とも言える)
要するに、*zは、配列aの実体であると言えますが、
式の中では、原則に従って配列の先頭要素を指すポインタとなってしまう、
ということです。
112ポイント を落としてしまった。
|
|
|
|
|
Name: へろり ..プログラマー(34,541ポイント)
Date: 2010/09/02(木) 15:20
No:60862
|
|
Title: Re:ポインタの関数での受け渡しについて
|
|
>結局zは配列へのポインタで、*zは配列そのもののエイリアスとなるので(*z)[1]、(*z)[2]で、配列の中身にア>クセスできるという解釈でよろしいでしょうか?
そう考えて問題ありません。
>また*(z+1)はzのアドレスからsizeof(*z)後ろにある配列へのポインタということでしょうか(なにが入って
>いるかはわかりませんが)。
正確には、*(z+1)はzのアドレスからsizeof(*z)後ろにある配列の先頭要素へのポインタ。 です。
>今回zは配列全体へのポインタで(結果的にzはz[0]のアドレスと同じなんでしょうが)、そこから*zは配列の
>先頭要素の実体になるのではないのですか?
ちょっと言葉遊びの重隅をつつくようで大変心苦しいのですが、先頭要素の実体と聞くと、まるでポインタの配列のような印象を受けるのは私だけでしょうか。
*z は配列の実体。 とした方が誤解が無いかと。
今回のケースは多次元配列を考えるとわかりやすいかと思います。
void func(int (*z)[5])
{
...
}
main()
{
int x[10][5];
func(x);
}
この時、*(z+5) は、x[5] であり、&x[5][0] です。
また、(*(z+1))[2] は、x[1][2]です。 この時は、添え字演算子[]は間接演算子*よりも優先順位が高いため、(*(z+1))と括弧でくくる必要があることに注意してください。
249ポイント を手に入れた。
|
|
|
|
|
Name: 初級者 ..中級者(9,050ポイント)
Date: 2010/09/02(木) 19:18
No:60869
|
|
Title: Re:ポインタの関数での受け渡しについて
|
|
はい。そういう印象を受けるのはあなただけです。
2倍のポイントを手に入れた! 42ポイント を手に入れた。
|
|
|
|
|
Name: 初級者 ..中級者(9,223ポイント)
Date: 2010/09/02(木) 22:27
No:60876
|
|
Title: Re:ポインタの関数での受け渡しについて
|
|
では、がくせいの希望に応えて、初級者らしい話をしようかな。
pがある型へのポインターであるとき、*(p+0)、つまり*pはp[0]の
シンタックスシュガーなんだよね。
ってことはだよ、*pはpが指している先頭領域の実体であるってことなの。
わかる?
pがある型へのポインターである、っていうのはね、
例えばint型へのポインターでもいいし、
int型へのポインターへのポインターでもいいってことなの。
つまり、最初に書いた「先頭領域の実体」っていうのは、
(int型のような)即値の場合だってあるし、
(int *型のような)ポインター値の場合だってあるわけ。
実体がポインター値の場合がある、という点を理解できていない人が
いるみたいだよね。誰とは言わないけど。
173ポイント を手に入れた。
|
|
|
|
|
Name: palladium ..中級者(9,985ポイント)
Date: 2010/09/03(金) 03:41
No:60885
|
|
Title: Re:ポインタの関数での受け渡しについて
|
|
>pがある型へのポインターであるとき、*(p+0)、つまり*pはp[0]の
シンタックスシュガーなんだよね。
これはvoid型でも成立するのでしょうか
64ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..ハッカー(222,301ポイント)
Date: 2010/09/03(金) 04:04
No:60886
|
|
Title: Re:ポインタの関数での受け渡しについて
|
|
> これはvoid型でも成立するのでしょうか
それをいうなら、関数型や(void以外の)不完全型でも同じことがいえます。
追記:
同じはいいすぎですね。
関数型の場合、*(p + 0) や p[0] はコンパイルできませんが、*p ならOKなので。 
34ポイント を手に入れた。
|
|
|
|
|
Name: しろ ..初心者(6,820ポイント)
Date: 2010/09/03(金) 07:01
No:60888
| 解決!
|
Title: Re:ポインタの関数での受け渡しについて
|
|
皆様のおかげでようやく飲み込めました。
やはりポインタはなにかと難しいですね。
あとはいろいろとプログラムを書いて、実践しようと思います。
皆様どうもありがとうございました。これにて解決とさせていただきます。
104ポイント を落としてしまった。
|
|
|
|
|