Seite 1 von 1
Problem mit einfacher Differenz
Verfasst: 07.01.2009 11:49
von ThoPie
Hallo,
ich bin gerade dabei ein Prog von 4.20 auf 4.30 zu konvertieren.
In 4.20 hat der folgende Quelltext das richtige Ergebnis geliefert, in 4.30 kommt 0 heraus. Kann mir bitte jemand sagen, was ich hier falsch mache.
Danke
Code: Alles auswählen
Declare.i Jahr(D.s)
Procedure.i Jahr(D.s)
ProcedureReturn Val(Left(D,4))
EndProcedure
Global D.s="1973-04-11"
Global DatDiff.i
DatDiff=Year(Date())-Val(Left(D,4))
Debug DatDiff ; Ergebnis ist 36, ok
DatDiff=Year(Date())-Jahr(D)
Debug DatDiff ; Ergebnis ist 0, Fehler
Verfasst: 07.01.2009 11:59
von cxAlex
Probiers mal mit einer Puffer- Variable. Ich hab hier grad kein PB zum testen, aber es sieht so aus als hätte PB 4.3 einen Bug bei direkter Stringverarbeitung aus Funktionen, gibt im englischen Forum ne ähnliche kurriosität:
http://www.purebasic.fr/english/viewtop ... movestring
Verfasst: 07.01.2009 12:07
von DarkDragon
Mit Quads .q gehts anstelle von Integer .i

.
Verfasst: 07.01.2009 14:31
von ThoPie
Danke.
Ist eigentlich bekannt ob der Bug behoben werden soll?
Verfasst: 07.01.2009 14:33
von cxAlex
ThoPie hat geschrieben:Danke.
Ist eigentlich bekannt ob der Bug behoben werden soll?
Bugs sollten normalerweise immer behoben werden.
Verfasst: 07.01.2009 14:48
von Kaeru Gaman
wie Alex sagte, direkte stringübergaben machen schwierigkeiten.
... allerdings ist das schon etwas anspruchsvoller hier,
WO man buffern muss.
das Problem hier ist die dierekte angabe der funktion bei ProcedureReturn.
so herum gehts:
Code: Alles auswählen
Procedure.i Jahr(D.s)
Protected Result = Val(Left(D,4))
ProcedureReturn Result
EndProcedure
ABER bei einer so kleinen Formel die hinter ProcedureReturn passt,
sollte man gar keine Procedure verwenden, sondern höchstens ein Macro.
Code: Alles auswählen
Declare.i Jahr(D.s)
Macro Anno( EXP )
Val(Left( EXP ,4))
EndMacro
Procedure.i Jahr(D.s)
Protected Result = Val(Left(D,4))
ProcedureReturn Result
EndProcedure
Global D.s="1973-04-11"
Global DatDiff.i
DatDiff=Year(Date())-Val(Left(D,4))
Debug DatDiff
DatDiff=Year(Date())-Jahr(D)
Debug DatDiff
DatDiff=Year(Date())-Anno(D)
Debug DatDiff
Verfasst: 07.01.2009 18:29
von ThoPie
... da habe ich diesbezüglich gleich mal eine Frage an die Experten:
Wann verwendet ihr Makros und wann Prozeduren. Gibt es einen Unterschied hinsichtlich der Verarbeitungsgeschwindigkeit?
Verfasst: 07.01.2009 18:37
von Josef Sniatecki
Makros fressen weniger Zeit als Prozeduren.
Merke dir am besten:
Kurze Codes als Makros
Lange Codes als Prozeduren
Ausderdem kannst du mit Makros Ersetzungen direkt im angegebenen
Code vornehmen.
Beispiel:
Code: Alles auswählen
Macro Op(x,op,y)
x op y
EndMacro
Debug Op(1,+,2) ;Diese Zeile wird zu "1 + 2"
Stell dir einfach vor Prozeduren wären Links auf andere Zeilen. Und
Makros werden einfach in mehrere Zeilen ersetzt. Die Makros werden
also vor dem Start des Programms ersetzt. Prozeduren bleiben jedoch
noch erhalten.
Hoffe, dass es so gut genug erklärt ist.
Verfasst: 07.01.2009 18:40
von edel
Ein Macro ist immer schneller als eine Procedure. Macht den Code aber
auch groesser. Macros machen aber auch nur dann Sinn wenn man den
Code sehr oft braucht.
@Josef Sniatecki
Gerade bei grossen Codestuecken kann ein Macro sehr sinnvoll sein.