Problem mit einfacher Differenz

Anfängerfragen zum Programmieren mit PureBasic.
ThoPie
Beiträge: 130
Registriert: 19.05.2006 15:18
Kontaktdaten:

Problem mit einfacher Differenz

Beitrag 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
Bild
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag 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
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Mit Quads .q gehts anstelle von Integer .i ;-) .
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
ThoPie
Beiträge: 130
Registriert: 19.05.2006 15:18
Kontaktdaten:

Beitrag von ThoPie »

Danke.

Ist eigentlich bekannt ob der Bug behoben werden soll?
Bild
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

ThoPie hat geschrieben:Danke.

Ist eigentlich bekannt ob der Bug behoben werden soll?
Bugs sollten normalerweise immer behoben werden.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
ThoPie
Beiträge: 130
Registriert: 19.05.2006 15:18
Kontaktdaten:

Beitrag 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?
Bild
Benutzeravatar
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

Beitrag 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.
PB 4.61 | Windows Vista - 32Bit
Homepage

"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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.
Antworten