OberonCore
https://forum.oberoncore.ru/

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

Автор:  Хохулин Олег [ Среда, 01 Декабрь, 2010 10:51 ]
Заголовок сообщения:  Как передать в процедуру строку?

есть следующие три модуля:
1-ый
Код:
МОДУЛЬ ПримерЖивность;
   ТИП
      Описание* = УКАЗАТЕЛЬ ДО МАССИВ ИЗ  ЛИТЕР;
      
      Живность* = УКАЗАТЕЛЬ ДО АБСТРАКТНАЯ ЗАПИСЬ
         имя*: Описание; (*Описание;*)
         описание*: Описание;
      КОНЕЦ;

   ПЕРЕМЕННЫЕ
НАЧАЛО
КОНЕЦ ПримерЖивность.

2-ой
Код:
МОДУЛЬ ПримерПтица;
   ПОДКЛЮЧИТЬ  ПримерЖивность;
   ТИП
   
      Птица* = УКАЗАТЕЛЬ ДО ЗАПИСЬ (ПримерЖивность.Живность)
      КОНЕЦ;   
   ПРОЦЕДУРА новая_птица*( наименование: ПримерЖивность.Описание): Птица;
      ПЕРЕМЕННЫЕ
         эта_птица: Птица;
   НАЧАЛО
      НОВАЯ (эта_птица);
      (*НОВАЯ (эта_птица.описание, 20);*)
      эта_птица.описание^:= "летает";
      эта_птица.имя := наименование;
      ВЕРНУТЬ эта_птица;   
   КОНЕЦ новая_птица;


НАЧАЛО
КОНЕЦ ПримерПтица.


и модуль в котором возникает ошибка:

МОДУЛЬ Пример;
ПОДКЛЮЧИТЬ Вывод := i21eduВывод, Ввод := i21eduВвод,
ПримерЖивность, ПримерПтица;
КОНСТАНТЫ
количество_живности = 4; (*пусть будут ворона, собака, лиса, ястреб*)
ПЕРЕМЕННЫЕ
список_живности : УКАЗАТЕЛЬ ДО МАССИВ ИЗ ПримерЖивность.Живность;
(*некая_живность : ПримерЖивность.Живность;*)

НАЧАЛО
НОВЫЙ (список_живности, количество_живности + 1);
список_живности [0]:= ПримерПтица.новая_птица("Ворона");несовместимое присваивание
КОНЕЦ Пример.

Как тогда правильно передать в процедуру строку?

Автор:  Ярослав Романченко [ Среда, 01 Декабрь, 2010 11:23 ]
Заголовок сообщения:  Re: Как передать в процедуру строку?

Параметр процедуры как открытый массив лучше всего сделать:
Код:
   ПРОЦЕДУРА новая_птица*( наименование: МАССИВ ИЗ  ЛИТЕР): Птица;

Автор:  Хохулин Олег [ Среда, 01 Декабрь, 2010 11:31 ]
Заголовок сообщения:  Re: Как передать в процедуру строку?

Ярослав Романченко писал(а):
Параметр процедуры как открытый массив лучше всего сделать:
Код:
   ПРОЦЕДУРА новая_птица*( наименование: МАССИВ ИЗ  ЛИТЕР): Птица;


Тогда получается другая ошибка
МОДУЛЬ ПримерПтица;
ПОДКЛЮЧИТЬ ПримерЖивность;
ТИП

Птица* = УКАЗАТЕЛЬ ДО ЗАПИСЬ (ПримерЖивность.Живность)
КОНЕЦ;
(* ПРОЦЕДУРА новая_птица*( наименование: ПримерЖивность.Описание): Птица; *)
ПРОЦЕДУРА новая_птица*( наименование: МАССИВ ИЗ ЛИТЕР): Птица;
ПЕРЕМЕННЫЕ
эта_птица: Птица;
НАЧАЛО
НОВАЯ (эта_птица);
(*НОВАЯ (эта_птица.описание, 20);*)
эта_птица.описание^:= "летает";
эта_птица.имя := наименование; несовместимое присваивание
ВЕРНУТЬ эта_птица;
КОНЕЦ новая_птица;

Автор:  Ярослав Романченко [ Среда, 01 Декабрь, 2010 11:45 ]
Заголовок сообщения:  Re: Как передать в процедуру строку?

Вобщем, нужно определиться, передавать в процедуру указатель или передавать массив.
Если указатель, то мою предыдущую рекомендацию отменить, но тогда так (ПримерПтица.новая_птица("Ворона");) строку передать будет нельзя, нужно создать указатель на строку "Ворона" и передавать его в процедуру.
Если передавать строку то в месте присваивания (там где "несовместимое присваивание") нужно создать экземпляр строки (указатель) из переданного массива и его присваивать.

Автор:  Valery Solovey [ Среда, 01 Декабрь, 2010 12:07 ]
Заголовок сообщения:  Re: Как передать в процедуру строку?

Ярослав Романченко писал(а):
Если передавать строку то в месте присваивания (там где "несовместимое присваивание") нужно создать экземпляр строки (указатель) из переданного массива и его присваивать.
Вместо
Код:
эта_птица.имя := наименование;
написать
Код:
эта_птица.имя^ := наименование$;

Автор:  Александр Ильин [ Среда, 01 Декабрь, 2010 12:21 ]
Заголовок сообщения:  Re: Как передать в процедуру строку?

Код:
ПРОЦЕДУРА ДавайСтрокуЖиво* (такую: СТРОКА ИЗ ЛИТЕР): Описание;
ПЕРЕМЕННАЯ строку: Описание;
НАЧАЛО
   НОВУЮ(строку, ДЛИНУ(такую));
   строку^ := такую$;
   ВЕРНУТЬ строку
КОНЕЦ ДавайСтрокуЖиво;

...

список_живности [0]:= ПримерПтица.новая_птица(ДавайСтрокуЖиво("Ворона"));

Автор:  Ярослав Романченко [ Среда, 01 Декабрь, 2010 12:34 ]
Заголовок сообщения:  Re: Как передать в процедуру строку?

вот! :D
В A2 такое чудо присутствует. Strings.NewString()

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