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

Твердыня модульных языков
Текущее время: 29 июн 2025, 18:59

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




Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: pointers on spectrum
СообщениеДобавлено: 14 июл 2013, 22:42 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Other interest moment is that I cannot compile standard SDCC's file _heap.c (if I've specified the option -mz80, SDCC does not accept keyword __xdata) - thus, we lose the possibility to set the size of the heap. But if I do not specify -mz80, SDCC compiles _heap.c perfectly, but for CPU 8051 - by default.

I wrote e-mail to Philipp Krause, but he hasn't time to help me. I must readress this questions to SDCC developers (and maybe at forum of Russian Speccy fans - zx.pk.ru).

P.S. So the Oberon code under Speccy ends at the same manner:
Код: "OBERON"
  1. BEGIN
  2. NEW(john); IF john=NIL THEN IO.WriteStr("NIL ") END;
  3. NEW(mike); IF mike=NIL THEN IO.WriteStr("NIL ") END;
  4. NEW(lisa); IF lisa=NIL THEN IO.WriteStr("NIL ") END;
  5. NEW(bob); IF bob =NIL THEN IO.WriteStr("NIL ") END;
  6. NEW(iren); IF iren=NIL THEN IO.WriteStr("NIL ") END;
prints NIL NIL NIL


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: pointers on spectrum
СообщениеДобавлено: 14 июл 2013, 23:21 
Не в сети

Сообщения: 104
Im not using pointers at the moment so I can wait :P


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: pointers on spectrum
СообщениеДобавлено: 15 июл 2013, 00:01 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Presumably you have a question - why Oberon pointers can only point to the heap, and not to an arbitrary location (a variable, a procedure entry, etc). The answer here is that Oberon controls every pointer, and must ensures the safety and proper operation. And when something goes wrong - it should warn us as soon as possible to avoid induced errors and strange behavior of a program at arbitrary. But in Oberon we have the ability to use implicit pointers as VAR procedure parameters - this is also hidden pointers. The other pointers are considered unsafe, and working with them is organized through the module SYSTEM features.

Of course, such a decision may seem like overkill, if you work with small programs, but for large and very large software projects - such organization of pointers contributing to the rapid determination of bugs without step-by-step debuggers, and seriously improves the stability of software.

All safety features after all to be implemented in XDev too, I hope so.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: pointers on spectrum
СообщениеДобавлено: 16 июл 2013, 16:37 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
I made two posts - at zx.pk.ru and at forum of SDCC developers. Now we'll wait for a response.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: pointers on spectrum
СообщениеДобавлено: 18 июл 2013, 17:42 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
We have the answer! :) And no problems with pointers on Spectrum:


Вложения:
DemoDynMem.tap [2.61 КБ]
Скачиваний: 1052
DynMem.png
DynMem.png [ 6.73 КБ | Просмотров: 12534 ]
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: pointers on spectrum
СообщениеДобавлено: 18 июл 2013, 19:58 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Using the heap under ZX - dynamic allocation of memory at about 40 Kb of RAM at all - is not a very efficient way. But it's possible, as you see.

For greater efficiency I recommend take look to untagged pointers (with flag [1]) and SYSTEM features SYSTEM.ADR, SYSTEM.VAL, SYSTEM.GET/SYSTEM.PUT (or, of course, Basic.PEEK/Basic.POKE), like:
Код: "OBERON"
  1. MODULE DemoStatMem; (*$MAIN*)
  2. IMPORT
  3. SYSTEM, IO := Console, Basic;
  4.  
  5. TYPE
  6. PersonPtr = POINTER [1] TO Person;
  7. Person = RECORD
  8. name: ARRAY 20 OF CHAR;
  9. age: INTEGER;
  10. sex: CHAR; (*"M" OR "F"*)
  11. next: PersonPtr;
  12. END;
  13.  
  14. VAR
  15. john, mike, lisa, bob, iren: Person; person: PersonPtr;
  16. list: ARRAY 5 OF PersonPtr;
  17. n: INTEGER;
  18.  
  19. BEGIN
  20. john.name := "John Smith" ; john.sex := "M"; john.age := 32;
  21. john.next := SYSTEM.VAL(PersonPtr, SYSTEM.ADR(bob));
  22. mike.name := "Michael Bison"; mike.sex := "M"; mike.age := 12;
  23. mike.next := SYSTEM.VAL(PersonPtr, SYSTEM.ADR(lisa));
  24. lisa.name := "Elisabeth Bow"; lisa.sex := "F"; lisa.age := 21;
  25. lisa.next := NIL;
  26. bob.name := "Boris Fellow" ; bob.sex := "M"; bob.age := 39;
  27. bob.next := SYSTEM.VAL(PersonPtr, SYSTEM.ADR(iren));
  28. iren.name := "Iren Summer" ; iren.sex := "F"; iren.age := 43;
  29. iren.next := SYSTEM.VAL(PersonPtr, SYSTEM.ADR(mike));
  30.  
  31. person := SYSTEM.VAL(PersonPtr, SYSTEM.ADR(john));
  32. IO.WriteStrLn("Female:");
  33. WHILE person # NIL DO
  34. IF person.sex = "F" THEN IO.WriteStrLn(person.name) END;
  35. person := person.next;
  36. END; IO.WriteLn;
  37.  
  38. list[0] := SYSTEM.VAL(PersonPtr, SYSTEM.ADR(john));
  39. list[1] := SYSTEM.VAL(PersonPtr, SYSTEM.ADR(mike));
  40. list[2] := SYSTEM.VAL(PersonPtr, SYSTEM.ADR(lisa));
  41. list[3] := SYSTEM.VAL(PersonPtr, SYSTEM.ADR(bob));
  42. list[4] := SYSTEM.VAL(PersonPtr, SYSTEM.ADR(iren));
  43.  
  44. FOR n := LEN(list) - 1 TO 0 BY -1 DO
  45. IO.WriteStr(list[n].name); IO.WriteStr(" ");
  46. IO.WriteCh(list[n].sex); IO.WriteStr(" ");
  47. IO.WriteInt(list[n].age); IO.WriteLn; IO.WriteLn;
  48. END;
  49.  
  50. (* Using manual POKE'ing to John.name: *)
  51. IO.WriteStr("Before POKE'ing: "); IO.WriteStrLn(john.name);
  52. Basic.POKE(SYSTEM.VAL(INTEGER, SYSTEM.ADR(john.name[0])), ORD("H"));
  53. Basic.POKE(SYSTEM.VAL(INTEGER, SYSTEM.ADR(john.name[1])), ORD("a"));
  54. (* Or the same by SYSTEM.PUT: *)
  55. SYSTEM.PUT(SYSTEM.ADR(john.name[2]), "n");
  56. SYSTEM.PUT(SYSTEM.ADR(john.name[3]), "s");
  57. IO.WriteStr("After POKE'ing: "); IO.WriteStrLn(john.name);
  58.  
  59. END DemoStatMem.
It is a code with the same functionality, but without using the heap. Use a code in this manner only for efficiency, because it is not a pure Oberon-way.

One more note: in some cases SDCC produces a binary code of size between CodeAddr and DataAddr. I don't know how to ask SDCC to reduce a binary size, and is it possible. For similar cases I wrote a tool ZXDev/Bin/stripbin.exe that removes all 'FF' bytes at end of a binary file.


Вложения:
DemoStatMem.tap [1.31 КБ]
Скачиваний: 998
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: pointers on spectrum
СообщениеДобавлено: 19 июл 2013, 01:02 
Не в сети

Сообщения: 104
very good!


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

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


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

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


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

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