Seite 1 von 1

globale variable zählt nur beim ersten Programmdurchlauf richtig

Verfasst: Sonntag 9. Juni 2019, 15:39
von Cortez
Hallo,

ich habe ein verrücktes Problem mit einem Programm, das globale Variablen nutzt. Eins vorweg: Bitte jetzt keinen Shitstorm oder Ähnliches. Ich weiß, dass man das eigentlich nicht macht. Aber trotzdem hätte ich das gerne so zu Ende gemacht, weil ich den inzwischen 8-seitigen Code nicht aufgeben möchte.

Also, ich habe eine Maske, wo Mitarbeiter aus einer Datei geladen wurden. Also die sind schon ausgewählt. In der Maske kann man dann Monat und Krankheitstage pro Monat eingeben. Wenn man in der Maske auf den Button "Weiter" klickt, kommt der nächste Mitarbeiter etc... Wenn alle ausgewählten Arbeiter, die zuvor in der Liste "Treffer" gespeichert wurden, durchgelaufen sind, erscheint als Ausgabe "fertig". Das klappt auch wunderbar, aber wenn man das ein zweites, drittes Mal durchführt, zählt der globale trefferzähler nicht mehr richtig. Beim ersten Klick auf weiter wird er dann um 2 erhöht anstatt um eins, beim dritten mal um 2. Ich bin jedenfalls völlig ratlos und hoffe, dass meine Erklärungen einigermaßen verständlich waren (ich sitz grad da und mir brummt der Schädel).

Hier mal der betreffende Code:

Code: Alles auswählen

def KrankentageEingeben():
    global trefferzähler
    trefferzähler = 0
    kursladen.tableWidget.clear()
    eingabe.comboBoxTage.clear()
    eingabe.show()
    eingabe.comboBoxTage.addItems(["1","2","3","4","5","mehr als 5"])
    eingabe.labelName.setText(Treffer[trefferzähler].name + ", " + Treffer[trefferzähler].vorname)
    
    
    eingabe.ButtonWeiter.clicked.connect(ButtonWeiter)
    

def ButtonWeiter():
    global trefferzähler
    print (trefferzähler)
   
    var = len(Treffer)-1
    if trefferzähler >= var:
        print ("fertig")
        Treffer[trefferzähler].tragetageiniiste ein(eingabe.lineEditMonat.text(), eingabe.comboBoxTage.currentText())
        
        
        
       
        Dateilöschen()
        for zähler in range(0, len(ensemble)):
            ensemble[zähler].BearbeiteteDatenSpeichern
            
        trefferzähler = 0
        
        eingabe.lineEditMonat.clear()
        eingabe.close()
        kursladen1()
        else:
        Treffer[trefferzähler].tragetageinlisteein(eingabe.lineEditMonat.text(), eingabe.comboBoxTage.currentText())

        
        

 
        trefferzähler = trefferzähler +1
    
        eingabe.labelName.setText(Treffer[trefferzähler].name +", " +Treffer[trefferzähler].vorname)

Re: globale variable zählt nur beim ersten Programmdurchlauf richtig

Verfasst: Sonntag 9. Juni 2019, 16:34
von Cortez
Hat niemand eine Idee? :(
Es gibt aus meiner Sicht keinen Grund, warum er das macht. Ich bin auch am Verzweifeln. Aber vielleicht kennt einer der Experten hier dieses Phänomen.

Re: globale variable zählt nur beim ersten Programmdurchlauf richtig

Verfasst: Sonntag 9. Juni 2019, 16:44
von sparrow
Entschuldige meine Offenheit, aber mir ist dein Code zu krude, um mich damit zu beschäftigen.

Schau dir mal die Funktion KrankentageEingeben an.
Sie bekommt keine Parameter.
Du definierst "trefferzähler" als global (warum nicht als Parameter übergeben?!?)
Du setzt trefferzähler auf 0.
Du veränderst in der Funktion trefferzähler nicht mehr, benutzt es aber als Index. Und der ist halt immer 0. Wenn dem nicht so ist, veränderst du irgendwo außerhalb trefferzähler (und das ist Kacke und _niemand_ will das debuggen) oder du zeigst uns nicht den richtigen Code.

"Treffer" ist auch so eine magisch auftauchende Variable.

So ist es recht mühselig dir zu helfen.

Schreib das Programm strukturiert neu - dann erledigt sich auch dein Problem direkt.

Und das mit den 8 Seiten ist dann auch nicht mehr, wenn du weniger unsinnige Leerzeichen setzt.

Re: globale variable zählt nur beim ersten Programmdurchlauf richtig

Verfasst: Sonntag 9. Juni 2019, 16:49
von sls
sparrow spricht mir aus der Seele, zwar gibt es noch morgen als Feiertag zum Wochenende dazu, aber wenn sich das oben gezeigte Drama über 8-Seiten fortsetzt (Was für Seiten eigentlich? Man gibt für die Länge von Source-Code die Zeilenanzahl an...) wird mir anders. Es entgegen aller Meinung doch falsch zu machen und global zu verwenden, sich dann auch noch über genau dieses "merkwürdige" Verhalten zu wundern, ist dann zusätzlich schräg.

Bitte einfach mal den ganzen Code zeigen. Und keine Angst, den wird sicherlich keiner hier verwenden um damit dann Geld zu verdienen.

Re: globale variable zählt nur beim ersten Programmdurchlauf richtig

Verfasst: Sonntag 9. Juni 2019, 16:55
von Cortez
Der Code ist schon der richtige. Treffer enthält die gefundenen Elemente, die zuvor aus der Datei geladen wurden. wie kann ich denn den Trefferzähler (den ich ja funktionsübergreifend brauche) als Parameter übergeben? Nochmal: Beim ersten Programmdurchlauf läuft das alles wie gedacht, aber dann, wenn ich das zweite mal Krankheitstage eingebe wird beim klick auf weiter 2 auf einmal gezählt, beim 3. mal 3 auf einmal usw. Das heißt, ich muss jedes Mal das Programm beenden und wieder starten, damit das wieder geht. An der Variable kann es glaube ich nicht liegen; mittlerweile habe ich die sogar am Ende der Funktion gelöscht oder mehrfach auf 0 zurück gesetzt, aber jedesmal der gleiche Sch... Es ist zum Blöde werden.

Re: globale variable zählt nur beim ersten Programmdurchlauf richtig

Verfasst: Sonntag 9. Juni 2019, 17:39
von __blackjack__
Cortez: Wenn das der Code ist mit dem Du ein Problem hast, dann wäre das aber ein anderes, nämlich mindestens zwei Syntaxfehler. In `ButtonWeiter()` die zweite Zeile im ``if``-Block und etwas später dann noch ein falsch eingerücktes ``else``.

Dann gibt's lauter globale Variablen. Und nun hast Du Probleme nachzuvollziehen was da von wo (nicht) verändert wird – also genau die Probleme derentwegen man keine globalen Variablen verwenden sollte. Aber Du willst eine andere Lösung hören als die globalen Variablen loszuwerden – und damit dieses Problem.

Bereits vorhandene Programmlänge ist da auch nicht wirklich eine gute Begründung für, denn je länger man wartet den Code sauber zu schreiben, um so mehr ”technologische Schulden” häufen sich auf, und es macht noch mehr Arbeit aufzuräumen.