0

Try 句と Except 句を含むコードが少しあります。IDLE のコンソールで実行すると、完全に動作し、クラッシュすることはありません。しかし、コンパイルするとエラーをキャッチできず、プログラムがクラッシュし、気が狂いそうになります!

コードは次のとおりです。

if self.height == 6:
    try:
        libtcod.path_compute(minimap[self.mapx][self.mapy].path3,self.x+60, self.y+60,target_x+60, target_y+60)
        stepx, stepy = libtcod.path_get(minimap[self.mapx][self.mapy].path3, 0)
        dx = stepx - self.x - 60
        dy = stepy - self.y - 60
    except:
        success = False  

libtcod ライブラリを使用しています。それは時々失敗する stepx/stepy ビットです。それはそれをキャッチしません!stepx セクションの前後にメッセージを出力しようとしましたが、最初の部分は出力されますが、後者は出力されません。成功 = False につながる可能性のあるオプションは多数あり、これは 1 つだけです。その後、成功 == False の場合に何が起こるかを扱います (これはゲーム用で、敵があなたにパスできるかどうかをテストし、そうでない場合は、その後、別のことを試みます)。アンコンパイル時にキャッチできるのに、コンパイル時に完全に失敗する理由がわかりません。誰かが私にこれを説明してもらえますか?

前もって感謝します!

4

1 に答える 1

3

プログラムをクラッシュさせる libtcod 関数に渡すすべての引数を確認してみてください (この場合はlibtcod.path_get)。libtcod は、適切なエラー メッセージを表示するのではなく、正しくない引数を渡すと、segfault を起こすことがよくあります。視野ツールキットでも同じ問題がありました。

何らかの理由でpy2exeで「コンパイル」されたバージョンでこれらの値が異なる場合、それが時々クラッシュする理由を説明できます。

この部分は問題があるように見えます:

minimap[self.mapx][self.mapy]

次のようなネストされた配列がある場合:

minimap = [[1, 2, 3, 4],
           [5, 6, 7, 8],
           [9, 10, 11, 12]]

次に、位置 (x, y) の項目を参照するには、次を使用する必要がありますminimap[y][x]

編集:

libtcod.path_getの最初の引数は、パス検索に使用されるマップである必要があります。これは、path_new_using_mapまたはによって返されdijkstra_newます。マップ内の正方形ごとに個別のマップは必要ありません。ドキュメントをもう少しよく読むべきだと思います: http://doryen.eptalys.net/data/libtcod/doc/1.5.0/index.html

于 2012-07-17T00:41:47.857 に答える