Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 23.12.2014
Сообщений: 4

Менеджер сегментированной памяти

23.12.2014, 20:54. Показов 5334. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер. Очень нужна помощь. Есть менеджер сегментированной памяти. Все вроде бы работает нормально, но преподаватель сказал, что в этой функции есть потенциальная ошибка во втором цикле. Никак не могу понять где эта ошибка, и что исправить.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
int AllocMemory(int sz)
{
    for (int i=0;i<30;i++)
    {
        if (BAr[i].Busy==0)
        {
            if (BAr[i].Size>sz)
            {
                for (int j=0;j<30;j++)  \\ в этом цикле ошибка
                {
                    if (BAr[j].Size==0)
                    {
                        
                        BAr[j].Size=BAr[i].Size-sz;
                        BAr[j].Begin=BAr[i].Begin+sz;
                        BAr[j].Busy=0;                      
                        BAr[i].Busy=1;
                        BAr[i].Size=sz;
                        a++;
                        BAr[j].Handle=a;
                        return BAr[j].Handle;
                    }
                }
            }
        }
    }
        return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.12.2014, 20:54
Ответы с готовыми решениями:

Выделить в памяти 1024 ячейки по 8 байт и вывести их адреса(МИНИ менеджер памяти))
Вот тут появилась такая интересная задача: требуется сделать программу которая управляет 1024 ячейками памяти по 8 байт каждая. т.е. за...

Менеджер памяти
Пишу менеджер памяти и возник вопрос насчет реализации free. Как бы из функции убить переданный указатель ? то есть занулить его......

Менеджер памяти
Доброго времени суток. Столкнулся с такой проблемой... Необходимо написать эмулятор менеджера памяти, т.е. создать какой нибудь...

5
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
23.12.2014, 21:08
Цитата Сообщение от ARTEMNEV Посмотреть сообщение
Никак не могу понять где эта ошибка, и что исправить.
Чтобы другие могли это понять нужно более полно задание озвучить.
0
Maniac
Эксперт С++
 Аватар для ISergey
1465 / 966 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
23.12.2014, 21:58
Не знаю что написано вo FreeMemory
но а++ может уйти в переполнение если нигде нет --a;
C
1
2
a++;
BAr[j].Handle=a;
Нужен наверное весь код.
0
0 / 0 / 0
Регистрация: 23.12.2014
Сообщений: 4
23.12.2014, 22:54  [ТС]
вот задание которое дали

вот полностью код программы если надо конечно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
Содержимое файла  prototypes.h
void InitMemory(void);
int AllocMemory(int Size);
void FreeMemory(int MemoryHandle);
int WriteMemory(int MemoryHandle, int Offset, int Size, void *Data);
int ReadMemory(int MemoryHandle, int Offset, int Size, void *Data);
void DumpMemory(void);
 
Содержимое файла  main.cpp
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include "prototypes.h"
 
using namespace std;
char Data[10]={1,2,3,4,5,6,7,8,9,0};
int a;
int i;
char mem[10000];
 
 
void main(void)
{
    setlocale(LC_ALL, "Russian");
    int hand=0;
    int hand1=1;
    int hand2=2;
    int hand3=3;
    InitMemory();
    AllocMemory(1000);
    AllocMemory(2000);
    AllocMemory(4000);
    WriteMemory(hand,2,10,Data);
    WriteMemory(hand1,2,10,Data);
    WriteMemory(hand2,2,10,Data);
    printf("|-| Блоки до чистки |-| \n \n");
    DumpMemory();
    
    printf("Выберите блок, который хотите отчсистить ");
    scanf("%i",&hand);
    
    FreeMemory(hand);
    printf("\n |-| Блоки после отчистки |-| \n \n");
    DumpMemory();
    ReadMemory(hand,2,10,Data);
    getch();
}
 
struct Block
{
    int Handle;
    int Size;
    int Begin;
    int Busy;   
};
 
struct Block BAr[30];
 
    void InitMemory(void)
    {
    BAr[0].Handle=0;
    BAr[0].Size=10000;
    BAr[0].Begin=0;
    BAr[0].Busy=0;
    }
 
int AllocMemory(int sz)
{
    for (int i=0;i<30;i++)
    {
        if (BAr[i].Busy==0)
        {
            if (BAr[i].Size>sz)
            {
                for (int j=0;j<30;j++)
                {
                    if (BAr[j].Size==0)
                    {
                        
                        BAr[j].Size=BAr[i].Size-sz;
                        BAr[j].Begin=BAr[i].Begin+sz;
                        BAr[j].Busy=0;                      
                        BAr[i].Busy=1;
                        BAr[i].Size=sz;
                        a++;
                        BAr[j].Handle=a;
                        return BAr[j].Handle;
                    }
                }
            }
        }
    }
        return 0;
}
 
 
void FreeMemory(int MemoryHandle)
{
    for (i=0;i<30;i++)
    {
    if(BAr[i].Handle==MemoryHandle)
        BAr[i].Busy=0;
    
    }
}
 
 
int WriteMemory(int MemoryHandle, int Offset, int Size, void *Data)
{
    char *ar1=(char *)Data;
    char *ar2=0;    
    for (i=0;i<30;i++)
    {
        if(BAr[i].Handle==MemoryHandle)
        {
            int w=BAr[i].Size;
            if(Offset<0 || Offset>=w || Size<=0) 
            {
            
            }
            else 
            {
                ar2=&mem[BAr[i].Begin+Offset];
                for(int i=0;i<Size;i++)
                {
                    ar2[i]=ar1[i];
                }
            }
        }
    }
    return 0;
}
 
