Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Объясните фрагмент кода программы "менеджер сегмен


Автор: olegarxxx 26.1.2015, 03:00
я только знаю, что здесь вызывается функция для чтения информации из ранее выделенной памяти,
это часть кода из темы по программе "Менеджер сегментированной памяти":
...................................................................................................
Код
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");
}


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

Автор: tzirechnoy 26.1.2015, 21:00
Здесь происходит АДСКИЙ ГОВНОКОД!

Если это дал тебе твой учитель по основам C -- беги. Не оглядываясь. Только клинический мудак мог показать такое для обучения.

Автор: bsa 27.1.2015, 11:37
olegarxxx, создается массив дескрипторов сегментов (BAr). Он описывает начало и размер сегмента в памяти (mem), а так же флаг его занятости (busy) и идентификатор (handle). Когда выделяется память, то находится первый свободный сегмент достаточного размера в массиве (BAr). Затем создается еще один сегмент, а свободный сегмент уменьшается. Возвращается ссылка на созданный сегмент. Освобождение происходит путем поиска по идентификатору и выставлению флага busy в 0.
Но код действительно не очень. Особенно убивает проблема с отсутствием элементарного форматирования - читать невозможно.
Кстати. Этот код не скомпилируется.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)