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.


Спасибо. Разобрался. Проблема была как раз с приведением к заданному типу. (Не так поставил вопрос :oops: )

Автор:  Иван Кузьмицкий [ Понедельник, 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/