Т.е. внутри функции создается переменная(объект) на основе структуры.
Инициализируются поля.
Возвращается ссылка на созданный объект (переменную) так чтобы им можно было пользоваться в других функциях.
Как правильно сделать простой конструктор объектов?
Сообщений 1 страница 8 из 8
Поделиться125.10.2011 06:40:55
Поделиться225.10.2011 10:58:27
Structure Person
Name$
Age.l
List Friends$()
EndStructure
Procedure Create()
*mem = AllocateMemory(SizeOf(Person))
If *mem
InitializeStructure(*mem, Person)
EndIf
ProcedureReturn *mem
EndProcedure
Procedure Free(*Struct)
If *Struct
ClearStructure(*Struct, Person)
FreeMemory(*Struct)
EndIf
EndProcedure
Procedure OutResult(*Struct.Person)
Debug *Struct\Name$
Debug *Struct\Age
ForEach *Struct\Friends$()
Debug *Struct\Friends$()
Next
EndProcedure
*MyStruct.Person = Create() ; Создали объект.
If *MyStruct
*MyStruct\Name$ = "John" ; Заполнили поля данными.
*MyStruct\Age = 23
AddElement(*MyStruct\Friends$())
*MyStruct\Friends$() = "Jim"
AddElement(*MyStruct\Friends$())
*MyStruct\Friends$() = "Monica"
OutResult(*MyStruct) ; Отобразили результат.
Free(*MyStruct) ; Уничтожили объект.
*MyStruct = 0
EndIfПоделиться326.10.2011 10:10:34
*MyStruct.Person = Create() ; Создали объект.
А можно без * и объявления типа?
типа этого
Obj1=MyObj_New()
Obj2=MyObj_New()
if Obj1 and Obj2
if MyObj_Func1(Obj1,val1,val2)
.....
endif
Name.s=MyObj_Func2(Obj2)
MyObj_Free(Obj1)
MyObj_Free(Obj2)
endifПоделиться426.10.2011 12:56:00
А можно без * и объявления типа?
Можно конечно, но первый вариант предпочтительнее.
Structure Person
Name$
Age.l
List Friends$()
EndStructure
Procedure Create()
*mem = AllocateMemory(SizeOf(Person))
If *mem
InitializeStructure(*mem, Person)
EndIf
ProcedureReturn *mem
EndProcedure
Procedure Free(*Struct)
If *Struct
ClearStructure(*Struct, Person)
FreeMemory(*Struct)
EndIf
EndProcedure
Procedure Func2(*Struct.Person)
*Struct\Name$ = "John" ; Заполнили поля данными.
*Struct\Age = 23
AddElement(*Struct\Friends$())
*Struct\Friends$() = "Jim"
AddElement(*Struct\Friends$())
*Struct\Friends$() = "Monica"
EndProcedure
Procedure.s OutResult(*Struct.Person)
Debug *Struct\Name$
Debug *Struct\Age
ForEach *Struct\Friends$()
Debug *Struct\Friends$()
Next
ProcedureReturn *Struct\Name$
EndProcedure
MyStruct = Create() ; Создали объект.
If MyStruct
Func2(MyStruct)
Name.s=OutResult(MyStruct) ; Отобразили результат.
Debug Name
Free(MyStruct) ; Уничтожили объект.
MyStruct = 0
EndIfПоделиться527.10.2011 02:13:38
Непонятки по
ClearStructure()
ClearStructure can be used to clear a structured memory area. It's for advanced use only, when pointers are involved.
Чем-то пугают. Не пойму толком - чем.
There is no internal check to ensures than the structure match the memory area. This function is for advanced users only and should be used with care.
Может перед FreeMemory(*Struct)
в явном виде сделать
для строк *Struct\Name$=""
для списка ClearList(*Struct\Friends$() )
P.S.
Допустим есть структура внутри которой другая типа
Structure ObjHeader ... EndStructure Structure ObjField ... EndStructure Structure ObjMain hFile.l ; хэндл открытого файла FullFileName.s Header.ObjHeader List Fields.ObjField() ... EndStructure
Как считать кусок файла в Obj\Header?
ReadData(hFile, *object\Header, 32) не проходит.
ReadData(hFile, @(*object\Header), 32) не проходит.
Прошло ReadData(hFile, *object, 32) когда поставил Header.ObjHeader первым в структуре ObjMain.
Как заполнить элементы списка Fileds() нужными кусками файла?
Отредактировано SadStar (27.10.2011 07:41:48)
Поделиться627.10.2011 10:59:27
Чем-то пугают. Не пойму толком - чем.
Может здесь понятнее будет. http://purebasic.ru/manual.php?id=1058&lng=rus
Нет никаких внутренних проверок, гарантирующих, что структура соответствует области памяти. Эта функция для опытных пользователей и должна использоваться с осторожностью.
Пугают тем, что указатель в первом аргументе, должен соответствовать структуре, указанной во втором аргументе функции ClearStructure(), иначе могут быть ошибки, т. к. очистка выполняется строго в соответствии с типом структуры, а если тип указан неправильно, то и чистить тоже будет не так, как нужно. Если эти требования выполняются, то все ОК.
Я эту функцию уже не раз использовал, причем на довольно сложных структурах, содержащих много вложенных, списков, массивов, других структур и еще не разу не подводила.
Как считать кусок файла в Obj\Header?
Смотря что находится в ObjHeader. Если там просто статический массив, то можно поступить так (чтение из файла, для упрощения, заменено на запись в память, это по сути одинаковые операции).
Structure ObjHeader Header.a[32] EndStructure Structure ObjField EndStructure Structure ObjMain hFile.l ; хэндл открытого файла FullFileName.s Header.ObjHeader List Fields.ObjField() EndStructure object.ObjMain PokeL(@object\Header, $12345678) ShowMemoryViewer(@object\Header, SizeOf(object\Header))
Как заполнить элементы списка Fileds() нужными кусками файла?
С помощью AddElement() добавляешь новый элемент в список. А вот как проще записать туда данные, сильно зависит от содержимого ObjField, хз что там.
Поделиться731.10.2011 02:37:07
Уточню вопрос.
Есть структура
Structure ObjHeader
...
EndStructure
Structure ObjField
FieldName.s{11}
FieldType.s{1}
...
EndStructure
Structure ObjMain
hFile.l ; хэндл открытого файла
FullFileName.s
Header.ObjHeader
List Fields.ObjField()
...
EndStructureна её основе создан объект
*object.ObjMain = AllocateMemory(SizeOf(ObjMain))
Как получить адрес начала *object\Header ?
Как получить адрес начала содержимого любого элемента *object\Fields()?
Поделиться831.10.2011 14:09:09
Как получить адрес начала *object\Header ?
*Point = @*object\Header
Как получить адрес начала содержимого любого элемента *object\Fields()?
SelectElement(*object\Fields(), НомерЭлемента) *Point = @*object\Fields()