Искажение данных при хранении в разделяемой памяти
Просто передаваемое значение описывается типом enum{}; и когда я после глюка перенумеровал значения в ручную, т.е. enum{A = 0, B = 1....}; то глюк исчез, а потом снова появился, причем ничего не менялось :(
З.Ы. код приводить не вижу смысла, так как производимые операции стандартные.
Может ты вылез за пределы своего меппинга.. Приведи кусочек кода..
int fa_Interface::CreateInterface(int inBrokerCount, int inInstrCount)
{
char* pBuf;//буферный указатель
TableLen = inBrokerCount * inInstrCount;//длина таблиц (всегда > 0)
...
hActionTable = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, TableLen * sizeof(ActionRec), NAME_ACTION_TABLE);
pBuf = NULL;
pBuf = (char*)MapViewOfFile(hActionTable, FILE_MAP_WRITE, 0, 0, 0);
pActionTable = (ActionRec*)pBuf;
if(!pActionTable)
{
MessageBox(NULL, "Ошибка! Не могу создать pActionTable", "Монитор", MB_OK);
//ОБРАБОТАТЬ ОШИБКУ!
return 5;
}
...
}
вот так пишу в элемент массива:
int fa_Interface::AddActionRec(ActionRec* inActionRec)
{
if(!Active) return 12;//ОБРАБОТАТЬ ОШИБКУ!
//корректируем необходимые элементы структуры ActionRec
inActionRec->BrokerName[NAMELEN - 1] = '\0';
inActionRec->InstrName[NAMELEN - 1] = '\0';
inActionRec->Active = 1;
//ищем свободную ячейку в массиве
int i;
WaitForSingleObject(hPriceActionSem, INFINITE); //---блок. память
for(i = 0; i < TableLen; i++)
if(pActionTable.Active == 0)
{
pActionTable = *inActionRec;
ReleaseMutex(hPriceActionSem); //---разблок. память
return 0;
}
MessageBox(NULL, "ERROR! таблица ACTION переполнена", "", MB_OK);//ОБРАБОТАТЬ ОШИБКУ!
ReleaseMutex(hPriceActionSem); //---разблок. память
return 14;
}
Так открываю память другим процессом:
int fa_Interface::OpenInterface(void)
{
...
char* pBuf;
pBuf = NULL;
hActionTable = OpenFileMapping(FILE_MAP_WRITE, FALSE, NAME_ACTION_TABLE);
pBuf = (char*)MapViewOfFile(hActionTable, FILE_MAP_WRITE, 0, 0, 0);
pActionTable = (ActionRec*)pBuf;
if((!pActionTable) || (!hActionTable))
{
MessageBox(NULL, "Ошибка! Не могу создать таблицу pActionTable.", "Арбитр", MB_OK);
//ОБРАБОТАТЬ ОШИБКУ!
return 10;
}
...
}
И вот так считываю запись:
int fa_Interface::LoadActionRec(char* inBrokerName, char* inInstrName, int inIndex, ActionRec* inActionRec)
{
WaitForSingleObject(hPriceActionSem, INFINITE); //---блок. память
//вариант поиска по заданным именам брокера и инструмента
int i;
int j = 0;
int inLen1 = strlen(inInstrName);
int inLen2 = strlen(inBrokerName);
bool ft_flag1, ft_flag2;
//вычисляем запись с совпадающими именами брокера и инструмента
for(i = 0; i < TableLen; i++)
{
//ищем среди "активных" записей
if(pActionTable.Active == 0) continue;
//сравнение строк
ft_flag1 = true; j = 0;
while((j < (NAMELEN - 1)) && (j < inLen1))
{
if(inInstrName[j] != pActionTable.InstrName[j])
{
ft_flag1 = false;
break;
}
j++;
}
if(!ft_flag1) continue;
//сравнение строк
ft_flag2 = true; j = 0;
while((j < (NAMELEN - 1)) && (j < inLen2))
{
if(inBrokerName[j] != pActionTable.BrokerName[j])
{
ft_flag2 = false;
break;
}
j++;
}
if(!ft_flag2) continue;
//если есть оба совпадения - возвращаем найденную запись
*inActionRec = pActionTable;
//очистить запись
pActionTable.Active = 0;
ReleaseMutex(hPriceActionSem); //---разблок. память
return 0;
}
ReleaseMutex(hPriceActionSem); //---разблок. память
return 17;//ОБРАБОТАТЬ ОШИБКУ! (NO_RESULT_FOUNDED)
}
вот и все. причем ошибка возникает не всегда, но эээ.. тенденциозно код уже прочесал на 1000 раз, посто мистика какая-то :(
struct ActionRec
{
char BrokerName[NAMELEN];
char InstrName[NAMELEN];
InstrActionEnum InstrAct;
double Lot;
long Magik;
int Active;
};
глючит именно поле "InstrAct" :(
вот ее тип:
enum InstrActionEnum{IA_WAIT = 0, IA_BUY = 1, IA_SELL = 2, IA_CLOSE = 3, IA_DEINIT = 4};