OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 09 Май, 2024 18:28

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
СообщениеДобавлено: Понедельник, 25 Июнь, 2007 21:56 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Здраствуйте.
Появилась необходимость создать динамический массив из произвольных записей. Т.е. тип записи не известен на момент написания кода.

Например:
Код:
TYPE

Queue = POINTER TO ANYREC;
Array = POINTER TO ARRAY OF Queue;


Даже не представляю с чего начать, но почитал документацию к модулю MtMem, думаю, надо двигаться в этом направлении.

Может у кого то есть готовые решения, или что-то похожее. Гдавное - результат.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 25 Июнь, 2007 22:28 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Вы совершенно правильно написали. Только вместо POINTER TO ANYREC можно использовать ANYPTR, что то же самое.

Т.е. Array = POINTER TO ARRAY OF ANYPTR.

Для динамической перемены длины можно использовать SetLength. Он есть не только в Mt, он продублирован в модуле Mem Service Pack 4.01.

Проверку типа можно осуществлять стандартными способами - через IS, WITH.
При необходимости можно и метапрограммирование задействовать (Meta, Services).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 28 Июнь, 2007 15:58 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
А как тогда выделить память под элемент массива?
Код:
MODULE RefDoc;
IMPORT Meta, MtMem;
TYPE
   Data = RECORD
      id : INTEGER;
   END;
VAR
   data : Data;
   queue : POINTER TO ARRAY OF ANYPTR;

PROCEDURE Do*;
BEGIN
   NEW(queue,5);
   queue[0] := data; [так нельзя]
   NEW(queue[0]) [так тем более нельзя]
END Do;

END RefDoc.


Тип элемента массива определить можно, но что-то никак не соображу, как быть с запретом на NEW для ANYPTR.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 28 Июнь, 2007 16:11 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Petryxa писал(а):
Тип элемента массива определить можно, но что-то никак не соображу, как быть с запретом на NEW для ANYPTR.

Код:
TYPE
  Rec = POINTER TO RECORD
    val  :REAL
  END;

...
VAR
  p : Rec;
BEGIN
  NEW(p);
  queue[0] := p;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 28 Июнь, 2007 16:36 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Petryxa писал(а):
А как тогда выделить память под элемент массива?
...
Тип элемента массива определить можно, но что-то никак не соображу, как быть с запретом на NEW для ANYPTR.


А если так:
Код:
MODULE RefDoc;
IMPORT Dialog, Meta, MtMem;
TYPE
   Data = POINTER TO RECORD
      id : INTEGER;
   END;

VAR
   data : Data;
   queue : POINTER TO ARRAY OF ANYPTR;

PROCEDURE Do*;
BEGIN
   NEW(queue,5);
   NEW(data);
   data.id := 1000;
   queue[0] := data;
END Do;

END RefDoc.


То есть, заводим указатель на запись, инициализируем его и потом просто присваиваем.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 28 Июнь, 2007 19:25 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Petryxa писал(а):
Код:
queue[0] := data; [так нельзя]

Так нельзя только потому, что тип Data объявлен как RECORD, а не POINTER TO RECORD.
А то понакатали исходников в ответ...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 29 Июнь, 2007 09:38 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Гм. С передачей в произвольную очередь понятно. А вот как обратно, неужели придётся делать приведение типов?

Код:
...
NEW(queue,5);
NEW(data);
data.id := 1000;
queue[0] := data; (*туда*)
data := queue[0]; (*обратно компилятор не пропускает, есес-но*)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 29 Июнь, 2007 09:54 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Иван А. Кузьмицкий писал(а):
Гм. С передачей в произвольную очередь понятно. А вот как обратно, неужели придётся делать приведение типов?

Конечно! WITH и IS вам помогут. Можно делать и приведение без предварительной проверки, но в случае несоответствия типов получите trap, так что безопасность не пострадает: просто так что угодно к чему угодно не приведете.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB