Оберон-клуб «ВЄДАsoft»

Твердыня модульных языков
Текущее время: 19 июн 2025, 08:07

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




Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Re: Процедуры
СообщениеДобавлено: 29 май 2017, 17:14 
Не в сети

Сообщения: 116
Откуда: Каменск-Уральский
Цитата:
Странное что то должно произойти!!!

К сожалению вообще ничего не происхлдит - выдаёт ошибку!
Цитата:
matrixF: ARRAY OF ARRAY OF INTEGER а возвращаете POINTER

Без POINTER вообще не работает - тоже ошибка.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Процедуры
СообщениеДобавлено: 29 май 2017, 17:21 
Не в сети
Администратор
Аватара пользователя

Сообщения: 189
Код: "OBERON"
  1. matrix2 := hMatrix(matrix1);

А вот так не работает matrix2 := matrix1;?


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Процедуры
СообщениеДобавлено: 29 май 2017, 17:27 
Не в сети

Сообщения: 116
Откуда: Каменск-Уральский
Цитата:
А вот так не работает matrix2 := matrix1;

Так конечно работает, но в процедуре предпологается обработка массива (это я пока так возвращаю без обработки - для краткости).


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Процедуры
СообщениеДобавлено: 29 май 2017, 17:35 
Не в сети
Администратор
Аватара пользователя

Сообщения: 189
Тогда вот так наверно надо

Код: "OBERON"
  1. PROCEDURE hMatrix (src: ARRAY OF ARRAY OF INTEGER; VAR dst: ARRAY OF ARRAY OF INTEGER);
  2. BEGIN
  3. END hMatrix;


А вызывать уже
Код: "OBERON"
  1. hMatrix(matrix1,matrix2);


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Процедуры
СообщениеДобавлено: 29 май 2017, 17:52 
Не в сети

Сообщения: 116
Откуда: Каменск-Уральский
Код: "OBERON"
  1. PROCEDURE hMatrix (src: ARRAY OF ARRAY OF INTEGER; VAR dst: ARRAY OF ARRAY OF INTEGER);
  2. BEGIN
  3. dst := src;
  4. END hMatrix;

В 3 строке выдаёт несовместимость типов.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Процедуры
СообщениеДобавлено: 29 май 2017, 18:04 
Не в сети
Администратор
Аватара пользователя

Сообщения: 189
Так тут циклом надо, кажен элемент присваивать...

ЗЫ...

А что в ББ нет разве операторов типа SYSTEM.MOVE или COPY
для копирования массивов?


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Процедуры
СообщениеДобавлено: 29 май 2017, 18:22 
Не в сети

Сообщения: 116
Откуда: Каменск-Уральский
А почему тогда matrix2 := matrix1; в модуле после BEGIN работало?
Цитата:
Так тут циклом надо, кажен элемент присваивать...

Циклом только что пробовал - NUL и всё тут! :(


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Процедуры
СообщениеДобавлено: 29 май 2017, 19:38 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Несовместимость типов отчего получается? Оттого, что два открытых массива типа ARRAY OF ARRAY OF INTEGER могут иметь совершенно различное количество элементов по обеим размерностям. Они ведь сформированы (объявлены) извне нашей процедуры. И то, что мы передаём их оба как бы одного типа внутрь процедуры, совсем не гарантирует, что они оба имеют одну размерность. Могут иметь, а могут и нет. Поэтому код их присвоения друг другу, строго говоря, некорректен.

Но если внутри нашей процедуры сформировать динамический массив той же мерности, что и входной массив-параметр, такое копирование должно сработать.

COPY только для строк (ARRAY OF CHAR), т.к. она только для копирования нуль-строковых данных. И если строка больше, чем принимающий её массив, она будет урезана до его размера + символ с кодом 0X в конце, который обозначает конец строки. Впрочем, это касается только Оберона-1, 2, AO и КП, в O7 со строками дело обстоит несколько иначе.

С помощью SYSTEM.MOVE можно такого накопировать, что ой :-) Лучше не пользоваться, это только для системных нужд.

Так что я предлагаю? Динамические массивы. Видимо, только они подойдут. Если нет других предложений :-)


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Процедуры
СообщениеДобавлено: 30 май 2017, 09:30 
Не в сети
Администратор
Аватара пользователя

Сообщения: 189
Хрен знает, а почему изначально POINTER OF ARRAY... не использовать и передавать указатели тогда?
Я просто в ББ не очень, как там с этим дело обстоит?
Но, в принципе, наверное можно подсмотреть в каком нибудь модуле аналог?


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Процедуры
СообщениеДобавлено: 30 май 2017, 17:21 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Если тип параметра объявить как Proc (par: ARRAY OF тип), то на вход можно подавать как статический массив, так и указатель на динамический массив, но тогда массив продублируется (внутри процедуры будет создана его копия). А если как Proc (VAR par: ARRAY OF тип), то можно подавать и статический массив, и указатель на динамический массив, и он дублироваться не будет, это называется передать по ссылке. А если параметр - указатель: Proc (par: POINTER TO ARRAY OF тип), то статический массив уже передать не получится. Вот такая петрушка.

S.Atan писал(а):
Я просто в ББ не очень, как там с этим дело обстоит?
В ББ с этим всё хорошо, но мы не знаем, на каком Обероне работает Len, он нам не сказал.

В Компонентном Паскале есть параметры с модификатором IN. Это параметр-запись или массив только для чтения. И такие параметры не дублируются.


Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу Пред.  1, 2, 3  След.

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


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

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


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

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
© VEDAsoft Oberon Club