PyQt4を使用して進化シミュレータアプリケーションを作成しています。 QGraphicsのシーンには「生き物」と「植生」があります。生き物は食べたときに収縮する植物を食べ、一定の大きさになると死んで現場から削除されます。飢えた生物も死ぬと削除されます。QGraphicsItemをシーンから削除する際のセグメンテーションエラー
問題は、シーンから植生アイテムを削除すると、セグメント違反が発生することです(直ちにではなく、時間がかかります)。これは生態系と同じ概念ではありますが、生態系を追加したときにのみ、生態系には発生しませんでした。私はアイテムを削除
特定のループは次のように(コードがコメントに置き換えコードのかなりの量と簡略化される)である。
dead = set()
items = self.scene.items()
for item in items:
if isinstance(item, Creature):
# Do some calculation to specify what creature does
for item1 in self.scene.items():
# Look through other items on scene and define interactions
if isinstance(item1, Creature):
# Specify what to do if current item is being compared to another creature
if isinstance(item1, Vegetation):
# Specify what to do if current item is being compared to vegetation
# If creature dies, add to dead set
dead.add(item)
elif isinstance(item, Vegetation):
# Do same as for creature (see above)
# If vegetation dies, add to dead set
dead.add(item)
# Get rid of all dead items from scene
while dead:
deadItem = dead.pop()
self.scene.removeItem(deadItem)
del deadItem
それからself.scene.removeItemラインをコメントアウト場合プログラムはクラッシュしません。
プログラムはもはや有効ではないメモリアドレスを呼び出しているようですが、何が原因であるのかわかりません。
アプリケーション全体がかなり長いので、ここには入れていませんが、必要に応じて追加することができます。
私はWindowsでPyQt4を使用してPython 3.4.3を実行しています。
アイテムの反復処理中にアイテムを削除するのは良い考えのようではありません。またはインデントが間違っていますか? – ekhumoro
私はあなたが話していることを見ます。私はそれを移動しようとしましたので、 'items for items'ループの外ですが、プログラムはまだクラッシュします。 –
私はあなたの投稿されたコードのインデントが間違っていると思います。 – strubbly