|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Описание классов в Delphi
Здравствуйте уважаемые форумчане столкнулся с проблемой. Учусь в ВУзе. Дали вот такое задание:
Задача «Организация основной памяти» * информационные объекты: страницы оперативной памяти (свойства – НомерСтраницы, Состояние) * страницы объединяются в рамках объекта Сегмент (свойство – РазмерСегмента) * сегменты объединяются в рамках объекта-контейнера ОсновнаяПамять (свойство – тип ОС). Я описал классы, вот что получилось: Код:
класс TMemory type TMemory = class(TObject) private // поля FNumber: integer; // приватное поле FPriznak: Boolean; // приватное поле public // Конструктор Constructor Create (const Number: integer; Priznak: boolean); // методы чтения и записи свойств function GetNumber: integer; // получаем номер procedure SetNumber (const Value: integer); // задаём номер function GetPriznak: boolean; // получаем состояние procedure SetPriznak (const Value: boolean); // задаём состояние end; Код:
класс TElement type TElement = class(TObject) private // поля FMemory: TMemory; // приватное поле FNext: TElement; // приватное поле, указатель на следующий элемент public // конструкторы и деструкторы constructor Create (const Memory: TMemory); destructor Destroy; override; // методы чтения и записи свойств function GetNext: TElement; // получаем следующий элемент стека procedure SetNext (const Value: TElement); // задаём следующий элемент стека function GetMemory: TMemory; // возвращаем значение поля FMemory end; Код:
класс TSegment type TSegment = class(TObject) private // поля FFirst: byte; // приватное поле, вершинный элемент FNum: integer; // приватное поле, номер сегмента public // конструкторы и деструкторы constructor Create (const Num: integer); destructor Destroy; override; // методы чтения и записи свойств function GetFirst; TSegment; // получаем головной элемент function GetNum: integer; // получаем номер сегмента procedure SetNum (const Value: integer); // задаем номер сегмента // методы procedure AddMemory (const Memory: TMemory); // добавляем элемент в стек function DelFirst: TElement; // удаляем вершинный элемент procedure Clear; // очищяем стек end; Код:
класс TSomeMemory type TSomeMemory = class(TObject) Private // поля FSome: array of TMemory (динамический массив экземпляров класса TMemory) FCount: real (приватное поле, количество сегментов) // конструкторы и деструкторы Constructor Create (initianCount) Destructor Destroy; override // методы получения и установки значений свойств Function GetMemory (index: integer): TMemory (возвращаем объект класса TMemory) Function GetCount: integer (получаем количество сегментов) // методы Function SegmentNO (No: integer):TSegment Function AddSL (No: integer): integer (добавляем в массив сегмент) Function DeleteSL (No: integeer): integer (удаляем из массива сегмент) Procedure SaveFile (const FileName: string) (сохраняем список в файле) Procedure LoadFile (const FileName: string) (загружаем список из файла) function WinInfo(Root_Key: HKEY; Key_Open, Key_Read: string): string WinVers = 'Software\Microsoft\Windows\CurrentVersion' (читаем всё из реестра) 2.Класс TSegment: поле FFirst имеет неправильный тип 3.Класс TSomeMemory: массив имеет неправильный тип первые 2 вродебы исправил, а с массивом проблемы. Подскажите пожалуйста. Спасибо. Последний раз редактировалось Deman1986, 03.11.2013 в 18:51. |
#2
|
|||
|
|||
Я бы вообще не массив использовал, а TObjectList. А тип у него д.б. TSegment.
|
#3
|
|||
|
|||
Спасибо за ответ. Подскажите пожалуйста как описать правильно TObjectList. Просто я запутался уже, кучу литературы перечитал, а толку нет.
Последний раз редактировалось Deman1986, 03.11.2013 в 19:16. |
#4
|
|||
|
|||
Цитата:
Ну, посмотри в справке в каком он юните описан, я не помню на вскидку, сам каждый раз смотрю Использовать как и любой другой список (TList и т.д.) за исключением того, что если TObjectList является "владельцем" объектов в списке, то он сам вызывает деструктор при удалении объекта из списка. В остальном - все тоже самое, что и с любым списком. У тебя и так работа со списком сегментов "спрятана" внутри классов, соотв. тебе надо будет переписать только саму работу с массива на список. Да, и еще. По мне, так у тебя как минимум один лишний класс. Я бы сделал так: Код:
type TMemBlock = class // тут содержимое блока - занят или нет, базовый адрес и т.д. end; TSegemnt = class private FBlocks : TObjectList; // Ну и другие аттрибуты public property Blocks[Index : Integer] : TMemBlock read GetBlock; // Для прямого обращения к блоку по индексу ... end TRAM = class private FSegments : TObjectList; ... end; Собственно, дальше, в зависимости от задачи, делаем методы инициализации. Последний раз редактировалось lmikle, 03.11.2013 в 20:22. |
#5
|
|||
|
|||
Спасибо большое за помощь, я с вами согласен, что лишний класс. Просто я еще обучаюсь Дельфи, раньше програмировал на Паскале.
|
#6
|
|||
|
|||
Вот получилось как то так))
Код:
класс TSomeMemory type TSomeMemory = class(TObjectList) Private // поля function GetItems (Index: integer): TSegment; procedure SetItems(Index: Integer; const Value: TSegment); public property Items[Index: Integer]: TSegment read GetItems write SetItems; default; //чтение элементов списка будет происходить через метод GetItems, //а запись - через SetItems // методы function WinInfo(Root_Key: HKEY; Key_Open, Key_Read: string): string WinVers = 'Software\Microsoft\Windows\CurrentVersion' // читаем всё из реестра |
#7
|
|||
|
|||
Цитата:
Мне все-таки кажется, что наследоваться от TObjectList не стоит. Просто в таком случае хорошим тоном считается перекрытие всех методов родительского класса на работу со своими типами, что тебе явно не нужно (учиться кодировать "чисто" надо сразу, переучиваться потом гораздо сложнее). Просто напиши обертки только к тем методам, которые тебе нужны, а сам список спряч внутри класса (как я тебе и показал). Кстати, если у тебя Дельфя одна из последних, то тогда можно сделать с помощью дженериков. В этом случае действительно компилятор за тебя сделает всю работу и можно использовать "наследование" (в кавычках, т.к. в случае использования дженериков это не совсем наследование, а инстанциация по типу). |
#8
|
|||
|
|||
отправил преподавателю, он написал следующее:
1.Замечание 1 НЕ исправлено! 2.Замечание 2 исправлено НЕ правильно! 3.Замечание 3 исправлено НЕ правильно: куда исчез массив и все необходимые методы? помогите исправить пожалуйста. Просто преподаватель настаивает на массиве. Спасибо за помощь Последний раз редактировалось Deman1986, 07.11.2013 в 21:58. |
#9
|
|||
|
|||
Цитата:
Ну и сделай, как он хочет. Заодно можешь передать ему от меня, что он дурак и программировать не умеет, ну или не умеет грамотно ставить задачу. 1. Переименуй класс в TPage или TMemoryPage 2. Тип д.б. как раз TPage(TMemoryPage). 3. а) Убираешь TElement, он не нужен. б) В TSegment делаешь массив для страниц памяти, кол-во, видимо, надо задавать в конструкторе, собственно, это размер сегмента. в) В TSomeMemory тоже делаешь массив для сегментов. Вроде так. |
#10
|
|||
|
|||
А набросать можете у меня с массивами туговато))
|
#11
|
|||
|
|||
Я подумал и вот что получилось:
Код:
класс TSegment type TSegment = class(TObject) private // поля FFirst: TPage; // приватное поле, вершинный элемент ACount: integer; // приватное поле, кол-во элементов public // конструкторы и деструкторы constructor Create (ACount: integer); // инициализация destructor Destroy; override; // уничтожение // методы procedure SetCount (ACount: integer); // установка кол-во элем. procedure Reset // обнуление данных end; Последний раз редактировалось Deman1986, 11.11.2013 в 20:37. |
#12
|
|||
|
|||
Как я понимаю, связанный список тут не нужен.
Тогда сегмент будет примерно так: Код:
type TSegment = class(TObject) private FPages : Array Of TPage; function GetCount : Integer; function GetPage(Index : Integer) : TPage; public // конструкторы и деструкторы constructor Create (ACount: integer); virtual;// инициализация destructor Destroy; override; // уничтожение property Count : Integer read GetCount; property Pages[Index : Integer] : TPage read GetPage; procedure ClearAll; end; ... constructor TSegment.Create(ACount : Integer); var I : Integer; begin inherited Create; SetLength(FPages,ACount); For I := Low(FPages) To High(FPages) Do FPages[i] := TPages.Create; end; destructor TSegment.Destroy; var I : Integer; begin For I := Low(FPages) To High(FPages) Do FPages[i].Free; SetLength(FPages,0); inherited; end; function TSegment.GetCount : Integer; begin Result := Length(FPages); end; function TSegment.GetPage(Index : Integer) : TPage; begin Result := FPages[Index]; end; procedure TSegment.ClearAll; var I : Integer; begin For I := Low(FPages) To High(FPages) Do FPages[i].Clear; end; Это вариант с пресозданием страниц. Можно сделать вариант с выделением памяти при первом обращении. Еще можно сделать в таком случае сборщик памяти, когда занятые куски собираются в начало сегмента. Вообще, там много можно чего сделать. Фактически, можно написать свой небольшой менеджер памяти. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Deman1986 (12.11.2013)
|
#13
|
|||
|
|||
Спасибо Вам большое. Вы настоящий человек. Буду думать над последним классом TSomeMemory.
|
#14
|
|||
|
|||
Вот описал я класс TRam (массив для сегментов):
Код:
класс TRam type TRam = class(TObject) private // поля FRam: Array of TSegment; // динамический массив FCount: real; // приватное поле, количество сегментов // конструкторы и деструкторы constructor Create (ACount: integer); // инициализация destructor Destroy; override; // методы procedure SetCount (ACount: integer): // установка количества элементов procedure Reset; // обнуление данных function WinInfo(Root_Key: HKEY; Key_Open, Key_Read: string): string; WinVers = 'Software\Microsoft\Windows\CurrentVersion' // читаем всё из реестра end; |
#15
|
||||
|
||||
Цитата:
Почему конструктор и деструктор в приватной секции? Идентификатор WinVers как вообще попал сюда в объявление класса? В объявлении метода SetCount в конце двоеточие вместо точки с запятой. |