Seite 1 von 1

Fehler bei einer variablen, bei anderer aber nicht (Deklarierung und Definierung gleich)

Verfasst: Freitag 27. September 2024, 11:52
von Hansi1350
Wie kann das sein dass Python hier einen Underschied macht, zwischen "port" und "history"? Ist doch im Prinzip gleich oder nicht?

Code: Alles auswählen

port = 5025 # the port number of the instrument service
historyMode = 0

def SocketConnect():
	try:
		#create an AF_INET, STREAM socket (TCP)
		s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
		s.settimeout(0.5)
		
	except socket.error:
		print ('Failed to create socket.')
		sys.exit();
	try:
		#Connect to remote server
		s.connect((remote_ip , port))
		
def tasks():
	# Wait for command from Arduino
	if ser.in_waiting >= 0:
		bs = ser.read_until("\n", 1).decode()
		print(bs)
		if bs == "1":
			if(historyMode):
			

def main():
	global port

	global historyMode
	

	s = SocketConnect()

	
	while 1:
		tasks()

Re: Fehler bei einer variablen, bei anderer aber nicht (Deklarierung und Definierung gleich)

Verfasst: Freitag 27. September 2024, 13:59
von noisefloor
Hallo,

der gezeigte Code ist so doch sowieso nicht lauffähig, da sind diverse Fehler drin. Das `global` in `main` ist an der Stelle überflüssig, abgesehen davon, dass man `global` sowieso meiden sollte.

Und bitte noch die _komplette_ Fehlermeldung noch posten.

Gruß, noisefloor

Re: Fehler bei einer variablen, bei anderer aber nicht (Deklarierung und Definierung gleich)

Verfasst: Freitag 27. September 2024, 16:56
von Hansi1350
Überflüssig ist das global in main nicht:
"NameError: name 's' is not defined"

Ich habe den Code ausgedünnt, und nur relevantes drinnen gelassen. Da muss ich wohl nochmal gucken mit dem global.

Re: Fehler bei einer variablen, bei anderer aber nicht (Deklarierung und Definierung gleich)

Verfasst: Freitag 27. September 2024, 18:51
von __blackjack__
@Hansi1350: Das ``global`` sollte da trotzdem nicht stehen. Alles was Funktionen (oder Methoden) ausser Konstanten benötigen, sollte als Argument(e) übergeben werden.

``sys.exit()`` sollte da nicht in einer Funktion stehen die eine Verbindung aufbaut. Das sollte im Hauptprogramm stehen und da eigentlich auch nur wenn damit ein Rückgabecode an den Aufrufer zurückgegeben wird der mindestens potentiell ungleich 0 ist, denn *das* ist der Zweck dieser Funktion.

Re: Fehler bei einer variablen, bei anderer aber nicht (Deklarierung und Definierung gleich)

Verfasst: Freitag 27. September 2024, 19:04
von sparrow
@Hansi1350: Ergänzend:

Man will keine globalen Variablen. Auf der Modulebene (nicht eingerückt) stehen nur die Shebang, Importe, did Deklaration von Konstanten (die sich dadurch definieren, dass sich die Werte nie ändern), die Definition von Klassen und Variablen und dir Import-Weiche.

Funktionen erhalten alles, was sie benötigen als Parameter und geben ihr Ergebnis mit return zurück.

Bis hierher sorgt alles dafü, dass du kein global mehr brauchst, weil du keine globalen Varisblen mehr hast.

Eingerpckt wird mit 4 Leerzeichen. Keine 8 und keine Tabs.

Es gibt True und False. Man nutzt für Wahrheitswerte nicht Ganzzahlen.

Hinter das print und die öffnende aklammer gehört kein Leerzeichen.
Die Ausgbae stelle ich aber ganz in Frage. Warum den aussagekräftige Fehlermeldung plus Stacktrace unterdrücken und stattdessen eine generische Meldung ausgeben.

Re: Fehler bei einer variablen, bei anderer aber nicht (Deklarierung und Definierung gleich)

Verfasst: Samstag 28. September 2024, 09:21
von noisefloor
Hansi1350 hat geschrieben: Freitag 27. September 2024, 16:56 Überflüssig ist das global in main nicht:
"NameError: name 's' is not defined"
Wo denn? Im von dir gezeigten Code sehe ich nicht, wo wegen `s ` ein NameError geworfen werden sollte. `s` wird in `main` definiert und nochmal in `SocketConnect`. Da `SocketConnect` keine Rückgabewert hat, ist das `s` in `main` gleich `True` (davon ausgehend, dass `SocketConnect` ohne Fehler durchläuft). Das ist wahrscheinlich zwar nicht, was du willst... Im gezeigten Code bekommst du wegen `ser` in `tasks` einen NameError.

Gruß, noisefloor