[ ホームページ ] [ 携帯用URL ]
ローグライク大学 ラウンジ

[ EZBBS.NET | DoChat.NET | 新規作成 | ランキング | オプション ]
iモード&Vodafone(絵文字)、au対応!ケータイからも返信できる無料掲示板!
名前
 E-mail 
題名
内容
投稿KEY    タグ有効 改行有効 等幅フォント
URL



10.核兵器の巻物実装不具合  
名前:高槻    日付:2009/9/1(火) 17:37
始めまして、高槻と申します。

長年Roguelike Gamesを楽しんでおりましたが、
梃入れを試してみたくなりこちらで公開されている核兵器の巻物を実装して見ました。

その際、make実行時に以下アラートが出てしまったのですが、
こちらは別途src修正で変数定義をした方が宜しいのでしょうか?

***********
gcc -O2 -fomit-frame-pointer -I../include -c -o read.o read.c
read.c: In function `do_nuclear':
read.c:1793: error: `mptr' が宣言されていません (この関数内で最初に利用)
read.c:1793: error: (未宣言の各変数については、それが最初に現われたそれぞれの関数
read.c:1793: error: に対して一度だけ報告されます。)
read.c:1810: error: `tmp' が宣言されていません (この関数内で最初に利用)
***********

日本語パッチ適用済nethack-3.4.3をCentOS5.1にて導入しております。
使用make:GNU Make 3.81

本来ならば自己解決すべきだとは思うのですが、編集srcを追ってみても定義されていない変数だったので、もしかしたら誤植かな?と思いこちらでお聞きさせて頂きました。

稚拙な文章で真に申し訳ありませんが、もしご存知の方、
ご助力頂ける方がおりましたらお教え頂けませんでしょうか。


該当src抜粋

/* Derived from mondead() */


if (mtmp == u.usteed)

9.樹海ダンジョンの不具合報告  
名前:井出    日付:2005/11/18(金) 23:21
井出です。

ネットハックで樹海ダンジョンですが、
gnome 版を使うと、樹海の中でも階数が表示されてしまう様です。
# これ自体は、NetHack3.4.3 自体がいけないのですが。

以下の修正で表示されなくなるはずですが、
これだけだとまだ移動時の階数の上下が判明しちゃいます。
とりあえず報告しておきます。

--- nethack-3.4.3/win/gnome/gnstatus.c.orig 2003-12-08 08:39:14.000000000 +0900
+++ nethack-3.4.3/win/gnome/gnstatus.c 2005-11-18 17:13:23.000000000 +0900
@@ -465,9 +465,7 @@
gtk_label_set( GTK_LABEL( titleLabel), buf);


- if (In_endgame(&u.uz)) {
- strcpy(buf, (Is_astralevel(&u.uz) ? "Astral Plane":"End Game"));
- } else {
+ if (!describe_level(buf)) {
sprintf(buf, "%s, level %d", dungeons[u.uz.dnum].dname, depth(&u.uz));
}
if (lastDepth > depth(&u.uz) && firstTime==FALSE) {

http://202.181.109.150/~ide/jnethack.html
auriga.ccs.tsukuba.ac.jp (130.158.109.138)
Mozilla/5.0 (X11; U; Linux i686; ja-JP; rv:1.7.12) Gecko/20050922 Firefox/1.0.7 (Debian package 1.0.7-1)

8.Re: 核兵器の巻物 for NetHack/JNetHack のバグ報告  
名前:井出    日付:2005/3/29(火) 3:43
井出です。

> >level.damagelist = (struct damage *)0;
> >でのメモリリークが直ってません。
> これはちょっと強引……ですが、解決してるのかな……?

まだ解決していないと思います。

level.damagelist.next の先も free() を呼ばないといけないと思います。


struct damage *tmp_dam, *tmp_dam2;
for (tmp_dam = level.damagelist; tmp_dam; tmp_dam = tmp_dam2) {
tmp_dam2 = tmp_dam->next;
free((genericptr_t)tmp_dam);
}
level.damagelist = (struct damage *)0;

こんな感じ?
これで十分かどうかはわかりませんが。

http://www.first.tsukuba.ac.jp/~kiyotomo/etc.html
auriga.ccs.tsukuba.ac.jp (130.158.109.138)
Mozilla/5.0 (X11; U; Linux i686; ja-JP; rv:1.7.6) Gecko/20050306 Firefox/1.0.1 (Debian package 1.0.1-2)

7.Re: 核兵器の巻物 for NetHack/JNetHack のバグ報告  
名前:偏屈学長    日付:2005/3/28(月) 3:40
またまたバグ報告、ありがとうございます。

>こっちとも関連しますが、do_nuclear() の引数に核兵器の巻物を指すポインタを渡すか、
>処理中のアイテムは otmp->in_use が TRUE に設定されているはずなので、
>どちらかを用いて do_nuclear() の削除ループ内で、核兵器の巻物だったら freeinv() も dealloc_obj() も呼び出さずに
>otmp->quan = 1; に止めて置くのはどうでしょう?
そういえば、struct objにはin_useというメンバーがあったんですね。気付きませんでした。
とりあえずdo_nuclear()はvoid型のままで、otmp->in_useがtrueのときotmp->quan = 1;で解決しました。

>level.damagelist = (struct damage *)0;
>でのメモリリークが直ってません。
これはちょっと強引……ですが、解決してるのかな……?

それからこれもやや強引にですが、部屋の属性が残る(例えば何も無いところで「店は廃墟と化している」と表示されるなど)バグを解決しました。店ならまだしも、寺院や金庫の跡地だったらどうなっていたことか……

http://guisi.hp.infoseek.co.jp/roguelikeuniv/
JJ077045.ppp.dion.ne.jp (211.4.77.45)
Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)

6.Re: 核兵器の巻物 for NetHack/JNetHack のバグ報告  
名前:井出    日付:2005/3/27(日) 1:49
井出です。

言い忘れたのですが、もう一つ直ってないバグが。

level.damagelist = (struct damage *)0;

でのメモリリークが直ってません。

http://www.first.tsukuba.ac.jp/~kiyotomo/etc.html
auriga.ccs.tsukuba.ac.jp (130.158.109.138)
Mozilla/5.0 (X11; U; Linux i686; ja-JP; rv:1.7.6) Gecko/20050306 Firefox/1.0.1 (Debian package 1.0.1-2)

5.Re: 核兵器の巻物 for NetHack/JNetHack のバグ報告  
名前:井出    日付:2005/3/27(日) 1:18
井出です。

> バグ報告、ありがとうございます。

どういたしまして。

しかし、修正版では

> ただ、ちゃんと削除したらしたで、呼び出しもとで sobj の指す先が削除されて
> 無効なポインタを参照してしまいますが。

の方が発現しています。

> >また、do_nuclear() 内で freeinv() を核兵器の巻物自体にも呼び出しているせいで、
> >オリジナルのままだと mkobj.c の extract_nobj() でエラーが起こるようです。
> これは、そうなんですよね。
> このために暫定的にextract_nobj()のほうを(強引に)書き換えているんですけれど、何かいい方法は無いものか……

こっちとも関連しますが、do_nuclear() の引数に核兵器の巻物を指すポインタを渡すか、
処理中のアイテムは otmp->in_use が TRUE に設定されているはずなので、
どちらかを用いて do_nuclear() の削除ループ内で、核兵器の巻物だったら freeinv() も dealloc_obj() も呼び出さずに
otmp->quan = 1; に止めて置くのはどうでしょう?

# otmp->quan = 1; にするのは複数持っていた場合の対策。残りの1枚は呼び出し元で削除されるはず。

http://www.first.tsukuba.ac.jp/~kiyotomo/etc.html
auriga.ccs.tsukuba.ac.jp (130.158.109.138)
Mozilla/5.0 (X11; U; Linux i686; ja-JP; rv:1.7.6) Gecko/20050306 Firefox/1.0.1 (Debian package 1.0.1-2)

4.Re: 核兵器の巻物 for NetHack/JNetHack のバグ報告  
名前:偏屈学長    日付:2005/3/26(土) 20:34
井出さん、はじめまして。
バグ報告、ありがとうございます。

>メモリリーク
うわ、難しい問題だ……
初版を書いた当時私はC言語初心者だったので気付きませんでした。
別の関数を使って回避してみましたが、どうでしょうか。

>また、do_nuclear() 内で freeinv() を核兵器の巻物自体にも呼び出しているせいで、
>オリジナルのままだと mkobj.c の extract_nobj() でエラーが起こるようです。
これは、そうなんですよね。
このために暫定的にextract_nobj()のほうを(強引に)書き換えているんですけれど、何かいい方法は無いものか……

>モンスターの撃破カウントには影響がない
これは……「敵のlifesaveを無視して撃破する」ことができないようなので、とりあえず仮にmongone()を使っています。ゆえにまだこのバグは直っていませんが、いずれ直します。直そうと思えば比較的簡単にできるので。

>魔法のマーカで核兵器の巻物を書けない
すっかり忘れていました。魔法のマーカの存在自体を。
とりあえず、インクの消費量を虐殺の巻物と同じ30にしてみましたが、いかがでしょうか。

http://guisi.hp.infoseek.co.jp/roguelikeuniv/
JJ077045.ppp.dion.ne.jp (211.4.77.45)
Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)

3.核兵器の巻物 for NetHack/JNetHack のバグ報告  
名前:井出    日付:2005/3/24(木) 23:43
はじめまして、井出と申します。

核兵器の巻物 for NetHack/JNetHack のバグを見つけたので報告します。

ここで実装している do_nuclear() 関数ですが、派手にメモリリークを起こして
いると思います。

freeinv() 関数自体は、インベントリのリンクリストからアイテムを外しているだけで、
実体は削除されていないはずです。
ただ、ちゃんと削除したらしたで、呼び出しもとで sobj の指す先が削除されて
無効なポインタを参照してしまいますが。

また、do_nuclear() 内で freeinv() を核兵器の巻物自体にも呼び出しているせいで、
オリジナルのままだと mkobj.c の extract_nobj() でエラーが起こるようです。

さらに、
level.objlist = (struct obj *)0;
level.buriedobjlist = (struct obj *)0;
level.monlist = (struct monst *)0;
level.damagelist = (struct damage *)0;
の部分もメモリリークしていると思います。

また、この実装だとモンスターの撃破カウントには影響がない、魔法のマーカで
核兵器の巻物を書けないなども問題かもしれません。

http://www.first.tsukuba.ac.jp/~kiyotomo/etc.html
auriga.ccs.tsukuba.ac.jp (130.158.109.138)
Mozilla/5.0 (X11; U; Linux i686; ja-JP; rv:1.7.6) Gecko/20050306 Firefox/1.0.1 (Debian package 1.0.1-2)

2.いきなりですが  
名前:偏屈学長    日付:2005/2/6(日) 1:26
キリ番1888、自爆しました……
http://guisi.hp.infoseek.co.jp/roguelikeuniv/
U137167.ppp.dion.ne.jp (218.222.137.167)
Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)

1.ラウンジ再開  
名前:偏屈学長    日付:2005/2/5(土) 20:56
「私立ローグライク大学」のリニューアルに伴い、ラウンジを再開してみました。
ローグライクに関係するものなら何でも、お気軽に書き込みをお願いします。

http://guisi.hp.infoseek.co.jp/roguelikeuniv/
U137167.ppp.dion.ne.jp (218.222.137.167)
Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)


ページ: 1 

無料アクセス解析

アクセス解析の決定版!無料レンタルで最大100ページ解析!

   投稿KEY
   パスワード

EZBBS.NET produced by InsideWeb