Hallo an Alle!
Ich binn neu Hier ich lerne gerade Python und wollte fragen ob Ich hier eine Aufgabe reinmachen kann und ob Ihr mir ein Paar moglichkeiten zur Losung hie lassen kannt.
Die Aufgabe Lautet:
• Das AliveCounter Signal ist 4-Bit lang ( => mögliche Werte: 0 … 15)
• Wir betrachten nur die AliveCounter Werte, nicht deren Timing.
• Der AliveCounter zählt normalerweise mit jedem Schritt/Botschaft um 1 hoch. Nach 15 kommt dann wieder die 0.
Dein Skript soll aber eine Toleranz für den gelegentlichen Ausfall eines Counts haben. Das heißt, das Signal darf
auch einen Sprung von 2 machen. Beispiel:
Das ist OK: 3 -> 4 -> 6 -> …
Das ist nicht OK: 3 -> 4 -> 7 -> …
• Das Skript sollte alle Stellen zurückmelden, an denen Fehler auftreten, inklusive Position in der Liste und Darstellung der Abweichung,
also z.B.
Fehler an Position #1234: 3 -> 5
Fehler an Position #534: 14 -> 1
AliveCounter zehler hilfe
def lineno():
return inspect.currentframe().f_back.f_lineno
for n in range(0, 16):
for x in range(0, n, 3):
if n + x == range:
print(n, 'war zu hoher sprung', x,lineno())
break
else:
print(n,'Ist okay',lineno())
Ich habe soweit dass hier Ich binn aber nicht sicher ob es korrekt funktioniert
return inspect.currentframe().f_back.f_lineno
for n in range(0, 16):
for x in range(0, n, 3):
if n + x == range:
print(n, 'war zu hoher sprung', x,lineno())
break
else:
print(n,'Ist okay',lineno())
Ich habe soweit dass hier Ich binn aber nicht sicher ob es korrekt funktioniert
Wo sind denn Deine Inputs, das AliveCounter-Signal? Du hast ja nur Ranges, also aufsteigende Zahlen.
Warum hast Du zwei for-Schleifen? n + x kann niemals gleich dem range-Typ sein. Die maximal erlaubte Sprunghöhe mußt Du am Anfang als Konstante definieren und mit der vergleichen.
Warum hast Du zwei for-Schleifen? n + x kann niemals gleich dem range-Typ sein. Die maximal erlaubte Sprunghöhe mußt Du am Anfang als Konstante definieren und mit der vergleichen.
Ich glaube auch das du da ein massives Missverständnis hast, was die Fehlerposition angeht. Deinen Dozenten interessiert dich nicht, in welcher Zeile des Skriptes das war. Sondern an welcher Stelle im Datenstrom das aufgetreten ist.
Momentan bin Ich Hier :
a = 0
list1 = [1, 2, 3, 4, 5, 6, 9, 10, 11, 12, 13, 14, 15, 16]
ideal = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
list2 = [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3]
def ac_check(ac_list):
idx=1
letzter_Wert = ac_list[0] # initalisierung
for ac_value in ac_list[1:]:
idx = idx + 1
#print(str(idx) +".ter Wert:" + str(ac_value))
# check if value is in a valid range
if (ac_value >= 0 | ac_value <= 15):
#GOOD
#print "OK"
pass
else:
print(str(idx) +".ter Wert:" + str(ac_value))
print ">>> ERROR: out of range!", ac_value
# Sprung ist ok? nur +1
## print "vorheriger Wert: ", ac_list[idx-2]
#print "vorheriger Wert: ", letzter_Wert
if (ac_value == (letzter_Wert + 1)%16) or (ac_value == (letzter_Wert + 2)%16):
#print "OK: Inkrement == 1 or 2"
pass
else:
print(str(idx) +".ter Wert:" + str(ac_value))
print ">>> ERROR: Inkrement <> 1 or 2: "+ str(letzter_Wert) + "->" +str(ac_value)
letzter_Wert = ac_value
ac_check(list2)
a = 0
list1 = [1, 2, 3, 4, 5, 6, 9, 10, 11, 12, 13, 14, 15, 16]
ideal = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
list2 = [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3]
def ac_check(ac_list):
idx=1
letzter_Wert = ac_list[0] # initalisierung
for ac_value in ac_list[1:]:
idx = idx + 1
#print(str(idx) +".ter Wert:" + str(ac_value))
# check if value is in a valid range
if (ac_value >= 0 | ac_value <= 15):
#GOOD
#print "OK"
pass
else:
print(str(idx) +".ter Wert:" + str(ac_value))
print ">>> ERROR: out of range!", ac_value
# Sprung ist ok? nur +1
## print "vorheriger Wert: ", ac_list[idx-2]
#print "vorheriger Wert: ", letzter_Wert
if (ac_value == (letzter_Wert + 1)%16) or (ac_value == (letzter_Wert + 2)%16):
#print "OK: Inkrement == 1 or 2"
pass
else:
print(str(idx) +".ter Wert:" + str(ac_value))
print ">>> ERROR: Inkrement <> 1 or 2: "+ str(letzter_Wert) + "->" +str(ac_value)
letzter_Wert = ac_value
ac_check(list2)
Die print-Anweisungen lassen befürchten, dass Du noch Python2 benutzt. Steige auf Python3 um, Python2 ist veraltet und sollte nicht mehr verwendet werden.
Benutze keine Abkürzungen, wenn Du activity_counter_check meinst, schreib das auch.
Wenn Du zusätzlich zum Wert in einer for-Schleife auch noch einen Index brauchst, benutze enumerate.
Warum darf der erste Wert außerhalb 0 und 15 liegen?
| ist eine Bit-Operation, die darf man bei logischen Vergleichen nicht benutzen, da ist das Schlüsselwort `or`.
String setzt man nicht mit str und + zusammen, sondern benutzt Formatstrings.
Mische nicht Englisch und Deutsch, am besten benennst Du alles in englischer Sprache. Variablennamen werden komplett klein geschrieben.
Benutze keine Abkürzungen, wenn Du activity_counter_check meinst, schreib das auch.
Wenn Du zusätzlich zum Wert in einer for-Schleife auch noch einen Index brauchst, benutze enumerate.
Warum darf der erste Wert außerhalb 0 und 15 liegen?
| ist eine Bit-Operation, die darf man bei logischen Vergleichen nicht benutzen, da ist das Schlüsselwort `or`.
String setzt man nicht mit str und + zusammen, sondern benutzt Formatstrings.
Mische nicht Englisch und Deutsch, am besten benennst Du alles in englischer Sprache. Variablennamen werden komplett klein geschrieben.
Code: Alles auswählen
def activity_counter_check(activity_counter):
last_value = activity_counter[0] # initalisierung
for index, value in enumerate(activity_counter[1:], 2):
# check if value is in a valid range
if not 0 <= value <= 15:
print(f"{index}.ter Wert: {value} >>> ERROR: out of range!")
# Sprung ist ok? nur +1
if (value - last_value) % 16 not in (1,2):
print(f"{index}.ter Wert: {value} >>> ERROR: Inkrement <> 1 or 2: {last_value} -> {value}")
last_value = value