Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2017, 15:14   #1
anron
Новичок
Джуниор
 
Регистрация: 22.01.2017
Сообщений: 2
По умолчанию Нужно подробно описать код, с 94 по 108

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] = "teststring0teststring0teststring0t eststring0teststring0teststring0tes tstring0";
167. char tmp1[5000] = "samplestring1samplestring1samplest ring1samplestring1samplestring1samp lestring1";
168. char tmp2[5000] = "helloworld2helloworld2helloworld2h elloworld2helloworld2helloworld2";
169. char tmp3[5000] = "smileystring3smileystring3smileyst ring3smileystring3smileystring3smil eystring3smileystring3";
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. }
anron вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите пожалуйста . Нужно сделать проверку (выходит ли введенный код в массив или нет, если нет то нужно заново запросить ввести код) Smile189 Общие вопросы Delphi 0 23.10.2016 20:56
нужно описать все циклы происходящие в этой программе.вот код anton6262906 Общие вопросы C/C++ 6 26.12.2011 17:29
Нужно описать UML диаграмму Jayden Помощь студентам 1 22.06.2010 00:26
Нужно описать уравнение (С++) Evgenii90 Помощь студентам 1 15.04.2010 18:46