AliveCounter zehler hilfe

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Dugeron
User
Beiträge: 5
Registriert: Dienstag 8. Dezember 2020, 11:01

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
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Leg los und zeig uns, was du bisher hast.
Wenn du nicht mehr weiter kommst oder etwas nicht verstehst, helfen wir dir gerne weiter.

Dass du hier einfach eine fertige Lösung bekommst, ist eher unwahrscheinlich.
Dugeron
User
Beiträge: 5
Registriert: Dienstag 8. Dezember 2020, 11:01

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
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Dugeron
User
Beiträge: 5
Registriert: Dienstag 8. Dezember 2020, 11:01

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)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte benutze die Code Tags. Das ist der </>-Knopf im vollständigen Editor.

Und ein Fehler ist schon mal zu sehen: du hast 16 als wert. Das ist nicht erlaubt.
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

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.

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
Antworten