合計 昨日 今日

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

[このトピックは解決済みです]

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

Name: keito94
[URL]
プログラマー(30,585 ポイント)
Date: 2017年7月29日(土) 12:42
No: 1
(OFFLINE)

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

今、Pythonを使って、MapEditor Quoyle ver0.8のヘルプを参考に、Quolyeで作ったマップデータのローダーを作っているのですが
Pythonのランダムアクセスについて調べていると、
https://docs.python.jp/3/library/linecache.html
テキストライン関係のものしか出ません。
どうやってバイト単位でのランダムアクセスを行うのですか?
プログラムは完全に無理だったけど、完全フリーのゲームエンジンGodotに出会ってからはボクの人生は変わった…。
Godotを試したい人は、ここで。
一応プログラムの履歴は、C言語+DXライブラリ→Python+Pygame→Godot Engine。
まあ、プログラム学ぶより、ゲームエンジンなり、ツクールなり使えば楽だということよ。
Godot広まらないかな…。(空想)

Name: keito94
[URL]
プログラマー(30,585 ポイント)
Date: 2017年7月29日(土) 12:57
No: 2
(OFFLINE)

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

Pythonのreadをよく読めばいいだけのことでした。
お付き合い頂きありがとうございました。
プログラムは完全に無理だったけど、完全フリーのゲームエンジンGodotに出会ってからはボクの人生は変わった…。
Godotを試したい人は、ここで。
一応プログラムの履歴は、C言語+DXライブラリ→Python+Pygame→Godot Engine。
まあ、プログラム学ぶより、ゲームエンジンなり、ツクールなり使えば楽だということよ。
Godot広まらないかな…。(空想)

Name: keito94
[URL]
プログラマー(30,585 ポイント)
Date: 2017年7月29日(土) 13:15
No: 3
(OFFLINE)

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

でも、Pythonのread機能で、どうやってバイナリデータのランダムアクセスとバイト数だけ読み込みを実現させるのかがわからない…。
すいません解決はなかったことにしてください。
最後に編集したユーザー keito94 [ 2017年7月29日(土) 13:24 ], 累計 1 回
プログラムは完全に無理だったけど、完全フリーのゲームエンジンGodotに出会ってからはボクの人生は変わった…。
Godotを試したい人は、ここで。
一応プログラムの履歴は、C言語+DXライブラリ→Python+Pygame→Godot Engine。
まあ、プログラム学ぶより、ゲームエンジンなり、ツクールなり使えば楽だということよ。
Godot広まらないかな…。(空想)

Name: keito94
[URL]
プログラマー(30,585 ポイント)
Date: 2017年7月29日(土) 13:23
No: 4
(OFFLINE)

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

とりあえずソースコード。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 細かいデータは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
プログラムは完全に無理だったけど、完全フリーのゲームエンジンGodotに出会ってからはボクの人生は変わった…。
Godotを試したい人は、ここで。
一応プログラムの履歴は、C言語+DXライブラリ→Python+Pygame→Godot Engine。
まあ、プログラム学ぶより、ゲームエンジンなり、ツクールなり使えば楽だということよ。
Godot広まらないかな…。(空想)

Name: Hiragi(GKUTH)
[URL]
熟練のプログラマー(55,184 ポイント)
Date: 2017年7月30日(日) 01:05
No: 5
(OFFLINE)

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

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

Name: shira211
[URL]
かけだし(1,370 ポイント)
Date: 2017年7月30日(日) 07:59
No: 6
(OFFLINE)

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

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

Name: keito94
[URL]
プログラマー(30,585 ポイント)
Date: 2017年7月30日(日) 13:40
No: 7
(OFFLINE)

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

shira211 さんが書きました:エンディアンの言葉の使い方が間違っています。リトル・ビッグエンディアンではなく、下位・上位バイトと呼ぶのが適切かと思います。

ごめんなさい、訂正しておきますね…。

それ以外の用語も、もしかしたら間違って使っているのではないですか?
ランダムアクセスとバイト数だけ読み込みとは、具体的にどのような動作を指すのでしょうか?

ランダムアクセスはread()関数を使えばできるということはわかりました。
ですが、
①ランダムアクセスは簡単にできた。
②でも、(Pythonにおける)1バイト単位のアクセスのやり方がわからない
これくらいでしょうか…。
プログラムは完全に無理だったけど、完全フリーのゲームエンジンGodotに出会ってからはボクの人生は変わった…。
Godotを試したい人は、ここで。
一応プログラムの履歴は、C言語+DXライブラリ→Python+Pygame→Godot Engine。
まあ、プログラム学ぶより、ゲームエンジンなり、ツクールなり使えば楽だということよ。
Godot広まらないかな…。(空想)

Name: Hiragi(GKUTH)
[URL]
熟練のプログラマー(55,184 ポイント)
Date: 2017年7月30日(日) 14:08
No: 8
(OFFLINE)

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

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

Name: keito94
[URL]
プログラマー(30,585 ポイント)
Date: 2017年7月30日(日) 14:33
No: 9
(OFFLINE)

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

[解決!]

Hiragi(GKUTH) さんが書きました:seek関数を使用する必要があると思います。

わかりました!!seek関数を使えばいいんですね!!
ありがとうございました!!
プログラムは完全に無理だったけど、完全フリーのゲームエンジンGodotに出会ってからはボクの人生は変わった…。
Godotを試したい人は、ここで。
一応プログラムの履歴は、C言語+DXライブラリ→Python+Pygame→Godot Engine。
まあ、プログラム学ぶより、ゲームエンジンなり、ツクールなり使えば楽だということよ。
Godot広まらないかな…。(空想)

Name: keito94
[URL]
プログラマー(30,585 ポイント)
Date: 2017年7月30日(日) 14:55
No: 10
(OFFLINE)

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

[解決!]

しまった解決押し忘れた(><)
プログラムは完全に無理だったけど、完全フリーのゲームエンジンGodotに出会ってからはボクの人生は変わった…。
Godotを試したい人は、ここで。
一応プログラムの履歴は、C言語+DXライブラリ→Python+Pygame→Godot Engine。
まあ、プログラム学ぶより、ゲームエンジンなり、ツクールなり使えば楽だということよ。
Godot広まらないかな…。(空想)

Name: asd
[URL]
熟練のプログラマー(67,423 ポイント)
Date: 2017年7月30日(日) 15:37
No: 11
(OFFLINE)

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

[解決!]

keito94 さんが書きました:
Hiragi(GKUTH) さんが書きました:seek関数を使用する必要があると思います。

わかりました!!seek関数を使えばいいんですね!!
ありがとうございました!!


