Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт апр 19, 2024 06:23

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: маленькие массивы на стеке данных
СообщениеДобавлено: Сб апр 28, 2007 03:52 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Иногда надо произвести операции над небольшими массивами, и не хочется
мудрить с выделением памяти под их хранение.

Массивы создаются на вершине стека данных или в памяти.
Каждый элемент массива занимает одну ячейку (то есть CELL), и одну ячейку
занимает счетчик, определяющий размер массива. Массивы могут иметь небольшой
размер (не более нескольких десятков ячеек) и их может быть не очень много
(не стоит забывать, что в СПФ обычно под стек данных отведено всего 4кб -
это примерно 1000 ячеек).

Код:
\ 10-04-2007 ~mOleg
\ Copyright [C] 2006-2007 mOleg mininoleg@yahoo.com
\ работа с небольшими массивами в стеке данных.

\ выделить на стеке место под массив без инициализации
: array ( # --> [array] # ) >R SP@ R@ CELLS - SP! R> ;

\ получить адрес начала массива и его длинну
: get-array ( [array] # --> [array] # addr #bytes )
            >R SP@ R> SWAP OVER CELLS ;

\ выделить место под массив на стеке данных, заполнить пространство нулями
: 0array ( # --> [000] # ) array get-array ERASE ;

\ удалить массив вместе с содрежимым
: dismiss ( [array] # --> ) get-array + SP! ;

\ создать копию массива
: reply ( [array] # --> [array] # [array] # )
        get-array >R >R DUP array
        get-array DROP R> SWAP R>
        MOVE ;

\ объединить указанные массивы в один
: combine ( [arr] m [ay] n --> [array] m+n )
          get-array 2DUP + @ >R OVER CELL + SWAP CMOVE> R> + NIP ;

\ разбить один массив на два.
\ если n больше m будет создано два массива:
\ один нулевой длинны, второй полная копия оригинального.
: break ( [array] m n --> [arr] m-n [ay] n )
        OVER UMIN 2DUP - >R >R
        get-array DROP DUP CELL - R@ CELLS MOVE
        R> get-array + R> SWAP ! ;

\ копировать массив в память вместе со счетчиком
: move-to ( [array] # addr --> )
          >R get-array CELL + SWAP CELL - SWAP R> SWAP MOVE dismiss ;

\ копировать массив из памяти на стек данных
: get-from ( addr --> [array] # )
           DUP >R @ array get-array R> CELL + -ROT MOVE ;

\EOF -- тестовая секция -----------------------------------------------------

1 CHARS CONSTANT char

\ преобразовать строку в массив
: s>arr ( asc # --> [a s c] # )
        OVER + 2>R
        0 BEGIN 2R@ <> WHILE
                1 + R> char - DUP >R C@ SWAP
          REPEAT RDROP RDROP ;

\ распечатать содержимое массива как строку
: .array ( [arr] # --> ) 0 ?DO EMIT LOOP ;

\ это примеры работы:
CR S" sample text" s>arr .array
CR S" sample" s>arr S" text " s>arr combine .array
CR S" sample text" s>arr 7 break .array CR .array
CR S" sample " s>arr reply combine .array
CR S" sample text" s>arr 7 break dismiss .array
   S" sample text" s>arr HERE move-to HERE DUP @ CELLS DUMP
CR HERE get-from .array


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб апр 28, 2007 10:40 
Конструкция из пяти тарелок, одной чашки на иголке стоящей на паркете. А за чашку, на одной руке, держится вниз головой виртуоз-скрипач и играет Паганини.

Т.е. -- на соплях. Поэтому неприменимо. Сам и сказал:
Цитата:
..и их может быть не очень много..


Если так ломает использовать традиционные, работающие (и далеко на такие страшные) средства по выделения памяти, можно использовать стековое выделение памяти: ~ac/lib/memory/mem_stack2.f.

Работать будет, и не на честном слове и одной сопле. Как то что выше.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб апр 28, 2007 21:49 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Кстати, зря ты так!
Если нужно активно работать с несколькими ( до десятка ) маленькими массвами - то у такого решения есть преимущества. Надежность кстати нормальная - собственно гарантировано освобождение памяти в случае возникновения ошибок.

profiT писал(а):
Если так ломает использовать традиционные, работающие (и далеко на такие страшные) средства по выделения памяти, можно использовать стековое выделение памяти: ~ac/lib/memory/mem_stack2.f.

это из другой оперы - не катит.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб апр 28, 2007 23:51 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Тут видится "вилка". На PC стек можно сделать и мегабайтный, а в МК стек чем меньше, тем лучше. И к чему такое? Еще помнить, какие массивы можно на стек, а какие нельзя?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн апр 30, 2007 21:13 
Не в сети

Зарегистрирован: Вс окт 15, 2006 13:05
Сообщения: 149
Откуда: Украина, Киев
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
опять не хватает описания параметров слов. Просто эпидемия какая-то практически по всем листинга из папки devel :(
Я правильно понимаю,

[array] # --- это ( n0 n1 n2 ... nM M )
n - элемент массива
M - общее кол-во элементов ?

Еще, а как располагаются элементы массива на стеке? Я правильно воспроизвел порядок?

Чо-то просматривается по использованию, скажем віполнение действия над каждым эл-том массива.
Если раньше было бы
Код:
ArrayCount 0 DO
   ArrayAddres I CELL * + @ \ получили элемент массива
   ( n ) DoSomething
LOOP

то сейчас это где-то так
Код:
Array get-from 0 DO
   ( n ) DoSomething 
LOOP

Я для своих задач просто определил слово .i -- взять i-ый элемент массива:
Код:
ArrayCount 0 DO
    I ArrayAddres .i
   ( n ) DoSomething
  LOOP


Т.е мне не понятна, из какой практической задачи выросла эта библиотека. Что смог предположить, решается проще...

Вот куда бы стал развивать это направление -- выделение места под структуры данных для вызова внешних функций из dll, и преобразование их затем в принятый стековый формат.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн апр 30, 2007 21:26 
Цитата:
Т.е мне не понятна, из какой практической задачи выросла эта библиотека.

Насколько я понял слова автора практической задачи не было. Было желание поиграться в PostScript.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт май 01, 2007 12:20 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
AlexF писал(а):
опять не хватает описания параметров слов. Просто эпидемия какая-то практически по всем листинга из папки devel
Я правильно понимаю,

Уточняй, что не понятно. Я обязательно поправлю. Просто всегда можно что-то упустить из виду.
Я обязательно добавлю пояснение. Просто мне казалось, что примеров в конце достаточно.

AlexF писал(а):
[array] # --- это ( n0 n1 n2 ... nM M )
n - элемент массива
M - общее кол-во элементов ?

да на вершине стека общее кол-во элементов.
а вот порядо данны другой. Собственно массив растет вниз, значит заполняется как стек, значит 0-вой элемент будет сразу под счетчиком.

можно добавить два слова:

Код:

\ получить значение i-того элемента массива
: [i]@ ( [array] # i --> [array] # n[i] ) 1 + PICK ;

\ сохранить значение в i-тый элемент массива
: [i]!   ( [array] # n i --> [array] # ) 1 + CELLS 2>R SP@ R> + R> SWAP ! ;


AlexF писал(а):
Еще, а как располагаются элементы массива на стеке? Я правильно воспроизвел порядок?

нет, порядок обратный

AlexF писал(а):
Т.е мне не понятна, из какой практической задачи выросла эта библиотека. Что смог предположить, решается проще...

Это действительно прикидывание механизмов постскрипта к Форту.
Писалось для практической задачи, но не подошло (то есть я просто рассматривал варианты создания массива, когда его длинна заранее неизвестна, и данные приходят как на стек и в случае возникновения ошибки о таких данных просто можно забыть) .
Мне лично оказалось проще создать отдельный стек, а не использовать общий. Но либа есть, к тому же народ уже интерисовался, как можно копировать массивы чисел на стеке данных, например для того же подсовывания их системным функциям.


profiT писал(а):
Цитата:
Т.е мне не понятна, из какой практической задачи выросла эта библиотека.

Насколько я понял слова автора практической задачи не было. Было желание поиграться в PostScript.


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


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

Часовой пояс: UTC + 3 часа [ Летнее время ]


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

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


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

cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB