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

...
Google Search
Forth-FAQ Spy Grafic

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




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - Возможность работать с многомерными массивами
Автор Сообщение
  Заголовок сообщения:  Re: Возможность работать с многомерными массивами  Ответить с цитатой
Hishnik писал(а):
Victor__v писал(а):
Если на входе 0 1, то смещение будет равно 12
А если 3 0, то смещение опять будет равно 12!

Так это ведь одно и то же. Если первая размерность массива равна 3, то индексы будут 0, 1, 2. Индекс 3 - это уже переход на следующую строку массива.

:))
А я себе всю ночь голову ломал почему у меня так происходит. А вот оно что, не доглядел)

KPG писал(а):
т.е. CELLS необходимо добавить при каждой операции умножения и убрать в конце кода

Как я понял это необзательно. Можно в конце доумножить на разрядность данных (CELLS в данном случае)
Даже так
3 * CELLS RP@ +! 1 * CELLS RP@ +! <==> 3 * RP@ +! 1 * RP@ +! R> CELLS

ИБО
AC+BC=(A+B)*C

Эх, математика кто ж знал, что ты пригодишься :)
Сообщение Добавлено: Вт янв 29, 2019 16:08
  Заголовок сообщения:  Re: Возможность работать с многомерными массивами  Ответить с цитатой
KPG писал(а):
т.е. CELLS необходимо добавить при каждой операции умножения и убрать в конце кода

Да нет, просто тут выход за границы массива. 3 0 - это то же самое что 0, 1, потому что у массива ячейки такие:

0, 0 1, 0 2, 0
0, 1 <- и это то же самое, что 3, 0
Сообщение Добавлено: Вт янв 29, 2019 16:03
  Заголовок сообщения:  Re: Возможность работать с многомерными массивами  Ответить с цитатой
Hishnik писал(а):
Victor__v писал(а):
Если на входе 0 1, то смещение будет равно 12
А если 3 0, то смещение опять будет равно 12!

Так это ведь одно и то же. Если первая размерность массива равна 3, то индексы будут 0, 1, 2. Индекс 3 - это уже переход на следующую строку массива.

т.е. CELLS необходимо добавить при каждой операции умножения и убрать в конце кода :shuffle;
Сообщение Добавлено: Вт янв 29, 2019 15:57
  Заголовок сообщения:  Re: Возможность работать с многомерными массивами  Ответить с цитатой
Victor__v писал(а):
Если на входе 0 1, то смещение будет равно 12
А если 3 0, то смещение опять будет равно 12!

Так это ведь одно и то же. Если первая размерность массива равна 3, то индексы будут 0, 1, 2. Индекс 3 - это уже переход на следующую строку массива.
Сообщение Добавлено: Вт янв 29, 2019 15:45
  Заголовок сообщения:  Re: Возможность работать с многомерными массивами  Ответить с цитатой
Victor__v писал(а):
Выдаст один и тот же адрес, а это плохо, бателька

А в каких Форт проверялось и какая промежуточная печать в коде делалась?
Сообщение Добавлено: Вт янв 29, 2019 15:27
  Заголовок сообщения:  Re: Возможность работать с многомерными массивами  Ответить с цитатой
KPG писал(а):
А так?
Код:
: TEST
0 2>R
3 * RP@ +!
1 * RP@ +!
2R> CELLS +
;

На удивление тот же логический косяк.
По разным координатам выдаётся один и тот же адрес!
0 1
3 0
Выдаст один и тот же адрес, а это плохо, бателька
Сообщение Добавлено: Вт янв 29, 2019 15:22
  Заголовок сообщения:  Re: Возможность работать с многомерными массивами  Ответить с цитатой
А так?
Код:
: TEST
0 2>R
3 * RP@ +!
1 * RP@ +!
2R> CELLS +
;
Сообщение Добавлено: Вт янв 29, 2019 14:48
  Заголовок сообщения:  Re: Возможность работать с многомерными массивами  Ответить с цитатой
