OberonCore

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

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




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
СообщениеДобавлено: Среда, 19 Июль, 2006 19:29 

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:43
Сообщения: 14
Откуда: Россия, Орёл
Доброго времени суток, господа!
Есть вопрос. Имеется тип Диапазон. Имеется функция, которая возвращает указатель на массив из Диапазон'ов.
Так вот, при компиляции возникает ошибка, поскольку в RETURN происходит недопустимое присваивание.
Код:
TYPE
   Diapason* = ARRAY 2 OF REAL;   

PROCEDURE Need* (age: INTEGER): POINTER TO ARRAY 2 OF Diapason;
VAR
  ret: POINTER TO ARRAY 2 OF Diapason;
BEGIN
  NEW(ret);
  ret[0][0] := 1;
   ..............
   ..............
   ..............
   RETURN ret;
END Need;


В документации прописано:
Цитата:
Совместимость по присваиванию [Assignment compatible]
Выражение e типа Te является совместимым по присваиванию с переменной v типа Tv, если выполняется одно из следующих условий:
1. Te и Tv эквивалентны и не являются ни типами открытых массивов, ни типами записей, описанными с атрибутами ABSTRACT, EXTENSIBLE или LIMITED;
2. Te и Tv — числовые или литерные типы, и Tv включает Te;
3. Te и Tv — указательные типы, и Te — потомок типа Tv;
4. Tv — указательный или процедурный тип, и e есть NIL;
5. Tv — числовой тип, а e — константное выражение, чье значение содержится в Tv;
6. Tv — массив CHAR, Te — String или Shortstring, и LEN(e) < LEN(v);
7. Tv — массив SHORTCHAR, Te — Shortstring, и LEN(e) < LEN(v);
8.??Tv — процедурный тип, а e — имя процедуры, чьи формальные параметры соответствуют параметрам Tv.


Получается, что ret должен быть потомком Diapason? Тогда надо создавать запись и наследовать от нее?[/i]


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

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
ret должен быть того же типа, что и возвращаемое значение.
Код:
TYPE
   Diapason* = ARRAY 2 OF REAL;   
   PtrArrDiapason = POINTER TO ARRAY 2 OF Diapason;
PROCEDURE Need* (age: INTEGER): PtrArrDiapason;
VAR
  ret: PtrArrDiapason;


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 20 Июль, 2006 11:23 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Надо делать так:
Код:
  TYPE
    Diapason* = ARRAY 2 OF REAL;
    Arr2Diapason* = ARRAY 2 OF Diapason;

  PROCEDURE Need* (age: INTEGER): POINTER TO Arr2Diapason;
    VAR ret: POINTER TO Arr2Diapason;
  BEGIN
    NEW(ret);
    ret[0, 0] := 1;
    RETURN ret;
  END Need;

потому что для массивов тег типа создаётся при его определении и в Вашем случае было несколько определений массивов - значит они считались разными.


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

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:43
Сообщения: 14
Откуда: Россия, Орёл
Сергей Губанов писал(а):
Надо делать так:
потому что для массивов тег типа создаётся при его определении и в Вашем случае было несколько определений массивов - значит они считались разными.


Да, я уже так и сделал. Хотел сам себе ответить, но не успел :)))
Спасибо.


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

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


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

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


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

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