Pythonのファイルのバイト単位でのランダムアクセスについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
keito94
記事: 264
登録日時: 7年前
連絡を取る:

Pythonのファイルのバイト単位でのランダムアクセスについて

#1

投稿記事 by keito94 » 6年前

今、Pythonを使って、MapEditor Quoyle ver0.8のヘルプを参考に、Quolyeで作ったマップデータのローダーを作っているのですが
Pythonのランダムアクセスについて調べていると、
https://docs.python.jp/3/library/linecache.html
テキストライン関係のものしか出ません。
どうやってバイト単位でのランダムアクセスを行うのですか?
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
keito94
記事: 264
登録日時: 7年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#2

投稿記事 by keito94 » 6年前

Pythonのreadをよく読めばいいだけのことでした。
お付き合い頂きありがとうございました。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
keito94
記事: 264
登録日時: 7年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#3

投稿記事 by keito94 » 6年前

でも、Pythonのread機能で、どうやってバイナリデータのランダムアクセスとバイト数だけ読み込みを実現させるのかがわからない…。
すいません解決はなかったことにしてください。
最後に編集したユーザー keito94 on 2017年7月29日(土) 13:24 [ 編集 1 回目 ]
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
keito94
記事: 264
登録日時: 7年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#4

投稿記事 by keito94 » 6年前

とりあえずソースコード。

コード:

# 細かいデータは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のファイルのバイト単位でのランダムアクセスについて

#5

投稿記事 by Hiragi(GKUTH) » 6年前

ファイル自体をランダムアクセスしようとするのではなく、ファイルを読み込んでメモリ上に展開してからのほうが扱いやすいのではないですか?
全く的外れでした。申し訳ありません。
そもそもなぜランダムアクセスが必要となったのですか?
だいがくせい!

shira211
記事: 13
登録日時: 7年前

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#6

投稿記事 by shira211 » 6年前

エンディアンの言葉の使い方が間違っています。リトル・ビッグエンディアンではなく、下位・上位バイトと呼ぶのが適切かと思います。
それ以外の用語も、もしかしたら間違って使っているのではないですか?
ランダムアクセスとバイト数だけ読み込みとは、具体的にどのような動作を指すのでしょうか?

アバター
keito94
記事: 264
登録日時: 7年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#7

投稿記事 by keito94 » 6年前

shira211 さんが書きました:エンディアンの言葉の使い方が間違っています。リトル・ビッグエンディアンではなく、下位・上位バイトと呼ぶのが適切かと思います。
ごめんなさい、訂正しておきますね…。
それ以外の用語も、もしかしたら間違って使っているのではないですか?
ランダムアクセスとバイト数だけ読み込みとは、具体的にどのような動作を指すのでしょうか?
ランダムアクセスはread()関数を使えばできるということはわかりました。
ですが、
①ランダムアクセスは簡単にできた。
②でも、(Pythonにおける)1バイト単位のアクセスのやり方がわからない
これくらいでしょうか…。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
Hiragi(GKUTH)
記事: 167
登録日時: 13年前
住所: 大阪府
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#8

投稿記事 by Hiragi(GKUTH) » 6年前

>>②でも、(Pythonにおける)1バイト単位のアクセスのやり方がわからない
read関数の第一引数は読み込むバイト数ですので、readの第一引数に1を渡してやればいいかと思います。(提示されたソースでは使い方を間違っている?)
それとkeito94さんが想像しているランダムアクセスは私の考えるランダムアクセスとは違うかもしれません。少なくともread関数ではランダムアクセスは出来ず、
seek関数を使用する必要があると思います。
だいがくせい!

アバター
keito94
記事: 264
登録日時: 7年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#9

投稿記事 by keito94 » 6年前

Hiragi(GKUTH) さんが書きました: seek関数を使用する必要があると思います。
わかりました!!seek関数を使えばいいんですね!!
ありがとうございました!!
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
keito94
記事: 264
登録日時: 7年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#10

投稿記事 by keito94 » 6年前

しまった解決押し忘れた(><)
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
asd
記事: 319
登録日時: 13年前

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#11

投稿記事 by asd » 6年前