int ReadMemory(int MemoryHandle, int Offset, int Size, void *Data)
{
    char *ar1=(char *)Data;
    char *ar2=0;    
    for (i=0;i<4;i++)
    {
        if(BAr[i].Handle==MemoryHandle)
        {
                ar2=&mem[BAr[i].Begin+Offset];
                for(int i=0;i<Size;i++)
                {
                    ar1[i]=ar2[i];
                    printf("%i\n",ar1[i]);
                }
        }
    }
    return 0;
}
 
void DumpMemory(void)
{
for (int i=0;i<30;i++)
{
if(BAr[i].Size==0)
continue;
printf(" Номер блока=%i",BAr[i].Handle);
printf(" Начало блока=%i",BAr[i].Begin);
printf(" Размер блока=%i",BAr[i].Size);
if(BAr[i].Busy==1)
{
    printf(" Блок занят? Да \n");
}
else printf(" Блок занят? Нет \n");
}
printf("\n");
}
Добавлено через 7 минут
вот само задание
Техническое задание
Продумайте систему сегментного хранения информации. Исходные данные:
1.Программа на Cи (Си++), под Windows, Консольное приложение.
2.Вся доступная память представлена массивом 10 КБайт. Все операции с выделением, доступом и освобождением памяти проводятся только с памятью внутри этого массива.
Инициализация менеджера памяти (если необходима) должна вся находиться в функции:
void InitMemory(void);
3.Необходима функция для выделения памяти с прототипом:
int AllocMemory(int Size);
Size – запрашиваемый размер в байтах.
Функция возвращает описатель выделенного блока или 0, если нет доступной памяти.
4.Необходима функция для освобождения памяти с прототипом:
void FreeMemory(int MemoryHandle);
MemoryHandle – описатель ранее выделенной памяти.
5.Необходима функция для записи информации в ранее выделенную память с прототипом:
int WriteMemory(int MemoryHandle, int Offset, int Size, void *Data);
MemoryHandle – описатель ранее выделенной памяти.
Offset – смещение внутри выделенного блока от его начала до места с которого необходимо записать данные.
Size – размер блока данных для записи в байтах.
Data – указатель на буфер, содержащий данные для копирования.
Функция возвращает 0, если запись в память осуществлена корректно или 1, если произошла какая-либо ошибка.
6.Необходима функция для чтения информации из ранее выделенной памяти с прототипом:
int ReadMemory(int MemoryHandle, int Offset, int Size, void *Data);
MemoryHandle – описатель ранее выделенной памяти.
Offset – смещение внутри выделенного блока от его начала до места с которого необходимо прочитать данные.
Size – размер блока данных для чтения в байтах.
Data – указатель на буфер, куда должны быть скопированы данные. Функция возвращает 0, если чтение из памяти осуществлено корректно или 1, если произошла какая-либо ошибка.
7.Необходима функция для «утряски» памяти в случае, если максимальный свободный блок памяти не достаточен для размещения очередного блока, но сумма всех свободных участков позволяет разместить его. При этом все уже выделенные блоки смещаются в начало массива и образуется один блок свободной памяти в конце массива, в котором и выделяется вновь запрашиваемый блок памяти.
8.Необходима функция для вывода дампа всех блоков на экран:
void DumpMemory(void);
Функция выводит на экран для каждого блока внутри массива следующую информацию (одна строка на один блок):
-описатель блока;
-смещение от начала массива до начала блока;
-размер блока;
-занятый или пустой блок;
-первые 10 байт блока.
Пример:
H:35 B:1234 S:345 Yes 2,3,3,2,1,1,2,3,4,5
Здесь: H–описатель, B-начало блока, S-размер блока, Yes(No)-занят или свободен блок.
9.Необходима функция для тестирования работоспособности менеджера памяти. Использоваться должны все вышеперечисленные функции для работы с памятью. Также необходимо сымитировать ситуацию, когда производится «утряска» памяти.
0
0 / 0 / 0
Регистрация: 23.12.2014
Сообщений: 4
26.12.2014, 17:38  [ТС]
Все, разобрался в чем проблема.
0
0 / 0 / 0
Регистрация: 07.09.2015
Сообщений: 1
07.09.2015, 21:26
ARTEMNEV, в чем ошибка была, если не секрет?)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.09.2015, 21:26
Помогаю со студенческими работами здесь

Менеджер памяти
Хочу написать свои аналоги malloc free. Загвоздка в том, что я не знаю как освобождать потом память, ведь VirtualFree не может освободить...

Как написать менеджер памяти
помогите написать менеджер памяти на с++

Освобождает ли память процесса менеджер памяти Windows?
Если моя программа допускает кучу memory leaks - ов, то после закрытия процесса программы утерянная (утёкшая) память будет так же...

DLL и менеджер памяти
Добрый день. Написал библиотеку на XE6, в которой подключаюсь к веб-сервису и возвращаю record. В проекте на Delphi2006 подключаю эту...

Менеджер по управлению памяти для серверной платформы
как писать менеджер по управлению памяти для серверной платформы ведь там регистровая память и ecc что надо знать и как эти особенности...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru