Plugin access to arrays?

Charles Dye

Super Moderator
Staff member
May 20, 2008
3,853
48
Albuquerque, NM
prospero.unm.edu
HELP PLUGINS says:
ArrayVariables

Plugins can access TCC array variables directly through the ArrayVariables array. See TakeCmd.h in the SDK for details.
but I have not been able to find a copy of TakeCmd.h which documents this interface. I vaguely remember seeing a synopsis at one point, and being deeply confused by it. Let me know if you figure it out....
 
May 20, 2008
9,425
63
Syracuse, NY, USA
HELP PLUGINS says:


but I have not been able to find a copy of TakeCmd.h which documents this interface. I vaguely remember seeing a synopsis at one point, and being deeply confused by it. Let me know if you figure it out....
I was aware of the existence of that array (or at least a function to get a pointer to it). TakeCmd.dll has
Code:
g:\tc24> undecorate [email protected]@[email protected]@A
struct ARRAYS * ArrayVariables
but it's not documented and I have no clue what the struct may look like. I was hoping for ways to manipulate array entries. If the array of structs gives pointers to the arrays and the arrays are like "C" arrays, that would be good enough. If they're not like "C" arrays, we'd need some functions.
 
May 20, 2008
9,425
63
Syracuse, NY, USA
I figured out a little. This much (the name) works (32-bit version).
Code:
struct ARRAY
{
    LPWSTR szName;
    BYTE bytes[64];    
};

    ARRAY *Arrays = (ARRAY*) GetProcAddress(global.hTCDLL, "[email protected]@[email protected]@A");
    Sprintf(szExpr, L"SETARRAY array_name[3,4,5,6]");
    Command(szExpr, 0);
    Sprintf(szExpr, L"SET array_name[0,0,0,0]=666");
    Command(szExpr, 0);
    Printf(L"Address of name: 0x%lX\r\n", Arrays[0].szName);
    Printf(L"ArrayName = %s\r\n", Arrays[0].szName);
Output:
Code:
Address of name: 0x1C36B48
ArrayName = array_name
I can't make a lot of sense out of the next 64 bytes. I see the 4 sizes there (though the last one looks different from the first three), There doesn't seerm to be a number of dimensions or a pointer to the beginning of the array.
Code:
    for ( INT i=0; i<64;i++ )
        Printf(L"%d ", Arrays[0].bytes[i]);
Output:
Code:
3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 152 121 196 1
 
May 20, 2008
9,425
63
Syracuse, NY, USA
This was the 64 bytes following the name pointer for a 3x4x5x6 array.

Code:
3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 152 121 196 1
Here are the 64 bytes following the name pointer for a 3x4x5 array.

Code:
3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 8 121 118 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
It doesn't even look like the same kind of struct. I give up.