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

Твердыня модульных языков
Текущее время: 21 апр 2024, 11:19

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




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Как правильно объявить метод?
СообщениеДобавлено: 08 авг 2019, 13:24 
Не в сети

Сообщения: 116
Откуда: Каменск-Уральский
Какой идентификатор (ident) использовать при объявлении метода? PROCEDURE ( [VAR|IN] ident : записевыйТип ) Имя метода [формальныеПараметры] атрибуты.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Как правильно объявить метод?
СообщениеДобавлено: 08 авг 2019, 16:33 
Не в сети
Аватара пользователя

Сообщения: 67
Откуда: Equestria
Любой удобный.
Я обычно использую одну букву подходящую по сокращение имени типа. Вроде (a: Action) или (v: TextView).


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Как правильно объявить метод?
СообщениеДобавлено: 08 авг 2019, 17:58 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
А ещё можно self, это традиционно для мэйнстримовых ЯП.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Как правильно объявить метод?
СообщениеДобавлено: 09 авг 2019, 04:01 
Не в сети

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


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Как правильно объявить метод?
СообщениеДобавлено: 09 авг 2019, 15:35 
Не в сети

Сообщения: 116
Откуда: Каменск-Уральский
Например, я хочу сделать следующий стек объектом:
Код: "OBERON"
  1. MODULE KnyshStack;
  2.  
  3. IMPORT StdLog;
  4.  
  5. CONST
  6. sizeStack* = 100;
  7. numberOfLetter* = 256;
  8. TYPE
  9. myKey*= ARRAY numberOfLetter OF CHAR;
  10. pListItem* = POINTER TO RECORD
  11. key: myKey;
  12. next: pListItem;
  13. END;
  14.  
  15. VAR
  16. myListItem, firstItem: pListItem;
  17. numberItemsOfStack-: INTEGER;
  18.  
  19. PROCEDURE (self: pListItem) AddTheItem* (add: ARRAY OF CHAR): BOOLEAN, NEW;(*добавить элемент*)
  20. BEGIN
  21. IF LEN(add) > numberOfLetter THEN
  22. StdLog.String ("Количество букв в слове не должно превышать");
  23. StdLog.Int (numberOfLetter);
  24. RETURN FALSE
  25. ELSIF add$ = "" THEN
  26. StdLog.String ("Слово не должно быть пустым.");
  27. RETURN FALSE
  28. ELSE
  29. IF numberItemsOfStack = sizeStack THEN
  30. StdLog.String ("Достигнуто максимальное количество элементов в стеке.");
  31. RETURN FALSE
  32. ELSE
  33. INC(numberItemsOfStack);
  34. IF firstItem = NIL THEN
  35. NEW (myListItem);
  36. myListItem.key := add$;
  37. firstItem := myListItem
  38. ELSE
  39. NEW (myListItem.next);
  40. myListItem.next.key := add$;
  41. myListItem.next.next := firstItem;
  42. firstItem := myListItem.next;
  43. myListItem.next := NIL;
  44. END;
  45. RETURN TRUE;
  46. END;
  47. RETURN TRUE
  48. END
  49. END AddTheItem;
  50.  
  51. PROCEDURE (self: pListItem) ExtractTheItem* (OUT str:myKey), NEW;(*извлечь элемент*)
  52. BEGIN
  53. IF firstItem # NIL THEN
  54. DEC(numberItemsOfStack);
  55. str := firstItem.key;
  56. firstItem:= firstItem.next
  57. ELSE
  58. StdLog.String ("Стек пуст - извлекать нечего.");
  59. END
  60. END ExtractTheItem;
  61.  
  62. PROCEDURE (self: pListItem) ClearList*, NEW;(*очистить стек*)
  63. BEGIN
  64. myListItem := NIL;
  65. firstItem := NIL;
  66. numberItemsOfStack := 0
  67. END ClearList;
  68.  
  69. BEGIN
  70. numberItemsOfStack := 0;
  71. END KnyshStack.

Далее пишу такой модуль:
Код: "OBERON"
  1. MODULE KnyshExamplesStack;
  2.  
  3. IMPORT KnyshStack, StdLog;
  4.  
  5. PROCEDURE a*;(**)
  6. VAR
  7. obj1, obj2: KnyshStack.pListItem;
  8. f: BOOLEAN;
  9. letter: KnyshStack.myKey;
  10. BEGIN
  11. NEW(obj1);
  12. NEW(obj2);
  13. f := obj1.AddTheItem ("Вася");
  14. f := obj1.AddTheItem ("Катя");
  15. f := obj1.AddTheItem ("Юля");
  16. f := obj1.AddTheItem ("Саша");
  17. f := obj2.AddTheItem ("Лена");
  18.  
  19. obj1.ExtractTheItem(letter);
  20. StdLog.String (letter)
  21. END a;
  22.  
  23. END KnyshExamplesStack.

При вызове процедуры KnyshExamplesStack.a печатается Лена, а не Саша. Как отделить поля одного объекта от другого?


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

Сообщения: 67
Откуда: Equestria
Исключи глобальные переменные переносом оных в структуру к которой прикрепляются процедуры. А к структуре обращайся через ресивер(или как ты называешь идентификатор).

Простая реализация стека (не тестировал, но ломаться нечему)
Код: "OBERON"
  1. MODULE MyStacks;
  2.  
  3. TYPE
  4. String* = ARRAY 256 OF CHAR;
  5.  
  6. Item = POINTER TO RECORD
  7. val: String;
  8. next: Item;
  9. END;
  10.  
  11. Stack* = POINTER TO RECORD
  12. item: Item;
  13. count: INTEGER
  14. END;
  15.  
  16. PROCEDURE (s: Stack) Push* (IN str: String), NEW;
  17. VAR i: Item;
  18. BEGIN
  19. NEW(i); i.val := str$; i.next := s.item; s.item := i;
  20. INC(s.count)
  21. END Push;
  22.  
  23. PROCEDURE (s: Stack) Pop* (OUT str: String), NEW;
  24. BEGIN
  25. ASSERT(s.item # NIL, 60); (* Стек пуст *)
  26. str := s.item.val$;
  27. s.item := s.item.next;
  28. DEC(s.count)
  29. END Pop;
  30.  
  31. PROCEDURE (s: Stack) Count* (): INTEGER, NEW;
  32. BEGIN
  33. RETURN s.count
  34. END Count;
  35.  
  36. PROCEDURE (s: Stack) Clear*, NEW;
  37. BEGIN
  38. s.item := NIL; s.count := 0
  39. END Clear;
  40.  
  41. END MyStacks.

Код: "OBERON"
  1. MODULE MyTest;
  2.  
  3. IMPORT MyStacks, Log;
  4.  
  5. PROCEDURE Do*;
  6. VAR s1, s2: MyStacks.Stack; str: MyStacks.String;
  7. BEGIN
  8. NEW(s1); NEW(s2);
  9. s1.Push("Вася");
  10. s1.Push("Катя");
  11. s1.Push("Юля");
  12. s1.Push("Саша");
  13. s2.Push("Лена");
  14.  
  15. s1.Pop(str);
  16. ASSERT(str = "Саша", 100); (* Если не трапает, значит всё работает как задумано *)
  17. Log.String(str); Log.Ln;
  18. END Do;
  19.  
  20. END MyTest.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Как правильно объявить метод?
СообщениеДобавлено: 11 авг 2019, 14:15 
Не в сети

Сообщения: 116
Откуда: Каменск-Уральский
Ну я и намудрил:
Код: "OBERON"
  1. IF firstItem = NIL THEN
  2. NEW (myListItem);
  3. myListItem.key := add$;
  4. firstItem := myListItem
  5. ELSE
  6. NEW (myListItem.next);
  7. myListItem.next.key := add$;
  8. myListItem.next.next := firstItem;
  9. firstItem := myListItem.next;
  10. myListItem.next := NIL;
  11. END;


, а ларчик просто открывался:
Код: "OBERON"
  1. NEW(i); i.val := str$; i.next := s.item; s.item := i

Век живи - век учись.


Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

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


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

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


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

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