Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобраться с кодом, Нужно подробно описать код, с 94 по 108 
:(
    Опции темы
arnol
Дата 22.1.2017, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 22.1.2017

Репутация: нет
Всего: нет



1.    #include "stdafx.h"
2.    #include <windows.h>
3.    #include <conio.h>
4.    #include <stdio.h>

5.    #define MSZ 10240
6.    #define PSZ 1024
7.    #define PCNT 20
8.    #define RPCNT 10

9.    char memory[MSZ]; 

10.    struct sPages
11.    {
12.    char id[PCNT];
13.    char rwCnt[PCNT];
14.    char pos[PCNT]; 
15.    };

16.    struct sAllocated
17.    {
18.    char data[PCNT][PCNT]; 
19.    };

20.    struct sPage
21.    {
22.    char data[PSZ]; 
23.    };

24.    sPages* info; 
25.    sPage* tData; 
26.    sAllocated* alc; 

27.    void fr(char* data,int num) 
28.    {
29.    char name[3] = "c/"; 
30.    name[2] = (char)(num + 97); 
31.    FILE * pFile;
32.    pFile = fopen(name,"r");
33.    if(pFile==NULL)return;
34.    fgets(data,PSZ,pFile);
35.    fclose(pFile);
36.    }

37.    void fw(char* data,int num) 
38.    {
39.    char name[3] = "c/";
40.    name[2] = (char)(num + 97);
41.    FILE * pFile;
42.    pFile = fopen(name,"a");
43.    if(pFile==NULL)return;
44.    fputs(data,pFile);
45.    fclose(pFile);
46.    }

47.    int getPageFromSmallRwCnt()
48.    {
49.    int id,rwCnt,pos;

50.    id = info->id[0];
51.    rwCnt = 255;
52.    pos = 0;

53.    int i;
54.    i = PCNT;
55.    while(i--)
56.    {
56.1.    if(info->rwCnt[i] < rwCnt && info->pos[i] < RPCNT/* && info->rwCnt[i] != -1*/)
56.2.    {
56.2.1.    rwCnt = info->rwCnt[i];
56.2.2.    id = info->id[i];
56.2.3.    pos = i;
56.3.    }
57.    }

58.    return pos;
59.    }

60.    sPage* getPageForReadOrWrite(char id) 
61.    {
62.    sPage* tmp;

63.    char idtmp,rwtmp;

64.    int i;
65.    int cpage = -1;
66.    i = PCNT;
67.    while(i--) // ищем по id
68.    {
68.1.    if(info->id[i] == id)
68.2.    {
68.2.1.    cpage = i;
68.2.2.    i = 0;
68.3.    }
69.    }
70.    if(info->pos[cpage] < RPCNT) 
71.    {
71.1.    info->rwCnt[cpage] ++; 
71.2.    return (sPage*)(&memory[info->pos[cpage] * PSZ]); 
72.    {
72.1.    int rampage = getPageFromSmallRwCnt();
72.2.    //printf("%d\n\n",rampage);

72.3.    fr((char*)tData,info->pos[cpage]);
72.4.    tmp = (sPage*)(&memory[info->pos[rampage] * PSZ]);
72.5.    fw((char*)tmp,info->pos[cpage]);
72.6.    for(int z = 0;z < PSZ;z ++)
72.6.1.    tmp->data[z] = tData->data[z]; 
72.7.    idtmp = info->id[rampage];
72.8.    rwtmp = info->rwCnt[rampage];
72.9.    info->id[rampage] = info->id[cpage];
72.10.    info->rwCnt[rampage] = info->rwCnt[cpage];
72.11.    info->id[cpage] = idtmp;
72.12.    info->rwCnt[cpage] = rwtmp;

72.13.    info->rwCnt[rampage] ++; 
72.14.    return (sPage*)(&memory[info->pos[rampage] * PSZ]);
73.    }
74.    }
75.    char getPagePosById(char id)
76.    {
77.    int i = 0;
78.    for(i = 0;i < PCNT;i ++)
79.    {
79.1.    if(info->id[i] == id)return info->pos[i];
80.    }
81.    }
82.    void dump(int a = 0) 
83.    {
84.    int i = 0;
85.    int j = 0;
86.    if(a)
87.    {
87.1.    printf("ID\tPOS\tRWCNT\n\n");
87.2.    for(i = 0;i < PCNT;i ++)
87.3.    {
87.3.1.    printf("%d\t%d\t%d\n",info->id[i],info->pos[i],info->rwCnt[i]);
87.4.    }
87.5.    printf("\n\n");
87.6.    for(i = 0;i < PCNT;i ++)
87.7.    {
87.7.1.    printf("\n");
87.7.2.    for(j = 0;j < PCNT;j ++)
87.7.3.    printf("%d ",alc->data[i][j]);
87.8.    }
88.    }
89.    printf("BLOCK_ID\tPAGES\n");
90.    for(i = 0;i < PCNT;i ++)
91.    {
91.1.    if(alc->data[i][0] == -1)continue;
91.2.    if(i < 10)
91.2.1.    printf("%d.........\t",i);
91.3.    else
91.3.1.    printf("%d........\t",i); 
91.4.    for(j = 0;j < PCNT;j ++)
91.5.    {
91.5.1.    if(alc->data[i][j] != -1)printf("%d ",getPagePosById(alc->data[i][j]));
91.6.    }
91.7.    printf("\n");
92.    }
93.    }

94.    int alloc(int size) 
95.    {
96.    int i = 0;

97.    int n = 0;
98.    int m = 0;

99.    int tblid = 0;
100.    while(alc->data[tblid][0] != -1) 
101.    {
101.1.    tblid ++;
102.    }
103.    if(tblid > PCNT)return -1;
104.    while(size > 0)
105.    {
105.1.    size -= PSZ;
105.2.    i = PCNT;
105.3.    m = -1;
105.4.    while(i--)
105.5.    {
105.5.1.    if(info->rwCnt[i] == -1) 
105.5.2.    {
105.5.3.    m = info->id[i];
105.5.4.    info->rwCnt[i] = 0;
105.5.5.    i = 0;
105.5.6.    }
105.6.    }
105.7.    if(m == -1)return -1;
105.8.    alc->data[tblid][n] = m; 
105.9.    n ++;
106.    }
107.    return tblid;
108.    }

109.    void setById(int id,int rwCnt) 
110.    {
111.    int i =0;
112.    while(info->id[i] != id)
113.    {
113.1.    i ++;
114.    }
115.    info->rwCnt[i] = rwCnt; 
116.    }

117.    void free(int id) 
118.    {
119.    for(int i = 0;i < PCNT;i ++)
120.    {
120.1.    if(alc->data[id][i] != -1)setById(alc->data[id][i],-1);
120.2.    alc->data[id][i] = -1;
121.    }
122.    }

123.    void write(int id,int size,int offset,char* data) 
124.    {
125.    sPage* tmp;

126.    int start = offset / PSZ; 
127.    int start_offset = offset - start * PSZ; 

128.    int cur = 0; 
129.    int sp = start_offset; // позиция для записи
130.    int pp = start; // номер страницы

131.    if(alc->data[id][pp] != -1)
131.1.    tmp = getPageForReadOrWrite(alc->data[id][pp]);
132.    else
132.1.    return;

133.    while(size--)
134.    {
134.1.    if(sp >= PSZ)
134.2.    {
134.2.1.    sp = 0;
134.2.2.    pp ++;
134.2.3.    if(alc->data[id][pp] != -1)
134.2.4.    tmp = getPageForReadOrWrite(alc->data[id][pp]); // получаем адрес страницы
134.2.5.    else
134.2.6.    return;
134.3.    }
134.4.    if(pp >= PCNT)return;
134.5.    //
134.6.    tmp->data[sp] = data[cur]; 
134.7.    cur++;
134.8.    //
134.9.    sp ++;
135.    }
136.    }

137.    void read(int id,int size,int offset,char* data) 
138.    {
139.    sPage* tmp;

140.    int start = offset / PSZ;
141.    int start_offset = offset - start * PSZ;

142.    int cur = 0;
143.    int sp = start_offset;
144.    int pp = start;

145.    if(alc->data[id][pp] != -1)
tmp = getPageForReadOrWrite(alc->data[id][pp]);
146.    else
146.1.    return;

147.    while(size--)
148.    {
148.1.    if(sp >= PSZ)
148.2.    {
148.2.1.    sp = 0;
148.2.2.    pp ++;
148.2.3.    if(alc->data[id][pp] != -1)
148.2.4.    tmp = getPageForReadOrWrite(alc->data[id][pp]);
148.2.5.    else
148.2.6.    return;
148.3.    }
148.4.    if(pp >= PCNT)return;
148.5.    //
148.6.    data[cur] = tmp->data[sp];
148.7.    cur++;
148.8.    //
148.9.    sp ++;
149.    }
150.    }

151.    void init() 
152.    {
153.    int i;
154.    for(i = 0;i < MSZ;i ++)memory[i] = 0x00; 
155.    info = (sPages*)(&memory[MSZ - PSZ]); 
156.    tData = (sPage*)(&memory[MSZ - PSZ * 2]); 
157.    alc = (sAllocated*)(&memory[MSZ - PSZ / 2]); 
158.    for(i = 0;i < PCNT;i ++)
159.    {
159.1.    info->id[i] = i;
159.2.    info->rwCnt[i] = -1;
159.3.    info->pos[i] = i;
159.4.    if(i > RPCNT)fw(memory,i); for(int j = 0;j < PCNT;j ++)
159.4.1.    alc->data[i][j] = -1;
160.    }
161.    }

162.    int main()
163.    {
164.    init();
165.    //dump(1);
166.    char tmp0[5000] = "teststring0teststring0teststring0teststring0teststring0teststring0teststring0";
167.    char tmp1[5000] = "samplestring1samplestring1samplestring1samplestring1samplestring1samplestring1";
168.    char tmp2[5000] = "helloworld2helloworld2helloworld2helloworld2helloworld2helloworld2";
169.    char tmp3[5000] = "smileystring3smileystring3smileystring3smileystring3smileystring3smileystring3smileystring3";
170.    int id0,id1,id2,id3,id4,id5;

171.    //dump();
172.    id0 = alloc(2048);
173.    id1 = alloc(2048);
174.    id2 = alloc(1024);
175.    id3 = alloc(12288);
176.    id4 = alloc(1024);
177.    dump();
178.    write(id1,10,1400,tmp0);
179.    dump();
180.    write(id1,10,400,tmp1);
181.    dump();
182.    write(id3,100,5*1024,tmp2);
183.    dump();
184.    // write(id0,200,100,tmp3);
185.    // dump();
186.    read(id1,10,400,tmp0);
187.    printf("\n\n\n%s\n\n\n",tmp0);
188.    getch();
189.    return 0;
190.    }
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1225 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.