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.