Seite 1 von 1

OverflowError

Verfasst: Dienstag 15. Februar 2005, 21:47
von xStream
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

Verfasst: Dienstag 15. Februar 2005, 22:41
von knekke
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

Verfasst: Dienstag 15. Februar 2005, 23:06
von 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
    
    # ...

Verfasst: Freitag 18. Februar 2005, 14:15
von xStream

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.

Verfasst: Freitag 18. Februar 2005, 23:59
von 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.