|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
06.05.2018, 11:22 | #1 |
Новичок
Джуниор
Регистрация: 06.05.2018
Сообщений: 2
|
Страничное распределение памяти C++
Прошу помочь! Мне необходимо написать программу для страничного распределения памяти. Есть код, но на языке C. Помогите исправить на C++.
# include <stdio.h> # include <stdlib.h> # include <string.h> # define N 3 # define M 20 int k=0; int process[N]; //ОП struct stable //таблица страниц { int number;//номер страницы int presence;//признак присутсвия int modify;//признак модификации table[M]; } void check(FILE*f) //проверка на открытие файла { if(f==NULL) { printf("can't open file"); getchar(); getchar(); exit(1); } int checkfree() //проверка на свободную память { int i; for(i=0;i<N;i++) { if(process[i]==0) //предположим что "0" является показателем незанятой памяти { return i; } } return -1; } void saveprocess(FILE*f, int i) //сохрание в памяти и внешней памяти { scanf("%d", &process[i]); f=fopen("process.txt","ab"); check(f); fwrite(&process[i], sizeof(process[i]), 1, f); fclose(f); } void savetable(int i) //сохранение таблицы { table[k].number=i; //вирт. адресс table[k].presence=1; table[k].modify=0; k++; // К-ой таблице соотвествует К процесс } int addprocess(FILE*f) //добавление нового процесса { int i = checkfree(); puts("введите новые данные\n"); if (i!=-1) //если существует свободная память { saveprocess(f, i); savetable(i); } if (i==-1) //если таковой нет { int j,x; for(j=0;j<M;j++) { if(table[j].presence==1) //находим первый попавшийся процесс находящийся в ОП { if(table[j].modify==1) //проверяем были ли изменения в процессе { table[j].modify=0; //если были то меняем данные на диске f=fopen("process.txt","rb+"); check(f); for(x=0;x<j;x++) { fseek(f, sizeof(process[x]), 1); } fwrite(&process[table[j].number], sizeof(process[table[j].number]), 1, f); fclose(f); table[j].presence=0; //после изменений можем добавить новый процесс на место старого saveprocess(f, table[j].number); savetable(table[j].number); return 0; } else //если изменений не было, то просто добавляем новый процесс { table[j].presence=0; saveprocess(f, table[j].number); savetable(table[j].number); return 0; } } } } } int out_and_edit(int i) //вывод и изменение { int y; printf("%d",process[table[i].number]); // то его номер является вирт. puts("\nЖелаете изменить процесс?\n1-да\n2-нет\n"); scanf("%d",&y); if(y==1) { puts("введите новые данные\n"); scanf("%d", &process[table[i].number]); table[i].modify=1; } else { return 0; } } void download_in_memory(int j, int x, int z, FILE*f)//считывание процесса с диска { table[j].presence=0; //после изменений можем добавить желаемый процесс на место старого f=fopen("process.txt","rb"); check(f); for(x=0;x<z;x++) { fseek(f, sizeof(process[x]), 1); } fread(&process[table[j].number], sizeof(process[table[j].number]), 1, f); fclose(f); table[z].presence=1; } int view_and_editprocess(FILE*f) //просмотр и редактирование { int z,j,x; puts("введите номер процесса, который вы хотите просмотерть\nВнимание! Нумерация начинается с 0!\n"); scanf("%d",&z); f=fopen("process.txt","rb+"); check(f); for(x=0;x<z;x++) //проверка на существование процесса { fseek(f, sizeof(process[x]), 1); if(!feof(f)) { puts("такого процесса нет"); fclose(f); return 0; } } fclose(f); if(table[z].presence==1) //если процесс находится в оп { out_and_edit(z); } else //если нет, то программа обработки страничного прерывания загружает его в оп { for(j=0;j<M;j++) { if(table[j].presence==1) //находим первый попавшийся процесс находящийся в ОП { if(table[j].modify==1) //проверяем были ли изменения в процессе { table[j].modify=0; //если были то меняем данные на диске f=fopen("process.txt","rb+"); check(f); for(x=0;x<j;x++) { fseek(f, sizeof(process[x]), 1); } fwrite(&process[table[j].number], sizeof(process[table[j].number]), 1, f); fclose(f); download_in_memory(j, x, z, f); out_and_edit(z); return 0; } else //если изменений не было, то просто добавляем процесс, который хотим просмотреть { download_in_memory(j, x, z, f); out_and_edit(z); return 0; } } } } } void view(FILE*f) //вывод файла с процессами { int vprocess; f=fopen("process.txt","rb"); check(f); fread(&vprocess, sizeof(vprocess), 1, f); if(!feof(f)) { while(!feof(f)) { printf("%d ", vprocess); fread(&vprocess, sizeof(vprocess), 1, f); } } else { printf("Отсутствуют какие-либо записи в файле.\n\n"); } fclose(f); } void viewop() //вывод процессов, находящихся в ОП { int i; for (i=0;i<N;i++) { printf("%d ",process[i]); } } int main() { FILE*f; f=fopen("process.txt","wb"); int a; while(1) { printf("\n---------MENU---------\n\nвведите число '1-5', каждая цифра соотвествует командам '1-5'.\n1. показать весь файл с процессами.\n2. добавить процесс.\n3. посмотреть и изменить процесс.\n4. показать процессы в ОП.\n5. Выход.\n\n"); scanf("%d",&a); switch(a) { case 1: { view(f); break; } case 2: { addprocess(f); break; } case 3: { view_and_editprocess(f); break; } case 4: { viewop(); break; } case 5: { return(0); } case 6: { viewtable(); break; } } getchar(); getchar(); system("cls"); } return 0; return 0; } |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Распределение памяти. Динамическое выделение памяти с++ | Tolian92 | Помощь студентам | 8 | 14.05.2012 21:44 |
Распределение в памяти в СИ | marsh123 | Общие вопросы C/C++ | 1 | 17.11.2011 16:35 |
сегментно-страничное распределение | Angel of death | Помощь студентам | 1 | 25.06.2010 10:24 |
Страничное распределение памяти | Angel of death | Помощь студентам | 1 | 22.06.2010 10:35 |
(BC 3.1) Распределение памяти! | Lawliet32 | Помощь студентам | 8 | 28.12.2009 23:49 |