OverflowError

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
Benutzeravatar
xStream
User
Beiträge: 24
Registriert: Dienstag 15. Februar 2005, 21:39

Hoi!
Dieser Quelltext:

Code: Alles auswählen

def spezialaktion(stufea, stufev):
    print "Spezialaktion auswählen!"
    print "1 = Inva; 2 = Sabo; 3 = Plünder; 4 = Spio; 5 = Kolo"
    aktion = input(">>> ")
    
    # Inva
    if aktion == 1:
        grundwert = "24"

    # Sabo
    elif aktion == 2:
        grundwert = "2"

    # Plünder
    elif aktion == 3:
        grundwert = "1"

    # Spio
    elif aktion == 4:
        grundwert = "0,5"

    # Kolo
    elif aktion == 5:
        grundwert = "37"

    # Error
    else:
        grundwert = "0"

    if grundwert != "0":
        ergebniss = 0,91 ** stufea * 1,11 ** stufev * grundwert
        print round(ergebniss, 2) + " Stunden"

spezialaktion(10, 10)
Verursacht folgenden Fehler:

Code: Alles auswählen

Traceback (most recent call last):
  File "H:/xZone/snRechner.py", line 34, in -toplevel-
    spezialaktion(10, 10)
  File "H:/xZone/snRechner.py", line 31, in spezialaktion
    ergebniss = 0,91 ** stufea * 1,11 ** stufev * grundwert
OverflowError: long int too large to convert to int
Ich denke der Fehler ist für einen fortgeschrittenen Pythonprogrammierer leicht zu lösen, ich code aber erst seit gestern in Python.

Greetz

xStream
Benutzeravatar
knekke
User
Beiträge: 100
Registriert: Freitag 29. Oktober 2004, 17:23
Wohnort: Schweden

Hi,
bin selber noob, aber mir war so als hätte ich gerade gestern was dazu gelesen: "Seit Version 2.2 nimmt Python automatisch die Erweiterung von Plain Integern, die größer als 4294967296 sind, in Long Integer vor."
Ich nehme an Deine Version ist älter als 2.2?

Aber die Lösung zu deinem Problem:
tausche mal bei ergebnis=0,91**blablabla alle Kommata durch Punkte aus.

Riecht verdächtig nach RPG. Sag mal bescheid wenns fertig ist ;-)

Gruß,
Thomas

Grundwert=0,5 wird dann auch zu 0.5
BlackJack

Ein Problem mit dem Code hat Dir knekke schon gesagt. Nach folgendem Code ist `x` der Name eines Tupels mit einer 0 als erstem Element und dem Ergebnis von 91 hoch `z` als zweitem Element.

Code: Alles auswählen

x = 0,91 ** z
Ebenfalls Probleme wirst Du bekommen, wenn Du Deinen `grundwert`, der eine Zeichenkette ist, dann mit den Zahlen multiplizieren willst. Das geht nicht -- `grundwert` muss auch eine Zahl sein. Wir sind hier ja nicht bei Perl oder PHP. ;-)

Statt der if...elif Abfragen könntest Du den Grundwert übrigens auch einfach aus einer Sequenz holen, die Du mit der `aktion` indizierst:

Code: Alles auswählen

def spezialaktion(stufea, stufev): 
    print "Spezialaktion auswählen!" 
    print "1 = Inva; 2 = Sabo; 3 = Plünder; 4 = Spio; 5 = Kolo" 
    aktion = input(">>> ")

    grundwerte = (24.0, 2.0, 1.0, 0.5, 37.0)
    
    try:
        grundwert = grundwerte[aktion - 1]
    except IndexError:
        grundwert = 0.0
    
    # ...
Benutzeravatar
xStream
User
Beiträge: 24
Registriert: Dienstag 15. Februar 2005, 21:39

Code: Alles auswählen

from time import *

def spezialaktion(stufea, stufev):
    print "Spezialaktion auswaehlen!"
    print "1 = Inva, 2 = Sabo, 3 = Pluender, 4 = Spio, 5 = Kolo"
    aktion = input(">>> ")
    
    grundwerte = (86400, 7200, 3600, 1800, 133200) 
    
    try: 
        grundwert = grundwerte[aktion - 1] 
    except IndexError: 
        grundwert = 0.0

    if grundwert != "0.0":
        ergebniss = 0.91 ** stufea * 1.11 ** stufev * grundwert
        tage = int(strftime("%d",gmtime(ergebniss))) - 1
        if tage < 10:
            tage = "0%s" % (tage)
        print tage, strftime("Tag(e), %H Stunde(n), %M Minute(n) und %S Sekunden",gmtime(ergebniss))
        
print "Was willst du berechnen?"
print "1 = Spezialaktionen"
auswahl = input(">>> ")

if auswahl == 1:
    print "(effektive) Stufe des Angreifers:"
    stufea = input(">>> ")
    print "(effektive) Stufe des Verteidigers:"
    stufev = input(">>> ")
    spezialaktion(stufea, stufev)
else:
    exit

input()
So hab ichs jetzt gemacht.
BlackJack

Du hast immer noch ein Problem mit Zahlen und Zeichenketten. Dein ``if grundwert != "0.0"`` ist immer wahr, weil `grundwert` der Name für eine Zahl ist:

Code: Alles auswählen

In [66]: 0.0 != "0.0"
Out[66]: True
Eine oder mehrere führende Nullen kann man durch den '%' Operator auf Zeichenketten und dem passenden Formatcode bekommen:

Code: Alles auswählen

In [67]: "%02d" % 5
Out[67]: '05'
Der Formatcode im Beispiel bedeutet: Darstellung als ganze Zahl (d) mit mindestens zwei Stellen (2) und wenn weniger Stellen dann links mit Nullen auffüllen (0). Ohne die '0' wäre mit Leerzeichen aufgefüllt worden.

Wenn Du den `grundwert` von 0.0 nicht benötigst, dann kannst Du das ``except IndexError`` auch einfach hinter den Code verschieben, der nur ausgeführt werden soll, wenn eine gültige Wahl getroffen wurde.
Antworten