0
#!/usr/bin/python 

import time 
from array import *

THINKING  = 0
HUNGRY = 1
EATING = 2

class Philosopher: 
    def __init__(self):
        self.ph = array('i',[1, 2, 3, 4, 5])
        self.sleeptime = array('i',[30, 30, 30, 30, 30])

    def initialization_code(self):
        for i in range(self.ph.__len__()):
            self.ph[i] = THINKING

    def pickup(self,i):
        self.ph[i] = HUNGRY 
        self.test(i)
        if(EATING not in (self.ph[i])):
            while(EATING not in (self.ph[i])):
                time.sleep(self.sleeptime[i])

    def putdown(self,i):
        self.ph[i] = THINKING
        self.test((i+4)%5)
        self.test((i+1)%5)

    def test(self,i):
        if((2 not in (self.ph[(i+4)%5]))and(2 not in (self.ph[(i+1)%5]))and(self.ph[i]==HUNGRY)):
            self.ph[i] = EATING

    def start_process(self):
        for i in range(self.ph.__len__()):
            self.pickup(i)
            self.putdown(i)


    def display_status(self):
        for i in range(self.ph.__len__()):
            if (self.ph[i] == 0):
                print "%d is THINKING" % i+1
            elif (self.ph[i] == 1):
                print "%d is WAITING" % i+1
            elif (self.ph[i] == 2):
                print "%d is EATING" % i+1

phil = Philosopher()
phil.initialization_code()
phil.start_process()
phil.display_status()   

上記は、Pythonで食事する哲学者の問題を実装しようとしている私のコードです。このコードを実行すると、次のエラーが表示されます。

Traceback (most recent call last):

File "dining.py", line 59, in <module>

phil.start_process()

   File "dining.py", line 43, in start_process    
   self.pickup(i)    
   File "dining.py", line 27, in pickup    
   self.test(i)    
   File "dining.py", line 38, in test    
   if((2 not in (self.ph[(i+4)%5]))and(2 not in (self.ph[(i+1)%5]))and(self.ph[i]==HUNGRY)):
   TypeError: argument of type 'int' is not iterable

誰かがこれで私を助けてくれますか、なぜそれはこのエラーを示しているのですか?私はそれについて検索しましたが、解決できませんでした。前もって感謝します!!

4

3 に答える 3

6

方程式は整数になります。in整数には使用できません。

>>> 'foo' in 3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: argument of type 'int' is not iterable
于 2012-06-25T07:04:43.990 に答える
2

initerable とそのクラス定義にあるオブジェクトにのみ適用できるの問題に加えて__contains__、おそらく次の問題に遭遇するでしょう: 並列化がありません。したがって、スレッドを使用するか、

if(EATING not in (self.ph[i])):
    while(EATING not in (self.ph[i])):
        time.sleep(self.sleeptime[i])

EATING行 - 誰もステータスを設定しないため、無限ループです。

または、ウォールクロック時間を常にチェックするか、実行する必要があるアクションを処理するイベントスケジューリングシステムを作成するなど、他の方法でタイミングを設定する必要があります.

ところで: andの周りには優先順位が高いprint "%d is THINKING" % i+1ため、 も壊れています。()i+1%

于 2012-06-25T07:33:56.060 に答える
1

私はあなたが一般的に使用していると思います:

in / not in

間違って。行うべき整数を比較しようとしているようです

==
!=
>
>=
<
<=

代わりに演算子。

于 2012-06-25T07:14:10.383 に答える