Моделирование Виртуальной Вычислительной Системы.
 
Выпуск N25
home URL
автор рассылки: noonv (noonv[AT]narod[.]ru)
" Это была удивительная страна. Поперек бежали прямые ручейки, а аккуратные живые изгороди делили пространство между ручейками на равные квадраты.
- По-моему, Зазеркалье страшно похоже на шахматную доску, - сказала наконец Алиса. - Только фигур почему-то не видно... А, впрочем, вот и они! - радостно закричала она, и сердце громко забилось у нее в груди.
- Здесь играют в шахматы! Весь этот мир - шахматы (если только, конечно, это можно назвать миром)! Это одна большая-пребольшая партия."
Льюис Кэрролл. Алиса в Зазеркалье

Приветствую вас, уважаемые читатели!


Я получил e-mail от Andrew Ezhguroff c критикой оформления рассылки:
"Рассылка оформлена так, что читать ее вообще невозможно."
Замечание справедливо и с этого выпуска рассылка будет выходить в чуть более светлом формате.
Спасибо за замечание, Андрей.


В предыдущем выпуске был приведён файл main.h проекта и теперь мы будем постепенно рассматривать файлы, которые он включает. Файл definitions.h был рассмотрен в 23-ем выпуске, поэтому сегодня рассмотрим файлы field.h и field.cpp, которые вместе с файлами definitions.h и main.h находятся в каталоге src.



//////////////////////////////////////////////////////////////////////
//
// field.h
//
// for world field
//
//
//                                                    XIII
//////////////////////////////////////////////////////////////////////

#ifndef _FIELD_H_
#define _FIELD_H_

#include "definitions.h"
#include "box.h"

class FIELD
{
public:
	FIELD(); // set default size
	FIELD(FSize x_size,FSize y_size,FSize z_size);
	~FIELD();
// variables
	FSize SizeX; // size of world
	FSize SizeY;
	FSize SizeZ;
	BOX *World; // Hello World! =) 
// functions
	void init(); // initialize World
	bool AllocateWorldMemory(); // get memory for World
	void FreeWorldMemory(); // free memory for World
	BOX* GetBox(FSize x_,FSize y_,FSize z_); // return the BOX by coordinates
};

#endif





//////////////////////////////////////////////////////////////////////
//
// field.cpp
//
// for world field
//
//
//                                                    XIII
//////////////////////////////////////////////////////////////////////

#ifndef _FIELD_CPP_
#define _FIELD_CPP_

#include "field.h"

FIELD::FIELD()
{
	World=NULL;
	SizeX=DEFAULT_X_SIZE;
	SizeY=DEFAULT_Y_SIZE;
	SizeZ=DEFAULT_Z_SIZE;
}
FIELD::FIELD(FSize x_size,FSize y_size,FSize z_size)
{
	World-NULL;
	SizeX=x_size;
	SizeY=y_size;
	SizeZ=z_size;
}
FIELD::~FIELD()
{
	FreeWorldMemory();
}
void FIELD::init()
{
	// initialize World

	bool temp=AllocateWorldMemory();
	if(!temp)
		printf("Cant allocate memory for World\n");
}
bool FIELD::AllocateWorldMemory()
{
	// get memory for World if OK return true

	World=new BOX[SizeX*SizeY*SizeZ];
	if(!World)
		return false;
	else
		return true;
}
void FIELD::FreeWorldMemory()
{
	// free memory for World
	if(World)
	{
		delete []World;
		World=NULL;
	}
}

BOX* FIELD::GetBox(FSize x,FSize y,FSize z)
{
	// return the BOX with coordinates x,y,z
	return &World[_XYZ_(x,y,z)];
}

#endif //_FIELD_CPP_



Как видите описывается класс FIELD(ПОЛЕ), в котором определяются размеры поля (типа FSize(см definitions.h)) по x,y и z (SizeX,SizeY и SizeZ соответственно).
Само ПОЛЕ - это одномерным массив элементов типа BOX(КОРОБКА :) (который определён в файле box.h).

Описывается два конструктора; конструктор по умолчанию устанавливает размеры ПОЛя по умолчанию (как они определены в definitions.h(SizeX=80, SizeY=20, SizeZ=1)). Второй конструктор принимает три параметра - размеры ПОЛя, которые будут установлены.

Так же стоит обратить внимание на то, что выделенныя память освобождается в деструкторе, но чтобы её выделить нужно вызвать функцию init().

Функция GetBox(FSize x,FSize y,FSize z), как Вы наверное уже догадались, возвращает указатель КОРОБки с координатами {x,y,z}.

Счастливо!

[noonv@volodia noonv]$ logout

XIII

Рейтинг@Mail.ru
Хостинг от uCoz