Page 1 of 1

[SOLVED] If not Defined() then Define inside If/CompilerIf. Defined() always returns 0

Posted: Wed Feb 15, 2023 8:04 pm
by destiny
Hi guys.
Can't make it work :(
I want to check if procedure/variable/constant/etc is defined or not and when not defined then include according file(s).
There is no difference if I use XIncludeFile/IncludeFile or replace it by Define MyParam.MyStruct/Global MyParam.MyStruct.
And which metod is better to use - "CompilerIf" or just "If" in that situation?

Test.pbi:

Code: Select all

Structure MyStruct
  Param.s
EndStructure

CompilerIf Defined(MyParam, #PB_Structure)
  Debug "1. Constant 'MyParam' is declared"
CompilerEndIf

CompilerIf Not Defined(MyParam, #PB_Structure)
  Debug "2. Constant 'MyParam' is not declared"
  IncludeFile "PathToFile\Struct.pbi"
CompilerEndIf

CompilerIf Defined(MyParam, #PB_Structure)
  Debug "3. Constant 'MyParam' is declared"
CompilerEndIf

If Defined(MyParam, #PB_Structure)
  Debug "4. Constant 'MyParam' is declared"
EndIf

If Not Defined(MyParam, #PB_Structure)
  Debug "5. Constant 'MyParam' is not declared"
  IncludeFile "PathToFile\Struct.pbi"
EndIf

If Defined(MyParam, #PB_Structure)
  Debug "6. Constant 'MyParam' is declared"
EndIf
PathToFile\Struct.pbi:

Code: Select all

Define MyParam.MyStruct

Re: If not Defined() then Define inside If/CompilerIf. Defined() always returns 0

Posted: Wed Feb 15, 2023 9:33 pm
by netmaestro

Code: Select all

Structure MyStruct
  Param.s
EndStructure

CompilerIf Defined(MyStruct, #PB_Structure) <> 0
  Debug "1. Structure 'MyStruct' is declared"
CompilerEndIf

'MyParam' is no part of the structure. It's an error. (too much coffee?)

Re: If not Defined() then Define inside If/CompilerIf. Defined() always returns 0

Posted: Wed Feb 15, 2023 9:35 pm
by Paul
Shouldn't it be...

Code: Select all

Structure MyStruct
  Param.s
EndStructure

CompilerIf Defined(MyStruct, #PB_Structure)
  Debug "1. Constant 'MyStruct' is declared"
CompilerEndIf

CompilerIf Not Defined(MyStruct, #PB_Structure)
  Debug "2. Constant 'MyStruct' is not declared"
CompilerEndIf

Code: Select all

;Structure MyStruct
;  Param.s
;EndStructure

CompilerIf Defined(MyStruct, #PB_Structure)
  Debug "1. Constant 'MyStruct' is declared"
CompilerEndIf

CompilerIf Not Defined(MyStruct, #PB_Structure)
  Debug "2. Constant 'MyStruct' is not declared"
CompilerEndIf

EDIT: netmaestro you are to quick !! :lol:

Re: If not Defined() then Define inside If/CompilerIf. Defined() always returns 0

Posted: Wed Feb 15, 2023 11:42 pm
by destiny
Ok, maybe I asked wrong.
How can I understand that MyParam is Defined? Not MyStruct.
After Define MyParam.MyStruct Defined() is always answers False.
TypeOf() MyParam and MyStruct tells that both of them are Structure. (03-1, 03-2, 04).

And question about If or CompilerIf is still bothering me. Why CompilerIf and not If? :( It's because there will be less bytes in final executable because compiler will ignore that parts of code where Defined() will answer True but If ... True will be compiled always?

Code: Select all

Structure MyStruct
  Param.s
EndStructure

CompilerIf Defined(MyParam, #PB_Structure)
  Debug "01-1. Structure 'MyParam' is declared"
CompilerEndIf
CompilerIf Defined(MyStruct, #PB_Structure)
  Debug "01-2. Structure 'MyStruct' is declared"
CompilerEndIf

CompilerIf Not Defined(MyParam, #PB_Structure)
  Debug "02-1. Structure 'MyParam' is not declared"
  Define MyParam.MyStruct
CompilerEndIf
CompilerIf Not Defined(MyStruct, #PB_Structure)
  Debug "02-2. Structure 'MyStruct' is not declared"
  Define MyParam.MyStruct
CompilerEndIf

Debug "03-1. " + TypeOf(MyParam)
Debug "03-2. " + TypeOf(MyStruct)
Debug "04. " + #PB_Structure

CompilerIf Defined(MyParam, #PB_Structure)
  Debug "05-1. Structure 'MyParam' is NOW declared"
CompilerEndIf
CompilerIf Defined(MyStruct, #PB_Structure)
  Debug "05-2. Structure 'MyStruct' is NOW declared"
CompilerEndIf

CompilerIf Not Defined(MyParam, #PB_Structure)
  Debug "06-1. Structure 'MyParam' is STILL NOT declared"
CompilerEndIf
CompilerIf Not Defined(MyStruct, #PB_Structure)
  Debug "06-2. Structure 'MyStruct' is STILL NOT declared"
CompilerEndIf

If Defined(MyParam, #PB_Structure)
  Debug "11-1. Structure 'MyParam' is declared"
EndIf
If Defined(MyStruct, #PB_Structure)
  Debug "11-2. Structure 'MyStruct' is declared"
EndIf

If Not Defined(MyParam, #PB_Structure)
  Debug "12-1. Structure 'MyParam' is not declared"
  Define MyParam.MyStruct
EndIf
If Not Defined(MyStruct, #PB_Structure)
  Debug "12-2. Structure 'MyStruct' is not declared"
  Define MyParam.MyStruct
EndIf

If Defined(MyParam, #PB_Structure)
  Debug "13-1. Structure 'MyParam' is NOW declared"
EndIf
If Defined(MyStruct, #PB_Structure)
  Debug "13-2. Structure 'MyStruct' is NOW declared"
EndIf

If Not Defined(MyParam, #PB_Structure)
  Debug "14-1. Structure 'MyParam' is STILL NOT declared"
EndIf
If Not Defined(MyStruct, #PB_Structure)
  Debug "14-2. Structure 'MyStruct' is STILL NOT declared"
EndIf

Re: If not Defined() then Define inside If/CompilerIf. Defined() always returns 0

Posted: Wed Feb 15, 2023 11:51 pm
by Demivec
destiny wrote: Wed Feb 15, 2023 11:42 pm Ok, maybe I asked wrong.
How can I understand that MyParam is Defined? Not MyStruct.
After Define MyParam.MyStruct Defined() is always answers False.
TypeOf() MyParam and MyStruct tells that both of them are Structure. (03-1, 03-2, 04).
You define MyParam as a variable, not a structure.
Use

Code: Select all

CompilerIf Not Defined(MyParam, #PB_VARIABLE)
  Debug "Variable 'MyParam' is not declared"
  Define MyParam.MyStruct
CompilerEndIf

Re: If not Defined() then Define inside If/CompilerIf. Defined() always returns 0

Posted: Thu Feb 16, 2023 12:10 am
by destiny
Demivec wrote: Wed Feb 15, 2023 11:51 pmYou define MyParam as a variable, not a structure.
Yep, found it when tested:

Code: Select all

Debug "21-01. " + Defined(MyParam, #PB_Constant)
Debug "21-02. " + Defined(MyParam, #PB_Variable)
Debug "21-03. " + Defined(MyParam, #PB_Array)
Debug "21-04. " + Defined(MyParam, #PB_Structure)
Debug "21-05. " + Defined(MyParam, #PB_List)
Debug "21-06. " + Defined(MyParam, #PB_Map)
Debug "21-07. " + Defined(MyParam, #PB_Interface)
Debug "21-08. " + Defined(MyParam, #PB_Procedure)
Debug "21-09. " + Defined(MyParam, #PB_Function)
Debug "21-10. " + Defined(MyParam, #PB_OSFunction)
Debug "21-11. " + Defined(MyParam, #PB_Label)
Debug "21-12. " + Defined(MyParam, #PB_Prototype)
Debug "21-13. " + Defined(MyParam, #PB_Module)
Debug "21-14. " + Defined(MyParam, #PB_Enumeration)
21-02 result was True.
Require a lot of rest. :|
Thanx to you all.