Составители:
Выполнению этих операций способствуют две дополнительные функции.
Функция GetPageBaseEntry получает в качестве аргумента индекс массива и
возвращает индекс первого элемента соответствующего страничного блока.
Иными словами, эта функция производит округление до ближайшего меньшего
значения, кратного четырем. Функция AdjustLookupTable удаляет запись,
выделенную в списке, и смещает все последующие элементы для заполнения
образовавшейся пустоты.
void DeleteItem ( void )
{
int iCurSel; // позиция текущей выбранной строки в списке
int iPlace; // позиция текущей выбранной строки в массиве элементов
int iStart; // позиция первого элемента в той странице памяти,
// где находится выбранный элемент
int i; // переменная цикла
BOOL bFree; // TRUE, если все 4 элемента, содержащиеся в данной
// странице памяти, не используются
BOOL bTest; // для проверки результатов
// определяет смещение в памяти текущей выбранной записи
iCurSel = ListBox_GetCurSel( hwndList ) ;
iPLace = iListLookup [iCurSel] ;
// обнуляет удаленный элемент
FillMemory( & (pBase [iPlace * ITEM_SIZE] ) , ITEM_SIZE, 0 );
// помечает этот элемент как свободный
bInUse[iPlace] = FALSE;
На данном этапе определяется номер первого элемента в текущей
странице памяти. Если все четыре элемента, которые находятся на данной
странице, свободны, закрепление страницы отменяется.
iStart = GetPageBaseEntry( iPlace ) ;
bFree = TRUE;
for( i = 0; i < 4; i++ ) // проверка четырех записей
{
if( bInUse[i + iStart] ) // используется?
{
bFree = FALSE; // страница занята
}
}
Если не используется вся страница памяти, она освобождается.
if( bFree ) // свободна ли страница?
{ // ДА; освободить ее
22
Выполнению этих операций способствуют две дополнительные функции. Функция GetPageBaseEntry получает в качестве аргумента индекс массива и возвращает индекс первого элемента соответствующего страничного блока. Иными словами, эта функция производит округление до ближайшего меньшего значения, кратного четырем. Функция AdjustLookupTable удаляет запись, выделенную в списке, и смещает все последующие элементы для заполнения образовавшейся пустоты. void DeleteItem ( void ) { int iCurSel; // позиция текущей выбранной строки в списке int iPlace; // позиция текущей выбранной строки в массиве элементов int iStart; // позиция первого элемента в той странице памяти, // где находится выбранный элемент int i; // переменная цикла BOOL bFree; // TRUE, если все 4 элемента, содержащиеся в данной // странице памяти, не используются BOOL bTest; // для проверки результатов // определяет смещение в памяти текущей выбранной записи iCurSel = ListBox_GetCurSel( hwndList ) ; iPLace = iListLookup [iCurSel] ; // обнуляет удаленный элемент FillMemory( & (pBase [iPlace * ITEM_SIZE] ) , ITEM_SIZE, 0 ); // помечает этот элемент как свободный bInUse[iPlace] = FALSE; На данном этапе определяется номер первого элемента в текущей странице памяти. Если все четыре элемента, которые находятся на данной странице, свободны, закрепление страницы отменяется. iStart = GetPageBaseEntry( iPlace ) ; bFree = TRUE; for( i = 0; i < 4; i++ ) // проверка четырех записей { if( bInUse[i + iStart] ) // используется? { bFree = FALSE; // страница занята } } Если не используется вся страница памяти, она освобождается. if( bFree ) // свободна ли страница? { // ДА; освободить ее 22
Страницы
- « первая
- ‹ предыдущая
- …
- 20
- 21
- 22
- 23
- 24
- …
- следующая ›
- последняя »