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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объясните фрагмент кода программы "менеджер сегмен 
:(
    Опции темы
olegarxxx
Дата 26.1.2015, 03:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



я только знаю, что здесь вызывается функция для чтения информации из ранее выделенной памяти,
это часть кода из темы по программе "Менеджер сегментированной памяти":
...................................................................................................
Код
int ReadMemory(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)
{
ar2=&mem[BAr[i].Begin+Offset];
for(int i=0;i<Size;i++)
{
ar1[i]=ar2[i];
printf("%i\n",ar1[i]);
}
}
}
return 0;

} 

.......................................................................................................

расскажите пожалуйста, знающие программисты, что здесь происходит? что к чему? для чего? зачем?


Исходный код

Код
// memory_manager.cpp: определяетточкувходадляконсольногоприложения.
//
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include "prototypes.h"
#include <locale.h>

using namespace std;
char Data[10]={1,2,3,4,5,6,7,8,9,0};
int a;
inti;
char mem[10000];

void main(void)

{
setlocale (LC_ALL, "RUSSIAN");
int hand=0;
int hand1=1;
int hand2=2;
int hand3=3;
InitMemory();
AllocMemory(1500);
AllocMemory(2000);
AllocMemory(4000);
WriteMemory(hand,0,3,Data);

printf("[[[ Блокидочистки ]]] \n \n");
DumpMemory();

FreeMemory(hand);
FreeMemory(hand1);
FreeMemory(hand2);
FreeMemory(hand3);
printf("[[[ Блокипослечистки ]]] \n \n");
DumpMemory();

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;
}

intAllocMemory(intsz)
{
for (inti=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(intMemoryHandle)
{
for (i=0;i<30;i++)
{
if(BAr[i].Handle==MemoryHandle)
BAr[i].Busy=0;
}
}

intWriteMemory(intMemoryHandle, 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) 
{
printf("");
}
else 
{
ar2=&mem[BAr[i].Begin+Offset];
for(inti=0;i<Size;i++)
{
ar2[i]=ar1[i];
}
}
}
}
return 0;
}

intReadMemory(intMemoryHandle, int Offset, int Size, void *Data)
{
char *ar1=(char *)Data;
char *ar2=0; 
for (i=0;i<30;i++)
{
if(BAr[i].Handle==MemoryHandle)
{
ar2=&mem[BAr[i].Begin+Offset];
for(inti=0;i<Size;i++)
{
ar1[i]=ar2[i];
printf("%i\n",ar1[i]);
}
}
}
return 0;
}

void DumpMemory(void)
{
for (inti=0;i<30;i++)
{
if(BAr[i].Size==0)
continue;
printf(" Handle=%i",BAr[i].Handle);
printf(" Begin=%i",BAr[i].Begin);
printf(" Size=%i",BAr[i].Size);
if(BAr[i].Busy==1)
{
printf(" Блокзанят?Да \n");
}
elseprintf(" Блокзанят? Нет \n");
}
printf("\n");
}


Модератор: не забываем пользоваться кнопочкой "Код"

Это сообщение отредактировал(а) bsa - 27.1.2015, 11:29
PM MAIL   Вверх
tzirechnoy
Дата 26.1.2015, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: -1
Всего: 16



Здесь происходит АДСКИЙ ГОВНОКОД!

Если это дал тебе твой учитель по основам C -- беги. Не оглядываясь. Только клинический мудак мог показать такое для обучения.
PM MAIL   Вверх
bsa
Дата 27.1.2015, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



olegarxxx, создается массив дескрипторов сегментов (BAr). Он описывает начало и размер сегмента в памяти (mem), а так же флаг его занятости (busy) и идентификатор (handle). Когда выделяется память, то находится первый свободный сегмент достаточного размера в массиве (BAr). Затем создается еще один сегмент, а свободный сегмент уменьшается. Возвращается ссылка на созданный сегмент. Освобождение происходит путем поиска по идентификатору и выставлению флага busy в 0.
Но код действительно не очень. Особенно убивает проблема с отсутствием элементарного форматирования - читать невозможно.
Кстати. Этот код не скомпилируется.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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