Posted By: AndrewAMD
Document AssetInt and AssetFloat - 11/13/18 12:59
jcl,
I think it would be useful for the manual to:
* Document AssetInt and AssetFloat
* Document how to avoid the problems I encountered, below.
- - - - -
I recently had the privilege to work on a custom indicator, where it seemed very practical to store some binary switches in an integer on a per-asset basis.
I dug into the headers, and I found these #define's:
... where Skill is a var array with 16 elements.
Cool, so I can use an AssetInt. Here was my naive implementation:
It took me an hour of debugging to figure out if and why my I3 int was giving me garbage values. Here was my fix:
As you can see, I had to double the array offset to position my integer correctly. In other words, I3 was originally at position 1.5 on the var array, so if I change the value of V1, it transforms I3 into a garbage value. The fix has I3 at position 3 of the var array, as desired.
As an added bonus, this means that the script writer can have:
* Up to 16 AssetVars, or
* Up to 16 AssetStrs (7 characters before null termination each), or
* Up to 32 AssetInts, or
* Up to 32 AssetFloats, or
* Any mix-and match of the above, with the appropriate pointer arithmetic.
I think it would be useful for the manual to:
* Document AssetInt and AssetFloat
* Document how to avoid the problems I encountered, below.
- - - - -
I recently had the privilege to work on a custom indicator, where it seemed very practical to store some binary switches in an integer on a per-asset basis.
I dug into the headers, and I found these #define's:
Code:
#define AssetVar (g->asset->Skill) #define AssetStr (char*)&(g->asset->Skill) #define AssetInt ((int*)AssetVar) #define AssetFloat ((float*)AssetVar)
... where Skill is a var array with 16 elements.
Cool, so I can use an AssetInt. Here was my naive implementation:
Code:
#define V0 AssetVar[0] #define V1 AssetVar[1] #define V2 AssetVar[2] #define I3 AssetInt[3]
It took me an hour of debugging to figure out if and why my I3 int was giving me garbage values. Here was my fix:
Code:
#define V0 AssetVar[0] #define V1 AssetVar[1] #define V2 AssetVar[2] #define I3 AssetInt[3*2]
As you can see, I had to double the array offset to position my integer correctly. In other words, I3 was originally at position 1.5 on the var array, so if I change the value of V1, it transforms I3 into a garbage value. The fix has I3 at position 3 of the var array, as desired.
As an added bonus, this means that the script writer can have:
* Up to 16 AssetVars, or
* Up to 16 AssetStrs (7 characters before null termination each), or
* Up to 32 AssetInts, or
* Up to 32 AssetFloats, or
* Any mix-and match of the above, with the appropriate pointer arithmetic.