OberonCore https://forum.oberoncore.ru/ |
|
Хранение данных в TreeNode https://forum.oberoncore.ru/viewtopic.php?f=24&t=212 |
Страница 1 из 1 |
Автор: | Вячеслав Бойко [ Среда, 17 Май, 2006 11:06 ] |
Заголовок сообщения: | Хранение данных в TreeNode |
Не получается считать данные из TreeNode. ![]() Код: MODULE StudyTree;
IMPORT Dialog; TYPE Tree* = RECORD tree*: Dialog.Tree END; Rec* = RECORD num*, info*: ARRAY 128 OF CHAR END; PRec* = POINTER TO Rec; VAR tree*: Tree; node*: Dialog.TreeNode; rec*: Rec; prec: PRec; str*: Dialog.String; PROCEDURE BuildTree; VAR n: Dialog.TreeNode; BEGIN ....................... n := tree.tree.NewChild(node, 0, str$); NEW(prec); prec.num := rec.num; prec.info := rec.info; n.SetData(prec) ....................... END BuildTree; PROCEDURE TreeNotifier*(op, from, to: INTEGER); VAR n: Dialog.TreeNode; BEGIN IF op = Dialog.changed THEN n := tree.tree.Selected(); IF n # NIL THEN NEW(prec); prec := n.Data [X]; <- ???????? ............... END; END; Dialog.Update(rec) END TreeNotifier; END StudyTree. |
Автор: | Trurl [ Среда, 17 Май, 2006 11:37 ] |
Заголовок сообщения: | Re: Хранение данных в TreeNode |
Вячеслав Бойко писал(а): Код: IF n # NIL THEN NEW(prec); prec := n.Data [X]; <- ???????? END; 1) Data - функция и вызывать надо n.Data() 2) она возваращает ANYPTR и его надо привести к типу prec. 3) К чему здесь NEW(prec)? Если нужна копия данных, надо явно разыменовавать. Итого Код: IF n # NIL THEN prec := n.Data() (PRec) END; или Код: IF n # NIL THEN
NEW(prec); prec^ := n.Data() (PRec)^ END; |
Автор: | Вячеслав Бойко [ Среда, 17 Май, 2006 12:37 ] |
Заголовок сообщения: | Re: Хранение данных в TreeNode |
Trurl писал(а): 2) она возваращает ANYPTR и его надо привести к типу prec.
Спасибо. Разобрался. Проблема была как раз с приведением к заданному типу. (Не так поставил вопрос ![]() |
Автор: | Иван Кузьмицкий [ Понедельник, 30 Октябрь, 2006 18:39 ] |
Заголовок сообщения: | |
А вот я не совсем понял. Сам только что столкнулся с этим. Почему компилятор в (tn: TreeNode) SetData (data: ANYPTR) проглатывает переменную типа POINTER TO ..., а в (tn: TreeNode) Data (): ANYPTR обязательно требует переменную ANYPTR? На мой взгляд, это нелогично. |
Автор: | Илья Ермаков [ Понедельник, 30 Октябрь, 2006 20:23 ] |
Заголовок сообщения: | |
В каком смысле "требует"? В первом случае идет неявное безопасное преобразование типа указателя к базовому для всех указателей типу ANYPTR. Во втором случае процедура возвращает указатель типа ANYPTR, который мы сами должны преобразовать к конкретному типу - ведь компилятор на этапе компиляции не может знать, какого типа указатель будет во время выполнения сохранен. При этом явное преобразование также безопасно, т.к. во время выполнения будет проверено соответствие реального типа требуемому. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |