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/ |