Черновик: Версия II
Участников: 2
Страница 2 из 2
Страница 2 из 2 • 1, 2
Re: Черновик: Версия II
Пока находился в выгоревшем состоянии, переработал свой форт на java, применив
Class ByteBuffer
https://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html#asDoubleBuffer()
и
reflection api
https://betacode.net/10155/java-reflection
Класс byteBuffer заменил ранее использовавшийся short[] memory в
качестве памяти форт виртуальной машины. Массив 16-битных чисел
в качестве памяти имел множество недостатков.
например: байт надо было записывать или в 16-битную ячейку,
или совершать кульбиты со сдвигами битов. А тип
double или long надо было распихивать в четыре ячейки.
В ByteBuffer же есть методы
Если вызвать функции без параметра
getChar() getFloat() getInt() getLong() getShort() - то загрузятся
значения относительно переменной position, а сама переменная получит
приращение, соответствущее длине значений.
Так же есть функции записи в память
put(int index, byte b) putInt(int index,int i) putLong(int index,long l) итд.
и
put( byte b) putInt(int i) putLong(long l) относительно position.
Следущее - reflection api.
Этот класс позволяет вызывать процедуры и обращатся к переменным ява программы,
используя только текстовое название этой процедуры или переменной.
Делается это примерно так
приходилось органиовывать целые гирлянды, типа
switch(a) {
...
case n : immediate() ; break;
case ...
}
Так же постарался улучшить код.
Например, постарался использовать ф-циии
L>NAME , >body итд. вместо link + 4 и adr_cfa+4.
В плане улучшения кода еще много работы, буду постепенно делать.
Еще ввел плавающую точку.
В ближайшее время выложу проект, после того,
как удалю отладочный мусор и еще раз перепроверю.
Class ByteBuffer
https://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html#asDoubleBuffer()
и
reflection api
https://betacode.net/10155/java-reflection
Класс byteBuffer заменил ранее использовавшийся short[] memory в
качестве памяти форт виртуальной машины. Массив 16-битных чисел
в качестве памяти имел множество недостатков.
например: байт надо было записывать или в 16-битную ячейку,
или совершать кульбиты со сдвигами битов. А тип
double или long надо было распихивать в четыре ячейки.
В ByteBuffer же есть методы
- Код:
byte b = get(int index);
double d = getDouble(int index);
аналогично
getChar(int index) getFloat(int index) getInt(int index) getLong(int index) getShort(int index)
Если вызвать функции без параметра
getChar() getFloat() getInt() getLong() getShort() - то загрузятся
значения относительно переменной position, а сама переменная получит
приращение, соответствущее длине значений.
Так же есть функции записи в память
put(int index, byte b) putInt(int index,int i) putLong(int index,long l) итд.
и
put( byte b) putInt(int i) putLong(long l) относительно position.
Следущее - reflection api.
Этот класс позволяет вызывать процедуры и обращатся к переменным ява программы,
используя только текстовое название этой процедуры или переменной.
Делается это примерно так
- Код:
Object o; // тут обычно класс,
public Method [] procedureLists = new Method[100]; // массив процедур
int procedureIndex=0; //свободное место в массиве
int ind_immediate;
...
procedureLists [ procedureIndex ] = o.getClass().getDeclaredMethod("immediate");
ind_immediate=procedureIndex;
procedureIndex++; //регистрация процедуры immediate
... далее создается статья для immediate, где запоминается индекс этой процедуры в массиве.
... процедура void immediate() уже должна существовать
// запуск процедуры
procedureLists [ ind_immediate ].invoke(o);
приходилось органиовывать целые гирлянды, типа
switch(a) {
...
case n : immediate() ; break;
case ...
}
Так же постарался улучшить код.
Например, постарался использовать ф-циии
L>NAME , >body итд. вместо link + 4 и adr_cfa+4.
В плане улучшения кода еще много работы, буду постепенно делать.
Еще ввел плавающую точку.
В ближайшее время выложу проект, после того,
как удалю отладочный мусор и еще раз перепроверю.
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Черновик: Версия II
Собрался было опубликовать форт, как обещал выше, но черт попутал - решил переписать слово
." anyword " c явы на форт, с целью проверки форт-системы.
В случае, если compile_call реализуется на java, все прекрасно работает,
а на форте нет. Расследование показало, что во время определения слова q
при запуске слова немедленного исполнения .", со стека возвратов
снимается почему то не адрес после compile_call, а адрес в слове q,
после ." qwertu ". Что это, оптимизация кода ява машиной, или моя какая-то ошибка -
черт знает.
Все это говорит о том, что задача создания грамотного руководства по построению
форт транслятора созрела и перезрела. Создание транслятора должно способствовать
пониманию работы форт-систем, а не борьбу со всякими мутностями на каждом шагу.
На этом я временно прекращаю разработку форт-систем, буду использовать то, что есть.
На первоначальное написания скриптов должно хватить. Тем более, это основная цель
данной работы. Успех этой работы, как я надеюсь, сделает работу с программами,
которые будут написаны с учетом возможности выполнять форт-скрипты, такой же
легкой и приятной, как написание скриптов для систем Unix.
Есть идеи, создать формальное описание стековой машины. Вроде должно облегчить
создание форт систем.
Свежий форт опубликую после перепроверки, надеюсь никаких камней не будет.
Затем переработаю материал, который выше, по андроид программированию,
и затем финал, навигационная программа с фортом на борту.
." anyword " c явы на форт, с целью проверки форт-системы.
- Код:
: compile_call ( компилирует вызов процедуры -> compile_call type )
r> dup ( сохранить со стека возвратов значение, которое занесло туда вызов compilecall )
c@ here c! ( прочитать и скомпилировать байт, который следует после compilecall, обычно call )
1 + dup ( увеличить адрес на единицу )
@ , ( компиляция адреса процедуры после compile_call )
4 + >r ( вернуть на стек возвратов новое значение пропустить адрес, который вызвали)
;
: ." 34 word 0 ( на стеке 0 0, здесь это значит, строка в буфере, длинна строки определяется автоматически )
state 0 =
if type ( если режим исполнения - печатать )
else
spick ( здесь, на стеке адрес и длина, продублировать строку, если 0 0 - продублировать буфер, )
swap ( на стеке длина и адрес новой cnоки )
literal literal ( если режим компиляции, генерируется код, который )
( во время исполнения положит на стек адр и длину новой строки )
compile_call ( компилирует вызов процедуры type, возможно в форте есть специальное слово, компилирущее вызовы )
type
then
; immediate
: q ." qwertu " ; ( тестовая процедура )
В случае, если compile_call реализуется на java, все прекрасно работает,
а на форте нет. Расследование показало, что во время определения слова q
при запуске слова немедленного исполнения .", со стека возвратов
снимается почему то не адрес после compile_call, а адрес в слове q,
после ." qwertu ". Что это, оптимизация кода ява машиной, или моя какая-то ошибка -
черт знает.
Все это говорит о том, что задача создания грамотного руководства по построению
форт транслятора созрела и перезрела. Создание транслятора должно способствовать
пониманию работы форт-систем, а не борьбу со всякими мутностями на каждом шагу.
На этом я временно прекращаю разработку форт-систем, буду использовать то, что есть.
На первоначальное написания скриптов должно хватить. Тем более, это основная цель
данной работы. Успех этой работы, как я надеюсь, сделает работу с программами,
которые будут написаны с учетом возможности выполнять форт-скрипты, такой же
легкой и приятной, как написание скриптов для систем Unix.
Есть идеи, создать формальное описание стековой машины. Вроде должно облегчить
создание форт систем.
Свежий форт опубликую после перепроверки, надеюсь никаких камней не будет.
Затем переработаю материал, который выше, по андроид программированию,
и затем финал, навигационная программа с фортом на борту.
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Черновик: Версия II
Переименовал state в state@ .
Это по прежнему процедура, но теперь ее проще найти поиском,
когда буду переписывать. Сразу делать ее переменной не стал,
в многозадачной среде она может иметь разные значения для
каждой задачи и опять пришлось бы переделывать.
План работ.
Перепроверить и опубликовать текущую реализацию форта. (возможно сегодня)
Переработать реализацию простейшей программы для android c фортом на борту.
Основные изменения: Элементы gui теперь будут уложены в массивы.
Это позволит к ним обращаться через индекс массива, а не к каждому элементу
отдельно. Это позволит избавится от излишне громоздкой реализации Handler
для обращения к этим элементам.
Работа с Intent. Это наиболее вкусные применения скриптового языка, возможность
вызывать и передавать параметры окнам своих и чужих приложений и получать от них
сообщения.
Создание viewers элементов, рисование на экране, canvas.
Навигационная программа со скриптовым языком на борту.
Это по прежнему процедура, но теперь ее проще найти поиском,
когда буду переписывать. Сразу делать ее переменной не стал,
в многозадачной среде она может иметь разные значения для
каждой задачи и опять пришлось бы переделывать.
План работ.
Перепроверить и опубликовать текущую реализацию форта. (возможно сегодня)
Переработать реализацию простейшей программы для android c фортом на борту.
Основные изменения: Элементы gui теперь будут уложены в массивы.
Это позволит к ним обращаться через индекс массива, а не к каждому элементу
отдельно. Это позволит избавится от излишне громоздкой реализации Handler
для обращения к этим элементам.
Работа с Intent. Это наиболее вкусные применения скриптового языка, возможность
вызывать и передавать параметры окнам своих и чужих приложений и получать от них
сообщения.
Создание viewers элементов, рисование на экране, canvas.
Навигационная программа со скриптовым языком на борту.
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Черновик: Версия II
Выкладываю промежуточные результаты.
https://github.com/vikt144/Forth/tree/main
Новый форт имеет простейшую реализацию словарей,
операции с плавающей точкой и другие новшества.
Список слов
NOP LIT dup drop swap >R R> CALL branch ;
0> 0< 0= ?branch
@ !
+ - * /MOD
AND OR XOR SHL SHR
ZERO_EXIT 1+ 1-
IN OUT WAIT LIT8 c@ c!
EXIT .
: ; create allot does> , here
compile compile_call immediate >resolve <resolve >mark <mark
name> L>NAME link> >body state@
word find
( комментарий - пропускает текстовый блок до ')'
\ - комментарий не поддерживается
< > =
if then else
begin until while repeat
var const
over rot ?DUP R@ / mod
2+ 2- 2/
negate
ABS ( A --->абс A )
2dup 2drop 2var 2@ 2!
Тип float
Примеры чисел с
1.073741824E9 5.304989477E-315 10f 4.6
В общем все, что совместимо с типом данных для java double
здесь числа с точкой не являются числом двойной точности
flit
fdup fswap fdrop
f. f! f@ f+ f- f* f/ f> f< f= f<> f>= f<=
fsin fcos ftan fasin facos fatan fatan2
fln flog fsqrt fexp fabs floor d>f f>d
Строки
ascii -- ascii " вернет 34
s" -размещает строку
type
s+ ( s0 l0 s1 l1 - sn ln конкатенация строк )
spick - дублирование строки
s= сравнение строк
В файле с именем 0 (ноль), находятся расширения, написанные на форте
constant variable c, 2const
>name
voc-link - список словарей
адреса переменных в памяти виртуальной машины форта.
2 constant here_
6 constant latest
10 constant state
15 constant context
20 constant current
25 constant forthVoc
vocabulary DEFINITIONS forth
Компиляция
javac helloForth.java
Запуск
java helloForth 0
0-это файл с расширениями.
https://github.com/vikt144/Forth/blob/main/0
главный файл
https://github.com/vikt144/Forth/blob/main/forth/fas.java
Запускающий файл
https://github.com/vikt144/Forth/blob/main/helloForth.java
https://github.com/vikt144/Forth/tree/main
Новый форт имеет простейшую реализацию словарей,
операции с плавающей точкой и другие новшества.
Список слов
NOP LIT dup drop swap >R R> CALL branch ;
0> 0< 0= ?branch
@ !
+ - * /MOD
AND OR XOR SHL SHR
ZERO_EXIT 1+ 1-
IN OUT WAIT LIT8 c@ c!
EXIT .
: ; create allot does> , here
compile compile_call immediate >resolve <resolve >mark <mark
name> L>NAME link> >body state@
word find
( комментарий - пропускает текстовый блок до ')'
\ - комментарий не поддерживается
< > =
if then else
begin until while repeat
var const
over rot ?DUP R@ / mod
2+ 2- 2/
negate
ABS ( A --->абс A )
2dup 2drop 2var 2@ 2!
Тип float
Примеры чисел с
1.073741824E9 5.304989477E-315 10f 4.6
В общем все, что совместимо с типом данных для java double
здесь числа с точкой не являются числом двойной точности
flit
fdup fswap fdrop
f. f! f@ f+ f- f* f/ f> f< f= f<> f>= f<=
fsin fcos ftan fasin facos fatan fatan2
fln flog fsqrt fexp fabs floor d>f f>d
Строки
ascii -- ascii " вернет 34
s" -размещает строку
type
s+ ( s0 l0 s1 l1 - sn ln конкатенация строк )
spick - дублирование строки
s= сравнение строк
В файле с именем 0 (ноль), находятся расширения, написанные на форте
constant variable c, 2const
>name
voc-link - список словарей
адреса переменных в памяти виртуальной машины форта.
2 constant here_
6 constant latest
10 constant state
15 constant context
20 constant current
25 constant forthVoc
vocabulary DEFINITIONS forth
Компиляция
javac helloForth.java
Запуск
java helloForth 0
0-это файл с расширениями.
https://github.com/vikt144/Forth/blob/main/0
главный файл
https://github.com/vikt144/Forth/blob/main/forth/fas.java
Запускающий файл
https://github.com/vikt144/Forth/blob/main/helloForth.java
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Черновик: Версия II
Рад, что не бросили.
Верю. Но, неужели нельзя хоть немного литературнее? Угадать место, в которое нужно ткнуть, чтобы понять суть, в 1000-строчном файле, практически нереально. Особенно, видя комментарии "вырезано", "туды - сюды"... Это как я показывал кому-то свой первый FORTH и он меня спросил: "А где тут то место, где запускаются слова?" А как его покажешь? Оно "размазано" по коду. Нужно придумать какую-то квадратно-гнездовую схему (типа моей), а пока ее нет - комментировать, комментировать и, еще раз, комментировать.
vikt144 пишет:главный файл
https://github.com/vikt144/Forth/blob/main/forth/fas.java
Верю. Но, неужели нельзя хоть немного литературнее? Угадать место, в которое нужно ткнуть, чтобы понять суть, в 1000-строчном файле, практически нереально. Особенно, видя комментарии "вырезано", "туды - сюды"... Это как я показывал кому-то свой первый FORTH и он меня спросил: "А где тут то место, где запускаются слова?" А как его покажешь? Оно "размазано" по коду. Нужно придумать какую-то квадратно-гнездовую схему (типа моей), а пока ее нет - комментировать, комментировать и, еще раз, комментировать.
Gudleifr- Admin
- Сообщения : 3246
Дата регистрации : 2017-03-29
Re: Черновик: Версия II
Собираюсь довести работу до некоторого итога.Рад, что не бросили.
Увы, в части литературности я крайне бездарен.нельзя хоть немного литературнее?
Но буду стараться.
Эта версия предварительная, она нужна, что бы иметь возможность работать над другими частями
системы. В частности, что бы побыстрее начать разрабатывать базовые форт-слова,
для последущего скриптинга. Что является ключевым в данной работе.
Понемногу буду документировать.
Структура словарной статьи в этой реализации.
- Код:
link int 0 - указатель на поле link предыдущей статьи
flag byte 4 - поле имени - флаги
size int - 5 - поле имени - длинна строки
adr int 9 - поле имени - - индекс на строку или адрес строки
cfa int 13 - cfa
Процедура exec в файле fas.java (форт ассемблер) выполняет слово,
cfa = 0
создает статью name, значение cfa должно интерпретироваться
1) в процессе интерпретации слова name, на стек кладется адрес поля параметров статьи name.
2) в процессе компиляции текста, где вызывается name, генерируется код, который кладет на стек
адрес поля параметров статьи name.
генерируется код виртуальной машины lit <адрес поля параметров name>
cfa=1 -- в этой реализации присваивается статьям,
которые являются обертками для опкодов виртуальной машины,
таких как dup + - ! @ итд.
поле параметров в этом случае состоит из двух слов и выглядит например для dup так,
opcode dup -- 2
opcode ret -- 9 - опкод для возврата из подпрограммы
(или -- 2 9 )
В процессе компиляции какой-нибудь словарной статьи, в случае ссылки на dup, просто скопирует 2 в поле параметров новой статьи.
В процессе интерпретации статьи dup, будет просто сделан вызов exec
<адрес поля параметров dup> , а ret вернет управление в интерпретатор.
Слова, определенные через : (двоеточия), это вообще процедура.
Здесь для таких слов cfa=2.
Если в процессе компиляции встретится ссылка на такое слово, то будет
сгенерирован код call <адрес поля параметров >
Слова, определенные через create does> в процессе выполнения оставляют на стеке
адрес поля параметров, и выполняют код, который расположен после does>.
Здесь cfa=-<адрес кода после does> , отрицательное значение используется,
что бы различить от других случаев.
В процессе компиляции генерируется код
lit <адрес поля параметров> call <abs(cfa)>
а comp - компилирует.
exec заносит в стек возвратов адрес процедуры exit,
которая потом остановит виртуальную машину и вернет управление interpret.
Затем exec выполнит слово, в соответствии со значением cfa
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Черновик: Версия II
Заранее спасибо.vikt144 пишет:Но буду стараться.
Gudleifr- Admin
- Сообщения : 3246
Дата регистрации : 2017-03-29
Re: Черновик: Версия II
Набросал простейшую андроид-прграммку, которая просто читает из editbox и
переименовывает кнопочку.
Туда буду внедрять свой новый форт.
Исходники
https://github.com/vikt144/less1
О программе aide, для компиляции проектов на телефоне.
http://fforum.winglion.ru/viewtopic.php?p=48738#p48738
apk - файл, если нужен.
https://anonfiles.com/Hcn3IdCdx6/les_7z
Затем решу трудности с реализацией слова expect,
которые возникают из за того, что запущенные из обработчиков android gui
процессы невозможно приостановить и возобновить снова. Его можно только
завершить. Затем Intent, меню , вывод и рисование изображений.
переименовывает кнопочку.
Туда буду внедрять свой новый форт.
Исходники
https://github.com/vikt144/less1
О программе aide, для компиляции проектов на телефоне.
http://fforum.winglion.ru/viewtopic.php?p=48738#p48738
apk - файл, если нужен.
https://anonfiles.com/Hcn3IdCdx6/les_7z
Затем решу трудности с реализацией слова expect,
которые возникают из за того, что запущенные из обработчиков android gui
процессы невозможно приостановить и возобновить снова. Его можно только
завершить. Затем Intent, меню , вывод и рисование изображений.
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Черновик: Версия II
Прошу прощения с задержкой на пол месяца, но
проект после переноса на андроид вылетал после запуска, хотя видимых ошибок
не было. Просто наваждение какое-то. Потом разобрался, позже переделаю
инициализацию форт машины в отдельную процедуру, что бы избежать
подобных неожиданностей в будущем.
Тоже предварительная версия.
Программы на форте могут изменять содержимое текстовых полей и
названия кнопок, а также записывать и читать текст в каналы и из каналов.
Это необходимо для реализации скриптовых возможностей форт системы
в андроид приложении. В данный момент это находится в зачаточном состоянии.
После установки программы необходимо настроить путь к каталогу форт-програм.
Это немного хлопотно, но это выходка гугол, после версии android 4.4б
программа, которая не поставляется вместе с прибором и специальным образом
не подписана, не может записывать данные куда угодно.
Как создать каталог для записи, описано здесь.
только вместо com.virf.less надо писать
com.less
http://fforum.winglion.ru/viewtopic.php?p=48787#p48787
В этот каталог надо положить файл с именем 0 (ноль).
Там находятся форт тексты, которые автоматически
загрузятся и исполнятся.
https://github.com/vikt144/less1/blob/WithForth/0
Проект
https://github.com/vikt144/less1/tree/WithForth
От прошлогоднего проекта отличается тем, что элементы gui - интерфейса теперь собраны
в массивы, что делает реализацию Handler (средство доступа к интерфейсу gui из потока)
намного компактнее.
Добавлено меню, это очень простой интерфейс, реализация обработчиков
элементов меню тоже простая.
ф-ции gui
s" text " 1 -- txt.set текстовому полю N1 присвоит зачение 'text'
s" bttext " 3 btn.txt.set -- 3 кнопку назовет bttext
s" anytext " 0 ed.txt.set -- в 0 поле редактирования загрузит anytext
s" anytext " 0 ed.txt.hint -- в 0 поле редактирования загрузит подсказку
clr -- очищает поле редактирования
Запись в канал осуществляется обычными операциями
. f. type ."
7.8 fsin f. ( запись в канал )
0 readchan ( на стеке адрес и длина строки из канала 0, канал обнуляется)
0 txt.set ( полю с номером ноль присваивается результат )
проект после переноса на андроид вылетал после запуска, хотя видимых ошибок
не было. Просто наваждение какое-то. Потом разобрался, позже переделаю
инициализацию форт машины в отдельную процедуру, что бы избежать
подобных неожиданностей в будущем.
Тоже предварительная версия.
Программы на форте могут изменять содержимое текстовых полей и
названия кнопок, а также записывать и читать текст в каналы и из каналов.
Это необходимо для реализации скриптовых возможностей форт системы
в андроид приложении. В данный момент это находится в зачаточном состоянии.
После установки программы необходимо настроить путь к каталогу форт-програм.
Это немного хлопотно, но это выходка гугол, после версии android 4.4б
программа, которая не поставляется вместе с прибором и специальным образом
не подписана, не может записывать данные куда угодно.
Как создать каталог для записи, описано здесь.
только вместо com.virf.less надо писать
com.less
http://fforum.winglion.ru/viewtopic.php?p=48787#p48787
В этот каталог надо положить файл с именем 0 (ноль).
Там находятся форт тексты, которые автоматически
загрузятся и исполнятся.
https://github.com/vikt144/less1/blob/WithForth/0
Проект
https://github.com/vikt144/less1/tree/WithForth
От прошлогоднего проекта отличается тем, что элементы gui - интерфейса теперь собраны
в массивы, что делает реализацию Handler (средство доступа к интерфейсу gui из потока)
намного компактнее.
Добавлено меню, это очень простой интерфейс, реализация обработчиков
элементов меню тоже простая.
ф-ции gui
s" text " 1 -- txt.set текстовому полю N1 присвоит зачение 'text'
s" bttext " 3 btn.txt.set -- 3 кнопку назовет bttext
s" anytext " 0 ed.txt.set -- в 0 поле редактирования загрузит anytext
s" anytext " 0 ed.txt.hint -- в 0 поле редактирования загрузит подсказку
clr -- очищает поле редактирования
Запись в канал осуществляется обычными операциями
. f. type ."
7.8 fsin f. ( запись в канал )
0 readchan ( на стеке адрес и длина строки из канала 0, канал обнуляется)
0 txt.set ( полю с номером ноль присваивается результат )
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Черновик: Версия II
Кнопка load загружает файл, имя которого находится
в поле редактирования. Текст загруженного файла
замещает имя файла в окне редактирования.
Кнопка bt4 интерпретирует форт текст,
который находится в окне редактирования.
Собрать apk из исходников в среде aide очень легко,
для этого достаточно скопировать каталоги с исходником.
Потом открыть, используя файл-менеджер aide каталог,
где появится, помимо файлов, предложение, собрать проект
из этих исходников. Среда сама обвесит проект необходимыми
градлами и файлами. С удовольствием отвечу на возникшие вопросы.
Исходник + apk + 0-файл
https://www39.zippyshare.com/v/NRaxOJVk/file.html
Пока откоментирую меню.
В общем все описано тут
https://startandroid.ru/ru/uroki/vse-uroki-spiskom/45-urok-13-sozdanie-prostogo-menju.html
Я использовал простейшую реализацию меню.
Код находится внизу файла MainActivity.java
элемент clr исполняет фортслово clr, которое очищает поле ввода от текста.
Остальные вызывают c помощью Intent настройки, браузер и карту.
Intent - очень важная часть програмирования android, можно вызывать
с их помощью другие экраны и приложения и сервисы.
Так же можно возвратить результаты работы других приложений.
Теперь займусь проблемой expect.
Проблема очень мутная в графической среде, затем рисовалка(реализация своего view
компонента - очень вкусная тема)
в поле редактирования. Текст загруженного файла
замещает имя файла в окне редактирования.
Кнопка bt4 интерпретирует форт текст,
который находится в окне редактирования.
Собрать apk из исходников в среде aide очень легко,
для этого достаточно скопировать каталоги с исходником.
Потом открыть, используя файл-менеджер aide каталог,
где появится, помимо файлов, предложение, собрать проект
из этих исходников. Среда сама обвесит проект необходимыми
градлами и файлами. С удовольствием отвечу на возникшие вопросы.
Исходник + apk + 0-файл
https://www39.zippyshare.com/v/NRaxOJVk/file.html
Пока откоментирую меню.
В общем все описано тут
https://startandroid.ru/ru/uroki/vse-uroki-spiskom/45-urok-13-sozdanie-prostogo-menju.html
Я использовал простейшую реализацию меню.
Код находится внизу файла MainActivity.java
элемент clr исполняет фортслово clr, которое очищает поле ввода от текста.
Остальные вызывают c помощью Intent настройки, браузер и карту.
Intent - очень важная часть програмирования android, можно вызывать
с их помощью другие экраны и приложения и сервисы.
Так же можно возвратить результаты работы других приложений.
Теперь займусь проблемой expect.
Проблема очень мутная в графической среде, затем рисовалка(реализация своего view
компонента - очень вкусная тема)
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Черновик: Версия II
Отправил через телеграм новую промежуточную версию форта
Еще можно скачать тут
https://anonfiles.com/lbScq3O4xb/less_7z
пасс 12345
На файлообменниках желательно выключать ява-скрипты.
Иначе - вывалка рекламы в огромном количестве.
К предыдущим постам - почему через обменник?
Просто у меня не получается выкладывать бинарные файлы
в гитхаб. Раз с ходу не получилось, то и не стоит время тратить,
что бы разбираться, в ущерб разработки.
Новое. Теперь к файлу 0 добавился еще файл 1 , который тоже
автоматически считывается и интерпретируется при старте системы.
Более менее сносно решена проблема expect в графическом интерфейсе.
Напомню, что в android gui процесс невозможно приостановить, можно
только выйти и повторно войти в interpret.
Или запускать процесс в фоновом режиме. Я так пробовал, но
получаются еще более уродские решения.
Добавил программу для решения квадратных уравнений, для иллюстрации
Если кто будет системой заниматься, устанавливать, брать фрагменты кода и пр.
задавайте вопросы.
В общем, Less1, это простейшая android программа, с фортом на борту.
Ее предназначение, тестирование различных мутных android api,
прежде чем вставлять их в основную программу. Особенно тех,
которые по разному работают на различных устройствах.
Следущая разработка будет намного интересней.
Еще можно скачать тут
https://anonfiles.com/lbScq3O4xb/less_7z
пасс 12345
На файлообменниках желательно выключать ява-скрипты.
Иначе - вывалка рекламы в огромном количестве.
К предыдущим постам - почему через обменник?
Просто у меня не получается выкладывать бинарные файлы
в гитхаб. Раз с ходу не получилось, то и не стоит время тратить,
что бы разбираться, в ущерб разработки.
Новое. Теперь к файлу 0 добавился еще файл 1 , который тоже
автоматически считывается и интерпретируется при старте системы.
Более менее сносно решена проблема expect в графическом интерфейсе.
Напомню, что в android gui процесс невозможно приостановить, можно
только выйти и повторно войти в interpret.
Или запускать процесс в фоновом режиме. Я так пробовал, но
получаются еще более уродские решения.
Добавил программу для решения квадратных уравнений, для иллюстрации
Если кто будет системой заниматься, устанавливать, брать фрагменты кода и пр.
задавайте вопросы.
В общем, Less1, это простейшая android программа, с фортом на борту.
Ее предназначение, тестирование различных мутных android api,
прежде чем вставлять их в основную программу. Особенно тех,
которые по разному работают на различных устройствах.
Следущая разработка будет намного интересней.
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Черновик: Версия II
Если программа установлена и настроены пути, то работать с форт текстами
можно следующим образом.
1) Можно добавить код к файлу 1 и он автоматически загрузится и выполнится.
2) Можно вводить форт-тексты в поле ввода и нажимать intrprt.
3) Ввести имя файла в поле ввода и нажать load.
Можно создать подкаталог( средствами android-системы) поместить туда файл,
и вводить данные так
Загрузить поставляемый файл q3 - (нахождение корней кв уравнения)
нажимаем intrprt и система 3 раза предложит ввести коэфиценты.
и выведет решение
На последнем скрине вместо символа корня вывела абракадабру,
надо еще поработать с utf кодировкой при загрузке файла.
Исходный код фортпрограммы
настраивает ввод данных для expect. Пока реализована только 0-функция для консоли,
и 10 для поля с кнопкой. inputTuning ожидается очень сложным словом.
(adrString param) parsenum - самоделка, для интерпретации чисел. Не нашел в dpanth94 ничего,
изобрел свое, не стал тратить время. Оставил на будущее
можно следующим образом.
1) Можно добавить код к файлу 1 и он автоматически загрузится и выполнится.
2) Можно вводить форт-тексты в поле ввода и нажимать intrprt.
3) Ввести имя файла в поле ввода и нажать load.
Можно создать подкаталог( средствами android-системы) поместить туда файл,
и вводить данные так
- Код:
cat/filename
Загрузить поставляемый файл q3 - (нахождение корней кв уравнения)
нажимаем intrprt и система 3 раза предложит ввести коэфиценты.
и выведет решение
На последнем скрине вместо символа корня вывела абракадабру,
надо еще поработать с utf кодировкой при загрузке файла.
Исходный код фортпрограммы
- Код:
fvariable a fvariable b
fvariable c
fvariable d fvariable b2a
fvariable x1 fvariable ix
fvariable x2
( 5.5 a f! 6.6 b f! 7.7 c f! )
0 4 10 inputTuning ( настройка ввода см. ниже )
s" " 2const expectString ( тут ожидаемые строки запоминаютс два числа - адрес и длинна )
: inp ( тест на float -1 да . 0 нет )
expectString
expect
expectString
drop ( сбросить длинну )
0
parsenum ( возвращает N 0 - целое, 3 и на флоат-стеке значение N и -1 - ошибка )
3 =
if
-1 ( на стеке -1 ,true, на фстеке знач )
else
drop 0
then
;
: inpdata
clr ( очистка поля ввода )
s" input a " 0 txt.set ( меняется текст в текстовом поле 0 на "input a" )
s" a " 4 btn.txt.set ( меняется текст 4 кнопки с "intrprt" на "A" )
inp
if
a f!
clr
s" input b " 0 txt.set
s" b " 4 btn.txt.set
inp
if
b f!
clr
s" input C " 0 txt.set
s" c " 4 btn.txt.set
inp
if
c f!
s" inp calc show " 0 txt.set
s" intrpr " 4 btn.txt.set
then
then
then
;
: di b f@ fdup f* ( b^2 - 4ac )
4.0 a f@ f* c f@ f*
f- ;
: calc
di fdup d f! fabs fsqrt 2.0 a f@ f* f/ ix f! ( i sqrt d )
b f@ -2.0 a f@ f* f/ b2a f! ( -b/2a )
d f@ ." discrm= " f. cr ( текст печатается в канал )
;
: sol
d f@ 0.0 f< ( if d<0 )
if
." complex 1 = " b2a f@ f. ." + i√ " ix f@ f. cr
." complex 2 = " b2a f@ f. ." - i√ " ix f@ f. cr
else
d f@ 0.0 f= ( if d=0 )
if
." one " b2a f@ f.
else
." one " b2a f@ ix f@ f+ f.
." two " b2a f@ ix f@ f- f.
then
then
;
: show 0 readchan ( извлекается текст, записанный в канал 0 и присваивается текстовому полю 0 )
0 txt.set ;
inpdata calc sol show
настраивает ввод данных для expect. Пока реализована только 0-функция для консоли,
и 10 для поля с кнопкой. inputTuning ожидается очень сложным словом.
(adrString param) parsenum - самоделка, для интерпретации чисел. Не нашел в dpanth94 ничего,
изобрел свое, не стал тратить время. Оставил на будущее
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Черновик: Версия II
Клонирование программы.
Программу Less1 можно клонировать, например для того, что бы протестировать
работу с гироскопами или gps, до того, как вставлять код в более сложные проекты.
Для примера создадим простую программу, работающую с gps, исрльзуя android Aide.
https://play.google.com/store/apps/details?id=com.aide.ui&hl=ru&gl=US
Для этого
1. Придумаем название программы и создадим каталог, используя это имя. Например nav0.
2. Копируем из каталога Less1 в каталог nav0 каталог app. Ничего другого копировать не надо.
3. В каталоге app оставляем только каталог src с подкаталогами и файл build.gradle, остальное удаляем.
( Внимание, существует 2 файла build.gradle, используем только тот, который внутри
каталога app. Наиболее важный параметр этого файла MinSdkVersion
MinSdkVersion 14 - программа будет выполнятся на android 4.0 и старше
MinSdkVersion 9 android 2.3 итд.
см https://developer.android.com/guide/topics/manifest/uses-sdk-element )
4. Затем перейдите в каталог main/src/res/values найдите файл strings.xml.
Найдите в файле
<string name="app_name">prog_name</string>. Замените prog_name на
имя, которое вы хотели бы, чтобы отображалось, когда приложение загружено.
5. Загрузите исходники в android устройство, где установлена aide
Лучше скачать в каталоги, которые принадлежат aide, обычно AppProjects.
6. Заходим в aide, в меню выбираем View/Files
7. заходим в папку nav0 затем в app и файл менеджер предложит открыть
проект. Открываем.
8. Затем в меню aide выбираем Errors, обязательно убеждаемся,
что нет ошибок, и компилируем проект, нажимая на черный треугольник вверху.
Устанавливаем, открываем.
Не забудьте выкачать проект назад, в компьютер, чтобы выкачать файлы,
которые aide добавил к проекту. Они могут понадобится.
Теперь можно развивать новый проект, не затрагивая базового.
Только надо учесть, что запись в sharedPreferenses будет такая же,
как в предыдущем проекте Less1, поэтому в новом проекте будут
доступны те же файлы, что и в Less1, в частности 0 и 1.
О файлах и правах доступа - это отдельная и мутная тема.
Google , начиная с версии android 4.2, запрещает записывать
файлы на карту, кроме как в специальные каталоги.
Об этом позже.
Сейчас буду разрабатывать простейшую программу с фортом, использующую gps,
по итогам, внесу коррективы в проект Less1.
Программу Less1 можно клонировать, например для того, что бы протестировать
работу с гироскопами или gps, до того, как вставлять код в более сложные проекты.
Для примера создадим простую программу, работающую с gps, исрльзуя android Aide.
https://play.google.com/store/apps/details?id=com.aide.ui&hl=ru&gl=US
Для этого
1. Придумаем название программы и создадим каталог, используя это имя. Например nav0.
2. Копируем из каталога Less1 в каталог nav0 каталог app. Ничего другого копировать не надо.
3. В каталоге app оставляем только каталог src с подкаталогами и файл build.gradle, остальное удаляем.
( Внимание, существует 2 файла build.gradle, используем только тот, который внутри
каталога app. Наиболее важный параметр этого файла MinSdkVersion
MinSdkVersion 14 - программа будет выполнятся на android 4.0 и старше
MinSdkVersion 9 android 2.3 итд.
см https://developer.android.com/guide/topics/manifest/uses-sdk-element )
4. Затем перейдите в каталог main/src/res/values найдите файл strings.xml.
Найдите в файле
<string name="app_name">prog_name</string>. Замените prog_name на
имя, которое вы хотели бы, чтобы отображалось, когда приложение загружено.
5. Загрузите исходники в android устройство, где установлена aide
Лучше скачать в каталоги, которые принадлежат aide, обычно AppProjects.
6. Заходим в aide, в меню выбираем View/Files
7. заходим в папку nav0 затем в app и файл менеджер предложит открыть
проект. Открываем.
8. Затем в меню aide выбираем Errors, обязательно убеждаемся,
что нет ошибок, и компилируем проект, нажимая на черный треугольник вверху.
Устанавливаем, открываем.
Не забудьте выкачать проект назад, в компьютер, чтобы выкачать файлы,
которые aide добавил к проекту. Они могут понадобится.
Теперь можно развивать новый проект, не затрагивая базового.
Только надо учесть, что запись в sharedPreferenses будет такая же,
как в предыдущем проекте Less1, поэтому в новом проекте будут
доступны те же файлы, что и в Less1, в частности 0 и 1.
О файлах и правах доступа - это отдельная и мутная тема.
Google , начиная с версии android 4.2, запрещает записывать
файлы на карту, кроме как в специальные каталоги.
Об этом позже.
Сейчас буду разрабатывать простейшую программу с фортом, использующую gps,
по итогам, внесу коррективы в проект Less1.
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Черновик: Версия II
Если кто читал сообщение выше, не используйте этот способ клонирования программ.
Aide по видимому мутно работает с двумя программами, записанными в один package.
Лучше создайте в aide новый проект с новым package, а затем в ручную
скопируйте файлы, отредактировав строку "package new.project.pac; " в java файлах.
Спрашивайте у меня, в случае чего.
Имя package лучше начинать с "a" и избегать названий типа "com.package.name".
Просто названий программ в самом устройстве, начинающихся с "com"
настолько много, что найти свою программу, будет не легко.
Итак, промежуточный итог. Новая программа может делать тоже самое,
что и предыдущая, но еще может работать с модулем gps, и проигрывать
звуковые файлы. Еще форт тут может читать и записывать текстовые файлы.
Если работа форта c gps разрешена, то по приходу сигнала с gps,
будет вызвано форт слово с именем "getgps" и координаты будут отправлены через
стек плавающей точки. Пользователь может переписать форт слово "getgps", чтобы оно
решало его задачу. Сейчас оно просто преобразует выводит на экран координаты,
записанных в десятичной системе, в систему градусы - десятичные минуты,
наиболее употребительные.
В файле форттекстов, с именем gps также находятся обработчики
add_wp - срабатывают при нажатии кнопки "wpt", добавляют координаты в
цепной список.
saved - обходит цепной список с точками wpt (waypoints), положенных предыдущим
словом, забирает строку с точками трека ( строка формируется процедурой
на java, точек очень много, пришлось бы для форт выделять очень много памяти.
Проблема будет решаться с помощью каналов, что бы можно было бы обрабатывать
на лету.) и все это оформляет в файл, со стандартным форматом "gpx".
Обработчик запускается при нажатии кнопки "bt5"
В общем, не совсем безполезная программа. Трек, записанный с ее помощью.
https://nakarte.me/#m=12/55.99195/37.83966&l=O&nktl=Ho1X5TwjGD2VwLs8EPQrxg
Если кто захочет повозиться с программой, напишите, тогда напишу подробней.
Самому разобраться с ней невозможно.
Следующей темой будет графика - очень интересная тема.
Там будет рисование карты и отрисовка треков.
Сылка на анон
https://anonfiles.com/98D1o1f0ya/andfrt_7z
Еще отправлю в телеграм
Aide по видимому мутно работает с двумя программами, записанными в один package.
Лучше создайте в aide новый проект с новым package, а затем в ручную
скопируйте файлы, отредактировав строку "package new.project.pac; " в java файлах.
Спрашивайте у меня, в случае чего.
Имя package лучше начинать с "a" и избегать названий типа "com.package.name".
Просто названий программ в самом устройстве, начинающихся с "com"
настолько много, что найти свою программу, будет не легко.
Итак, промежуточный итог. Новая программа может делать тоже самое,
что и предыдущая, но еще может работать с модулем gps, и проигрывать
звуковые файлы. Еще форт тут может читать и записывать текстовые файлы.
Если работа форта c gps разрешена, то по приходу сигнала с gps,
будет вызвано форт слово с именем "getgps" и координаты будут отправлены через
стек плавающей точки. Пользователь может переписать форт слово "getgps", чтобы оно
решало его задачу. Сейчас оно просто преобразует выводит на экран координаты,
записанных в десятичной системе, в систему градусы - десятичные минуты,
наиболее употребительные.
В файле форттекстов, с именем gps также находятся обработчики
add_wp - срабатывают при нажатии кнопки "wpt", добавляют координаты в
цепной список.
saved - обходит цепной список с точками wpt (waypoints), положенных предыдущим
словом, забирает строку с точками трека ( строка формируется процедурой
на java, точек очень много, пришлось бы для форт выделять очень много памяти.
Проблема будет решаться с помощью каналов, что бы можно было бы обрабатывать
на лету.) и все это оформляет в файл, со стандартным форматом "gpx".
Обработчик запускается при нажатии кнопки "bt5"
В общем, не совсем безполезная программа. Трек, записанный с ее помощью.
https://nakarte.me/#m=12/55.99195/37.83966&l=O&nktl=Ho1X5TwjGD2VwLs8EPQrxg
Если кто захочет повозиться с программой, напишите, тогда напишу подробней.
Самому разобраться с ней невозможно.
Следующей темой будет графика - очень интересная тема.
Там будет рисование карты и отрисовка треков.
Сылка на анон
https://anonfiles.com/98D1o1f0ya/andfrt_7z
Еще отправлю в телеграм
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Черновик: Версия II
Опасность вполне реальная.чтоб не жалко было.
Написать Intent, который вызовет браузер с определенным url,
или приложение "телефон " с преднабранным платным номером
проще простого. Конкретно в этой версии такой возможности нет,
но ее очень легко добавить используя исходные тексты.
Но эта программа написана любителем для любителей,
что бы он адаптировал ее к своим нуждам. Для мошенников есть
куча других, не менее легких способов делать гадости.
Есть варианты эмуляции андроид, в том числе и online.
https://compconfig.ru/mobile/emulyator-android-dlya-pk.html
Я испробовал только что это.
https://www.apkonline.net
Увидел свои кнопочки.
Можно ли эмулировать gps, не разобрался
Установка программы.
1 способ. Компиляция из исходников.
Наиболее удобно использовать aide, так как проект можно компилировать
прямо на планшете.
https://www.android-ide.com/
google play
https://play.google.com/store/apps/details?id=com.aide.ui&referrer=utm_source%3Daidewebsite%26utm_campaign%3Dhomepage
тема на 4pda
https://4pda.to/forum/index.php?showtopic=319369
В бесплатной версии может работать с 5 java файлами. ( именно по этому
весь код форт-системы впихнут в один файл )
Можно оплатить 850 рублей или воспользоваться крякнутой версией с pda.
(я планирую оплатить, как только научусь пользоваться электронными кошельками)
2 способ Установка apk-файла.
Загрузить файл на устройство и выполнить.
Если не получается, зайти в настройки, безопасность,
разрешить устанавливать из ненадежных источников.
(Андроид считает ненадежными источниками все, кроме google play)
Установить программу, затем вернуться и запретить ненадежные источники.
см.
https://setphone.ru/rukovodstva/kak-ustanovit-apk-fajl-na-android/
Далее необходимо настроить пути программы. Для android <=4.0 более менее
любой путь, для старших - android запрещает записывать данные во многие места,
в том числе на sd-карту. кроме определенного пути, обычно типа
/storage/1234-5678/Android/data. В каталоге data, надо с помощью
файл менеджера, поставляемого вместе с устройством, который имеет права
создавать каталоги в любом месте, создать каталог art.nav.one (имя пакета)
не перепутайте art.nav.one, а не art/nav/one
/storage/1234-5678/Android/data/art.nav.one Запомните этот путь.
В этот каталог запись гарантированно будет разрешена.
1234 5678 - имя sd карты. Оно отличается на разных устройствах.
Еще на эту тему
https://webhamster.ru/mytetrashare/index/mtb0/1421490641w34hno1mb8
для любителей рискнуть
https://miradmin.ru/sd-android/
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Черновик: Версия II
Далее копируем в этот каталог файлы с именем 0 , 1 , gps.
Потом запускаем программу, нажимаем setup
вводим только что полученный путь в форму, и быстро два раза жмем setup.
Затем выходим из программы, и снова заходим, и если все сделано правильно
появится кнопка load.
В строке редактирования пишем gps и нажимаем load. затем intrprt.
Нажимаем gpson. Ждем сигнала спутников.
В меню включаем пункт lockgps
теперь обработчик gps будет вызывать форт слово getgps и передавать координаты lat lon
через float стек. Слово getgps можно отредактировать на свой вкус в файле gps.
Нажатие кнопки wpt вызывает обработчик add_wp и передает ему параметры через
float стек.
Кнопка bt5 вызывает обработчик saved и формирует gpx-файл из точек трека и точек ,
добавленных wpt.
Обычные фортовские операции вывода
. f. ." kk " emit type
d. - ( работает с ошибкой)
тут выводят данные в канал 0.
Функция readchan читает канал, из прочитанного создает и размещает строку, оставляя на стеке
адрес и длину строки.
Таким образом, что бы увидеть вывод программы, можно выполнить
0 readchan 1 txt.set (или 0 txt.set)
readchan и writechan могут работать и с файлами.
Файл с каналом должен быть связан процедурой assign
s" w" ( запись )
s" file" ( протокол файл - в будущем будет все, что угодно http и прчее )
s" cur" ( относительно текущего каталога )
s" filename"
3 assign ( привязан к 3 каналу )
0 readchan 3 writechan ( вывод программы запишется в файл с именем filename )
writechan оставляет на стеке 0 в случае успеха.
Полезные пункты меню
wakelock - включает/выключает гашение экрана
Предотвращает выключение экрана, хотя экран темнеет. Делает удобным
использование навигации.
Внимание: пунктами меню ftest и path не допустимо, они отладочные,
я не убрал их по невнимательности.
Вывод звука
1.0 1.0 ( громк левая правая 1.0 max )
1
0
1.0 ( cкорость воспроизведения )
3 ( звук под нрмером 3 , тут 0 до 5 )
0 media.play
упрощенная
3 splay ( звук под номером 3 )
Обе функции оставляют на стеке 0 или -100 в случае успеха/ не успеха
Потом запускаем программу, нажимаем setup
вводим только что полученный путь в форму, и быстро два раза жмем setup.
Затем выходим из программы, и снова заходим, и если все сделано правильно
появится кнопка load.
В строке редактирования пишем gps и нажимаем load. затем intrprt.
Нажимаем gpson. Ждем сигнала спутников.
В меню включаем пункт lockgps
теперь обработчик gps будет вызывать форт слово getgps и передавать координаты lat lon
через float стек. Слово getgps можно отредактировать на свой вкус в файле gps.
Нажатие кнопки wpt вызывает обработчик add_wp и передает ему параметры через
float стек.
Кнопка bt5 вызывает обработчик saved и формирует gpx-файл из точек трека и точек ,
добавленных wpt.
Обычные фортовские операции вывода
. f. ." kk " emit type
d. - ( работает с ошибкой)
тут выводят данные в канал 0.
Функция readchan читает канал, из прочитанного создает и размещает строку, оставляя на стеке
адрес и длину строки.
Таким образом, что бы увидеть вывод программы, можно выполнить
0 readchan 1 txt.set (или 0 txt.set)
readchan и writechan могут работать и с файлами.
Файл с каналом должен быть связан процедурой assign
s" w" ( запись )
s" file" ( протокол файл - в будущем будет все, что угодно http и прчее )
s" cur" ( относительно текущего каталога )
s" filename"
3 assign ( привязан к 3 каналу )
0 readchan 3 writechan ( вывод программы запишется в файл с именем filename )
writechan оставляет на стеке 0 в случае успеха.
Полезные пункты меню
wakelock - включает/выключает гашение экрана
Предотвращает выключение экрана, хотя экран темнеет. Делает удобным
использование навигации.
Внимание: пунктами меню ftest и path не допустимо, они отладочные,
я не убрал их по невнимательности.
Вывод звука
1.0 1.0 ( громк левая правая 1.0 max )
1
0
1.0 ( cкорость воспроизведения )
3 ( звук под нрмером 3 , тут 0 до 5 )
0 media.play
упрощенная
3 splay ( звук под номером 3 )
Обе функции оставляют на стеке 0 или -100 в случае успеха/ не успеха
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Черновик: Версия II
Реализация canvas, суть.
Можно почитать тут
https://startandroid.ru/ru/uroki/vse-uroki-spiskom/311-urok-141-risovanie-dostup-k-canvas.html
и тут
https://startandroid.ru/ru/uroki/vse-uroki-spiskom/312-urok-142-risovanie-prostye-figury-tekst.html
Там описывается способ выводить графику на полный экран.
Для моих задач canvas должен занимать только часть экрана,
соседствуя с кнопками и текстовыми полями. Для этого пришлось
немного повозится. Пришлось создать собственный view элемент.
но об этом позже.
Суть графики андроид в том, что необходимо переопределять
функцию onDraw.
- Код:
super(context, attrs);
p = new Paint();
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.GREEN);
p.setStrokeWidth(50);
p.setColor(Color.RED);
canvas.drawText("width="+displaywidth+" height="+displayheight, 10, 10, p);
/// итд
}
onDraw вызывается, когда приложение вызывает ф-цию invalidate, прямо вызвать ondraw нельзя.
Я ничего не смог придумать, кроме как присвоить графическим функциям некий код, который
могли бы формировать форт-слова, записывать их в массив, который функция onDraw
исполняла в цикле.
В моей реализации это выглядит так
ByteBuffer gmem = ByteBuffer.allocate( 1000 /* max capacity */ ); // память команд
В onDraw
- Код:
byte op = gmem.get();
while (op != -1 ) {
switch (op) {
case 5 : p.setColor(gmem.getInt() );
break;
case 10 : p.setStrokeWidth( gmem.getInt() ); //
break;
case 15 : p.setTextSize( gmem.getInt() ); //
break;
case 18 : canvas.drawPoint( gmem.getInt(), gmem.getInt() , p);
break;
case 20 : canvas.drawLine( gmem.getInt(), gmem.getInt(), gmem.getInt(), gmem.getInt() ,p);
break;
}//sw
op = gmem.get();
} //while
//// get() getInt() загружают байт . целое из памяти и автоматически увеличивают
/// указатель памяти на 1 или 4
Если у кого-то есть идея реализовать графику более эффективно, напишите.
Завтра продолжу.
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Черновик: Версия II
Продолжаю работать над проектом.
Успешно реализовывая навигационную часть проекта, к сожалению
допустил какую-то непонятную ошибку в фортовской части, конкретно в графике.
Решил не разбираться с этим, тем более, что осталось реализовать
только загрузку из сети, кэширование и отображение карты.
Затем буду переписывать проект.
В частности форт сделаю намного более полным и читаемым.
И с графикой, прежде чем внедрить ее в навигационный прект, буду разбираться
на более простом проекте, не отягощенным навигационными приблудами.
Сейчас реализованы 1) загрузка и отображение gpx файла. ( путевые точки и трек в
формате xml )
2) Отображение и сохранение точек трека, полученные через gps приемник в формате gpx.
https://nakarte.me/#m=15/55.96711/37.80035&l=O&nktl=qZJcKV_rT86ZQCGiPOZiqA
Скошанные углы на повороте объясняются тем, что я забираю данные с gps один
раз в 10 секунд.
Кстати, реализацию фортов, оформлю отдельным проектом.
Думаю, форт сообществу надо было сделать это давно,
с тех пор, как возникла идея,
"каждый фортер должен написать свой форт".
Вполне согласен с этим утверждением.
Во первых, это поможет понять create does компилирущие слова итд.
Во вторых - в хозяйстве пригодицо.
Книга Баранова и Ноздрунова расчитана на очень подготовленного читателя,
и из за мизерного объема ее многие вещи мало раскрыты.
Успешно реализовывая навигационную часть проекта, к сожалению
допустил какую-то непонятную ошибку в фортовской части, конкретно в графике.
Решил не разбираться с этим, тем более, что осталось реализовать
только загрузку из сети, кэширование и отображение карты.
Затем буду переписывать проект.
В частности форт сделаю намного более полным и читаемым.
И с графикой, прежде чем внедрить ее в навигационный прект, буду разбираться
на более простом проекте, не отягощенным навигационными приблудами.
Сейчас реализованы 1) загрузка и отображение gpx файла. ( путевые точки и трек в
формате xml )
2) Отображение и сохранение точек трека, полученные через gps приемник в формате gpx.
https://nakarte.me/#m=15/55.96711/37.80035&l=O&nktl=qZJcKV_rT86ZQCGiPOZiqA
Скошанные углы на повороте объясняются тем, что я забираю данные с gps один
раз в 10 секунд.
Кстати, реализацию фортов, оформлю отдельным проектом.
Думаю, форт сообществу надо было сделать это давно,
с тех пор, как возникла идея,
"каждый фортер должен написать свой форт".
Вполне согласен с этим утверждением.
Во первых, это поможет понять create does компилирущие слова итд.
Во вторых - в хозяйстве пригодицо.
Книга Баранова и Ноздрунова расчитана на очень подготовленного читателя,
и из за мизерного объема ее многие вещи мало раскрыты.
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Черновик: Версия II
А просто писать на ФОРТЕ, использую всю красоту и мощь можно?
Нельзя. Скорее всего для андроида нет форта, пригодного для написания скриптов,
чтоб переправлять данные между процессами, как это делают в мире Юникс уже
пол столетия. Кстати, на такие возможности, мне кажется мало обращают
внимание. А они радикально облегчают любительское программирование,
оставляя реализацию всякой организационной хрени на "потом", которую
можно доработать скриптами.
Хорошая новость. Написал отображение карты за один вечер,
хотя ожидал закончить работу за месяц другой. Осталось только
написать кеширование загруженных из интернета тайлов, и можно
считать реализацию черновика сделанной.
Запись фрагмента недавней велопрогулки.
На телефоне карту можно перемещать, написал свою реализацию перемещения
экрана, та, что используется в android api ужастна, экран залипает.
- Код:
float Xdown, Ydown;// координаты касания
@Override
public boolean onTouch(View v, MotionEvent event ) {
float x,y;
x = event.getX(); y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: // нажатие
Xdown=x; Ydown=y;
break;
case MotionEvent.ACTION_MOVE: // движение .. на некоторых моделях работает муторно
break;
case MotionEvent.ACTION_UP: // отпускание !! убрать инт
int dxp=(int)(Xdown-x); // смещение в пикселях
int dyp=-(int)(Ydown-y);
double dxm=dxp*PixelSizeMetres; // смещение в метрах
double dym=dyp*PixelSizeMetres;
float klat=111111.0f; // метров в градусе по широте
float kLon=(float ) (40000*Math.cos( Math.toRadians( centrLat) )/360 ) *1000; // по долготе
double dxg = dxm/kLon;
double dyg = dym/klat;
centrLat=centrLat+dyg;
centrLon=centrLon+dxg;
PixelSizeMetres = AU.calcMetrsPix(centrLat, zoom);
dispCorner = AU.calcDispCorner(centrLat,centrLon,PixelSizeMetres, displaywidth , displayheight);
navView.tileArray=macroTileArray( centrLat, centrLon, zoom, displaywidth , displayheight);
if (AU.Wpt!=null)updateWP( AU.Wpt, dispCorner , PixelSizeMetres);
if (AU.TRK!=null) updateTRK(AU.TRK);
if (TRKp!=null) updateGPS(TRKp);
navView.invalidate();
break;
case MotionEvent.ACTION_CANCEL:
break;
}
return true;
}
В работе использовал только сферическую геометрию и информацию отсюда
https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames
Никакими сторонними библиотеками не пользовался.
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Черновик: Версия II
Да. Те же проблемы. На моем наладоннике стоит усеченная версия Windows. Зачем мне создавать окно, если я просто преобразую один файл в другой?- Не создавай!- Но в отсутствие консоли ОС я просто не увижу, что во что преобразовал. Отсюда дурацкий вывод: окно приложения - только для выдачи того, что в нормальных ОС идет на консоль. В переводе на FORTH-язык, видимо, создание в блоковой памяти блока выдачи текущей программы. Причем в формате, пригодном для его запуска для выполнения следующей операции (путем вставки в него меню команд, пригодного для правки)...vikt144 пишет:Скорее всего для андроида нет форта, пригодного для написания скриптов,
чтоб переправлять данные между процессами, как это делают в мире Юникс уже
пол столетия
Gudleifr- Admin
- Сообщения : 3246
Дата регистрации : 2017-03-29
Re: Черновик: Версия II
Это легко сделать, если выдача команды небольшая. Иначе приднтся организовывать многозадачность,В переводе на FORTH-язык, видимо, создание в блоковой памяти блока выдачи текущей программы.
что бы переключатся между выдающим данные словом и принимающим словом.
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Черновик: Версия II
Я неправильно выразился. Основная выдача программы, как и положено в скрипте, идет в файл/конвейер. В блок попадает только результат/диагностика/варианты дальнейших операций.vikt144 пишет:Это легко сделать, если выдача команды небольшая
Gudleifr- Admin
- Сообщения : 3246
Дата регистрации : 2017-03-29
Re: Черновик: Версия II
Все это время выгуливал эту программу в велосипедных поездках.
Программа умеет работать с одним загруженным треком и отображать
текущий, формируемый трек. В принципе, несложно было бы написать
форт-программу, которая давала бы, например, звуковое оповещение в случае
отклонения от заданного трека, но почему-то поленился это сделать.
Вместо этого, используя Intent, реализовал вызов фотографической
программы пользователя Longer'а
http://fforum.winglion.ru/viewtopic.php?p=44257#p44257
(Кстати, много кода я надергал с его camSnap'a, на тот момент
я был чайником в андроид программировании)
Intent вызывается при нажатии на кнопку wpt, что позволяет
не только зафиксировать координаты путевой точки, но и отфотографировать ее
со всех сторон. Для этого ослабил крепление смартфона на руле так,
что бы можно было переворачивать его вертикально, для фотографирования,
или горизонтально, для навигации.
В целом, две взаимодействующие примитивные программы оказались
гораздо удобнее каких-то иных средств. Когда же в обоих окажется
отлаженный forth, использование таких программ станет еще
на порядок гибче.
Работа над фортом продолжается - введено много улучшений.
Прорабатывается многозадачность, каналы.
Добавилась возможность работать не только с файлами, но и с датаграммами.
Программа умеет работать с одним загруженным треком и отображать
текущий, формируемый трек. В принципе, несложно было бы написать
форт-программу, которая давала бы, например, звуковое оповещение в случае
отклонения от заданного трека, но почему-то поленился это сделать.
Вместо этого, используя Intent, реализовал вызов фотографической
программы пользователя Longer'а
http://fforum.winglion.ru/viewtopic.php?p=44257#p44257
(Кстати, много кода я надергал с его camSnap'a, на тот момент
я был чайником в андроид программировании)
Intent вызывается при нажатии на кнопку wpt, что позволяет
не только зафиксировать координаты путевой точки, но и отфотографировать ее
со всех сторон. Для этого ослабил крепление смартфона на руле так,
что бы можно было переворачивать его вертикально, для фотографирования,
или горизонтально, для навигации.
В целом, две взаимодействующие примитивные программы оказались
гораздо удобнее каких-то иных средств. Когда же в обоих окажется
отлаженный forth, использование таких программ станет еще
на порядок гибче.
Работа над фортом продолжается - введено много улучшений.
Прорабатывается многозадачность, каналы.
Добавилась возможность работать не только с файлами, но и с датаграммами.
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Черновик: Версия II
По причине отсутствия опыта работы с сокетами, довольно много кода пришлось переписывать
много раз. Пока идет чистка кода после всех экспериментов.
Но уже есть сетевые разработки, Wake on lan, ftp-клиент.
Не сложно также оснастить каждое приложение, содержащее форт, своим ftp-сервером,
что бы можно было без геморойно обмениваться с ним данными.
Сейчас выложу рабочую версию самодельной wol.
( удаленное включение компьютеров.
https://admcomp.ru/wol.html
)
К сожалению технология сбойная, иногда не срабатывает.
Но вероятность сбоя самодельной wol и "официальной" программы wol примерно равно.
Для запуска нужно реализовать ф-ции
adrString lenString index getchar
и
adrByte len send - которая посылает udp-пакет определенному хосту
много раз. Пока идет чистка кода после всех экспериментов.
Но уже есть сетевые разработки, Wake on lan, ftp-клиент.
Не сложно также оснастить каждое приложение, содержащее форт, своим ftp-сервером,
что бы можно было без геморойно обмениваться с ним данными.
Сейчас выложу рабочую версию самодельной wol.
( удаленное включение компьютеров.
https://admcomp.ru/wol.html
)
К сожалению технология сбойная, иногда не срабатывает.
Но вероятность сбоя самодельной wol и "официальной" программы wol примерно равно.
Для запуска нужно реализовать ф-ции
adrString lenString index getchar
и
adrByte len send - которая посылает udp-пакет определенному хосту
- Код:
2variable mk s" 00:1A:4D:2F:89:0C" mk 2! \ адрес и размер строки mac-адреса
variable aa variable bb variable er
: dps \ int n int a int b a>b диапазон a < n < b ,-1 a n b > 0
0 er !
bb ! aa !
dup aa @ - 0>
if
DUP bb @ - 0<
if -1 er !
then
then
drop
er @
; \ -1 -- входит в диапазон между a и b
: ifdig16 \ char - log ( num | -1 ) 0 - 9 , a - f ; -1 false
dup 47 59 dps \ 0-9
if 48 -
else
dup 96 103 dps \ a-f
if 87 -
else
dup 64 71 dps \ A-F
if 55 -
else drop -1
then
then
then
; \ 0 - Н или -1
: sum16 ( dig1 dig2 - byte or -1000 )
swap
dup 0< if \ error (-1)
drop drop -1000
else
swap
dup 0< if
drop drop -1000
else
4 shl or \ сдвигает и складывает
then
then
;
variable qu 0 qu !
: to_byte \ .. - byte два соседних символа из строки mk превращает в байт
mk 2@ qu @ getchar \ char from string
1 qu +!
ifdig16 \ dup .
mk 2@ qu @ getchar
1 qu +!
ifdig16 \ dup .
swap
sum16
; \ qu приращается
: mac \ Читает mac-строку и укладывает байты
to_byte 1 qu +! c,
to_byte 1 qu +! c,
to_byte 1 qu +! c,
to_byte 1 qu +! c,
to_byte 1 qu +! c,
to_byte c,
0 qu !
;
variable macm
here macm !
mac \ в macm - адрес байтов mac
6 6 16 * + constant dtg.length \ 102
create datagram[] dtg.length allot
0 qu !
: fillFF \ заполнить 6 байтов структуры datagram байтом ff
datagram[] dup 5 + swap
do 255 i c! loop
;
: movMak \ копировать байты mak адреса
6 qu +!
\ qu dup 5 + swap \ qu текущий адрес в datagram
5 0
do
macm @ i + c@ qu @ i + c!
loop
;
: 4mv movMak movMak movMak movMak ;
: 16mv 4mv 4mv 4mv 4mv ;
: pre
fillff \ 16mv
datagram[] qu !
16mv
;
pre
datagram[] dtg.length send
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Черновик: Версия II
Работа продолжается. Основная трудность - неопределенность предполагаемой системы, для которой
пишешь интерфейс. Когда система наконец создана, становится очевидны дефекты интерфейса,
которые должны поддерживать систему. Работа идет на новый круг, что психологически тяжело и неприятно.
Сейчас прорабатываю функцию assign.
Она назначает параметры устройствам ввода-вывода, куда и откуда forth скрипт будет выдавать
и забирать данные, не заботясь, куда эти данные попадут на самом деле.
Устройством ввода вывода может быть что угодно, его даже можно написать на форте.
Остановился на следущем дизайне функции assign
readchan writechan - для текстов
writebytes readbytes - массивы байт
Это все у меня уже находится в эксплуатации, скрипты буду понемногу выкладывать.
Сам forth пока выкладывать не буду, код еще пока грязный.
пишешь интерфейс. Когда система наконец создана, становится очевидны дефекты интерфейса,
которые должны поддерживать систему. Работа идет на новый круг, что психологически тяжело и неприятно.
Сейчас прорабатываю функцию assign.
Она назначает параметры устройствам ввода-вывода, куда и откуда forth скрипт будет выдавать
и забирать данные, не заботясь, куда эти данные попадут на самом деле.
Устройством ввода вывода может быть что угодно, его даже можно написать на форте.
Остановился на следущем дизайне функции assign
- Код:
\ .s" name" - оставляет на стеке адрес и длину слова name
.s" protocol param1 ... paramN"
.s" filename"
channal assign \ int int int int int assign
- Код:
s" file" s" anyFileName" 5 assign \ тут все понятно файл назначается 5 каналу
( url = IP_or_HOSTNAME:port or user:password@IP_or_HOSTNAME:port/path )
s" udp url" s" filename" 5 assign
s" tcp url" s" filename" 5 assign
s" ftp url" s" filename" 5 assign
readchan writechan - для текстов
writebytes readbytes - массивы байт
Это все у меня уже находится в эксплуатации, скрипты буду понемногу выкладывать.
Сам forth пока выкладывать не буду, код еще пока грязный.
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Страница 2 из 2 • 1, 2
Страница 2 из 2
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|