Datenstruktur Variable mit 2 Namen.

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

Wie sollte denn in Flanke.pos deiner Meinung nach Self.alt_val gesetzt werden, wenn du aus beiden if-Zweigen darüber mit Return die Methode verlässt?
rob87
User
Beiträge: 45
Registriert: Donnerstag 17. Oktober 2019, 14:24

__blackjack__ hat geschrieben: Donnerstag 23. September 2021, 11:46 @rob87: Da ist ein unbenutztes `input_richtung` auf Modulebene. Und was ist denn bei Dir Zeile 38? Bei mir ist das ``if input+add > 1.0:`` in der `simu_input()`-Funktion.

Code: Alles auswählen

print(self.alt_val)
In `Flanke.pos()` und `Flanke.neg()` steht jeweils toter Code nach dem ``if``/``else``. Denn dort steht in beiden Zweigen ein ``return``, womit der Code danach nie ausgeführt werden kann.
Ok wird nach "return" kein Code mehr abgearbeitet? dann müsste man es so umschrieben:

Code: Alles auswählen

	def pos(self,val,schwelle= 0.75):
		if val > schwelle and self.alt_val<schwelle: # erstes mal die Schwelle überschritten
			ret_val= True
		else:
			ret_valFalse
		self.alt_val = val # aktuellen wert speichern
		print(self.alt_val)
		return ret_val

rob87
User
Beiträge: 45
Registriert: Donnerstag 17. Oktober 2019, 14:24

So funktionierts jetzt:

Code: Alles auswählen

import time
import random
class Flanke:
	def __init__(self):
		self.alt_val = 0.0
		
	def pos(self,val,schwelle= 0.75):
		if val >= schwelle and self.alt_val<schwelle:
			ret_val= True
		else:
			ret_val= False
		self.alt_val = val # aktuellen wert speichern
		return ret_val
		
	def neg(self,val,schwelle= 0.75):
		if val<=schwelle and self.alt_val>schwelle:
			ret_val= True
		else:
			ret_val= False
		self.alt_val = val
		return ret_val
		
class Toggle:
	def __init__(self):
		self.zustand= False
		self.flanke = Flanke()
	
	def status(self,val, schaltschwelle = 0.5):
		if self.flanke.pos(val,schaltschwelle):
			self.zustand = not self.zustand
		return self.zustand


		
def simu_input(input): #input zwischen 0.4 und 1.0 schwingen lassen
	input_richtung =1.0
	add=(random.randint(1, 10))*0.01
	
	if input+add >  0.88:
		input_richtung =-1.0
	elif input - add <  0.4:
		input_richtung =1.0

	return input + (add*input_richtung)
	

def main():

	schalter= Toggle() # bistabiler Schalter
	stick = 0.7 #eingabeelemnt von Hardware
	while True:
		if schalter.status(stick,0.8):
			str = 'ON %s'%(stick)
		else:
			str = 'OFF %s'%(stick)
		print(str)
		stick=simu_input(stick)
		time.sleep(0.2)

input_richtung=1.0	
main()

Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@rob87: eingerückt wird immer mit 4 Leerzeichen pro Ebene, keine Tabs. Wenn man eine if-Abfrage nur dazu benutzt, einer Variable True oder False zuzuweisen, dann kann man gleich die Bedinung der Variable zuweisen.
Benutze keine Abkürzungen, statt alt_val würde man alternative_value schreiben, oder sollte das alter_wert heißen? Die Mischung aus deutsch und englisch ist hier sehr verwirrend.
In simu_input ist der elif-Zeig unnötig, da darin input_richtung gar nicht verändert wird. Der Kommentar stimmt nicht damit überein, was die Funktion macht.
`str` ist der Name einer eingebauten Klasse und sollte nicht überschrieben werden.

Code: Alles auswählen

import time
import random

class Flanke:
    def __init__(self):
        self.alter_wert = 0.0
        
    def pos(self, wert, schwelle=0.75):
        resultat = wert >= schwelle and self.alter_wert < schwelle
        self.alter_wert = wert
        return resultat
        
    def neg(self, wert, schwelle=0.75):
        resultat = wert <= schwelle and self.alter_wert > schwelle
        self.alter_wert = wert
        return resultat
        
class Toggle:
    def __init__(self):
        self.zustand = False
        self.flanke = Flanke()
    
    def status(self, wert, schaltschwelle=0.5):
        if self.flanke.pos(wert, schaltschwelle):
            self.zustand = not self.zustand
        return self.zustand
        
def simuliere_eingabe():
    """ input zwischen 0.4 und 1.0 schwingen lassen """
    wert = 0.7
    richtung = 1.0
    while True:
        add = random.randint(1, 10) * 0.01
        if wert + add > 1.0:
            richtung = -1.0
        elif wert - add < 0.4:
            richtung = 1.0
        wert += add * richtung
        yield wert
    
def main():
    stick = simuliere_eingabe()
    schalter = Toggle() # bistabiler Schalter
    while True:
        wert = next(stick)
        if schalter.status(wert, 0.8):
            text = f'{wert:.2f} ON'
        else:
            text = f'{wert:.2f} OFF'
        print(text)
        time.sleep(0.2)

if __name__ == "__main__":
    main()
Antworten