Pythonのファイルのバイト単位でのランダムアクセスについて
Pythonのファイルのバイト単位でのランダムアクセスについて
今、Pythonを使って、MapEditor Quoyle ver0.8のヘルプを参考に、Quolyeで作ったマップデータのローダーを作っているのですが
Pythonのランダムアクセスについて調べていると、
https://docs.python.jp/3/library/linecache.html
テキストライン関係のものしか出ません。
どうやってバイト単位でのランダムアクセスを行うのですか?
Pythonのランダムアクセスについて調べていると、
https://docs.python.jp/3/library/linecache.html
テキストライン関係のものしか出ません。
どうやってバイト単位でのランダムアクセスを行うのですか?
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
Pythonのreadをよく読めばいいだけのことでした。
お付き合い頂きありがとうございました。
お付き合い頂きありがとうございました。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
でも、Pythonのread機能で、どうやってバイナリデータのランダムアクセスとバイト数だけ読み込みを実現させるのかがわからない…。
すいません解決はなかったことにしてください。
すいません解決はなかったことにしてください。
最後に編集したユーザー keito94 on 2017年7月29日(土) 13:24 [ 編集 1 回目 ]
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
とりあえずソースコード。
# 細かいデータはQuolyeのヘルプを見てください。
def Map_Load(filename):
fn = open(filename,'rb')
# Widthのビッグ、リトルエンディアン。
W_B = int(fn.read(0))
W_L = int(fn.read(1))
# マップの幅。
MAP_W = W_L | (W_B << 8)
# Heightのビッグ、リトルエンディアン。
H_B = int(fn.read(2))
H_L = int(fn.read(3))
# マップの高さ。
MAP_H = H_L | (H_B << 8)
CW_B = int(fn.read(4))
CW_L = int(fn.read(5))
CHIP_W = CW_L | (CW_B << 8)
CH_B = int(fn.read(6))
CH_L = int(fn.read(7))
CHIP_H = CH_L | (CH_B << 8)
LAYER_C = int(fn.read(8))
CHIP_COUNT = int(fn.read(9))
if CHIP_COUNT != 0:
# マップチップは16ビット、2バイト。
chipbyte = 2
bit = 65536
else:
# マップチップは8ビット、1バイト。
chipbyte = 1
bit = 256
for z in range(LAYER_C):
for y in range(CHIP_H):
for x in range(CHIP_W):
# マップデータの書き込み。
pass
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
- Hiragi(GKUTH)
- 記事: 167
- 登録日時: 13年前
- 住所: 大阪府
- 連絡を取る:
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
ファイル自体をランダムアクセスしようとするのではなく、ファイルを読み込んでメモリ上に展開してからのほうが扱いやすいのではないですか?
全く的外れでした。申し訳ありません。
そもそもなぜランダムアクセスが必要となったのですか?
全く的外れでした。申し訳ありません。
そもそもなぜランダムアクセスが必要となったのですか?
だいがくせい!
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
エンディアンの言葉の使い方が間違っています。リトル・ビッグエンディアンではなく、下位・上位バイトと呼ぶのが適切かと思います。
それ以外の用語も、もしかしたら間違って使っているのではないですか?
ランダムアクセスとバイト数だけ読み込みとは、具体的にどのような動作を指すのでしょうか?
それ以外の用語も、もしかしたら間違って使っているのではないですか?
ランダムアクセスとバイト数だけ読み込みとは、具体的にどのような動作を指すのでしょうか?
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
ごめんなさい、訂正しておきますね…。shira211 さんが書きました:エンディアンの言葉の使い方が間違っています。リトル・ビッグエンディアンではなく、下位・上位バイトと呼ぶのが適切かと思います。
ランダムアクセスはread()関数を使えばできるということはわかりました。それ以外の用語も、もしかしたら間違って使っているのではないですか?
ランダムアクセスとバイト数だけ読み込みとは、具体的にどのような動作を指すのでしょうか?
ですが、
①ランダムアクセスは簡単にできた。
②でも、(Pythonにおける)1バイト単位のアクセスのやり方がわからない
これくらいでしょうか…。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
- Hiragi(GKUTH)
- 記事: 167
- 登録日時: 13年前
- 住所: 大阪府
- 連絡を取る:
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
>>②でも、(Pythonにおける)1バイト単位のアクセスのやり方がわからない
read関数の第一引数は読み込むバイト数ですので、readの第一引数に1を渡してやればいいかと思います。(提示されたソースでは使い方を間違っている?)
それとkeito94さんが想像しているランダムアクセスは私の考えるランダムアクセスとは違うかもしれません。少なくともread関数ではランダムアクセスは出来ず、
seek関数を使用する必要があると思います。
read関数の第一引数は読み込むバイト数ですので、readの第一引数に1を渡してやればいいかと思います。(提示されたソースでは使い方を間違っている?)
それとkeito94さんが想像しているランダムアクセスは私の考えるランダムアクセスとは違うかもしれません。少なくともread関数ではランダムアクセスは出来ず、
seek関数を使用する必要があると思います。
だいがくせい!
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
わかりました!!seek関数を使えばいいんですね!!Hiragi(GKUTH) さんが書きました: seek関数を使用する必要があると思います。
ありがとうございました!!
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
しまった解決押し忘れた(><)
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
最終的にseek関数を使ったソースが出来上がったらそれを解決の証として貼り付けておいてください。keito94 さんが書きました:わかりました!!seek関数を使えばいいんですね!!Hiragi(GKUTH) さんが書きました: seek関数を使用する必要があると思います。
ありがとうございました!!
Advanced Supporting Developer
無理やりこじつけ(ぉ
無理やりこじつけ(ぉ
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
# 細かいデータはQuolyeのヘルプを見てください。
class Map:
def __init__(self,filename):
self.fn = open(filename, 'rb')
# マップの幅を獲得。
W_B = int(self.fn.read(1))
self.fn.seek(1)
W_L = int(self.fn.read(1))
self.MAP_W = W_L | (W_B << 8)
# マップの高さを獲得。
self.fn.seek(1)
H_B = int(self.fn.read(1))
self.fn.seek(1)
H_L = int(self.fn.read(1))
self.MAP_H = H_L | (H_B << 8)
# マップチップの幅を獲得。
self.fn.seek(1)
CW_B = int(self.fn.read(1))
self.fn.seek(1)
CW_L = int(self.fn.read(1))
self.CHIP_W = CW_L | (CW_B << 8)
# マップチップの高さを獲得。
self.fn.seek(1)
CH_B = int(self.fn.read(1))
self.fn.seek(1)
CH_L = int(self.fn.read(1))
self.CHIP_H = CH_L | (CH_B << 8)
self.fn.seek(1)
self.LAYER_C = int(self.fn.read(1))
self.fn.seek(1)
self.CHIP_COUNT = int(self.fn.read(1))
if self.CHIP_COUNT != 0:
# マップチップは16ビット、2バイト。
self.chipbyte = 2
self.bit = 256
else:
# マップチップは8ビット、1バイト。
self.chipbyte = 1
self.bit = 16
self.fn.seek(5)
self.movebyte = 0
オフトピック
沖さんの日記のASDさんのコメント読みました…。
これから態度を改められる訓練をしなければ…。
これから態度を改められる訓練をしなければ…。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
さっき書いたコードは効率がかなり悪いことに気づいて、load関数というものを作りました。
すると、どうでしょう!!
コードがかなりすっきりしました。
今度こそありがとうございました。
# ファイルから一文字読み出す。nは読み込むファイルのオフセット。
def load(self,n):
self.fn.seek(n)
self.fn.read(1)
self.fn.seek(-n)
class Map:
# マップを開いてヘッダ情報を読み込む。引数:filename(ファイルのパス。)
def __init__(self,filename):
self.fn = open(filename, 'rb')
# マップの幅を獲得。
W_B = int(self.load(0))
W_L = int(self.load(1))
self.MAP_W = W_L | (W_B << 8)
# マップの高さを獲得。
H_B = int(self.load(2))
H_L = int(self.load(3))
self.MAP_H = H_L | (H_B << 8)
# マップチップの幅を獲得。
CW_B = int(self.load(4))
CW_L = int(self.load(5))
self.CHIP_W = CW_L | (CW_B << 8)
CH_B = int(self.load(6))
CH_L = int(self.load(7))
self.CHIP_H = CH_L | (CH_B << 8)
self.LAYER_C = int(self.load(8))
self.CHIP_COUNT = int(self.load(9))
if self.CHIP_COUNT != 0:
self.bysize = 2
else:
self.bysize = 1
今度こそありがとうございました。
オフトピック
今回の教訓。最後まで確認してから解決させるべし。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
解決したソースの投稿ありがとうございました。
解決したのであれば解決!にチェックを入れておいてください。
第三者からみて意味が分からなくなりますので。
解決したのであれば解決!にチェックを入れておいてください。
オフトピックにツッコミいれるのもなんですが、このトピック外の話を混ぜるのやめませんか?keito94 さんが書きました:オフトピック沖さんの日記のASDさんのコメント読みました…。
これから態度を改められる訓練をしなければ…。
第三者からみて意味が分からなくなりますので。
Advanced Supporting Developer
無理やりこじつけ(ぉ
無理やりこじつけ(ぉ
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
オフトピック
ファイルの先頭から10バイトは順番に読み込むだけだし
structモジュールとかいうのを使うと複数バイトデータの変換が楽にできるらしい。
こんな感じ?(未検証)
ここからreadShortとかreadByteとかの関数作って置き換える流れが順当。
structモジュールとかいうのを使うと複数バイトデータの変換が楽にできるらしい。
こんな感じ?(未検証)
from struct import *
class Map:
# マップを開いてヘッダ情報を読み込む。引数:filename(ファイルのパス。)
def __init__(self,filename):
self.fn = open(filename, 'rb')
# マップの幅を獲得。
self.MAP_W = unpack('>h', self.fn.read(2))[0] # '>' : bigendian 'h' : signed short (2bytes)
# マップの高さを獲得。
self.MAP_H = unpack('>h', self.fn.read(2))[0]
# マップチップの幅を獲得。
self.CHIP_W = unpack('>h', self.fn.read(2))[0]
# マップチップの高さを獲得。
self.CHIP_H = unpack('>h', self.fn.read(2))[0]
self.LAYER_C = unpack('b', self.fn.read(1))[0] # 'b' : signed byte
self.CHIP_COUNT = unpack('b', self.fn.read(1))[0]
#以下略
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
とりあえず返信しますが動作確認しましたか?
・load関数は値を返していない
・self.fn.seek関数は第2引数を省略しているため、nは 0もしくは正の値でなければならない(第2引数にos.SEEK_SET(デフォルト)を指定した場合と同様)
他にも問題だらけなのでドキュメント確認しましょうね。以前のトピで出たprint文デバッグでも良いでしょう。
これ以上、他の問題点について私は答えるつもりはありませんのでデバッグをしてくださいね
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
readShortとreadByteがネイティブコード(C言語)で書かれた変数をPythonの整数に変換するというのはわかるのですが…。ISLe さんが書きました: ここからreadShortとかreadByteとかの関数作って置き換える流れが順当。
それのヒントらしきものはありますか?
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
オフトピックにだけ反応してload関数対応版について、沖さん指摘の動作確認をしたかどうかはスルーですか?keito94 さんが書きました:readShortとreadByteがネイティブコード(C言語)で書かれた変数をPythonの整数に変換するというのはわかるのですが…。ISLe さんが書きました: ここからreadShortとかreadByteとかの関数作って置き換える流れが順当。
それのヒントらしきものはありますか?
動くかどうかわからないソースを載せて解決とされると、同じような問題で困っている人が参照した際に困ってしまいます。
Advanced Supporting Developer
無理やりこじつけ(ぉ
無理やりこじつけ(ぉ
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
structモジュールって書いてあるのだからドキュメントを読んではいかがですか?keito94 さんが書きました:ISLe さんが書きました:
ここからreadShortとかreadByteとかの関数作って置き換える流れが順当。
readShortとreadByteがネイティブコード(C言語)で書かれた変数をPythonの整数に変換するというのはわかるのですが…。
それのヒントらしきものはありますか?
Python 3.6.1 ドキュメント
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
2バイトのやつはリトルエンディアンですよ。(output_d.htmlを読めばわかりますが…。)
さてさて、readShortと、readByteを完成させました。
ですが、以下のようなエラーが出ました。
ボクとしては惜しい所まで来たのですが…。
quoyletestフォルダにテストプログラムがあります。(Pygameが必要です。)
見えにくいですが、pygameのウィンドウにHELLOと表示されれば成功です。
あと、output_d.htmlには、使用しているマップファイルのデータが入っています。
ドキュメントはよく読んだのですが、
さてさて、readShortと、readByteを完成させました。
def readShort(self,val):
return unpack('<h',val)[0]
def readByte(self,val):
return unpack('b',val)[0]
ボクとしては惜しい所まで来たのですが…。
マップの幅を獲得します。
マップの高さを獲得します。
マップチップの幅を獲得します。
マップチップの高さを獲得します。
レイヤーの数を獲得します。
チップカウントを獲得します。
マップチップの位置を読み取ります。
Traceback (most recent call last):
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
File "C:/Users/keito940/PycharmProjects/quoyletest/test.py", line 53, in <module>
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
main()
File "C:/Users/keito940/PycharmProjects/quoyletest/test.py", line 41, in main
map_data = map.data_load()
File "C:\Users\keito940\PycharmProjects\quoyletest\quoyle\map.py", line 72, in data_load
map_data[i][j] = self.get_pos(1, j, i)
IndexError: list assignment index out of range
Process finished with exit code 1
見えにくいですが、pygameのウィンドウにHELLOと表示されれば成功です。
あと、output_d.htmlには、使用しているマップファイルのデータが入っています。
ドキュメントはよく読んだのですが、
オフトピック
自分の脳内だけで補完せず、やりたいことを他人に伝える。
それが傲慢な態度、卒業の鍵。
それが傲慢な態度、卒業の鍵。
- 添付ファイル
-
- output_d.zip
- (2.34 KiB) ダウンロード数: 359 回
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
添付されているoutput_d.htmってマップエディタQuoyleに附属しているヘルプファイルの一部じゃないですか?
それを勝手に転載するのはよくないのではと思います。
いろいろツッコミを入れたいところですがどうせスルーされちゃうと思うので1点のみに絞って指摘しておきます。
・エラーメッセージが何を意味しているか調べましたか?
・発生している場所がどこかは分かりますか?
・printデバッグで各パラメータを調べましたか?
もし自分でデバッグにあたりやったことがあればやったことを書いておくとよいですよ。
それを勝手に転載するのはよくないのではと思います。
いろいろツッコミを入れたいところですがどうせスルーされちゃうと思うので1点のみに絞って指摘しておきます。
エラーが出たからだれかデバッグしてー、直し方教えてーではデバッグにはなりませんよ。keito94 さんが書きました: ですが、以下のようなエラーが出ました。
ボクとしては惜しい所まで来たのですが…。マップの幅を獲得します。 マップの高さを獲得します。 マップチップの幅を獲得します。 マップチップの高さを獲得します。 レイヤーの数を獲得します。 チップカウントを獲得します。 マップチップの位置を読み取ります。 Traceback (most recent call last): マップチップの位置を読み取ります。 マップチップの位置を読み取ります。 File "C:/Users/keito940/PycharmProjects/quoyletest/test.py", line 53, in <module> マップチップの位置を読み取ります。 マップチップの位置を読み取ります。 マップチップの位置を読み取ります。 マップチップの位置を読み取ります。 マップチップの位置を読み取ります。 マップチップの位置を読み取ります。 マップチップの位置を読み取ります。 マップチップの位置を読み取ります。 マップチップの位置を読み取ります。 マップチップの位置を読み取ります。 マップチップの位置を読み取ります。 マップチップの位置を読み取ります。 マップチップの位置を読み取ります。 マップチップの位置を読み取ります。 main() File "C:/Users/keito940/PycharmProjects/quoyletest/test.py", line 41, in main map_data = map.data_load() File "C:\Users\keito940\PycharmProjects\quoyletest\quoyle\map.py", line 72, in data_load map_data[i][j] = self.get_pos(1, j, i) IndexError: list assignment index out of range Process finished with exit code 1
・エラーメッセージが何を意味しているか調べましたか?
・発生している場所がどこかは分かりますか?
・printデバッグで各パラメータを調べましたか?
もし自分でデバッグにあたりやったことがあればやったことを書いておくとよいですよ。
Advanced Supporting Developer
無理やりこじつけ(ぉ
無理やりこじつけ(ぉ
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
エラー報告は内容を自分で調べて自分でデバッグしてください
readShortとreadByteを作りましたとありますがこれだけで動いてないですよね?
使用箇所に問題があると思いますが、他の変更コードはどうなっているのですか?
あと、前回のload関数が値を返していない件に関しても返答がありませんね
他はasdさんが指摘されている通りなので省略します。
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
load関数はソースコードを見ればわかるように都合により廃止されました。沖 滉均 さんが書きました: あと、前回のload関数が値を返していない件に関しても返答がありませんね
というか、structを使う方針に変更しました。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
ソースコードを見ればわかるように?
どこにそのようなソースコードがあるのですか?
どこにそのようなソースコードがあるのですか?
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
オフトピック
keito94さんの提示したコードでビッグエンディアンとして処理しているのをそのまま書き換えたのですよ。keito94 さんが書きました:2バイトのやつはリトルエンディアンですよ。(output_d.htmlを読めばわかりますが…。)
反省したと言いながらあいかわらずトピを読み返さないので自分の書いたコードに原因があることに気付かないのでしょうかね。
あるいは、わたしを貶めようと目論んでいるのでしょうか。
必要最低限の書き換えで済ましているのは、このような状況でもある意味keito94さんを信用してのことですが、そのような悪意を突き付けられるとは。
自分を棚に上げて他人に間違いを直させる姿勢にさらに磨きがかかってますね。
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
output_d.zipのquoyletestの中に入ってると思うのですが…。沖 滉均 さんが書きました:ソースコードを見ればわかるように?
どこにそのようなソースコードがあるのですか?
ちょっと不適切な名前だったので添付するファイルを修正しますね。(ソースコードは少し変えてます。)
今回のデバッグでわかったこと。
①レイヤーのアドレスの位置は(layer-1)で表す。
②流石にまずいと思い、load関数と、readByteを組み合わせた関数を作った。
③しかし、今のコードではnindexが適切な値を返さず、 エラーを返す。
この場合どうすればいいのでしょうか?
- 添付ファイル
-
- quoyletest.zip
- (24.56 KiB) ダウンロード数: 344 回
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
新しい添付ファイルはまだ確認してませんが、ひとつ言っておきます。
output_d.zipの中身確認してみましたか?quoyletestなんてフォルダは入っていませんよ。
output_d.zipの中身確認してみましたか?quoyletestなんてフォルダは入っていませんよ。
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
ごめんなさい、ファイルの中身をよく確認すべきでした…。沖 滉均 さんが書きました: output_d.zipの中身確認してみましたか?quoyletestなんてフォルダは入っていませんよ。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
添付しているファイルはあなたの現在確認しているコードですか?
違いますよね
nindexが正しい値を返さない以前にエラーが発生するはずですけどもね。
使用方法の誤りが色々ありますし、あなたがスルーしていた下記の件も直っていませんし(load関数そのものではなくても使い方の誤りを指摘していますよ)
http://dixq.net/forum/viewtopic.php?f=3&t=19442#p147088
そもそも、なぜ複数の人から指摘・回答があっても1人にしか返信をしないんでしょう?
デバッグのやり方ややることについても前のトピで返信ついていますよね
このトピでも返信ついてますよね
何度このやり取りを繰り返せば良いんでしょうか?
違いますよね
nindexが正しい値を返さない以前にエラーが発生するはずですけどもね。
使用方法の誤りが色々ありますし、あなたがスルーしていた下記の件も直っていませんし(load関数そのものではなくても使い方の誤りを指摘していますよ)
http://dixq.net/forum/viewtopic.php?f=3&t=19442#p147088
そもそも、なぜ複数の人から指摘・回答があっても1人にしか返信をしないんでしょう?
デバッグのやり方ややることについても前のトピで返信ついていますよね
このトピでも返信ついてますよね
何度このやり取りを繰り返せば良いんでしょうか?
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
ごめんなさい…。勝手な転載等はしないよう心がけます…。asd さんが書きました:添付されているoutput_d.htmってマップエディタQuoyleに附属しているヘルプファイルの一部じゃないですか?
それを勝手に転載するのはよくないのではと思います。
分かりました、書きますね。いろいろツッコミを入れたいところですがどうせスルーされちゃうと思うので1点のみに絞って指摘しておきます。
エラーが出たからだれかデバッグしてー、直し方教えてーではデバッグにはなりませんよ。
・エラーメッセージが何を意味しているか調べましたか?
・発生している場所がどこかは分かりますか?
・printデバッグで各パラメータを調べましたか?
もし自分でデバッグにあたりやったことがあればやったことを書いておくとよいですよ。
def load(self,val,byte = 1):
self.fn.seek(val)
data = self.fn.read(byte)
# ここでエラーが出る。
self.fn.seek(-val)
return data
なんとかself.fn.seek(-val)を取り除きました。
あと、get_layerに違和感があることに気づき、
def get_layer(self, index):
print("レイヤーを読み取ります。")
# メモリと範囲をチェック
if self.LAYER_C > index:
return None
return 16 + self.MAP_W * self.MAP_H * self.bysize * (index-1)
File "C:/Users/keito940/PycharmProjects/quoyletest/test.py", line 53, in <module>
main()
File "C:/Users/keito940/PycharmProjects/quoyletest/test.py", line 41, in main
map_data = map.data_load()
File "C:/Users/keito940/PycharmProjects/quoyletest\quoyle\map.py", line 80, in data_load
map_data[i].append(self.get_pos(1, j, i))
IndexError: list index out of range
解決方法は、新たに二列目の配列を作る必要がある模様です。
def data_load(self):
map_data = [[]]
# 開始時の位置を決める。
for i in range(self.MAP_H):
for j in range(self.MAP_W):
if i < 0 and j == 0:
map_data.append([self.get_pos(1, j, i)])
else:
map_data[i].append(self.get_pos(1, j, i))
return map_data
どうやって、二列目の配列を生成されるのでしょうか?
- 添付ファイル
-
- quoyletest.zip
- (22.41 KiB) ダウンロード数: 380 回
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
複数の指摘を書くと1か所にしか反応されなさそうで不安ではありますが、
keito94さんの決心を信じて指摘します。
そうであればここは特に触れずに行きますね。
http://dixq.net/forum/viewtopic.php?f=3&t=19442#p147101
本題とはあまり関係ないものの、ここも直してみたという説明でしょうか?
違和感があることに気づき…どうしたのかはわかりませんが何かしら奮闘されたと理解しておきます。
ようやく本題に戻ってきて安心しました。
・「二列目の配列が生成されず…」ということは一列目はきちんと配列が生成されているということでしょうか?
→実際に一列目だけ読み込まれたことはどうやって確認したのでしょうか?
・上記コードのif文の条件式 i < 0 and j ==0ですがこれは何を期待しての条件式でしょうか?
→どういう場合にTrueになるつもりで書いていますかを教えてください
・例えばマップチップデータ側が横幅5マス、縦幅2マスだったとして以下のようなデータを読み取った場合、
生成されることを期待するmap_dataは以下で正しいでしょうか?
マップデータ(5*2マス):0123456789
期待するmap_data:[ [0,1,2,3,4] , [5,6,7,8,9] ]
keito94さんの決心を信じて指摘します。
えーと、load関数は廃止されたと以下のレスで書いてありましたが、廃止前にやったことの説明でしょうか?
そうであればここは特に触れずに行きますね。
http://dixq.net/forum/viewtopic.php?f=3&t=19442#p147101
get_layerについては今初めて本文中に登場した気がしますが、keito94 さんが書きました: あと、get_layerに違和感があることに気づき、
本題とはあまり関係ないものの、ここも直してみたという説明でしょうか?
違和感があることに気づき…どうしたのかはわかりませんが何かしら奮闘されたと理解しておきます。
というかこちらが本題ですよね?keito94 さんが書きました: そして、頭を悩ませた以下のエラーの原因もわかりました。マップデータを表す配列が一列しかない上に、存在しない二列目に書き込もうとして以上のエラーが発生している模様です。File "C:/Users/keito940/PycharmProjects/quoyletest/test.py", line 53, in <module> main() File "C:/Users/keito940/PycharmProjects/quoyletest/test.py", line 41, in main map_data = map.data_load() File "C:/Users/keito940/PycharmProjects/quoyletest\quoyle\map.py", line 80, in data_load map_data[i].append(self.get_pos(1, j, i)) IndexError: list index out of range
解決方法は、新たに二列目の配列を作る必要がある模様です。
ようやく本題に戻ってきて安心しました。
その質問に答える前に原因と対応方針が正しいかを確認させてもらうため、いくつか質問しますね。keito94 さんが書きました:ですが、二列目の配列が生成されず、無効な配列を参照しているというエラーが出てしまいます。def data_load(self): map_data = [[]] # 開始時の位置を決める。 for i in range(self.MAP_H): for j in range(self.MAP_W): if i < 0 and j == 0: map_data.append([self.get_pos(1, j, i)]) else: map_data[i].append(self.get_pos(1, j, i)) return map_data
どうやって、二列目の配列を生成されるのでしょうか?
・「二列目の配列が生成されず…」ということは一列目はきちんと配列が生成されているということでしょうか?
→実際に一列目だけ読み込まれたことはどうやって確認したのでしょうか?
・上記コードのif文の条件式 i < 0 and j ==0ですがこれは何を期待しての条件式でしょうか?
→どういう場合にTrueになるつもりで書いていますかを教えてください
・例えばマップチップデータ側が横幅5マス、縦幅2マスだったとして以下のようなデータを読み取った場合、
生成されることを期待するmap_dataは以下で正しいでしょうか?
マップデータ(5*2マス):0123456789
期待するmap_data:[ [0,1,2,3,4] , [5,6,7,8,9] ]
Advanced Supporting Developer
無理やりこじつけ(ぉ
無理やりこじつけ(ぉ
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
いろいろいじってたらこんな出力が得られましたけど、これが今回の目標でいいんですよね?
オフトピック
MAPファイルはQuoyleで開けない、QMPファイルは画像ファイルへの絶対パスが含まれてUPするのを躊躇う・・・
相対パスで指定出来たら便利そうですけどね
相対パスで指定出来たら便利そうですけどね
- 添付ファイル
-
- Quoyle.png (20.77 KiB) 閲覧数: 41409 回
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
正確にはソースコードを廃止前に戻して、asd さんが書きました: えーと、load関数は廃止されたと以下のレスで書いてありましたが、廃止前にやったことの説明でしょうか?
廃止前のエラーを修正したという感じですね。
はい。その通りです。get_layerについては今初めて本文中に登場した気がしますが、
本題とはあまり関係ないものの、ここも直してみたという説明でしょうか?
違和感があることに気づき…どうしたのかはわかりませんが何かしら奮闘されたと理解しておきます。
違和感に気づく前のコードは、以下のとおりです。
ファイルのアドレスは0から始まるとばかり思っていたのですが、
1から始まることに気づいて修正しました。
def get_layer(self, index):
print("レイヤーを読み取ります。")
# メモリと範囲をチェック
if self.LAYER_C > index:
return None
return 15 + self.MAP_W * self.MAP_H * self.bysize * (index-1)
はい。・「二列目の配列が生成されず…」ということは一列目はきちんと配列が生成されているということでしょうか?
Pycharmについているブレークポイントによるデバッグ機能で、調べました。実際に一列目だけ読み込まれたことはどうやって確認したのでしょうか?
添付している画像を見てください。
ちなみに画像は1列目の7行目まで来たところです。
これは、参照するマップが新しい列に来たときに、新しく配列を生成することを期待しての条件式です。・上記コードのif文の条件式 i < 0 and j ==0ですがこれは何を期待しての条件式でしょうか?
→どういう場合にTrueになるつもりで書いていますかを教えてください
すでに生成されている最初の列でない、なおかつ新しく読み込まれる列のときにTrueになります。
はい。その通りです。・例えばマップチップデータ側が横幅5マス、縦幅2マスだったとして以下のようなデータを読み取った場合、
生成されることを期待するmap_dataは以下で正しいでしょうか?
マップデータ(5*2マス):0123456789
期待するmap_data:[ [0,1,2,3,4] , [5,6,7,8,9] ]
そうです!!それです!!shira211 さんが書きました: いろいろいじってたらこんな出力が得られましたけど、これが今回の目標でいいんですよね?
この一件が解決したらGithubにも上げておきますね!!
だったら、HSPDecoで、Quoyleを逆コンパイルして、mapファイルを読み込めるようにしてはいかがでしょうか?MAPファイルはQuoyleで開けない、QMPファイルは画像ファイルへの絶対パスが含まれてUPするのを躊躇う・・・
相対パスで指定出来たら便利そうですけどね
調べてみたところ、HSP製のソフトらしいので。Elona(HSP製なことで有名なゲームです。)の解析にも、使われているソフトですよ。
オフトピック
self.fn.write()とstruct.pack()で、マップファイルの書き込みが実現できるらしいけど、
エラーが出てしまうかもしれない不安があったので却下した(><)
誰か、マップファイルの書き込み機能作って…。
(と言うか、読み込むので精一杯…。)
エラーが出てしまうかもしれない不安があったので却下した(><)
誰か、マップファイルの書き込み機能作って…。
(と言うか、読み込むので精一杯…。)
- 添付ファイル
-
- Pycharmのスクショ.png (34.12 KiB) 閲覧数: 41365 回
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
ようやく返信がついたようなのでひとつずつ進めていきましょうか
この部分だけを抜き出して動かしてみるとあなたが期待していない動作をしていることがわかるはずです。
何度言ってもデバッグのやり方がわからないようなので今回は単純な確認用のコードを提示しましょう
マップは例として5x5で設定しています。
いかがですか?あなたの期待通りの動作になっていますか?
さて、この続きはあなたがどう考えるか次第です。
本当でしょうか?keito94 さんが書きました:これは、参照するマップが新しい列に来たときに、新しく配列を生成することを期待しての条件式です。asd さんが書きました:・上記コードのif文の条件式 i < 0 and j ==0ですがこれは何を期待しての条件式でしょうか?
→どういう場合にTrueになるつもりで書いていますかを教えてください
すでに生成されている最初の列でない、なおかつ新しく読み込まれる列のときにTrueになります。
この部分だけを抜き出して動かしてみるとあなたが期待していない動作をしていることがわかるはずです。
何度言ってもデバッグのやり方がわからないようなので今回は単純な確認用のコードを提示しましょう
マップは例として5x5で設定しています。
► スポイラーを表示
さて、この続きはあなたがどう考えるか次第です。
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
本題は沖さんが回答している通りなので、私はそれ以外を主としてレスします。
(私のレスだけに反応して本題がおろそかにならないよう注意!)
書かれていないことは分からないので、私のように「廃止前の説明かな?」と誤解を招いてしまいます。
であれば、何を直したのかを今回のように明示してもらえると助かります。
修正後のソースだけをはるのであれば「○○を△△に直しました」のように説明を付与してもらわないと
何を直したのか分からないままになることがありますので。
であれば、その過程でif文の実行順がおかしいと気が付きませんでしたか?
これは沖さんのデバッグのやり方も参考にしておかしな部分を見つけてみましょう。
ということは上記の例示データでkeito94さんの期待した動きだと以下のようになる感じですね。
(行初めで行全体の配列を追加するイメージ)
map_data:[]
map_data:[[0]] ※行初めなので行全体の配列を追加(if文がTrue時の処理)
map_data:[[0,1]]
~(省略)~
map_data:[[0,1,2,3,4]]
map_data:[[0,1,2,3,4],[5]] ※行初めなので行全体の配列を追加(if文がTrue時の処理)
map_data:[[0,1,2,3,4],[5,6]]
~(省略)~
map_data:[[0,1,2,3,4],[5,6,7,8,9]]
ということでまずは沖さん指摘のif文が自分の期待した通りに判定されているかを確認してみましょう。
(私のレスだけに反応して本題がおろそかにならないよう注意!)
なるほど。そういうことであれば廃止はやめて、load関数方式で行くことにしたと明示してくださいね。keito94 さんが書きました:正確にはソースコードを廃止前に戻して、asd さんが書きました: えーと、load関数は廃止されたと以下のレスで書いてありましたが、廃止前にやったことの説明でしょうか?
廃止前のエラーを修正したという感じですね。
書かれていないことは分からないので、私のように「廃止前の説明かな?」と誤解を招いてしまいます。
なるほどなるほど。keito94 さんが書きました:はい。その通りです。asd さんが書きました: get_layerについては今初めて本文中に登場した気がしますが、
本題とはあまり関係ないものの、ここも直してみたという説明でしょうか?
違和感があることに気づき…どうしたのかはわかりませんが何かしら奮闘されたと理解しておきます。
違和感に気づく前のコードは、以下のとおりです。
ファイルのアドレスは0から始まるとばかり思っていたのですが、
1から始まることに気づいて修正しました。
であれば、何を直したのかを今回のように明示してもらえると助かります。
修正後のソースだけをはるのであれば「○○を△△に直しました」のように説明を付与してもらわないと
何を直したのか分からないままになることがありますので。
この図を見るにブレイクポイントを置きながらステップ実行された感じでしょうか?keito94 さんが書きました:Pycharmについているブレークポイントによるデバッグ機能で、調べました。asd さんが書きました: 実際に一列目だけ読み込まれたことはどうやって確認したのでしょうか?
添付している画像を見てください。
ちなみに画像は1列目の7行目まで来たところです。
であれば、その過程でif文の実行順がおかしいと気が付きませんでしたか?
上記で少し書きましたが、現在のソースでステップ実行してみてその条件でTrueになり期待した通りに動いたでしょうか?keito94 さんが書きました:これは、参照するマップが新しい列に来たときに、新しく配列を生成することを期待しての条件式です。asd さんが書きました: ・上記コードのif文の条件式 i < 0 and j ==0ですがこれは何を期待しての条件式でしょうか?
→どういう場合にTrueになるつもりで書いていますかを教えてください
すでに生成されている最初の列でない、なおかつ新しく読み込まれる列のときにTrueになります。
これは沖さんのデバッグのやり方も参考にしておかしな部分を見つけてみましょう。
確認ありがとうございます。keito94 さんが書きました:はい。その通りです。asd さんが書きました: ・例えばマップチップデータ側が横幅5マス、縦幅2マスだったとして以下のようなデータを読み取った場合、
生成されることを期待するmap_dataは以下で正しいでしょうか?
マップデータ(5*2マス):0123456789
期待するmap_data:[ [0,1,2,3,4] , [5,6,7,8,9] ]
ということは上記の例示データでkeito94さんの期待した動きだと以下のようになる感じですね。
(行初めで行全体の配列を追加するイメージ)
map_data:[]
map_data:[[0]] ※行初めなので行全体の配列を追加(if文がTrue時の処理)
map_data:[[0,1]]
~(省略)~
map_data:[[0,1,2,3,4]]
map_data:[[0,1,2,3,4],[5]] ※行初めなので行全体の配列を追加(if文がTrue時の処理)
map_data:[[0,1,2,3,4],[5,6]]
~(省略)~
map_data:[[0,1,2,3,4],[5,6,7,8,9]]
ということでまずは沖さん指摘のif文が自分の期待した通りに判定されているかを確認してみましょう。
オフトピック
ちなみに私だったらif文を使わずにつくると思います。
混乱させてしまうと思うので、そのやり方は本題が解決した後に余力があれば提示しますね。
混乱させてしまうと思うので、そのやり方は本題が解決した後に余力があれば提示しますね。
Advanced Supporting Developer
無理やりこじつけ(ぉ
無理やりこじつけ(ぉ
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
オフトピック
実行例が「目に見える形で」示されていないのが問題だと思って投稿しただけで、Quoyleの仕様に不満があるわけではありませんよ。まあ、Quoyleに同封されているhello.qmpを.mapにコンバートしたものだという予想は付きますし、手元でコンバートしてみてバイナリエディタとかで比べればわかる話ですが、、、それって回答者の仕事じゃないですよね。keito94 さんが書きました: だったら、HSPDecoで、Quoyleを逆コンパイルして、mapファイルを読み込めるようにしてはいかがでしょうか?
調べてみたところ、HSP製のソフトらしいので。Elona(HSP製なことで有名なゲームです。)の解析にも、使われているソフトですよ。
(そもそも、読み込みたいのが.qmpなのか.mapなのかも示されてませんね。コードを見ればわかりますし、.qmpを読み込んだってうれしくないので.mapなのだろうとは思いますが、プログラムと、テストデータが投稿されるまでは確証がありませんでした。)
asdさんと同じ理由ですぐには書かないことにしました。
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
>>沖さん
たしかに条件満たしているはずなのにTrueなってない!!
でも、デバッグの仕方がようやくわかり始めたから、テスト用のコードの提供はありがたいです!!
>>asdさん
ボクはprintデバッグよりも、GUIのブレークポイント派ではあるのですが、そこまでは気づきませんでした…。
たしかに条件満たしているはずなのにTrueなってない!!
でも、デバッグの仕方がようやくわかり始めたから、テスト用のコードの提供はありがたいです!!
data_load関数の条件確認
map_data:[[]]
i:0
j:0
i <= 1 and j == 0:False
map_data[0].append([self.get_pos(1, 0, 0))]
j:1
i <= 1 and j == 0:False
map_data[0].append([self.get_pos(1, 1, 0))]
j:2
i <= 1 and j == 0:False
map_data[0].append([self.get_pos(1, 2, 0))]
j:3
i <= 1 and j == 0:False
map_data[0].append([self.get_pos(1, 3, 0))]
j:4
i <= 1 and j == 0:False
map_data[0].append([self.get_pos(1, 4, 0))]
i:1
j:0
i <= 1 and j == 0:False
map_data[1].append([self.get_pos(1, 0, 1))]
j:1
i <= 1 and j == 0:False
map_data[1].append([self.get_pos(1, 1, 1))]
j:2
i <= 1 and j == 0:False
map_data[1].append([self.get_pos(1, 2, 1))]
j:3
i <= 1 and j == 0:False
map_data[1].append([self.get_pos(1, 3, 1))]
j:4
i <= 1 and j == 0:False
map_data[1].append([self.get_pos(1, 4, 1))]
i:2
j:0
i <= 1 and j == 0:False
map_data[2].append([self.get_pos(1, 0, 2))]
j:1
i <= 1 and j == 0:False
map_data[2].append([self.get_pos(1, 1, 2))]
j:2
i <= 1 and j == 0:False
map_data[2].append([self.get_pos(1, 2, 2))]
j:3
i <= 1 and j == 0:False
map_data[2].append([self.get_pos(1, 3, 2))]
j:4
i <= 1 and j == 0:False
map_data[2].append([self.get_pos(1, 4, 2))]
i:3
j:0
i <= 1 and j == 0:False
map_data[3].append([self.get_pos(1, 0, 3))]
j:1
i <= 1 and j == 0:False
map_data[3].append([self.get_pos(1, 1, 3))]
j:2
i <= 1 and j == 0:False
map_data[3].append([self.get_pos(1, 2, 3))]
j:3
i <= 1 and j == 0:False
map_data[3].append([self.get_pos(1, 3, 3))]
j:4
i <= 1 and j == 0:False
map_data[3].append([self.get_pos(1, 4, 3))]
i:4
j:0
i <= 1 and j == 0:False
map_data[4].append([self.get_pos(1, 0, 4))]
j:1
i <= 1 and j == 0:False
map_data[4].append([self.get_pos(1, 1, 4))]
j:2
i <= 1 and j == 0:False
map_data[4].append([self.get_pos(1, 2, 4))]
j:3
i <= 1 and j == 0:False
map_data[4].append([self.get_pos(1, 3, 4))]
j:4
i <= 1 and j == 0:False
map_data[4].append([self.get_pos(1, 4, 4))]
Process finished with exit code 0
えっ、if文は使わなくてもできるのですか!?初めて知りました。shira211 さんが書きました:ちなみにNo:32の結果はif文を使わないやり方でやりました。(asdさんと同じなのかな?)
>>asdさん
ボクはprintデバッグよりも、GUIのブレークポイント派ではあるのですが、そこまでは気づきませんでした…。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
表示と実行結果が一致していないですね。keito94 さんが書きました:>>沖さん
たしかに条件満たしているはずなのにTrueなってない!!
でも、デバッグの仕方がようやくわかり始めたから、テスト用のコードの提供はありがたいです!!
data_load関数の条件確認 map_data:[[]] i:0 j:0 i <= 1 and j == 0:False map_data[0].append([self.get_pos(1, 0, 0))] j:1 i <= 1 and j == 0:False map_data[0].append([self.get_pos(1, 1, 0))] j:2 i <= 1 and j == 0:False map_data[0].append([self.get_pos(1, 2, 0))] j:3 i <= 1 and j == 0:False map_data[0].append([self.get_pos(1, 3, 0))] j:4 i <= 1 and j == 0:False map_data[0].append([self.get_pos(1, 4, 0))] i:1 j:0 i <= 1 and j == 0:False map_data[1].append([self.get_pos(1, 0, 1))] j:1 i <= 1 and j == 0:False map_data[1].append([self.get_pos(1, 1, 1))] j:2 i <= 1 and j == 0:False map_data[1].append([self.get_pos(1, 2, 1))] j:3 i <= 1 and j == 0:False map_data[1].append([self.get_pos(1, 3, 1))] j:4 i <= 1 and j == 0:False map_data[1].append([self.get_pos(1, 4, 1))] 以下略…
表示されている条件に変えたのであれば下記のようになっているはずです。
► スポイラーを表示
①range(stop)
②range(start, stop)
③range(start, stop, step)
今回は①の指定なので、この場合、startは0(デフォルト値)となるため、iは0~(stop - 1)までの値を取ります。
そう考えると条件がおかしいことに気づくんじゃないでしょうか?
また、今後の話をする上で確認です。
上記のように、asdさん、shira211さんともにif文を使用しない方法で行なっています。keito94 さんが書きました:えっ、if文は使わなくてもできるのですか!?初めて知りました。shira211 さんが書きました:ちなみにNo:32の結果はif文を使わないやり方でやりました。(asdさんと同じなのかな?)
>>asdさん
ボクはprintデバッグよりも、GUIのブレークポイント派ではあるのですが、そこまでは気づきませんでした…。
私も基本的にはif文を使用しない方法がスマートで良い方法だと考えています。(もちろんif文を使ってはいけないということではありません)
そこで、keito94さんはこのままif文を使用した方法で正しい条件を見つける方向ですすめていくのか
if文を使わない方法で進めていくのかを答えてください。
ただし、range関数が取り得る値については必ずドキュメントを読み理解してから先に進むようにしてください
https://docs.python.jp/3/library/stdtypes.html#range
オフトピック
なお、asdさん、shira211さんへの返答について指摘事項がありますが、一度に色々書くと全部読まないのでこの件が終了後に改めて指摘します
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
思えば、if文は面倒なものですね…。自分で条件を探さないといけないですし…。沖 滉均 さんが書きました: 上記のように、asdさん、shira211さんともにif文を使用しない方法で行なっています
私も基本的にはif文を使用しない方法がスマートで良い方法だと考えています。(もちろんif文を使ってはいけないということではありません)
そこで、keito94さんはこのままif文を使用した方法で正しい条件を見つける方向ですすめていくのか
if文を使わない方法で進めていくのかを答えてください。
なのでボクはif文を使わない方法で進めたいと思います。
ああっ、たしかに!!まず、rangeの引数については3つの方法があります。
①range(stop)
②range(start, stop)
③range(start, stop, step)
今回は①の指定なので、この場合、startは0(デフォルト値)となるため、iは0~(stop - 1)までの値を取ります。
そう考えると条件がおかしいことに気づくんじゃないでしょうか?
オフトピック
あっちのほうが楽だというのなら、私は迷わずその道を進むわ。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
自分で条件を探さないといけないから面倒なのでif文を使用しない方法を取るのは間違いです。keito94 さんが書きました:思えば、if文は面倒なものですね…。自分で条件を探さないといけないですし…。
なのでボクはif文を使わない方法で進めたいと思います。
今回は、if文を使用しないでもできるというだけで正しい条件を考えるのは必要なことです。
なにより、今回はrange関数の出力を理解していれば期待動作になっているはずですので
と、返答されているからには理解されたんですよね?keito94 さんが書きました:ああっ、たしかに!!
このまま先に進めてしまうと、また理解したつもりになってしまうかもしれないので正しい条件の返答を求めます。
その後、if文を使わない方法で進めていきましょう
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
>>沖さん
もしかすると、こうではないのでしょうか?
では、今度こそ、ありがとうございました。
もしかすると、こうではないのでしょうか?
# 以上のライブラリを利用してマップデータをリストに変換するサンプル。
def data_load(self):
map_data = []
# 開始時の位置を決める。
for i in range(0,self.MAP_H):
map_data.append([self.get_pos(1, 0, i)])
for j in range(1,self.MAP_W):
map_data[i].append(self.get_pos(1, j, i))
return map_data
► スポイラーを表示
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
Pythonだからです。かずま さんが書きました: 普通の人は、そうんな風に書かないと思います。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
言語のことを言っているのではありません。keito94 さんが書きました:Pythonだからです。
普通は、a[0] を特別扱いしない、ということを言っているのが
分からないようですね。
python で、リストの和なら、sum でしょう。 python で、リストのリストを作るなら、
次のように書くのではないでしょうか?
map_data = []
for i in range(3):
map_data.append([])
for j in range(4):
map_data[i].append(i*10+j)
print(map_data)
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
すごく一部にしか返信ないのが残念なのと、出遅れた感満載ですが返信してみます。
同じやり方かなぁ?と気になるところですが、本題解決までお披露目は我慢します(笑)
ちなみに沖さんも書いていますが、if文を使った書き方をまずしてみて、そのうえで
・このif文があるとどういう動きになるのか?
・その動きを実現する上でif文を省略した書き換えができないか?
を考えて書き換えを行います。
慣れている人はこの動きを頭で整理した上でコードに落とし込めるのでif文を使っていないだけで、
脳内では一度if文を使った処理も考えています。
この考え方はサンプルを流し見したり、人のプログラムを写すだけでは身につきません。
きちんと処理を考える必要があるのです。
そういった考え方を身につけてもらえたらなと個人的には思っています。
以前はそんなこと一言も言ってなかったですよね?
「こうですか?」ではなくそれで正しく動いたことをきちんと示してください。
そうしないと早合点で解決にしてしまうことになりますよ?
添付した画像は実行例ですが、私はPyGameを使っていなかったのでCUI出力で検証してます。
配置ウィンドウにあるのがpack.qmpで、コマンドプロンプトにそれを読み込んだ結果をマップチップのコードを出力してみました。
(0が何もないところ、1が壁のつもりで作ってみました。混乱させるといけないのでレイヤーはまだ考慮していません)
ここまできっちり提示しましょうとは言いませんが、何をもって正しくできたと判断したのかは提示してくださいね。
実はたまたま動いているだけで問題があるみたいなこともあり得るので。
オフトピック
ご配慮ありがとうございます(*´ヮ`)shira211 さんが書きました: ちなみにNo:32の結果はif文を使わないやり方でやりました。(asdさんと同じなのかな?)
asdさんと同じ理由ですぐには書かないことにしました。
同じやり方かなぁ?と気になるところですが、本題解決までお披露目は我慢します(笑)
はい、実際に私の手元ではifは使わない方法で作成したQuoyleMap読み込みクラスがあります。keito94 さんが書きました: えっ、if文は使わなくてもできるのですか!?初めて知りました。
ちなみに沖さんも書いていますが、if文を使った書き方をまずしてみて、そのうえで
・このif文があるとどういう動きになるのか?
・その動きを実現する上でif文を省略した書き換えができないか?
を考えて書き換えを行います。
慣れている人はこの動きを頭で整理した上でコードに落とし込めるのでif文を使っていないだけで、
脳内では一度if文を使った処理も考えています。
この考え方はサンプルを流し見したり、人のプログラムを写すだけでは身につきません。
きちんと処理を考える必要があるのです。
そういった考え方を身につけてもらえたらなと個人的には思っています。
えぇぇ…。であれば、エラーが出た際にすぐにデバッグできるではないですか…。keito94 さんが書きました: >>asdさん
ボクはprintデバッグよりも、GUIのブレークポイント派ではあるのですが、そこまでは気づきませんでした…。
以前はそんなこと一言も言ってなかったですよね?
ちゃんと動いたのかどうかを確認するのもデバッグですよ。keito94 さんが書きました:>>沖さん
もしかすると、こうではないのでしょうか?
では、今度こそ、ありがとうございました。
「こうですか?」ではなくそれで正しく動いたことをきちんと示してください。
そうしないと早合点で解決にしてしまうことになりますよ?
添付した画像は実行例ですが、私はPyGameを使っていなかったのでCUI出力で検証してます。
配置ウィンドウにあるのがpack.qmpで、コマンドプロンプトにそれを読み込んだ結果をマップチップのコードを出力してみました。
(0が何もないところ、1が壁のつもりで作ってみました。混乱させるといけないのでレイヤーはまだ考慮していません)
ここまできっちり提示しましょうとは言いませんが、何をもって正しくできたと判断したのかは提示してくださいね。
実はたまたま動いているだけで問題があるみたいなこともあり得るので。
- 添付ファイル
-
- QuoyleMapクラス動作確認例
- 無題3.png (20.96 KiB) 閲覧数: 40945 回
Advanced Supporting Developer
無理やりこじつけ(ぉ
無理やりこじつけ(ぉ
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
ごめんなさい、a[0]は特別扱いしないんですね…。かずま さんが書きました: 言語のことを言っているのではありません。
普通は、a[0] を特別扱いしない、ということを言っているのが
分からないようですね。
>> asdさん
ちょっと暴論を吐いてしまった…。
そうでした。デバッグ画面を見ればわかると思いますが、QuoyleMapは正しく動いてますが、ここまできっちり提示しましょうとは言いませんが、何をもって正しくできたと判断したのかは提示してくださいね。
実はたまたま動いているだけで問題があるみたいなこともあり得るので。
Pygameの画面に画像が表示されてません。
簡単なミスかもしれませんが…。
- 添付ファイル
-
- QuoyleMapクラスは正しく動いたが….PNG (39.79 KiB) 閲覧数: 40852 回
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
暴論というより説明不足というか、早合点というか…。keito94 さんが書きました: >> asdさん
ちょっと暴論を吐いてしまった…。
結局if文は使わない形で行くようですが、先の回答にも書いた通りif文を使った場合の正しい書き方(処理)を考えることは有用です。
if文を使った場合はどのように書くのが正解だったのかは考えるようにしてくださいね。
ですから、その「QuoyleMapは正しく動いていることを確認し、Pygameの画面に画像が表示されない原因を見つけ修正すること」がデバッグですよ。keito94 さんが書きました: そうでした。デバッグ画面を見ればわかると思いますが、QuoyleMapは正しく動いてますが、
Pygameの画面に画像が表示されてません。
簡単なミスかもしれませんが…。
読み込まれたmap_dataが正しいかどうかは元のマップデータを私は知らないので確認しようがありません。keito94さん自身で確認してみてください。
その上で読み込まれているmap_dataは正しいものとして考えると調べるべき箇所は、
・imageList[40]、imageList[34]には正しいデータが格納されているか
・screen.blit行の部分の処理は正しいか
→imageList[40]やimageList[34]を指定した場合は描画されるか
imageList[chip]の代わりに別の画像を指定した場合は描画されるか
などが考えられます。
その上でどういう場合に成功してどういう場合に失敗するかを絞り込み、意図せず失敗するパターンを修正するのがデバッグです。
少なくとも原因箇所の特定と不具合発生の条件の絞り込みはそろそろ自力でできるようになりましょう。
Advanced Supporting Developer
無理やりこじつけ(ぉ
無理やりこじつけ(ぉ
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
もう答え書かれてしまっていますし、表示されない原因だけ言いますよ
QuoyleMapが正しく動いていることが前提として
画面を更新していないので表示されないのは当たり前です
マップのサンプルではなく、以前のコードでは画面を更新していましたよ
画面の更新方法は自分の過去のコードから探せばいいんじゃないですかね
QuoyleMapが正しく動いていることが前提として
画面を更新していないので表示されないのは当たり前です
マップのサンプルではなく、以前のコードでは画面を更新していましたよ
画面の更新方法は自分の過去のコードから探せばいいんじゃないですかね
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
しまった、簡単なことにも気づかなかった!!沖 滉均 さんが書きました:もう答え書かれてしまっていますし、表示されない原因だけ言いますよ
QuoyleMapが正しく動いていることが前提として
画面を更新していないので表示されないのは当たり前です
マップのサンプルではなく、以前のコードでは画面を更新していましたよ
画面の更新方法は自分の過去のコードから探せばいいんじゃないですかね
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
Re: Pythonのファイルのバイト単位でのランダムアクセスについて
オフトピック
本題については解決したようなので、棚上げしていた私の実装方法を提示して書き込みを終えたいと思います。asd さんが書きました: ちなみに私だったらif文を使わずにつくると思います。
混乱させてしまうと思うので、そのやり方は本題が解決した後に余力があれば提示しますね。
マップ読み込み部分だけ抜粋していますが、1行分のリスト_tmprowをまず作りそれをマップ全体のリスト__MAP_DATAに追加することでリストのリストを作成していました。
質問者のコードでは途中で方針転換して空のリストを追加してからそこに1行分のデータを追加するようになっていましたが、いずれの方法でもif文は不要ですね。 作成したクラス全体をあげようか迷いましたがやめておきます。
Advanced Supporting Developer
無理やりこじつけ(ぉ
無理やりこじつけ(ぉ