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

Твердыня модульных языков
Текущее время: 17 июн 2025, 02:20

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




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

Сообщения: 116
Откуда: Каменск-Уральский
Я написал процедуру умножения двух матриц (поправьте, если что не так):
Код: "OBERON"
  1. PROCEDURE MultiplicationMatrix;
  2. VAR Matrix3 = ARRAY LEN(Matrix1,1), LEN(Matrix2,0) OF INTEGER;
  3. BEGIN
  4. IF LEN(Matrix1,1)=LEN(Matrix2,0) THEN
  5. Line1=0;
  6. Column1:=0;
  7. Line2:=0;
  8. Column2:=0;
  9. Line3:=0;
  10. Column3:=0
  11. REPEAT
  12. REPEAT
  13. REPEAT
  14. Matrix3[Line3, Column3] := Matrix3[Line3, Column3] + Matrix1[Line1, Column1] * Matrix2[Line2, Column2];
  15. Column1 := Column1 + 1;
  16. Line2 := Column1
  17. UNTIL Column1 = LEN(Matrix1, 1)
  18. Column2 := Column2 + 1;
  19. Column3 := Column2;
  20. Line2 := 0;
  21. Column1 := 0
  22. UNTIL Column2 = LEN(Matrix2,1)
  23. Line1 := Line1 + 1;
  24. Line3 := Line1;
  25. Column2 := 0;
  26. Column3 := 0
  27. UNTIL Line1 = LEN(Matrix1, 0)
  28. END
  29. END MultiplicationMatrix

Как в эту процедуру передать массивы Matrix1 и Matrix2?


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

Сообщения: 1019
Откуда: Днепропетровская обл.
Вот так, по идее:
Код: "OBERON"
  1. PROCEDURE MultiplicationMatrix (VAR Matrix1, Matrix2: ARRAY OF ARRAY OF INTEGER);
  2. ...

Резервирование памяти под массив таким способом:
Код: "OBERON"
  1. VAR Matrix3: ARRAY LEN(Matrix1,1), LEN(Matrix2,0) OF INTEGER;
когда при объявлении массива длина берётся функцией LEN(), строго говоря, логически правильно, но что-то мне подсказывает, что оно будет работать только в Oberon-X. Может я ошибаюсь. Но если нет, то резервировать придётся динамически — с помощью NEW().

Да, скорее всего, функцию LEN() нельзя использовать при объявлении, т.к., насколько я помню, её результат не является константным выражением.

P.S. А вот так матрицы нельзя объявить?
Код: "OBERON"
  1. ARRAY OF RECORD x, y, z: INTEGER END;


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

Сообщения: 108
Для добавления единицы лучше использовать INC(Column2)


Объявление долбно быть через двоеточие:
Код: "OBERON"
  1. VAR Matrix3: ARRAY LEN(Matrix1,1), LEN(Matrix2,0) OF INTEGER;


В Компонентном Паскале так нельзя объявить, согласен с Олегом. Надо так:
Код: "OBERON"
  1. VAR matrix3: POINTER TO ARRAY OF ARRAY OF INTEGER;
  2. BEGIN
  3. NEW(matrix3, LEN(matrix1,1), LEN(matrix2,0));


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


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

Сообщения: 116
Откуда: Каменск-Уральский
Цитата:
Код: "OBERON"
  1. PROCEDURE MultiplicationMatrix (VAR Matrix1, Matrix2: ARRAY OF ARRAY OF INTEGER);

Это передача ссылки на масивы или копирование их содержимого?


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

Сообщения: 1019
Откуда: Днепропетровская обл.
Ссылки. А без VAR - будет копирование содержимого.


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

Сообщения: 116
Откуда: Каменск-Уральский
А как сделать так, чтобы процедура возвращала массив, если она расположена в отдельном модуле?


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

Сообщения: 1019
Откуда: Днепропетровская обл.
Код: "OBERON"
  1. PROCEDURE Abc1* (VAR result: ARRAY OF INTEGER);
Здесь ссылка на внешний массив поступает внутрь процедуры, а она его заполняет.

Или так:
Код: "OBERON"
  1. PROCEDURE Abc2* (): POINTER TO ARRAY OF INTEGER;
Здесь внутри самой процедуры выделяется память под массив нужного размера (с помощью NEW), и процедура возвращает указатель на этот динамический массив. Или, например, NIL — если что-то не получилось.


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

Сообщения: 273
Откуда: Россия
Немного не то теме. Замечу, что в Обероне, начиная с Оберона2, есть цикл FOR. Он, конечно, имеет недостатки (о чем я уже написал много постов), и иногда употребляется там, где не нужно. Но в данном случае происходит перебор всех строк и столбцов в заранее определенных границах, поэтому здесь применение FOR уместно. И программа станет более похожа на математическую формулу умножения матриц, где тоже явно заданы индексы и границы. Правда, небольшое отличие будет из-за индексации массивов с нуля, в то время как в математике принято индексировать строки и столбцы матрицы с 1.


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

Сообщения: 116
Откуда: Каменск-Уральский
Я хочу передать массив в процедуру, обработать в ней, а затем вывести. Почему не работает такой код:
Код: "OBERON"
  1. MODULE Program0;
  2. IMPORT Log, Strings;
  3. VAR matrix1, matrix2: ARRAY 2 OF ARRAY 3 OF INTEGER;
  4. line1, column1 : INTEGER;
  5. c:POINTER TO ARRAY OF CHAR;
  6.  
  7. PROCEDURE hMatrix (VAR matrixF: ARRAY OF ARRAY OF INTEGER):POINTER TO ARRAY OF ARRAY OF INTEGER;
  8. BEGIN
  9. RETURN matrixF;
  10. END hMatrix;
  11.  
  12. BEGIN
  13. matrix1[0,0] := 1;
  14. matrix1[0,1] := 2;
  15. matrix1[0,2] := 3;
  16. matrix1[1,0] := 5;
  17. matrix1[1,1] := 4;
  18. matrix1[1,2] := -5;
  19. matrix2 := hMatrix(matrix1);
  20. line1 := 0;
  21. column1 := 0;
  22. REPEAT
  23. REPEAT
  24. Strings.IntToString(matrix2[line1, column1],c);
  25. Log.String(c);
  26. Log.String(' ');
  27. column1 := column1 + 1;
  28. UNTIL column1 = LEN(matrix1,0);
  29. Log.Ln;
  30. column1 := 0;
  31. line1 := line1 + 1;
  32. UNTIL line1 = LEN(matrix1,1);
  33. END Program0.

(компилирую на Black Box).


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

Сообщения: 189
Код: "OBERON"
  1. PROCEDURE hMatrix (VAR matrixF: ARRAY OF ARRAY OF INTEGER):POINTER TO ARRAY OF ARRAY OF INTEGER;
  2. BEGIN
  3. RETURN matrixF;
  4. END hMatrix;
  5.  
  6. matrix2 := hMatrix(matrix1);


Странное что то должно произойти!!!
matrixF: ARRAY OF ARRAY OF INTEGER а возвращаете POINTER
Да ещё передача по ссылке?


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

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


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

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


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

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