OberonCore
https://forum.oberoncore.ru/

Недопустимое присваивание указателя
https://forum.oberoncore.ru/viewtopic.php?f=35&t=274
Страница 1 из 1

Автор:  Евгений Семашко [ Среда, 19 Июль, 2006 19:29 ]
Заголовок сообщения:  Недопустимое присваивание указателя

Доброго времени суток, господа!
Есть вопрос. Имеется тип Диапазон. Имеется функция, которая возвращает указатель на массив из Диапазон'ов.
Так вот, при компиляции возникает ошибка, поскольку в 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]

Автор:  Trurl [ Четверг, 20 Июль, 2006 11:22 ]
Заголовок сообщения: 

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 ]
Заголовок сообщения:  Re: Недопустимое присваивание указателя

Надо делать так:
Код:
  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 ]
Заголовок сообщения:  Re: Недопустимое присваивание указателя

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


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

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/