Помогите разобраться с кодом, с 94 по 108 строки

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
aroli
Сообщения: 2
Зарегистрирован: 22 янв 2017, 15:41

22 янв 2017, 15:47

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 < rwCnt && info->pos < RPCNT/* && info->rwCnt != -1*/)
56.2. {
56.2.1. rwCnt = info->rwCnt;
56.2.2. id = info->id;
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 == 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 == id)return info->pos;
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,info->pos,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;
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

23 янв 2017, 09:14

По всей видимости, это функция, которая эмулирует работу библиотечной функции malloc. Функция ищет незанятую ячейку в таблице. Если такая ячейка не найдена, то возвращается -1. В противном случае ячейка помещается как "занятая" и возвращает её индекс.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить