1

Тема: Стек построенный на Memory Mapped File

По подобию Стека фиксированного размера, построенного на массиве организую стек на Memory Mapped File в DLL под QLua.

При размещении строчек кода в вызываемой функции из "main" функции- данные передаются

// вызываемая функция
static int BBA(lua_State* L){
...
// код записи побайтовой числа типа double      
double h = lua_tonumber(L, -1);
 lua_pop(L, 1);

/*для общей картины
union easy{
    double *d;
    size_t *s_t;
    BYTE *pb;
} q_type;
*/

q_type.d = &h;

if (hFileMap_HC) {
    PBYTE pb = (PBYTE)(MapViewOfFile(hFileMap_HC, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 1024));

    if (pb != NULL){
       if (!pb[0]!= 0){
                memcpy(pb,q_type.pb ,sizeof(double));
                }
            } 
    UnmapViewOfFile(pb);
    }
...
}

// основная функция
static int forLua_main(lua_State* L){
...
BBA(L);
...
}


При попытки создать отдельную функцию инициализации стека данные не записываются - ничего не могу понять.

struct stack{
    double elem[STACK_MAX];
    size_t top;
};

//функция инициализации
static int init ( lua_State* L, struct stack *stk){

    stk->top = 0;
    stk->elem[stk->top] = 10;
        
        
//    lua_pushnumber(L, stk->elem[stk->top]); 
//    при выводе сообщения Lua ругается пока не закрою окно сообщения
//    MessageBoxA(0,lua_tostring(L,-1), "double", MB_OK);

    if (hFileMap_HC) {
        PBYTE pb = (PBYTE)(MapViewOfFile(hFileMap_HC, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 1024));
        if (pb != NULL)    {
                q_type.d = &(stk->elem[stk->top]);
                memcpy(pb, q_type.pb, sizeof(double));
                q_type.s_t = &(stk->top);
                memcpy(pb + sizeof(double), q_type.pb, sizeof(size_t));        
            }
        UnmapViewOfFile(pb);
    }
    return 0;
}

//инициализация в main
static int forLua_main(lua_State* L){
...
stack S;
init(L, &S);
...
}

Кто-нибудь???

2

Re: Стек построенный на Memory Mapped File

Вопрос закрыт!

При замене:

//функция инициализации
static int init ( lua_State* L, struct stack *stk){

    stk->top = 0;
    stk->elem[stk->top] = 10;//         <------------
...

На:

//функция инициализации
static int init ( lua_State* L, struct stack *stk){

    stk->top = 0;
    stk->elem[stk->top] = 10.1 ;//         <------------
...

Все заработало smile и стало ясно.