Bug? Can someone verify this?

Just starting out? Need help? Post your questions and find answers here.
User avatar
kpeters58
Enthusiast
Enthusiast
Posts: 341
Joined: Tue Nov 22, 2011 5:11 pm
Location: Kelowna, BC, Canada

Bug? Can someone verify this?

Post by kpeters58 »

Given the declaration

Code: Select all

 Declare.i DBError(Message1.s, Message2.s = "", ModuleName.s = #PB_Compiler_Module, ProcedureName.s = #PB_Compiler_Procedure, LineNr = 0, Fatal.i = #False)
and the definition

Code: Select all

  Procedure DBError(Message1.s, Message2.s = "", ModuleName.s = #PB_Compiler_Module, ProcedureName.s = #PB_Compiler_Procedure, LineNr = 0, Fatal.i = #False)
  ; ....
  EndProcedure
works very well.

If I replace the 'LineNr = 0' instances with 'LineNr = #PB_Compiler_Line', I get 'Declare doesn't match with real Procedure' which seems like a bug to me. Can anyone confirm or clear this up?
PB 5.73 on Windows 10 & OS X High Sierra
User avatar
Demivec
Addict
Addict
Posts: 4091
Joined: Mon Jul 25, 2005 3:51 pm
Location: Utah, USA

Re: Bug? Can someone verify this?

Post by Demivec »

kpeters58 wrote:If I replace the 'LineNr = 0' instances with 'LineNr = #PB_Compiler_Line', I get 'Declare doesn't match with real Procedure' which seems like a bug to me. Can anyone confirm or clear this up?
The constant #PB_Compiler_Line gets replaced by the number of the line in each line where it occurs. This means since the two lines you indicated are in fact on different lines, they each indicate that 'LineNr' will receive a different default value. The compiler error message is thus correct, no bug.
Dude
Addict
Addict
Posts: 1907
Joined: Mon Feb 16, 2015 2:49 pm

Re: Bug? Can someone verify this?

Post by Dude »

Everything after "Declare" and "Procedure" on both lines have to be literally the same.
User avatar
mk-soft
Always Here
Always Here
Posts: 5409
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: Bug? Can someone verify this?

Post by mk-soft »

Works only over Macro...

Code: Select all

Declare.i __DBError(Message1.s, Message2.s, ModuleName.s, ProcedureName.s, LineNr, Fatal.i)

Macro DBError(Message1, Message2 = "", ModuleName = #PB_Compiler_Module, ProcedureName = #PB_Compiler_Procedure, LineNr = #PB_Compiler_Line, Fatal = #False)
  __DBError(Message1, Message2, ModuleName, ProcedureName, LineNr, Fatal)
EndMacro
  
Procedure foo()
  DBError("Info")
EndProcedure

foo()
End

Procedure __DBError(Message1.s, Message2.s, ModuleName.s, ProcedureName.s, LineNr, Fatal.i)
  ; ....
  Debug "Message 1: " + Message1
  Debug "Modul: " + ModuleName
  Debug "Procedure: " + ProcedureName + "(...)"
  Debug "LineNr: " + LineNr
  ; ...
EndProcedure
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
IdeasVacuum
Always Here
Always Here
Posts: 6425
Joined: Fri Oct 23, 2009 2:33 am
Location: Wales, UK
Contact:

Re: Bug? Can someone verify this?

Post by IdeasVacuum »

What if you made the code ugly with inline?

Code: Select all

Declare.i DBError(Message1.s, Message2.s = "", ModuleName.s = #PB_Compiler_Module, ProcedureName.s = #PB_Compiler_Procedure, LineNr = #PB_Compiler_Line, Fatal.i = #False) : Procedure.i DBError(Message1.s, Message2.s = "", ModuleName.s = #PB_Compiler_Module, ProcedureName.s = #PB_Compiler_Procedure, LineNr = #PB_Compiler_Line, Fatal.i = #False)
; ....
EndProcedure
IdeasVacuum
If it sounds simple, you have not grasped the complexity.
User avatar
Demivec
Addict
Addict
Posts: 4091
Joined: Mon Jul 25, 2005 3:51 pm
Location: Utah, USA

Re: Bug? Can someone verify this?

Post by Demivec »

IdeasVacuum wrote:What if you made the code ugly with inline?

Code: Select all

Declare.i DBError(Message1.s, Message2.s = "", ModuleName.s = #PB_Compiler_Module, ProcedureName.s = #PB_Compiler_Procedure, LineNr = #PB_Compiler_Line, Fatal.i = #False) : Procedure.i DBError(Message1.s, Message2.s = "", ModuleName.s = #PB_Compiler_Module, ProcedureName.s = #PB_Compiler_Procedure, LineNr = #PB_Compiler_Line, Fatal.i = #False)
; ....
EndProcedure
@IdeasVacuum: If it is written as you suggest you don't need the 'Declare' portion at all. :)

@kpeters58: Why do you use the compiler constants in the procedure's parameter list?

If you are wanting those values to indicate where each invocation of DBError() occurs it will not function as you intend it to do so. This is necause those values used as defaults in the parameter list are substtuted at compile time. What you would want to do is use those compiler constants in each invocation of DBError(). Still, another option is to use it in both places.
User avatar
mk-soft
Always Here
Always Here
Posts: 5409
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: Bug? Can someone verify this?

Post by mk-soft »

Simple example

Code: Select all

Procedure DBError(Message.s, ProcedureName.s = #PB_Compiler_Procedure)
  Debug Message
  Debug "Procedure: " + ProcedureName + "(...)"
EndProcedure

Procedure __DBError(Message.s, ProcedureName.s)
  Debug Message
  Debug "Procedure: " + ProcedureName + "(...)"
EndProcedure

Macro DBErrorMacro(Message, ProcedureName = #PB_Compiler_Procedure)
  __DBError(Message, ProcedureName)
EndMacro

Procedure foo()
  DBError("Not Work")
  DBErrorMacro("Over macro is working")
  ; Macro is replaced with '__DBError("Over macro is working", #PB_Compiler_Procedure). Now we have the right ProcedureName
EndProcedure

foo()
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
#NULL
Addict
Addict
Posts: 1440
Joined: Thu Aug 30, 2007 11:54 pm
Location: right here

Re: Bug? Can someone verify this?

Post by #NULL »

This could be considered a feature request. In the D programming language (and maybe others too) that's exactly how it works. If you use __LINE__ etc. as default arguments of a function they will be evaluated at the call (or better 'instantiation' because D has templates). It might seem 'incorrect' but that's usually just what you want to do, the 'correct' way is of no use.
Post Reply