OberonCore
https://forum.oberoncore.ru/

Ошибка при возврате моего массивного типа
https://forum.oberoncore.ru/viewtopic.php?f=35&t=4944
Страница 1 из 1

Автор:  bill [ Суббота, 18 Январь, 2014 15:34 ]
Заголовок сообщения:  Ошибка при возврате моего массивного типа

Код:
MODULE XmatemGaus0;

   IMPORT StdLog;

      TYPE
      
   STRING  = ARRAY 256 OF CHAR;   
   massiv_type  = ARRAY 4 OF REAL;
   
   PROCEDURE massiv_umnojenie(a:massiv_type; n:REAL) : massiv_type ;(*вот тут ошибка*)
   VAR
   stroka_1:massiv_type;
   BEGIN
      stroka_1[0]:=a[0]*n;
      stroka_1[1]:=a[1]*n;
      stroka_1[2]:=a[2]*n;
      stroka_1[3]:=a[3]*n;

      RETURN:=stroka_1;
end;
   
   (*....*)

END XmatemGaus0.

Автор:  Пётр Кушнир [ Суббота, 18 Январь, 2014 15:49 ]
Заголовок сообщения:  Re: Ошибка при возврате моего массивного типа

Используй параметры IN, OUT вместо возврата результата.

Автор:  bill [ Воскресенье, 19 Январь, 2014 10:11 ]
Заголовок сообщения:  Re: Ошибка при возврате моего массивного типа

Не смог разобраться в IN и OUT,

Автор:  Jordan [ Воскресенье, 19 Январь, 2014 11:32 ]
Заголовок сообщения:  Re: Ошибка при возврате моего массивного типа

Код:
MODULE XmatemGaus0;

   IMPORT StdLog;

      TYPE
     
   STRING  = ARRAY 256 OF CHAR;   
   massiv_type  = ARRAY 4 OF REAL;
   
   PROCEDURE massiv_umnojenie(a:massiv_type; n:REAL; OUT v:massiv_type) ;
   VAR
   stroka_1:massiv_type;
   BEGIN
      stroka_1[0]:=a[0]*n;
      stroka_1[1]:=a[1]*n;
      stroka_1[2]:=a[2]*n;
      stroka_1[3]:=a[3]*n;

      v := stroka_1;
END massiv_umnojenie;

END XmatemGaus0.


И попробуйте заменить OUT, VAR'ом.

Автор:  Jordan [ Воскресенье, 19 Январь, 2014 11:44 ]
Заголовок сообщения:  Re: Ошибка при возврате моего массивного типа

Пример на паскале.

Код:
{$mode objfpc}

PROGRAM main;

TYPE
  MType = ARRAY [0..4] OF INTEGER;
 
PROCEDURE MMul(A: MType; N: INTEGER; VAR V: MType);
VAR
  S: MType;
BEGIN
  S[0]:=a[0]*n;
  S[1]:=a[1]*n;
  S[2]:=a[2]*n;
  S[3]:=a[3]*n;

  V := S;
END;

VAR
  M: MType;
  A: MType;

BEGIN
  A[0]:= 3;
  A[1]:= 4;
  A[2]:= 9;
  A[3]:= 11;
  MMul(A, 5, M);
  WriteLn(M[0]);
  WriteLn(M[1]);
  WriteLn(M[2]);
  WriteLn(M[3]);
END.

Автор:  Jordan [ Воскресенье, 19 Январь, 2014 11:54 ]
Заголовок сообщения:  Re: Ошибка при возврате моего массивного типа

Ещё бы я умножал в цикле. И заменил тип, на Mtype: POINTER ARRAY OF REAL. Тогда не будет ограничения на размер массива.

Автор:  bill [ Воскресенье, 19 Январь, 2014 12:43 ]
Заголовок сообщения:  Re: Ошибка при возврате моего массивного типа

опять ошибка я хотел вывести результаты своей функции, я делаю так как привык в FPC, вызываю функцию а тут ошибка
Код:
MODULE XmatemGaus0;

   IMPORT StdLog;

      TYPE
     
   STRING  = ARRAY 256 OF CHAR;   
   massiv_type  = ARRAY 4 OF REAL;
   
   PROCEDURE massiv_umnojenie(a:massiv_type; n:REAL; OUT v:massiv_type) ;
   VAR
   stroka_1:massiv_type;
   BEGIN
      stroka_1[0]:=a[0]*n;
      stroka_1[1]:=a[1]*n;
      stroka_1[2]:=a[2]*n;
      stroka_1[3]:=a[3]*n;

      v := stroka_1;
END massiv_umnojenie;