keito94 さんが書きました:
Hiragi(GKUTH) さんが書きました: seek関数を使用する必要があると思います。
わかりました!!seek関数を使えばいいんですね!!
ありがとうございました!!
最終的にseek関数を使ったソースが出来上がったらそれを解決の証として貼り付けておいてください。
Advanced Supporting Developer
無理やりこじつけ(ぉ

アバター
keito94
記事: 264
登録日時: 7年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#12

投稿記事 by keito94 » 6年前

コード:

# 細かいデータは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さんのコメント読みました…。
これから態度を改められる訓練をしなければ…。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
keito94
記事: 264
登録日時: 7年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#13

投稿記事 by keito94 » 6年前

さっき書いたコードは効率がかなり悪いことに気づいて、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

コードがかなりすっきりしました。
今度こそありがとうございました。
オフトピック
今回の教訓。最後まで確認してから解決させるべし。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
asd
記事: 319
登録日時: 13年前

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#14

投稿記事 by asd » 6年前

解決したソースの投稿ありがとうございました。
解決したのであれば解決!にチェックを入れておいてください。
keito94 さんが書きました:
オフトピック
沖さんの日記のASDさんのコメント読みました…。
これから態度を改められる訓練をしなければ…。
オフトピックにツッコミいれるのもなんですが、このトピック外の話を混ぜるのやめませんか?
第三者からみて意味が分からなくなりますので。
Advanced Supporting Developer
無理やりこじつけ(ぉ

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#15

投稿記事 by ISLe » 6年前

オフトピック
ファイルの先頭から10バイトは順番に読み込むだけだし
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]

        #以下略
ここからreadShortとかreadByteとかの関数作って置き換える流れが順当。

アバター
沖 滉均
記事: 237
登録日時: 13年前
住所: K県F市

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#16

投稿記事 by 沖 滉均 » 6年前

keito94 さんが書きました:さっき書いたコードは効率がかなり悪いことに気づいて、load関数というものを作りました。

コード:

    # ファイルから一文字読み出す。nは読み込むファイルのオフセット。
    def load(self,n):
        self.fn.seek(n)
        self.fn.read(1)
        self.fn.seek(-n)
オフトピック
今回の教訓。最後まで確認してから解決させるべし。
とりあえず返信しますが動作確認しましたか?

・load関数は値を返していない
・self.fn.seek関数は第2引数を省略しているため、nは 0もしくは正の値でなければならない(第2引数にos.SEEK_SET(デフォルト)を指定した場合と同様)

他にも問題だらけなのでドキュメント確認しましょうね。以前のトピで出たprint文デバッグでも良いでしょう。
これ以上、他の問題点について私は答えるつもりはありませんのでデバッグをしてくださいね
There is no royal road to learning.
codeタグで指定できる言語
画像

アバター
keito94
記事: 264
登録日時: 7年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#17

投稿記事 by keito94 » 6年前

ISLe さんが書きました: ここからreadShortとかreadByteとかの関数作って置き換える流れが順当。
readShortとreadByteがネイティブコード(C言語)で書かれた変数をPythonの整数に変換するというのはわかるのですが…。
それのヒントらしきものはありますか?
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
asd
記事: 319
登録日時: 13年前

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#18

投稿記事 by asd » 6年前

keito94 さんが書きました:
ISLe さんが書きました: ここからreadShortとかreadByteとかの関数作って置き換える流れが順当。
readShortとreadByteがネイティブコード(C言語)で書かれた変数をPythonの整数に変換するというのはわかるのですが…。
それのヒントらしきものはありますか?
オフトピックにだけ反応してload関数対応版について、沖さん指摘の動作確認をしたかどうかはスルーですか?

動くかどうかわからないソースを載せて解決とされると、同じような問題で困っている人が参照した際に困ってしまいます。
Advanced Supporting Developer
無理やりこじつけ(ぉ

アバター
沖 滉均
記事: 237
登録日時: 13年前
住所: K県F市

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#19

投稿記事 by 沖 滉均 » 6年前

keito94 さんが書きました:ISLe さんが書きました:
ここからreadShortとかreadByteとかの関数作って置き換える流れが順当。

readShortとreadByteがネイティブコード(C言語)で書かれた変数をPythonの整数に変換するというのはわかるのですが…。
それのヒントらしきものはありますか?
structモジュールって書いてあるのだからドキュメントを読んではいかがですか?
Python 3.6.1 ドキュメント
There is no royal road to learning.
codeタグで指定できる言語
画像

アバター
keito94
記事: 264
登録日時: 7年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#20

投稿記事 by keito94 » 6年前

2バイトのやつはリトルエンディアンですよ。(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

quoyletestフォルダにテストプログラムがあります。(Pygameが必要です。)
見えにくいですが、pygameのウィンドウにHELLOと表示されれば成功です。
あと、output_d.htmlには、使用しているマップファイルのデータが入っています。
ドキュメントはよく読んだのですが、
オフトピック
自分の脳内だけで補完せず、やりたいことを他人に伝える。
それが傲慢な態度、卒業の鍵。
添付ファイル
output_d.zip
(2.34 KiB) ダウンロード数: 326 回
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
asd
記事: 319
登録日時: 13年前

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#21

投稿記事 by asd » 6年前

添付されているoutput_d.htmってマップエディタQuoyleに附属しているヘルプファイルの一部じゃないですか?
それを勝手に転載するのはよくないのではと思います。

いろいろツッコミを入れたいところですがどうせスルーされちゃうと思うので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
無理やりこじつけ(ぉ

アバター
沖 滉均
記事: 237
登録日時: 13年前
住所: K県F市

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#22

投稿記事 by 沖 滉均 » 6年前

keito94 さんが書きました:2バイトのやつはリトルエンディアンですよ。(output_d.htmlを読めばわかりますが…。)
さてさて、readShortと、readByteを完成させました。

コード:

    def readShort(self,val):
        return unpack('<h',val)[0]

    def readByte(self,val):
        return unpack('b',val)[0]

エラー報告は内容を自分で調べて自分でデバッグしてください
readShortとreadByteを作りましたとありますがこれだけで動いてないですよね?
使用箇所に問題があると思いますが、他の変更コードはどうなっているのですか?
あと、前回のload関数が値を返していない件に関しても返答がありませんね

他はasdさんが指摘されている通りなので省略します。
There is no royal road to learning.
codeタグで指定できる言語
画像

アバター
keito94
記事: 264
登録日時: 7年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#23

投稿記事 by keito94 » 6年前

沖 滉均 さんが書きました: あと、前回のload関数が値を返していない件に関しても返答がありませんね
load関数はソースコードを見ればわかるように都合により廃止されました。
というか、structを使う方針に変更しました。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
沖 滉均
記事: 237
登録日時: 13年前
住所: K県F市

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#24

投稿記事 by 沖 滉均 » 6年前

ソースコードを見ればわかるように?
どこにそのようなソースコードがあるのですか?
There is no royal road to learning.
codeタグで指定できる言語
画像

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#25

投稿記事 by ISLe » 6年前

オフトピック
keito94 さんが書きました:2バイトのやつはリトルエンディアンですよ。(output_d.htmlを読めばわかりますが…。)
keito94さんの提示したコードでビッグエンディアンとして処理しているのをそのまま書き換えたのですよ。

反省したと言いながらあいかわらずトピを読み返さないので自分の書いたコードに原因があることに気付かないのでしょうかね。
あるいは、わたしを貶めようと目論んでいるのでしょうか。

必要最低限の書き換えで済ましているのは、このような状況でもある意味keito94さんを信用してのことですが、そのような悪意を突き付けられるとは。
自分を棚に上げて他人に間違いを直させる姿勢にさらに磨きがかかってますね。

アバター
keito94
記事: 264
登録日時: 7年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#26

投稿記事 by keito94 » 6年前

沖 滉均 さんが書きました:ソースコードを見ればわかるように?
どこにそのようなソースコードがあるのですか?
output_d.zipのquoyletestの中に入ってると思うのですが…。
ちょっと不適切な名前だったので添付するファイルを修正しますね。(ソースコードは少し変えてます。)

今回のデバッグでわかったこと。
①レイヤーのアドレスの位置は(layer-1)で表す。
②流石にまずいと思い、load関数と、readByteを組み合わせた関数を作った。
③しかし、今のコードではnindexが適切な値を返さず、

コード:

TypeError: a bytes-like object is required, not 'int'
エラーを返す。
この場合どうすればいいのでしょうか?
添付ファイル
quoyletest.zip
(24.56 KiB) ダウンロード数: 317 回
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
沖 滉均
記事: 237
登録日時: 13年前
住所: K県F市

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#27

投稿記事 by 沖 滉均 » 6年前

新しい添付ファイルはまだ確認してませんが、ひとつ言っておきます。
output_d.zipの中身確認してみましたか?quoyletestなんてフォルダは入っていませんよ。
There is no royal road to learning.
codeタグで指定できる言語
画像

アバター
keito94
記事: 264
登録日時: 7年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#28

投稿記事 by keito94 » 6年前

沖 滉均 さんが書きました: output_d.zipの中身確認してみましたか?quoyletestなんてフォルダは入っていませんよ。
ごめんなさい、ファイルの中身をよく確認すべきでした…。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
沖 滉均
記事: 237
登録日時: 13年前
住所: K県F市

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#29

投稿記事 by 沖 滉均 » 6年前

添付しているファイルはあなたの現在確認しているコードですか?
違いますよね
nindexが正しい値を返さない以前にエラーが発生するはずですけどもね。
使用方法の誤りが色々ありますし、あなたがスルーしていた下記の件も直っていませんし(load関数そのものではなくても使い方の誤りを指摘していますよ)
http://dixq.net/forum/viewtopic.php?f=3&t=19442#p147088
そもそも、なぜ複数の人から指摘・回答があっても1人にしか返信をしないんでしょう?

デバッグのやり方ややることについても前のトピで返信ついていますよね
このトピでも返信ついてますよね
何度このやり取りを繰り返せば良いんでしょうか?
There is no royal road to learning.
codeタグで指定できる言語
画像

アバター
keito94
記事: 264
登録日時: 7年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#30

投稿記事 by keito94 » 6年前

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)が悪さをすることに気づき、
なんとか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) ダウンロード数: 348 回
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
asd
記事: 319
登録日時: 13年前

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#31

投稿記事 by asd » 6年前

複数の指摘を書くと1か所にしか反応されなさそうで不安ではありますが、
keito94さんの決心を信じて指摘します。
keito94 さんが書きました: 分かりました、書きますね。

コード:

    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)が悪さをすることに気づき、
なんとかself.fn.seek(-val)を取り除きました。
えーと、load関数は廃止されたと以下のレスで書いてありましたが、廃止前にやったことの説明でしょうか?
そうであればここは特に触れずに行きますね。

http://dixq.net/forum/viewtopic.php?f=3&t=19442#p147101
keito94 さんが書きました: あと、get_layerに違和感があることに気づき、
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
無理やりこじつけ(ぉ

shira211
記事: 13
登録日時: 7年前

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#32

投稿記事 by shira211 » 6年前

いろいろいじってたらこんな出力が得られましたけど、これが今回の目標でいいんですよね?
オフトピック
MAPファイルはQuoyleで開けない、QMPファイルは画像ファイルへの絶対パスが含まれてUPするのを躊躇う・・・
相対パスで指定出来たら便利そうですけどね
添付ファイル
Quoyle.png
Quoyle.png (20.77 KiB) 閲覧数: 39217 回

アバター
keito94
記事: 264
登録日時: 7年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#33

投稿記事 by keito94 » 6年前

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にも上げておきますね!!
MAPファイルはQuoyleで開けない、QMPファイルは画像ファイルへの絶対パスが含まれてUPするのを躊躇う・・・
相対パスで指定出来たら便利そうですけどね
だったら、HSPDecoで、Quoyleを逆コンパイルして、mapファイルを読み込めるようにしてはいかがでしょうか?
調べてみたところ、HSP製のソフトらしいので。Elona(HSP製なことで有名なゲームです。)の解析にも、使われているソフトですよ。
オフトピック
self.fn.write()とstruct.pack()で、マップファイルの書き込みが実現できるらしいけど、
エラーが出てしまうかもしれない不安があったので却下した(><)
誰か、マップファイルの書き込み機能作って…。
(と言うか、読み込むので精一杯…。)
添付ファイル
Pycharmのスクショ.png
Pycharmのスクショ.png (34.12 KiB) 閲覧数: 39173 回
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
沖 滉均
記事: 237
登録日時: 13年前
住所: K県F市

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#34

投稿記事 by 沖 滉均 » 6年前

ようやく返信がついたようなのでひとつずつ進めていきましょうか
keito94 さんが書きました:
asd さんが書きました:・上記コードのif文の条件式 i < 0 and j ==0ですがこれは何を期待しての条件式でしょうか?
 →どういう場合にTrueになるつもりで書いていますかを教えてください
これは、参照するマップが新しい列に来たときに、新しく配列を生成することを期待しての条件式です。
すでに生成されている最初の列でない、なおかつ新しく読み込まれる列のときにTrueになります。
本当でしょうか?
この部分だけを抜き出して動かしてみるとあなたが期待していない動作をしていることがわかるはずです。

何度言ってもデバッグのやり方がわからないようなので今回は単純な確認用のコードを提示しましょう
マップは例として5x5で設定しています。
► スポイラーを表示
いかがですか?あなたの期待通りの動作になっていますか?
さて、この続きはあなたがどう考えるか次第です。
There is no royal road to learning.
codeタグで指定できる言語
画像

アバター
asd
記事: 319
登録日時: 13年前

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#35

投稿記事 by asd » 6年前

本題は沖さんが回答している通りなので、私はそれ以外を主としてレスします。
(私のレスだけに反応して本題がおろそかにならないよう注意!)
keito94 さんが書きました:
asd さんが書きました: えーと、load関数は廃止されたと以下のレスで書いてありましたが、廃止前にやったことの説明でしょうか?
正確にはソースコードを廃止前に戻して、
廃止前のエラーを修正したという感じですね。
なるほど。そういうことであれば廃止はやめて、load関数方式で行くことにしたと明示してくださいね。
書かれていないことは分からないので、私のように「廃止前の説明かな?」と誤解を招いてしまいます。
keito94 さんが書きました:
asd さんが書きました: get_layerについては今初めて本文中に登場した気がしますが、
本題とはあまり関係ないものの、ここも直してみたという説明でしょうか?
違和感があることに気づき…どうしたのかはわかりませんが何かしら奮闘されたと理解しておきます。
はい。その通りです。
違和感に気づく前のコードは、以下のとおりです。
ファイルのアドレスは0から始まるとばかり思っていたのですが、
1から始まることに気づいて修正しました。
なるほどなるほど。
であれば、何を直したのかを今回のように明示してもらえると助かります。
修正後のソースだけをはるのであれば「○○を△△に直しました」のように説明を付与してもらわないと
何を直したのか分からないままになることがありますので。
keito94 さんが書きました:
asd さんが書きました: 実際に一列目だけ読み込まれたことはどうやって確認したのでしょうか?
Pycharmについているブレークポイントによるデバッグ機能で、調べました。
添付している画像を見てください。
ちなみに画像は1列目の7行目まで来たところです。
この図を見るにブレイクポイントを置きながらステップ実行された感じでしょうか?
であれば、その過程でif文の実行順がおかしいと気が付きませんでしたか?
keito94 さんが書きました:
asd さんが書きました: ・上記コードのif文の条件式 i < 0 and j ==0ですがこれは何を期待しての条件式でしょうか?
 →どういう場合にTrueになるつもりで書いていますかを教えてください
これは、参照するマップが新しい列に来たときに、新しく配列を生成することを期待しての条件式です。
すでに生成されている最初の列でない、なおかつ新しく読み込まれる列のときに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
無理やりこじつけ(ぉ

shira211
記事: 13
登録日時: 7年前

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#36

投稿記事 by shira211 » 6年前

オフトピック
keito94 さんが書きました: だったら、HSPDecoで、Quoyleを逆コンパイルして、mapファイルを読み込めるようにしてはいかがでしょうか?
調べてみたところ、HSP製のソフトらしいので。Elona(HSP製なことで有名なゲームです。)の解析にも、使われているソフトですよ。
実行例が「目に見える形で」示されていないのが問題だと思って投稿しただけで、Quoyleの仕様に不満があるわけではありませんよ。まあ、Quoyleに同封されているhello.qmpを.mapにコンバートしたものだという予想は付きますし、手元でコンバートしてみてバイナリエディタとかで比べればわかる話ですが、、、それって回答者の仕事じゃないですよね。
(そもそも、読み込みたいのが.qmpなのか.mapなのかも示されてませんね。コードを見ればわかりますし、.qmpを読み込んだってうれしくないので.mapなのだろうとは思いますが、プログラムと、テストデータが投稿されるまでは確証がありませんでした。)
ちなみにNo:32の結果はif文を使わないやり方でやりました。(asdさんと同じなのかな?)
asdさんと同じ理由ですぐには書かないことにしました。

アバター
keito94
記事: 264
登録日時: 7年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#37

投稿記事 by keito94 » 6年前

>>沖さん
たしかに条件満たしているはずなのに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
shira211 さんが書きました:ちなみにNo:32の結果はif文を使わないやり方でやりました。(asdさんと同じなのかな?)
えっ、if文は使わなくてもできるのですか!?初めて知りました。

>>asdさん
ボクはprintデバッグよりも、GUIのブレークポイント派ではあるのですが、そこまでは気づきませんでした…。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
沖 滉均
記事: 237
登録日時: 13年前
住所: K県F市

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#38

投稿記事 by 沖 滉均 » 6年前

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の引数については3つの方法があります。
①range(stop)
②range(start, stop)
③range(start, stop, step)
今回は①の指定なので、この場合、startは0(デフォルト値)となるため、iは0~(stop - 1)までの値を取ります。
そう考えると条件がおかしいことに気づくんじゃないでしょうか?

また、今後の話をする上で確認です。
keito94 さんが書きました:
shira211 さんが書きました:ちなみにNo:32の結果はif文を使わないやり方でやりました。(asdさんと同じなのかな?)
えっ、if文は使わなくてもできるのですか!?初めて知りました。

>>asdさん
ボクはprintデバッグよりも、GUIのブレークポイント派ではあるのですが、そこまでは気づきませんでした…。
上記のように、asdさん、shira211さんともにif文を使用しない方法で行なっています。
私も基本的にはif文を使用しない方法がスマートで良い方法だと考えています。(もちろんif文を使ってはいけないということではありません)
そこで、keito94さんはこのままif文を使用した方法で正しい条件を見つける方向ですすめていくのか
if文を使わない方法で進めていくのかを答えてください。

ただし、range関数が取り得る値については必ずドキュメントを読み理解してから先に進むようにしてください
https://docs.python.jp/3/library/stdtypes.html#range
オフトピック
なお、asdさん、shira211さんへの返答について指摘事項がありますが、一度に色々書くと全部読まないのでこの件が終了後に改めて指摘します
There is no royal road to learning.
codeタグで指定できる言語
画像

アバター
keito94
記事: 264
登録日時: 7年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#39

投稿記事 by keito94 » 6年前

沖 滉均 さんが書きました: 上記のように、asdさん、shira211さんともにif文を使用しない方法で行なっています
私も基本的にはif文を使用しない方法がスマートで良い方法だと考えています。(もちろんif文を使ってはいけないということではありません)
そこで、keito94さんはこのままif文を使用した方法で正しい条件を見つける方向ですすめていくのか
if文を使わない方法で進めていくのかを答えてください。
思えば、if文は面倒なものですね…。自分で条件を探さないといけないですし…。
なのでボクはif文を使わない方法で進めたいと思います。
まず、rangeの引数については3つの方法があります。
①range(stop)
②range(start, stop)
③range(start, stop, step)
今回は①の指定なので、この場合、startは0(デフォルト値)となるため、iは0~(stop - 1)までの値を取ります。
そう考えると条件がおかしいことに気づくんじゃないでしょうか?
ああっ、たしかに!!
オフトピック
あっちのほうが楽だというのなら、私は迷わずその道を進むわ。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
沖 滉均
記事: 237
登録日時: 13年前
住所: K県F市

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#40

投稿記事 by 沖 滉均 » 6年前

keito94 さんが書きました:思えば、if文は面倒なものですね…。自分で条件を探さないといけないですし…。
なのでボクはif文を使わない方法で進めたいと思います。
自分で条件を探さないといけないから面倒なのでif文を使用しない方法を取るのは間違いです。
今回は、if文を使用しないでもできるというだけで正しい条件を考えるのは必要なことです。
なにより、今回はrange関数の出力を理解していれば期待動作になっているはずですので
keito94 さんが書きました:ああっ、たしかに!!
と、返答されているからには理解されたんですよね?
このまま先に進めてしまうと、また理解したつもりになってしまうかもしれないので正しい条件の返答を求めます。
その後、if文を使わない方法で進めていきましょう
There is no royal road to learning.
codeタグで指定できる言語
画像

アバター
keito94
記事: 264
登録日時: 7年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#41

投稿記事 by keito94 » 6年前

>>沖さん
もしかすると、こうではないのでしょうか?

コード:

    # 以上のライブラリを利用してマップデータをリストに変換するサンプル。
    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のファイルのバイト単位でのランダムアクセスについて

#42

投稿記事 by かずま » 6年前

配列の要素の和を求める C のプログラムを、
keito94さんは次のように書くのでしょうか。
普通の人は if文を使わずに書きます。

コード:

#include <stdio.h>

int a[5] = { 1, 2, 3, 4, 5 };

int main(void)
{
    int s;
    for (int i = 0; i < 5; i++)
        if (i == 0)
            s = a[0];
        else
            s += a[i];
    printf("和は %d です。\n", s);
    return 0;
}

かずま

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#43

投稿記事 by かずま » 6年前

配列の要素の和を求める C のプログラムを、
keito94さんは次のように書くように方針を変えたのでしょうか

コード:

#include <stdio.h>

int a[5] = { 1, 2, 3, 4, 5 };

int main(void)
{
    int s = a[0];
    for (int i = 1; i < 5; i++)
        s += a[i];
    printf("和は %d です。\n", s);
    return 0;
}
普通の人は、そうんな風に書かないと思います。

アバター
keito94
記事: 264
登録日時: 7年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#44

投稿記事 by keito94 » 6年前

かずま さんが書きました: 普通の人は、そうんな風に書かないと思います。
Pythonだからです。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

かずま

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#45

投稿記事 by かずま » 6年前

keito94 さんが書きました:Pythonだからです。
言語のことを言っているのではありません。
普通は、a[0] を特別扱いしない、ということを言っているのが
分からないようですね。

python で、リストの和なら、sum でしょう。

コード:

a = [1, 2, 3, 4, 5]
sum(a)
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)
実行結果

コード:

[[0, 1, 2, 3], [10, 11, 12, 13], [20, 21, 22, 23]]
返事をお待ちしております。

アバター
asd
記事: 319
登録日時: 13年前

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#46

投稿記事 by asd » 6年前

すごく一部にしか返信ないのが残念なのと、出遅れた感満載ですが返信してみます。
オフトピック
shira211 さんが書きました: ちなみにNo:32の結果はif文を使わないやり方でやりました。(asdさんと同じなのかな?)
asdさんと同じ理由ですぐには書かないことにしました。
ご配慮ありがとうございます(*´ヮ`)
同じやり方かなぁ?と気になるところですが、本題解決までお披露目は我慢します(笑)
keito94 さんが書きました: えっ、if文は使わなくてもできるのですか!?初めて知りました。
はい、実際に私の手元ではifは使わない方法で作成したQuoyleMap読み込みクラスがあります。
ちなみに沖さんも書いていますが、if文を使った書き方をまずしてみて、そのうえで

・このif文があるとどういう動きになるのか?
・その動きを実現する上でif文を省略した書き換えができないか?

を考えて書き換えを行います。
慣れている人はこの動きを頭で整理した上でコードに落とし込めるのでif文を使っていないだけで、
脳内では一度if文を使った処理も考えています。

この考え方はサンプルを流し見したり、人のプログラムを写すだけでは身につきません。
きちんと処理を考える必要があるのです。

そういった考え方を身につけてもらえたらなと個人的には思っています。
keito94 さんが書きました: >>asdさん
ボクはprintデバッグよりも、GUIのブレークポイント派ではあるのですが、そこまでは気づきませんでした…。
えぇぇ…。であれば、エラーが出た際にすぐにデバッグできるではないですか…。
以前はそんなこと一言も言ってなかったですよね?
keito94 さんが書きました:>>沖さん
もしかすると、こうではないのでしょうか?

では、今度こそ、ありがとうございました。
ちゃんと動いたのかどうかを確認するのもデバッグですよ。
「こうですか?」ではなくそれで正しく動いたことをきちんと示してください。
そうしないと早合点で解決にしてしまうことになりますよ?

添付した画像は実行例ですが、私はPyGameを使っていなかったのでCUI出力で検証してます。
配置ウィンドウにあるのがpack.qmpで、コマンドプロンプトにそれを読み込んだ結果をマップチップのコードを出力してみました。
(0が何もないところ、1が壁のつもりで作ってみました。混乱させるといけないのでレイヤーはまだ考慮していません)

ここまできっちり提示しましょうとは言いませんが、何をもって正しくできたと判断したのかは提示してくださいね。
実はたまたま動いているだけで問題があるみたいなこともあり得るので。
添付ファイル
無題3.png
QuoyleMapクラス動作確認例
無題3.png (20.96 KiB) 閲覧数: 38753 回
Advanced Supporting Developer
無理やりこじつけ(ぉ

アバター
keito94
記事: 264
登録日時: 7年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#47

投稿記事 by keito94 » 6年前

かずま さんが書きました: 言語のことを言っているのではありません。
普通は、a[0] を特別扱いしない、ということを言っているのが
分からないようですね。
ごめんなさい、a[0]は特別扱いしないんですね…。

>> asdさん
ちょっと暴論を吐いてしまった…。
ここまできっちり提示しましょうとは言いませんが、何をもって正しくできたと判断したのかは提示してくださいね。
実はたまたま動いているだけで問題があるみたいなこともあり得るので。
そうでした。デバッグ画面を見ればわかると思いますが、QuoyleMapは正しく動いてますが、
Pygameの画面に画像が表示されてません。
簡単なミスかもしれませんが…。
添付ファイル
QuoyleMapクラスは正しく動いたが….PNG
QuoyleMapクラスは正しく動いたが….PNG (39.79 KiB) 閲覧数: 38660 回
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
asd
記事: 319
登録日時: 13年前

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#48

投稿記事 by asd » 6年前

keito94 さんが書きました: >> asdさん
ちょっと暴論を吐いてしまった…。
暴論というより説明不足というか、早合点というか…。
結局if文は使わない形で行くようですが、先の回答にも書いた通りif文を使った場合の正しい書き方(処理)を考えることは有用です。
if文を使った場合はどのように書くのが正解だったのかは考えるようにしてくださいね。
keito94 さんが書きました: そうでした。デバッグ画面を見ればわかると思いますが、QuoyleMapは正しく動いてますが、
Pygameの画面に画像が表示されてません。
簡単なミスかもしれませんが…。
ですから、その「QuoyleMapは正しく動いていることを確認し、Pygameの画面に画像が表示されない原因を見つけ修正すること」がデバッグですよ。
読み込まれたmap_dataが正しいかどうかは元のマップデータを私は知らないので確認しようがありません。keito94さん自身で確認してみてください。

その上で読み込まれているmap_dataは正しいものとして考えると調べるべき箇所は、

・imageList[40]、imageList[34]には正しいデータが格納されているか
・screen.blit行の部分の処理は正しいか
 →imageList[40]やimageList[34]を指定した場合は描画されるか
  imageList[chip]の代わりに別の画像を指定した場合は描画されるか

などが考えられます。
その上でどういう場合に成功してどういう場合に失敗するかを絞り込み、意図せず失敗するパターンを修正するのがデバッグです。

少なくとも原因箇所の特定と不具合発生の条件の絞り込みはそろそろ自力でできるようになりましょう。
Advanced Supporting Developer
無理やりこじつけ(ぉ

アバター
沖 滉均
記事: 237
登録日時: 13年前
住所: K県F市

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#49

投稿記事 by 沖 滉均 » 6年前

もう答え書かれてしまっていますし、表示されない原因だけ言いますよ
QuoyleMapが正しく動いていることが前提として
画面を更新していないので表示されないのは当たり前です
マップのサンプルではなく、以前のコードでは画面を更新していましたよ
画面の更新方法は自分の過去のコードから探せばいいんじゃないですかね
There is no royal road to learning.
codeタグで指定できる言語
画像

アバター
keito94
記事: 264
登録日時: 7年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#50

投稿記事 by keito94 » 6年前

沖 滉均 さんが書きました:もう答え書かれてしまっていますし、表示されない原因だけ言いますよ
QuoyleMapが正しく動いていることが前提として
画面を更新していないので表示されないのは当たり前です
マップのサンプルではなく、以前のコードでは画面を更新していましたよ
画面の更新方法は自分の過去のコードから探せばいいんじゃないですかね
しまった、簡単なことにも気づかなかった!!
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
asd
記事: 319
登録日時: 13年前

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#51

投稿記事 by asd » 6年前

オフトピック
asd さんが書きました: ちなみに私だったらif文を使わずにつくると思います。
混乱させてしまうと思うので、そのやり方は本題が解決した後に余力があれば提示しますね。
本題については解決したようなので、棚上げしていた私の実装方法を提示して書き込みを終えたいと思います。
マップ読み込み部分だけ抜粋していますが、1行分のリスト_tmprowをまず作りそれをマップ全体のリスト__MAP_DATAに追加することでリストのリストを作成していました。
質問者のコードでは途中で方針転換して空のリストを追加してからそこに1行分のデータを追加するようになっていましたが、いずれの方法でもif文は不要ですね。

コード:

			# マップ読み込み
			self.__MAP_DATA = []
			for row in range(self.__MAP_H):
				_tmprow = [] # 1行分のリスト
				for col in range(self.__MAP_W):
					_tmprow.append(unpack('b', f.read(1))[0])
				self.__MAP_DATA.append(_tmprow)
作成したクラス全体をあげようか迷いましたがやめておきます。
Advanced Supporting Developer
無理やりこじつけ(ぉ

返信

“C言語何でも質問掲示板” へ戻る