newbie again: exposing my ignorance...

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

newbie again: exposing my ignorance...

Chris
Thanks a lot you for your help, but I'll implement my
matrices as userdata and let my C functions do
all the maths. This seems to be the best and fastest method.
Is the following code a *good* way to do this?

Sorry for the notation, but I'm an old *Hungarian*.

Chris

//tagMatrix is global

void InitMatrix(lua_State *L)
{
        lua_register(L, "MATRIX", CreateMatrix);
        lua_register(L, "MyMatrixFunc", MyMatrixFunc);
        tagMatrix = lua_newtag(L);
        lua_pushcfunction(L, GetIndex);
        lua_settagmethod(L, tagMatrix, "gettable");
        lua_pushcfunction(L, SetIndex);
        lua_settagmethod(L, tagMatrix, "settable");
        lua_pushcfunction(L, FreeMatrix);
        lua_settagmethod(L, tagMatrix, "gc");
}

//lua: mat = MATRIX(cols, rows)
int CreateMatrix(lua_State *L)   //registered function
{
        PMATRIX pMat;
        int iCols, iRows;

        iCols = lua_tonumber(L, 1);
        iRows = lua_isnull(L, 2) ? 1 : lua_tonumber(L, 2);
        if((pMat = MatAlloc(iRows, iCols)) == NULL)
                lua_error(L, "Out of Memory!");
        lua_pushusertag(L, (void*) pMat, tagMatrix);
        return 0;
}

//lua: mat[col][row] => my main problem
int GetIndex(lua_State *L)   //tag method
{
        PMATRIX pMat;
        int iCol, iRow;

        pMat = (PMATRIX) lua_touserdata(L, 1);
        iCol = lua_tonumber(L, 2) - 1;
/************************************************************
* ????  iRow = lua_isnull(L, 3) ? 1 : lua_tonumber(L, 3) - 1;
* Do I get the row index here? If not - how do I get it?
************************************************************/
        if((iCol < 0) || (iCol > pMat->nCols) ||
            (iRow < 0) || (iRow > pMat->nRows))
                lua_error(L, "Index out of Range!")
        lua_pushnumber(L, pMat->pData[iRow][iCol]);
        return 0;
}

int MyMatrixFunc(lua_State *L)   //registered function
{
        PMATRIX pMat;

        if(lua_tag(L, 1) != tagMatrix)
                lua_error(L, "Invalid Argument!");
        pMat = (PMATRIX) lua_touserdata(L, 1);
        //do something here
        return 0;
}