Этот расчет кажется слишком сложным.
char * cMemoryMappedFile::GetPointer(int n){
unsigned int baseoff;
if( n < MEM_BLOCK_SIZE / 2)
{
baseoff = 0;
}
else
{
baseoff = ((n + MEM_BLOCK_SIZE / 4) &
(~(MEM_BLOCK_SIZE / 2 - 1))) - MEM_BLOCK_SIZE / 2;
}
...
Как я понимаю, n
- это желаемое смещение в файле, а baseoff
- это первый адрес, который мы на самом деле отобразим. Нам нужно наибольшее значение baseoff
<= <code>n, где baseoff
- это кратное MEM_BLOCK_SIZE
. Так как насчет:
unsigned int baseoff = (n / MEM_BLOCK_SIZE) * MEM_BLOCK_SIZE;
Позже:
MapPtr = (char*)::MapViewOfFile(hMapping, FILE_MAP_WRITE | FILE_MAP_READ, 0,
baseoff, mappedlength);
Вы должны проверить результат MapViewOfFile
.
Не ясно, что вы хотите, чтобы возвращаемое значение было. Я предполагаю, что adjustedptr + n
должен указывать на первоначально запрошенный байт. Но затем вы пытаетесь получить доступ к *adjustedptr
, который не гарантируется как часть представления, когда базовое смещение больше MEM_BLOCK_SIZE
. Я думаю, вы хотите, чтобы printf использовал *(adjustedptr + n)
или adjustedptr[n]
. Или, может быть, вы пытаетесь получить доступ к первому отображенному байту, который будет adjustedptr[baseoff]
.