LINUX.ORG.RU

Битовые поля в Си


0

0

//************************************************************************

// define page table entry struct

//************************************************************************

struct PTE

{

struct PTE_INFO

{

unsigned int

PROG_FILE:1, // if turned on indicates that page should

// be taken from the program file (executable)

SWAP_FILE:1, // if turned on indicates that page

// is swapped out to the swap file

// NOTE: 2 bits PROF_FILE/SWAP file are used

// because both bits turned off indicate BSS page

VALID:1, // indicates page presence/absence in the memory

DIRTY:1, // indicates whether the page was modified

RDONLY:1, // indicates existence/absence of write rmission

// for the page

EMPTY:3; // reserved bits (not in use)

} pte_info;

// page tabe entry data (union is used for alignment to 8 bits)

union {

struct PTE_INFO info;

char value; // just to initiate easily info bits

} PTE_DATA;

// number of frame in physical memory

short PTE_PHYS_PAGE; // even thought sizeof (short) > 512

};

Вот достался такой код, как правильно заюзать такую структуру ?

т.е. нужен доступ к полям PROG_FILE, SWAP_FILE, VALID, DIRTY, RDONLY.

Мой код :

int main(int argc, char** argv)

{

GList* VMemInfo;

int i;

for( i =0; i <10; i++) { VMemInfo =g_list_append (VMemInfo, NULL); VMemInfo[i].data =malloc(sizeof(struct PTE)); }/* end for */ /* здесь я хочу проинициализировать PROG_FILE, SWAP_FILE, VALID, DIRTY, RDONLY */ .

. . . .

return 0;

} /* end main */ Вопрос больще по Си, я пока учусь. Сильно не пинайте. Спасибо.

anonymous

>Битовые поля в Си

Прочитал как "Поля битвы в Си"

iRunix ★★★★
()

> GList

в музей юмора:)

dilmah ★★★★★
()
Ответ на: комментарий от mky

====> VMemInfo[i].data->pte_info.PROG_FILE = 1;

vm.c:56: warning: dereferencing 'void *' pointer

vm.c:56: error: request for member 'pte_info' in something not a structure or union

Нужно наверное привести что то к нужному типу

совсем запутался уже

anonymous
()
Ответ на: комментарий от anonymous

похоже тебе перед битовыми полями нужно разобраться со списками и указателями.

Почему ты обращаешься к i-мому жл-ту списка как memInfo[i] ??

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

===> Почему ты обращаешься к i-мому жл-ту списка как memInfo[i] ??

Потаму что

GList* VMemInfo;

for( i =0; i <10; i++) {

VMemInfo =g_list_append (VMemInfo, NULL);

VMemInfo[i].data =malloc(sizeof(struct PTE));

}

anonymous
()
Ответ на: комментарий от anonymous

> Потаму что

никогда не пользовался glib, но мне это режет глаз как ошибка человека не знающего Си.

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

Я же написал, что учусь. Просто нужно использовать GList

Вот я и запутался с указателями и приведениями типов.

Для того и форум что бы спрашивать/советоваться

anonymous
()
Ответ на: комментарий от anonymous

> Просто нужно использовать GList

первая ссылка в гугле: http://library.gnome.org/devel/glib/stable/glib-Doubly-Linked-Lists.html

int main(int argc, char** argv) 
{ 
  GList *VMemInfo = 0; 
  int i;

  for (i=0; i<10; i++)
  {
    struct PTE *data = (struct PTE *)malloc(sizeof(struct PTE));
    data->PROG_FILE = 1;
    data->SWAP_FILE = 0;
    VMemInfo = g_list_prepend(VMemInfo, data);
  }
  . . . . 
  return 0; 
}

dilmah ★★★★★
()
Ответ на: комментарий от anonymous

только в твоей структуре PROG_FILE и компания встречаются _два_ раза: один в поле pte_info, другой в поле инфо внутри поля PTE_DATA

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

===> data->pte_info.PROG_FILE = 1;

Большущее СПАСИБО господин dilmah

anonymous
()
Ответ на: комментарий от dilmah

===>только в твоей структуре PROG_FILE и компания встречаются _два_ раза: один в поле pte_info, другой в поле инфо внутри поля PTE_DATA

Я обязательно спрошу у препода что он покуривает

ещё раз спасибо

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.