PROCEDURE Do ;
   VAR
   stroka_1:massiv_type;
   a:massiv_type;
   BEGIN
      a[0]:=1;
      a[1]:=1;
      a[2]:=1;
      a[3]:=1;
      stroka_1:=massiv_umnojenie(a,3);(*ошибка тут*)
      StdLog.Ln;
      StdLog.Real(stroka_1[0]);
      StdLog.Ln;
      StdLog.Real(stroka_1[1]);

END Do;

END XmatemGaus0.

Автор:  Jordan [ Воскресенье, 19 Январь, 2014 12:51 ]
Заголовок сообщения:  Re: Ошибка при возврате моего массивного типа

bill писал(а):
stroka_1:=massiv_umnojenie(a,3);(*ошибка тут*)


Правильно так.

massiv_umnojenie(a,3, stroka_1);

У нас процедура, а не функция.

Автор:  Jordan [ Воскресенье, 19 Январь, 2014 13:01 ]
Заголовок сообщения:  Re: Ошибка при возврате моего массивного типа

Код:
MODULE XmatemGaus0;

   IMPORT StdLog;

      TYPE
     
   STRING  = ARRAY 256 OF CHAR;   
   massiv_type  = ARRAY 4 OF REAL;

   VAR
   stroka_1:massiv_type;
   a:massiv_type;
   
   PROCEDURE massiv_umnojenie(a:massiv_type; n:REAL; OUT v:massiv_type) ;
   VAR
   stroka_1:massiv_type;
   BEGIN
      stroka_1[0]:=a[0]*n;
      stroka_1[1]:=a[1]*n;
      stroka_1[2]:=a[2]*n;
      stroka_1[3]:=a[3]*n;

      v := stroka_1;
END massiv_umnojenie;

   BEGIN
      a[0]:=1;
      a[1]:=1;
      a[2]:=1;
      a[3]:=1;
      massiv_umnojenie(a,3, stroka_1);
      StdLog.Ln;
      StdLog.Real(stroka_1[0]);
      StdLog.Ln;
      StdLog.Real(stroka_1[1]);

END XmatemGaus0.


Вы не знаете как вывести в лог информацию? Я компилирую ctrl+k, куда потом жать, что бы запустить программу. Вроде, как в delphi, compile and run.

Автор:  bill [ Воскресенье, 19 Январь, 2014 14:06 ]
Заголовок сообщения:  Re: Ошибка при возврате моего массивного типа

Jordan, Меню-> Contrors-> New Form, далее вводим имя программы(XmatemGaus0), форма создается автоматически, за лог отвечает модуль StdLog

Автор:  Jordan [ Вторник, 21 Январь, 2014 15:30 ]
Заголовок сообщения:  Re: Ошибка при возврате моего массивного типа

У меня ББ, не выводит сообщения в лог. Даже простой StdLog.String("Hello World!"), не работает.

Так как получилось, работает?

Писать результат можно в сам массив, без создания переменной.

PROCEDURE massiv_umnojenie(VAR A:massiv_type; N:REAL) ;
VAR
I: INTEGER;
BEGIN
FOR I := 0 TO LEN(A)-1 DO
A[I] := A[I] * N;
END;
END massiv_umnojenie;

Вызов
massiv_umnojenie(a,3);

Автор:  bill [ Вторник, 21 Январь, 2014 16:00 ]
Заголовок сообщения:  Re: Ошибка при возврате моего массивного типа

вот этот пример попробуйте
Код:
MODULE ObxHello0;

   IMPORT StdLog;

   PROCEDURE Do*;
   BEGIN
      StdLog.String("Hello World"); StdLog.Ln  (* вывод в рабочий журнал (Log) цепочки литер и 0DX (переход на новую строку) *)
   END Do;

END ObxHello0.

Автор:  Jordan [ Вторник, 21 Январь, 2014 16:03 ]
Заголовок сообщения:  Re: Ошибка при возврате моего массивного типа

В лог пишет только "compiling "ObxHello0" 32 0".

Автор:  Димыч [ Вторник, 21 Январь, 2014 16:55 ]
Заголовок сообщения:  Re: Ошибка при возврате моего массивного типа

Потом ставите курсор в конец файла, нажимаете Ctrl-Q и печатаете ObxHello0.Do
После этого жмете на восклицательный знак и наблюдаете.

Автор:  bill [ Вторник, 21 Январь, 2014 17:02 ]
Заголовок сообщения:  Re: Ошибка при возврате моего массивного типа

Jordan, или Contrors-> New Form, далее вводим имя программы(ObxHello0), генерируется кнопка Do , нажимаем на нее

Автор:  Jordan [ Вторник, 21 Январь, 2014 21:31 ]
Заголовок сообщения:  Re: Ошибка при возврате моего массивного типа

Работает, спасибо. Теперь я написал первый, рабочий hello world на КП.

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