2014-09-26 4 views
-3
def adder(l1,l2,op): 

    if(op == 0): 

     carry = 0 
     result = [] 
     l1.reverse() 
     l2.reverse() 

     for x in range(0, 4): 

      sum = l1[x] + l2[x] + carry 

      if(sum == 0): 
       result[x] = 0 
       carry = 0 
      elif(sum == 1): 
       result[x] = 1 
       carry = 0 
      elif(sum == 2): 
       result[x] = 0 
       carry = 1 
      elif(sum == 3): 
       result[x] = 1 
       carry = 1 

      if(x == 2): 
       carry_in = carry 
      if(x == 3): 
       carry_out = carry 

    result.reverse() 

    overflow = carry_in^carry_out 
    sign = result[3] 
    zero = not(result[0] | result[1] | result[2] | result[3]) 
    sign_of_true_result = overflow^sign 

    print result,carry,overflow,sign,zero,sign_of_true_result 


number1 = [] 
number2 = [] 
print "Enter the bits of number 1 one by one: " 

x = 0 
while(x < 4): 

    digit_1 = raw_input() 

    if(digit_1 != '0' and digit_1 != '1'): 
     print "Please enter either 0 or 1" 
     continue 
    else: 
     x = x + 1 
     number1.append(int(digit_1)) 

print "Enter the bits of number 2 one by one: " 

y = 0  
while(y < 4): 

    digit_2 = raw_input() 

    if(digit_2 != '0' and digit_2 != '1'): 
     print "Please enter either 0 or 1" 
     continue 
    else: 
     y = y + 1 
     number2.append(int(digit_2)) 

op = int(raw_input("Press 0 for addition or 1 for substraction (Op): ")) 

if __name__ == '__main__': 
    adder(number1,number2,op) 

Я пытаюсь реализовать двоичный сумматор для 4 бит. Я получаю следующую ошибку. В чем проблема с линией 22? Я не понимаю, почему существует ошибка вне диапазона.Ошибка трассировки (последний последний звонок) в python

Ошибка:

Traceback (most recent call last): 
    File "ex9.py", line 85, in <module> 
    adder(number1,number2,op) 
    File "ex9.py", line 22, in adder 
    result[x] = 0 
IndexError: list assignment index out of range 
+0

Чтобы понять, почему это ошибка, вы должны знать, что находится в 'x' и что находится в' result'. Вы можете найти это с помощью отладчика или интерактивного визуализатора или просто добавить «print (x, result)» прямо перед этой строкой, а затем рассказать нам, что вы видите. Или, что еще лучше, вы можете разделить это на [минимальный, полный, проверяемый пример] (http://stackoverflow.com/help/mcve), который кто-то может, возможно, понять и отладить с первого взгляда или, может быть, запустить для себя, чтобы найти вашу проблему. (Это включает в себя вход, а не только код! Или, еще лучше, жесткий код ввода в ваш пример.) – abarnert

+0

В любом случае, я могу нанести такой же удар, даже не прочитав код: вы реализовали перенос, вы добавив два 4-разрядных номера, вы, вероятно, сохраните результат в списке из 4 бит, а если вы переполняете или переполняете, вы пытаетесь установить бит пятый бит, которого не существует. – abarnert

+0

Я запускаю цикл for 4 раза, чтобы добавить все четыре бита. Не указывать пятый бит.В любом случае эта ошибка не важна, я могу понять, отлаживая ее. Меня больше интересует первая ошибка, которая возникает в строке 85. Я сделал свое полное исследование, прежде чем задавать этот вопрос. :) – Aashil

ответ

1

Вы начинаете с этим:

result = [] 

Так result не имеет значения.

В первый раз через петлю, x является 0, и вы пытаетесь передать result[0] к либо 0 или 1. Но там is нет result[0]. Таким образом, вы получаете IndexError.

Вы можете увидеть то же самое в гораздо более простой пример:

>>> result = [] 
>>> result[0] = 0 
IndexError: list assignment index out of range 

Вы либо должны реорганизовать свой код так, что вы добавляете или предварять биты, как вы получаете их, или вам необходимо предварительно заполнить result с, например, [None, None, None, None] или [0, 0, 0, 0] или что-то еще, чтобы result[0] имеет смысл.


I am more interested in the first error which occurs at line 85.

Вы на самом деле не ошибка в строке 85. Обратите внимание, что отладочные показывает "самый последний вызов последнего":

Traceback (most recent call last): 
    File "ex9.py", line 85, in <module> 
    adder(number1,number2,op) 
    File "ex9.py", line 22, in adder 
    result[x] = 0 
IndexError: list assignment index out of range 

result[x] = 0 в строке 22, в adder, поднял IndexError, потому что x is 0 и result пуст.

adder(number1,number2,op) на линии 85, на верхнем уровне модуля, поднял IndexError, потому что называется функция, которая подняла IndexError и не имеют try:/except IndexError: (или некоторый суперкласс IndexError) вокруг этого вызова.

И, поскольку это было на верхнем уровне, в вашем коде нет места выше, чтобы его можно было обрабатывать, поэтому интерпретатор обрабатывает его, распечатывая трассировку и выходя из нее.

+0

Это было тщательное и полное объяснение. Так что я обо мне. Странно, что еще одна ошибка исчезла, когда я исправил эту ошибку. Любые объяснения по этому поводу? – Aashil

+0

@Aashil: Не зная, что произошло с другой ошибкой, или какое решение вы использовали для исправления этой ошибки, я не думаю, что могу это объяснить ... – abarnert

+0

@Aashil: На самом деле, я думаю, я, возможно, понял, что вы имеете в виду. См. Мое редактирование. – abarnert

 Смежные вопросы

  • Нет связанных вопросов^_^