Как получить адрес элемента в многомерном массиве?
А то у меня ошибка адресации происходит
К примеру, есть 2-мерный массив 3 на 4 (arr[3][4])
Вычисление адреса элемента делаю по коэффициентам (пытался понять код chess'а выше)
Итак, для первой мерности k=1, для второй k=3

на входе слова соот-но две координаты и указатель на массив.
Я делал с конца
Соот-но примерно
Код:
: TEST
>R \ mas-addr
0 >R \ sm
3 * RP@ +!
1 * RP@ +!
2R> CELLS +
;


Вот он и работает НЕКОРРЕКТНО
Если на входе 0 1, то смещение будет равно 12
А если 3 0, то смещение опять будет равно 12!

Где я совершил ошибку?

Отмечу, что мне нужен код работающий в любой размерности (2, 3,4 и пр.)
Сообщение Добавлено: Вт янв 29, 2019 11:52
  Заголовок сообщения:  Re: Возможность работать с многомерными массивами  Ответить с цитатой
WingLion писал(а):
А где умножение матрицы на вектор?

Ну вектор можно рассматривать как матрицу с одной строкой(или одним столбцом):
Код:
1 3  2 ARRAY VC1  10  3 i. VC1 S[! \ определим вектор
3 4  2 ARRAY MT2   1 12 i. MT2 S[!
STARTLOG
VC1 MT.
MT2 MT.

VC1 MT2 M*M MT.

лог.
Код:
       10        11        12

         1         2         3         4
         5         6         7         8
         9        10        11        12

       173       206       239       272

Ok
Сообщение Добавлено: Вс сен 05, 2010 14:02
  Заголовок сообщения:  Re: Возможность работать с многомерными массивами  Ответить с цитатой
А где умножение матрицы на вектор?
Сообщение Добавлено: Вс сен 05, 2010 08:47
  Заголовок сообщения:  Re: Возможность работать с многомерными массивами  Ответить с цитатой
Добавил матрицы
Код:
\ многомерные массивы(одномерные - частный случай многомерных при n=1)

: SPCOPY ( am n -- ) CELLS SP@ 2 CELLS + -ROT CMOVE> ;              \ скопировать n параметров на стеке в память

\ создание стат. массива
: ARRAY ( Ln..L1 n --)
  n! n 1+ 2* CELLS hlen! CREATE HERE a! n , a CELL+ n SPCOPY
  n 1 ?DO * LOOP CELLS DUP size! hlen + ALLOT 1 st!
  n 0 DO I IF I CELLS a + @ st * is st THEN st I n 1+ + CELLS a + ! LOOP
  size hlen a + CELL- ! DOES> ;

\ слово ARRAY формирует сл. структуру данных:
\ ------------------------- ЗАГОЛОВОК----------------------------------------     ----- ДАННЫЕ -----
\ n        Ln Ln-1 ...... L1  1 L1 L1*L2 ................... L1*..*Ln-1  SIZE     N(0)..N(L1*..Ln - 1)
\ мерн-ть  пределы координат  коэффициенты для расчета номера элемента   размер   собственно массив

: [DIM  ( A -- n)           @ ;                                     \ дать мерность
: [HLEN ( A -- LEN)         @ 1+ 8 * ;                              \ длина заголовка в байтах
: [A0   ( A -- A[0])        DUP [HLEN + ;                           \ дать адрес первого элемента
: [SIZE ( A -- S=L1*..*Ln)  [A0 CELL- @ ;                           \ дать размер массива в байтах
: [LIM  ( A -- Ln .. L1)    DUP CELL+ SWAP DUP @ CELLS +  DO I @ -4 +LOOP ;  \ дать пределы
                            \ A+4 A A DIM
: C[A   ( CRD A -- A[i])                                            \ дать адрес элемента по координатам
  a! 0 st! a a [HLEN + CELL- a a [DIM 1+ CELLS +
  DO I @  * st + is st CELL +LOOP st CELLS a [A0 + ;

: C[!  ( n CRD A --)        C[A ! ;                                 \ записать элемент по координатам
: C[@  ( CRD A -- n)        C[A @ ;                                 \ читать элемент по координатам

: N[C  ( N A -- CRD)                                                \ получение координат по номеру
  >R R@ DUP @ 1+ CELLS + R> DUP @ 2* CELLS +  DO I @ /MOD SWAP -4 +LOOP DROP ;

\ операции над одним массивом
: [MAX ( A -- NMAX) DUP [A0 >R [SIZE >R 0x80000001 R> R@ + R> DO I @ MAX CELL +LOOP ;
: [MIN ( A -- NMAX) DUP [A0 >R [SIZE >R 0x7FFFFFFF R> R@ + R> DO I @ MIN CELL +LOOP ;
: [ERASE ( A --) DUP [A0 SWAP [SIZE ERASE ; \ обнулить массив
: S[! ( n..n A -- ) >R R@ [A0 R@ [SIZE R> [A0 + CELL- DO I ! -4 +LOOP ;  \ заполнить массив со стека параметров

M: 1O[ ( A -- a d) DUP >R DUP [A0 >R [SIZE R@ + R> DO I DUP @ ;
M: ]1O ( a d -- A) SWAP ! CELL +LOOP R> ;

: [NOT ( A -- A)  1O[ INVERT ]1O ;
: [NEG ( A -- A)  1O[ NEGATE ]1O ;
: [ABS ( A -- A)  1O[ ABS    ]1O ;

\ операции над массивом и константой
: [#!  ( A # -- ) n! DUP [A0 >R [SIZE R@ + R> DO n I ! CELL +LOOP ; \ заполнить массив константой

: C[#! ( CRD-BEG CRD-END A # --)                                    \ заполнить от CRD-BEG до CRD-END включительно
  >R DUP >R C[A R> SWAP >R C[A R> CELL+ SWAP R> -ROT
  DO DUP I ! CELL +LOOP DROP ;

M: #[ ( A # -- A d #)  n! DUP >R DUP [A0 >R [SIZE R@ + R> DO I DUP @ n ;
M: ]# ( A d # -- A)    SWAP ! CELL +LOOP R> ;

: [+#  #[ +   ]# ;  : [-#  #[ -  ]# ;  : [*#  #[ *   ]# ;  : [/#  #[ *   ]# ;
: [%#  #[ MOD ]# ;  : [|#  #[ OR ]# ;  : [^#  #[ XOR ]# ;  : [&#  #[ AND ]# ;

\ операции над двумя массивами
M: 2O[ ( A1 A2 -- d1 d2)  [A0 a2! DUP DUP >R [A0 a1! [SIZE 0 DO I a1 + @ I a2 + @ ;
M: ]2O ( d1 d2 -- A1)     I a1 + ! CELL +LOOP R> ;

: [+ ( A1 A2 -- A1 = A1  +  A2) 2O[  +  ]2O ;
: [- ( A1 A2 -- A1 = A1  -  A2) 2O[  -  ]2O ;
: [* ( A1 A2 -- A1 = A1  *  A2) 2O[  *  ]2O ;
: [/ ( A1 A2 -- A1 = A1  /  A2) 2O[  /  ]2O ;
: [% ( A1 A2 -- A1 = A1 MOD A2) 2O[ MOD ]2O ;
: [| ( A1 A2 -- A1 = A1 OR  A2) 2O[  OR ]2O ;
: [^ ( A1 A2 -- A1 = A1 XOR A2) 2O[ XOR ]2O ;
: [& ( A1 A2 -- A1 = A1 AND A2) 2O[ AND ]2O ;

\ сравнение массивов
: [COMPARE ( A1 A2 -- 0|1)
  a2! a1! TRUE a1 [HLEN a1 [SIZE + 0
  DO I a1 + @ I a2 + @ <> IF DROP FALSE LEAVE THEN CELL +LOOP ;

\ безымянные динамические массивы в хипе
: [DUP ( A -- A A1)                                                 \ создание копий массивов в хипе
  a! a [HLEN a [SIZE + u! u ALLOCATE THROW a1! a a1 u MOVE a a1 ;

: [DROP ( A -- ) FREE THROW ;                                       \ удалить массив из хипа

: SPDUP ( p*n n -- p*n p*n)                                         \ дублировать n параметров на стеке
  CELLS >R SP@ DUP R@ - R@ CMOVE> SP@ R> - SP! ;

: SPDROP ( p*n n -- )                                               \ удалить n параметров на стеке
  1+ CELLS SP@ + SP! ;

: HARRAY ( Ln..L1 n -- addr)                                        \ создание безымянных динамических массивов в хипе
  n! n 1+ 2* CELLS hlen! n SPDUP
  n 1 ?DO * LOOP CELLS DUP size! hlen + ALLOCATE THROW a!
  n a ! a CELL+ n SPCOPY n SPDROP size hlen a + CELL- !  1 st!
  n 0 DO I IF I CELLS a + @ st * is st THEN st I n 1+ + CELLS a + ! LOOP a ;

\ утилиты
: [DUMP  ( A -- ) DUP [A0 SWAP [SIZE DUMP CR ;         \ только элементы
: [HDUMP ( A -- ) DUP [HLEN DUMP CR ;                  \ только заголовок
: [ADUMP ( A -- ) DUP DUP [HLEN SWAP [SIZE + DUMP CR ; \ заголовок и элементы

: SPREV ( p*n n -- p'*n)                               \ реверс n элементов стека
  A-- D=P ( D-нач.адрес) $ 2 #A<< A+D ( A-кон.адрес)
  L1: B=@D C=@A @A=B @D=C $ 4 Da $ -4 Aa A=D? L1 J>= DROP ;

: ARR. ( A -- )                                        \ координатная распечатка массива
  a! a [SIZE CELL / 0
  DO CR I a N[C a [DIM SPREV  a [DIM 0
     DO . LOOP a [A0 I CELLS + @ SPACE .
  LOOP CR ;

\ положить на стек N чисел с шагом 1 начиная c Nbeg
: i. ( Nbeg N -- Nbeg Nbeg+1..Nbeg+N )  OVER + SWAP DO I LOOP ;

\ Алгебра матриц

\ Сумма матриц реализуется через [+

\ Произведение матрицы на скаляр реализуется через [*#

\ Произведение матрицы на матрицу
: M*M ( A1 A2 -- A)
  a2! a1! 0 sum! a2 [LIM Lx2! Ly2! a1 [LIM Lx1! Ly1!
  Lx1 Ly2 <> IF CR ." Matrix no valid" CR EXIT THEN
  Ly1 Lx2 2 HARRAY a! 0 col2! 0 str1!
  BEGIN
    BEGIN Lx1 0 DO str1 I a1 C[@ I col2 a2 C[@ * sum + is sum LOOP
          sum str1 col2 a C[! 0 is sum col2 1+ is col2 col2 Lx2 =
    UNTIL 0 is col2 str1 1+ is str1 str1 Ly1 =
  UNTIL a ;

: .BL ( q n -- )
  >R DUP >R ABS 0 <# #S R> SIGN #> R> OVER - 0 MAX DUP
  IF 0 DO BL EMIT LOOP ELSE DROP THEN TYPE ;

: MT. ( A -- ) a! a [LIM Lx! Ly! CR                    \ распечатка матрицы
  Ly 0 DO Lx 0 DO J I a C[A @ 10 .BL LOOP CR LOOP ;

\ EOF

4 3  2 ARRAY MT1  1 12 i. MT1 S[!
3 4  2 ARRAY MT2  1 12 i. MT2 S[!
STARTLOG
MT1 MT.
MT2 MT.

MT1 MT2 M*M MT.

лог.

Код:
         1         2         3
         4         5         6
         7         8         9
        10        11        12

         1         2         3         4
         5         6         7         8
         9        10        11        12

        38        44        50        56
        83        98       113       128
       128       152       176       200
       173       206       239       272

Ok

PS. Для удаления массивов в хипе (после их использования) можно завести
массив для сборки мусора, куда складывать адреса дин. массивов и
и сделать [DROP по всем элементам этого массива и удалить этот массив.
Сообщение Добавлено: Вс сен 05, 2010 08:00
  Заголовок сообщения:  Re: Возможность работать с многомерными массивами  Ответить с цитатой
вопрос писал(а):
а чья цитата?

Подозреваю, что Л.П.Берия.
Сообщение Добавлено: Вт авг 24, 2010 22:48
  Заголовок сообщения:  Re: Возможность работать с многомерными массивами  Ответить с цитатой
Цитата:
p.s. "я крокодил, крокожу и буду крокодить!" (c)...

а чья цитата?
Сообщение Добавлено: Вт авг 24, 2010 22:24
  Заголовок сообщения:  Re: Возможность работать с многомерными массивами  Ответить с цитатой
Можно записывать в классику "кодинга ради кодинга".

p.s. "я крокодил, крокожу и буду крокодить!" (c)...
Сообщение Добавлено: Вт авг 24, 2010 21:06
  Заголовок сообщения:  Re: Возможность работать с многомерными массивами  Ответить с цитатой
Убрал ошибки и ускорил код для работы с массивами( http://chess2007.nm.ru/arrays.f )
Сообщение Добавлено: Пн авг 23, 2010 20:30

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


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