Форум сайта python.su
0
Ребят, вопрос в следующем, использую процедуру для обсчета некоторых данных, на выходе она должна давать 2 значения. Почему то иногда появляется следующая ошибка:
IndexError: index out of range: 3 in <script> at line number 230
Вот мой упрощенный кусок кода:
def GEO_attitude(): lan1 = 2.3474 lan2 = 5.049 lat1 = 384.3 lat2 = 384.3888 lan0 = (lan1 + lan2) / 2 lat0 = (lat1 + lat2) / 2 return lan0, lat0 ##################### lan, lat = GEO_attitude() # это и есть строчка 230
Офлайн
568
Нужен код полностью
Офлайн
0
вот полный кусок кода с процедурой
##################################################################### # Процедура по определению GPS данных c двойной проверкой def GEO_attitude(): waiting = True lan0 = 0 lat0 = 0 lan1 = 0 lat1 = 0 lan2 = 0 lat2 = 0 while waiting: # Цикл по выкачиванию данных с GPS модуля data = tn.read_until("*") lines = data.split("\n") for line in lines: # Цикл обработки закаченной информации по строками values = line.split(',') # Разбиваем данные по запятым и ищем нужные строки if values[0] == '$GPGGA' or values[0] == '$GPRMC': if values[0] == '$GPRMC': if lan1 < 0.0001 or lat1 < 0.0001: # Записываем данные try: lan1 = float(values[3]) lat1 = float(values[5]) timeUTC = float(values[1]) except ValueError: data = [] else: try: lan2 = float(values[3]) lat2 = float(values[5]) timeUTC = float(values[1]) except ValueError: data = [] if lan1 > 0 and lan2 > 0: # Сравниваем данные на актуальность if (abs(lan1 - lan2) < 60.00 / 10000) and (abs(lat1 - lat2) < 60.00/ 10000): lan0 = (lan1 + lan2) / 2 # Сохраняем усредненные данные lat0 = (lat1 + lat2) / 2 print 'CurrentPosition:' print lan0 print lat0 print 'Time: ' print timeUTC waiting = False # break else : lat1 = lat2 # Сохраняем вторичные данные и закачиваем данные снова lan1 = lan2 data = '' lines = '' else: if lan1 < 0.0001 or lat1 < 0.0001: try: lan1 = float(values[2]) lat1 = float(values[4]) timeUTC = float(values[1]) except ValueError: data = [] else: try: lan2 = float(values[2]) lat2 = float(values[4]) timeUTC = float(values[1]) except ValueError: data = [] if lan1 > 0 and lan2 > 0: if (abs(lan1 - lan2) < 60.00 / 10000) and (abs(lat1 - lat2) < 60.00/ 10000): # Сравниваем данные на актуальность (проблема отсева данных по времени) lan0 = (lan1 + lan2) / 2 lat0 = (lat1 + lat2) / 2 print 'CurrentPosition: ' print lan0 print lat0 print 'Time: ' print timeUTC waiting = False # break else : lat1 = lat2 # Сохраняем вторичные данные и закачиваем снова lan1 = lan2 data = '' lines = '' return lan0, lat0 #################### # Полет к заданной точке l = 0 FlightMode = True while l < QuantityPoints : print 'NEW POINT POSITION' print pointLan[l] print pointLat[l] while FlightMode: lan, lat = GEO_attitude() ######## Дальше думаю код не нужен.
Офлайн
47
и полный Traceback
Офлайн
568
сделай принт на values, 100% ошибка в данных
Офлайн
0
Странно, ошибка просто не регулярная и перед тем как сохранить данные я их проверяю, что они действительно числовые и входят в определенный диапазон.
Попробую сделать принты. и кстати ошибка когда вылазит, то там разные цифры идут от 2х до 5ти точно.
IndexError: index out of range: 5 in <script> at line number 230
Отредактировано robot_chickn (Июнь 5, 2013 13:20:22)
Офлайн
0
а какие могут поступать данные, чтобы вызвать эту ошибку именно на этой строчке,а не внутри процедуры??
Офлайн
568
index out of range возникает, когда программа пытается обратиться к элементу списка или кортежа, которого не существует. У тебя это может возникнуть в любом месте, где ты делаешь подобное
lan1 = float(values[2])
Офлайн