|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
22.01.2017, 15:14 | #1 |
Новичок
Джуниор
Регистрация: 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. } |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Помогите пожалуйста . Нужно сделать проверку (выходит ли введенный код в массив или нет, если нет то нужно заново запросить ввести код) | 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 |