最終的にseek関数を使ったソースが出来上がったらそれを解決の証として貼り付けておいてください。
Advanced Supporting Developer
無理やりこじつけ(ぉ

Name: keito94
[URL]
プログラマー(30,585 ポイント)
Date: 2017年7月31日(月) 14:13
No: 12
(OFFLINE)

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

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 細かいデータは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


多分これ効率が悪いのかもしれませんけど…。

Offtopic :
沖さんの日記のASDさんのコメント読みました…。
これから態度を改められる訓練をしなければ…。
プログラムは完全に無理だったけど、完全フリーのゲームエンジンGodotに出会ってからはボクの人生は変わった…。
Godotを試したい人は、ここで。
一応プログラムの履歴は、C言語+DXライブラリ→Python+Pygame→Godot Engine。
まあ、プログラム学ぶより、ゲームエンジンなり、ツクールなり使えば楽だということよ。
Godot広まらないかな…。(空想)

Name: keito94
[URL]
プログラマー(30,585 ポイント)
Date: 2017年7月31日(月) 15:06
No: 13
(OFFLINE)

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

さっき書いたコードは効率がかなり悪いことに気づいて、load関数というものを作りました。
コード[C++]: 全て選択
1
2
3
4
5
    # ファイルから一文字読み出す。nは読み込むファイルのオフセット。
    def load(self,n):
        self.fn.seek(n)
        self.fn.read(1)
        self.fn.seek(-n)

すると、どうでしょう!!
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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

コードがかなりすっきりしました。
今度こそありがとうございました。

Offtopic :
今回の教訓。最後まで確認してから解決させるべし。
プログラムは完全に無理だったけど、完全フリーのゲームエンジンGodotに出会ってからはボクの人生は変わった…。
Godotを試したい人は、ここで。
一応プログラムの履歴は、C言語+DXライブラリ→Python+Pygame→Godot Engine。
まあ、プログラム学ぶより、ゲームエンジンなり、ツクールなり使えば楽だということよ。
Godot広まらないかな…。(空想)

Name: asd
[URL]
熟練のプログラマー(67,423 ポイント)
Date: 2017年7月31日(月) 15:57
No: 14
(OFFLINE)

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

解決したソースの投稿ありがとうございました。
解決したのであれば解決!にチェックを入れておいてください。

keito94 さんが書きました:
Offtopic :
沖さんの日記のASDさんのコメント読みました…。
これから態度を改められる訓練をしなければ…。


オフトピックにツッコミいれるのもなんですが、このトピック外の話を混ぜるのやめませんか?
第三者からみて意味が分からなくなりますので。
Advanced Supporting Developer
無理やりこじつけ(ぉ

Name: ISLe
[URL]
ハッカー(262,780 ポイント)
Date: 2017年7月31日(月) 17:12
No: 15
(OFFLINE)

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

Offtopic :
ファイルの先頭から10バイトは順番に読み込むだけだし
structモジュールとかいうのを使うと複数バイトデータの変換が楽にできるらしい。
こんな感じ?(未検証)
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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とかの関数作って置き換える流れが順当。

Name: 沖 滉均
[URL]
熟練のプログラマー(50,788 ポイント)
Date: 2017年7月31日(月) 18:49
No: 16
(OFFLINE)

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

keito94 さんが書きました:さっき書いたコードは効率がかなり悪いことに気づいて、load関数というものを作りました。
コード[C++]: 全て選択
1
2
3
4
5
    # ファイルから一文字読み出す。nは読み込むファイルのオフセット。
    def load(self,n):
        self.fn.seek(n)
        self.fn.read(1)
        self.fn.seek(-n)

Offtopic :
今回の教訓。最後まで確認してから解決させるべし。

とりあえず返信しますが動作確認しましたか?

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

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

Name: keito94
[URL]
プログラマー(30,585 ポイント)
Date: 2017年7月31日(月) 19:17
No: 17
(OFFLINE)

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

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

readShortとreadByteがネイティブコード(C言語)で書かれた変数をPythonの整数に変換するというのはわかるのですが…。
それのヒントらしきものはありますか?
プログラムは完全に無理だったけど、完全フリーのゲームエンジンGodotに出会ってからはボクの人生は変わった…。
Godotを試したい人は、ここで。
一応プログラムの履歴は、C言語+DXライブラリ→Python+Pygame→Godot Engine。
まあ、プログラム学ぶより、ゲームエンジンなり、ツクールなり使えば楽だということよ。
Godot広まらないかな…。(空想)

Name: asd
[URL]
熟練のプログラマー(67,423 ポイント)
Date: 2017年8月01日(火) 09:20
No: 18
(OFFLINE)

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

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

readShortとreadByteがネイティブコード(C言語)で書かれた変数をPythonの整数に変換するというのはわかるのですが…。
それのヒントらしきものはありますか?


オフトピックにだけ反応してload関数対応版について、沖さん指摘の動作確認をしたかどうかはスルーですか?

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

Name: 沖 滉均
[URL]
熟練のプログラマー(50,788 ポイント)
Date: 2017年8月01日(火) 10:07
No: 19
(OFFLINE)

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

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

readShortとreadByteがネイティブコード(C言語)で書かれた変数をPythonの整数に変換するというのはわかるのですが…。
それのヒントらしきものはありますか?

structモジュールって書いてあるのだからドキュメントを読んではいかがですか?
Python 3.6.1 ドキュメント
There is no royal road to learning.
[code]タグで指定できる言語
沖の雑記帳

Name: keito94
[URL]
プログラマー(30,585 ポイント)
Date: 2017年8月01日(火) 13:46
No: 20
(OFFLINE)

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

2バイトのやつはリトルエンディアンですよ。(output_d.htmlを読めばわかりますが…。)
さてさて、readShortと、readByteを完成させました。
コード[C++]: 全て選択
1
2
3
4
5
    def readShort(self,val):
        return unpack('<h',val)[0]
 
    def readByte(self,val):
        return unpack('b',val)[0]

ですが、以下のようなエラーが出ました。
ボクとしては惜しい所まで来たのですが…。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
マップの幅を獲得します。
マップの高さを獲得します。
マップチップの幅を獲得します。
マップチップの高さを獲得します。
レイヤーの数を獲得します。
チップカウントを獲得します。
マップチップの位置を読み取ります。
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には、使用しているマップファイルのデータが入っています。
ドキュメントはよく読んだのですが、

Offtopic :
自分の脳内だけで補完せず、やりたいことを他人に伝える。
それが傲慢な態度、卒業の鍵。
添付ファイル
output_d.zip
(2.34 KiB) ダウンロード数: 13 回
プログラムは完全に無理だったけど、完全フリーのゲームエンジンGodotに出会ってからはボクの人生は変わった…。
Godotを試したい人は、ここで。
一応プログラムの履歴は、C言語+DXライブラリ→Python+Pygame→Godot Engine。
まあ、プログラム学ぶより、ゲームエンジンなり、ツクールなり使えば楽だということよ。
Godot広まらないかな…。(空想)

Name: asd
[URL]
熟練のプログラマー(67,423 ポイント)
Date: 2017年8月01日(火) 14:43
No: 21
(OFFLINE)

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

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

いろいろツッコミを入れたいところですがどうせスルーされちゃうと思うので1点のみに絞って指摘しておきます。

keito94 さんが書きました:ですが、以下のようなエラーが出ました。
ボクとしては惜しい所まで来たのですが…。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
マップの幅を獲得します。
マップの高さを獲得します。
マップチップの幅を獲得します。
マップチップの高さを獲得します。
レイヤーの数を獲得します。
チップカウントを獲得します。
マップチップの位置を読み取ります。
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
無理やりこじつけ(ぉ

Name: 沖 滉均
[URL]
熟練のプログラマー(50,788 ポイント)
Date: 2017年8月01日(火) 15:24
No: 22
(OFFLINE)

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

keito94 さんが書きました:2バイトのやつはリトルエンディアンですよ。(output_d.htmlを読めばわかりますが…。)
さてさて、readShortと、readByteを完成させました。
コード[C++]: 全て選択
1
2
3
4
5
    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]タグで指定できる言語
沖の雑記帳

Name: keito94
[URL]
プログラマー(30,585 ポイント)
Date: 2017年8月01日(火) 15:35
No: 23
(OFFLINE)

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

沖 滉均 さんが書きました:あと、前回のload関数が値を返していない件に関しても返答がありませんね

load関数はソースコードを見ればわかるように都合により廃止されました。
というか、structを使う方針に変更しました。
プログラムは完全に無理だったけど、完全フリーのゲームエンジンGodotに出会ってからはボクの人生は変わった…。
Godotを試したい人は、ここで。
一応プログラムの履歴は、C言語+DXライブラリ→Python+Pygame→Godot Engine。
まあ、プログラム学ぶより、ゲームエンジンなり、ツクールなり使えば楽だということよ。
Godot広まらないかな…。(空想)

Name: 沖 滉均
[URL]
熟練のプログラマー(50,788 ポイント)
Date: 2017年8月01日(火) 15:42
No: 24
(OFFLINE)

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

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

Name: ISLe
[URL]
ハッカー(262,780 ポイント)
Date: 2017年8月01日(火) 16:34
No: 25
(OFFLINE)

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

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

keito94さんの提示したコードでビッグエンディアンとして処理しているのをそのまま書き換えたのですよ。

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

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

Name: keito94
[URL]
プログラマー(30,585 ポイント)
Date: 2017年8月01日(火) 16:34
No: 26
(OFFLINE)

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

沖 滉均 さんが書きました:ソースコードを見ればわかるように?
どこにそのようなソースコードがあるのですか?

output_d.zipのquoyletestの中に入ってると思うのですが…。
ちょっと不適切な名前だったので添付するファイルを修正しますね。(ソースコードは少し変えてます。)

今回のデバッグでわかったこと。
①レイヤーのアドレスの位置は(layer-1)で表す。
②流石にまずいと思い、load関数と、readByteを組み合わせた関数を作った。
③しかし、今のコードではnindexが適切な値を返さず、
コード[C++]: 全て選択
1
TypeError: a bytes-like object is required, not 'int'

エラーを返す。
この場合どうすればいいのでしょうか?
添付ファイル
quoyletest.zip
(24.56 KiB) ダウンロード数: 8 回
プログラムは完全に無理だったけど、完全フリーのゲームエンジンGodotに出会ってからはボクの人生は変わった…。
Godotを試したい人は、ここで。
一応プログラムの履歴は、C言語+DXライブラリ→Python+Pygame→Godot Engine。
まあ、プログラム学ぶより、ゲームエンジンなり、ツクールなり使えば楽だということよ。
Godot広まらないかな…。(空想)

Name: 沖 滉均
[URL]
熟練のプログラマー(50,788 ポイント)
Date: 2017年8月01日(火) 17:08
No: 27
(OFFLINE)

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

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

Name: keito94
[URL]
プログラマー(30,585 ポイント)
Date: 2017年8月01日(火) 17:16
No: 28
(OFFLINE)

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

沖 滉均 さんが書きました:output_d.zipの中身確認してみましたか?quoyletestなんてフォルダは入っていませんよ。

ごめんなさい、ファイルの中身をよく確認すべきでした…。
プログラムは完全に無理だったけど、完全フリーのゲームエンジンGodotに出会ってからはボクの人生は変わった…。
Godotを試したい人は、ここで。
一応プログラムの履歴は、C言語+DXライブラリ→Python+Pygame→Godot Engine。
まあ、プログラム学ぶより、ゲームエンジンなり、ツクールなり使えば楽だということよ。
Godot広まらないかな…。(空想)

Name: 沖 滉均
[URL]
熟練のプログラマー(50,788 ポイント)
Date: 2017年8月01日(火) 17:55
No: 29
(OFFLINE)

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

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

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

Name: keito94
[URL]
プログラマー(30,585 ポイント)
Date: 2017年8月01日(火) 18:55
No: 30
(OFFLINE)

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

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

ごめんなさい…。勝手な転載等はしないよう心がけます…。

いろいろツッコミを入れたいところですがどうせスルーされちゃうと思うので1点のみに絞って指摘しておきます。
エラーが出たからだれかデバッグしてー、直し方教えてーではデバッグにはなりませんよ。
・エラーメッセージが何を意味しているか調べましたか?
・発生している場所がどこかは分かりますか?
・printデバッグで各パラメータを調べましたか?

もし自分でデバッグにあたりやったことがあればやったことを書いておくとよいですよ。


分かりました、書きますね。
コード[C++]: 全て選択
1
2
3
4
5
6
    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に違和感があることに気づき、
コード[C++]: 全て選択
1
2
3
4
5
6
7
    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)

そして、頭を悩ませた以下のエラーの原因もわかりました。
コード[C++]: 全て選択
1
2
3
4
5
6
7
  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

マップデータを表す配列が一列しかない上に、存在しない二列目に書き込もうとして以上のエラーが発生している模様です。
解決方法は、新たに二列目の配列を作る必要がある模様です。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
    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) ダウンロード数: 9 回
プログラムは完全に無理だったけど、完全フリーのゲームエンジンGodotに出会ってからはボクの人生は変わった…。
Godotを試したい人は、ここで。
一応プログラムの履歴は、C言語+DXライブラリ→Python+Pygame→Godot Engine。
まあ、プログラム学ぶより、ゲームエンジンなり、ツクールなり使えば楽だということよ。
Godot広まらないかな…。(空想)

次へ

Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: kinokawa & ゲスト[21人]