powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Какая то чертовщина с этим gt.m
25 сообщений из 40, страница 1 из 2
Какая то чертовщина с этим gt.m
    #38879956
Виталийv4567
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По роду работы пытаюсь освоить gt.m но что то пока получается не очень.

Например есть код:prog4
        s i=0
        f  q:i=20  d  
        . s i=i+1
        . w !,i
        . q:i=10
        w !
        q
После "d" идёт два пробела!
Этот код компилируется без ошибок, а вот если после "f  q:i=20" поставить один пробел вместо двух, то уже при компиляции выдаёт ошибку. Почему не понятно, я ведь после for поставил два пробела - бесконечный цикл, поэтому насколько я понял после строки "f  q:i=20" можно ставить один пробел. Или это не так?

Потом следующий момент. Если убрать "q:i=20" и написать " f  d   " то хоть ставь в теле цикла выход по условию (q:i=10) хоть не ставь всё равно не выйдешь, надо для выхода писать вот так "f  q:i=20  d" Я так понял что в теле цикла если ставить выход то он не действует. так это или я ошибаюсь?

Далее есть вот такой код:prog3
        s i=0
        i i=0 d  
        . s i=i+1
        . w !,i
        . s i=i+1
        . w !,i
        . s i=i+1
        . w !,i
        . s i=i+1
        . w !,i
        . s i=i+1
        . g:i=5 met1
        . w !,i
        . s i=i+1
        . w !,i
        . s i=i+1
        . w !,i
        . s i=i+1
        . w !,i
        . s i=i+1
        e  d..
        . w !,i
        . s i=i+1
        . w !,i
        . s i=i+1
        . w !,i
        . s i=i+1
met1    w !,i
После "d" в строке "i i=0 d   " два пробела.

Результатом работы этой программы будет:

Код: plaintext
1.
2.
3.
4.
5.
1
2
3
4
5
5

Вопрос, откуда появилась вторая пятёрка?? Одна пятёрка должна быть, но откуда вылезла вторая?

За помощь буду очень благодарен!!!
...
Рейтинг: 0 / 0
Какая то чертовщина с этим gt.m
    #38880028
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виталийv4567вот если после "f  q:i=20" поставить один пробел вместо двух, то уже при компиляции выдаёт ошибку.потому что компилятор ожидает результат выхода q result, 2 пробела это выход без результата
...
Рейтинг: 0 / 0
Какая то чертовщина с этим gt.m
    #38880074
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и вот из документации http://tinco.pair.com/bhaskar/gtm/doc/books/pg/UNIX_manual/ch06s17.html The postconditional QUIT terminates the FOR loop. Note the two spaces after the QUIT because it has no argument.
...
Рейтинг: 0 / 0
Какая то чертовщина с этим gt.m
    #38880079
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виталийv4567Вопрос, откуда появилась вторая пятёрка??
потому что у вас код в met1 выполняется дважды,
когда выполнялся do у вас перешло выполнение ниже по стеку (как подпрограмма)
первый раз когда вы переходите в met1 по goto, потом происходит выход, так как закончился код, выход обратно по стеку наверх (выход из подпрограммы)
а значит, должен выполнится код, который идет дальше, а дальше у вас опять только met1, который выполняется повторно
если вы перед ним поставите quit то все будет как надо
...
Рейтинг: 0 / 0
Какая то чертовщина с этим gt.m
    #38880086
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виталийv4567Если убрать "q:i=20" и написать "f  d " то хоть ставь в теле цикла выход по условию (q:i=10) хоть не ставь всё равно не выйдешь,Да, все верно quit в теле стека DO означает выход из этой подпрограммы, а не выход из цикла, выход из цикла командами в той же строке где и цикл, как до команды do с двумя пробелами та и после, как в примере ниже set q=0
 for i=1:1 do  quit:q
   . write !,i
   . set:i=5 q=1
...
Рейтинг: 0 / 0
Какая то чертовщина с этим gt.m
    #38880108
Виталийv4567
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DAiMor, Огромное спасибо за помощь!

Ещё хочу уточнить некоторые детали.
Если я запускаю свою программу d ^prog4 и втеле цикла у меня команда quit по которой я получается выхожу из программы prog4 но при этом остаюсь в цикле и он выполняется...?? Я не пойму как это. Если я выйду из программы то всё что в ней выполнялось должно прекратиться, или это не так? Что то этот момент я не пойму.
DAiMor можете объяснить поподробней.
...
Рейтинг: 0 / 0
Какая то чертовщина с этим gt.m
    #38880116
Виталийv4567
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виталийv4567,

Что то этот gt.m очень какой то запутанный.
По поводу цикла, я так понял что само тело цикла будет запущено как подпрограмма и по quit я выхожу из этой подпрограммы - то есть из цикла, но при этом сам цикл продолжает выполняться. Что то я совсем не пойму как это?

По поводу двух пятёрок. Тело if и else запускаются то же как подпрограммы и когда по goto я выпрыгиваю из этой подпрограммы и когда заканчивается программа prog3 я обратно возвращаюсь в тело if но так как я раньше выпрыгнул из него то оно должно закончиться и я опять из него выхожу на строку которая идёт за телом if, else, а это как раз и есть метка met1. Это так? Получается что если выпрыгеуть по goto не из тела if, else, а из запущенной программы то когда она закончиться всё равно будет возврат туда откуда выпрыгнул?
...
Рейтинг: 0 / 0
Какая то чертовщина с этим gt.m
    #38880127
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виталийv4567,

смотри, команда do с двумя пробелами, и со всем кодом начинающимся на точки, для for это как одна команда
do это вызов подпрограммы, она может быть указана по имени, либо вот так через точки, это не важно, важно что выход из нее, влияет только на эту подпрограмму
. quit это не выход из программы, а выход из подпрограммы

то же самое и с IF
...
Рейтинг: 0 / 0
Какая то чертовщина с этим gt.m
    #38880136
Виталийv4567
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DAiMor, извини что надоедаю, но мне надо разобраться. Просто работа будет связанна с gt.m, а не разобравшись работать не смогу.

Получается что я вышел из подпрограммы, но подпрограмма это и есть тело цикла или тело if, else. получается что я вышел из цикла или if, else и должен выполнять то что идёт за циклом или if, else и больше к циклу или if, else не возвращаться, а я получается возвращаюсь. В цикле вообще возвращаюсь всё время, а в if, else один раз.
...
Рейтинг: 0 / 0
Какая то чертовщина с этим gt.m
    #38880141
Виталийv4567
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виталийv4567,

С вызовом по do подпрограмм написанных в других файлах как то всё укладывается в мою логику, а вот с for, if, else не могу разобраться.

Получается если подпрограмма вызвана по do то она отработает полностью или до первой встречи quit, а потом продолжится выполнение программы из которой была вызвана эта подпрограмма.
Пока не пойму как это привязать к for, if, else.
...
Рейтинг: 0 / 0
Какая то чертовщина с этим gt.m
    #38880143
Фотография П.С.М.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виталийv4567Получается что я вышел из подпрограммы, но подпрограмма это и есть тело цикла или тело if, else.
Подпрограмма это не тело цикла. Вы можете вызвать не одну подпрограмму, а много:f  q:i=20  d someprog1,someprog2,someprog3
...
someprog1
 ; выход из  
 Q
someprog2
 ; каждой 
 Q
someprog3
 ; подпрограммы != выход из тела цикла
 Q ЗЫ: делать так, как в моем примере (процедуры через запятую), не надо. Плохо читаемо.
Лучше так:f  q:i=20  d label
...
label
 d someprog1
 d someprog2
 d someprog3
 Q
someprog1
 ; выход из  
 Q
someprog2
 ; каждой 
 Q
someprog3
 ; подпрограммы != выход из тела цикла
 Q 
...
Рейтинг: 0 / 0
Какая то чертовщина с этим gt.m
    #38880146
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виталийv4567но подпрограмма это и есть тело цикла или тело if, else.нет, подпрограмма никакого отношения к телу цикла или условия не имеет, и вход из нее возвращает исполнение к телу цикла или условия
...
Рейтинг: 0 / 0
Какая то чертовщина с этим gt.m
    #38880149
Виталийv4567
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
П.С.М.,

это понятно, но в моём случае после do нет названий подпрограмм, после do стоит два пробела что указывает на то что вызывается подпрограмма - тело цикла. Насколько я понял (может я конечно ошибаюсь!) do с двумя пробелами и будет означать что вызывается подпрограмма которая и есть само тело цикла и если я вышел из неё то вышел и из тела цикла - получается что из цикла и должен продолжить выполнение того что написано после тела цикла то есть строки без точек. А получается что выхода никакого нет.
...
Рейтинг: 0 / 0
Какая то чертовщина с этим gt.m
    #38880153
Виталийv4567
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виталийv4567,

DAiMor я своё последнее сообщение написал перед тем как прочёл твоё последнее сообщение.
...
Рейтинг: 0 / 0
Какая то чертовщина с этим gt.m
    #38880154
Виталийv4567
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виталийv4567,

сейчас ещё попробую поэкспериментировать.
...
Рейтинг: 0 / 0
Какая то чертовщина с этим gt.m
    #38880155
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виталийv4567,

в Caché есть возможность использования фигурных скобок, и тут уже проще ориентироваться.
...
Рейтинг: 0 / 0
Какая то чертовщина с этим gt.m
    #38880160
Фотография П.С.М.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виталийv4567 но в моём случае после do нет названий подпрограмм
Это не важно. У Вас происходит вызов "неименнованной" процедуры.
Виталийv4567после do стоит два пробела что указывает на то что вызывается подпрограмма - тело цикла
Вызывается подпрограмма из тела цикла!
ЗЫ:
Уж не знаю есть ли в gt.m переменная $STACK (хотя должна быть), вот почитайте из документации к Каше ( тынц ). Думаю поможет Вашему пониманию.
...
Рейтинг: 0 / 0
Какая то чертовщина с этим gt.m
    #38880168
Виталийv4567
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
П.С.М.,

С goto кажись разобрался.
В Си нельзя выпрыгнуть из одной подпрограммы в другую. В рамках одной подпрограммы прыжок не противоречит логики. Я прыгаю на какую нибудь строку с кодом и дальше выполняю всё с этой строки не возвращаясь больше никогда к месту с которого прыгнул. В gt.m если прыгать в пределах одной подпрограммы то то же так, а вот если прыгать из одной подпрограммы в другую (что в Си невозможно) то тогда всё по другому, закончатся строки кода в подпрограмме со строки куда я прыгнул и я вернусь к месту вызова подпрограммы из которой выпрыгивал и опять пойду выполнять строка за строкой код до самого конца первой подпрограммы.
...
Рейтинг: 0 / 0
Какая то чертовщина с этим gt.m
    #38880174
Фотография П.С.М.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виталийv4567а вот если прыгать из одной подпрограммы в другую
Если уж себя не жалеете, пожалейте тех, кто будет работать после Вас. Ну не верю я, что у Вас такая логика программы, что без GoTo не обойтись. Ну ладно еще в рамках какой-нибудь небольшой программки используются переходы по GoTo, где видны все переходы на одном экране (хотя и здесь можно без GoTo обойтись). Но переходы через GoTo еще и по другим программам, это тот случай, из-за которого и предали GoTo анафеме :)
...
Рейтинг: 0 / 0
Какая то чертовщина с этим gt.m
    #38880181
Виталийv4567
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
П.С.М.,

да я раньше не мог понять почему так ругают goto. Мне казалось наоборот goto помогает.
(Кстати если посмотреть на условия if, else и циклы на уровне ассемблера, то в начале будет проверка условия, а потом в зависимости как это условие выполнилось прыжок на определённый адрес, а если это цикл то ещё прыжок обратно и это столько раз, сколь итераций цикла. )
Если бы при прыжке из одной подпрограммы в другую не было возврата в место где начала выполняться вызванная подпрограмма (выпрыгнули из подпрограммы и забыли про неё и место где она была вызвана, что к ней возвращаться мы для этого и выпрыгиваем из неё, что бы начать выполнение совсем другого кода) то тогда бы goto не был бы так запутан, а наоборот было бы всё понятно и goto был бы только в помощь.
...
Рейтинг: 0 / 0
Какая то чертовщина с этим gt.m
    #38880208
Фотография П.С.М.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виталийv4567условия if, else и циклы на уровне ассемблера
...
прыжок на определённый адрес
Аналогичным образом можно писать программы и на М. Только прыжки, в отличии от языка ассемблера, совершаются не на адрес, а на метку. Как правило, такой подход к написанию программ (организация циклов и ветвлений через goto), встречается только в старых программах. В новых программах все же лучше такой подход не использовать (ИМХО).
...
Рейтинг: 0 / 0
Какая то чертовщина с этим gt.m
    #38880317
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виталийv4567,

В общем-то M(UMPS) может показаться языком со странной философией, особенно если пытаться изучать его методом тыка, ничего не читая. А почитать сейчас есть что, и даже по-русски . 30 лет назад язык поражал своим аскетизмом, возможностью минимальными средствами выразить многое ("запрограммировать что угодно, даже ветер в голове"), сохраняя достаточный уровень абстракции и читабельности программ. Некоторые программные комплексы на MUMPS имеют 20-30 летнюю историю (разве что интерфейс обновился). Задумайтесь, если бы их авторы писали спагетти-код, вряд ли бы они столько прослужили - их бы просто никто не смог сопровождать.
...
Рейтинг: 0 / 0
Какая то чертовщина с этим gt.m
    #38880512
Виталийv4567
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Maslov,

Эту книгу купила организация, я её сейчас читаю и пробую на примерах маленькие куски кода.

У меня в программировании очень небольшой опыт, но всё равно были моменты в которых приходилось использовать бесконечные циклы с возможными вариантами - (по условиям) выхода из него. Может это конечно не правильно так как есть опасность сделать ошибку и программа при исполнении уйдёт в бесконечный цикл, что приведёт к её зависанию. Но иногда надо выпрыгнуть и из цикла с конечным числом итераций, а как это сделать не понятно. В книге написано:
"Если при выполнении команды GOTO действовал контекст цикла, то он отменяется. Контекст стека полностью сохраняется. Вызываемый код может вызвать команду quit, которая вернёт управление."
То есть мы вернёмся обратно в цикл. К goto вставленной в одной строке for обращение идёт только после выполнения всех строк в блоке за одну итерацию, а как быть если необходимо провести проверку и выйти по условию в середине блока.
По книге получается что выйти можно, но только когда будет команда quit опять будет возврат на следующую строку в этом блоке откуда вышел, а если надо выйти без возврата, то как быть тогда.
Например такой код:prog7
        f i=0:1:10 d..
        . w !,i
        . g:i=5 met1
        w !,"1111"
met1    w !,"2222"
        qДаёт такой результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
GTM>zl "prog7.m"

GTM>d ^prog7

0
1
2
3
4
5
2222
6
7
8
9
10
1111
2222
GTM>
По quit всё равно вернулись в цикл.

Как быть в таком случае?

Вот такой код работает как задумывалось:prog7
        f i=0:1:10 g:i=5 met1 d..
        . w !,i
        w !,"1111"
met1    w !,"2222"
        qВот результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
GTM>zl "prog7.m"

GTM>d ^prog7

0
1
2
3
4
2222
GTM>
Вроде бы всё правильно, но это когда условие выполняется в результате прохождения всех строк в блоке.

Например вот такой код надо выйти в середине цикла и больше в цикл не возвращаться:prog7
        f i=0:1:10 d..
        . w !,i
        . s i=i+1
        . w !,i
        . s i=i+1
        . w !,i
        . s i=i+1
        . w !,i
        . s i=i+1
        . w !,i
        . s i=i+1
        . w !,i
        . g:i=5 met1
        . s i=i+1
        . w !,i
        w !,"1111"
met1    w !,"2222"
        qВыйти на совсем не получается, мы возвращаемся, вот результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
GTM>zl "prog7.m"

GTM>d ^prog7

0
1
2
3
4
5
2222
6
7
8
9
10
11
12
1111
2222
GTM>
Такой вариант то же не помогает:prog7
        f i=0:1:10 g:i=5 met1 d..
        . w !,i
        . s i=i+1
        . w !,i
        . s i=i+1
        . w !,i
        . s i=i+1
        . w !,i
        . s i=i+1
        . w !,i
        . s i=i+1
        . w !,i
        . s i=i+1
        . w !,i
        w !,"1111"
met1    w !,"2222"
        qВот результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
GTM>zl "prog7.m"

GTM>d ^prog7

0
1
2
3
4
5
6
7
8
9
10
11
12
13
1111
2222
GTM>
Как быть в данном случае?
В Си выпрыгнул и всё, а в MUMPS не понятно как это осуществить.

После "d" две точки - это два пробела. У меня в редакторе они точками другого цвета пишутся, когда копировал получилось что скопировалось точками.
...
Рейтинг: 0 / 0
Какая то чертовщина с этим gt.m
    #38880601
Фотография П.С.М.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виталийv4567Например вот такой код надо выйти в середине цикла и больше в цикл не возвращаться:П.С.М. Вы можете вызвать не одну подпрограмму, а многоЯ когда писал свой ответ, наверное как то не очень точно вложил в него смысл. Дополню:
Вы можете вызвать не одну подпрограмму, а много чего еще, не только процедуры, но и команды.
Вы можете добавить, после выполнения Вашей процедуры, и другие команды/вызовы. Например, можете добавить выход по условию или переход по нужной метке. Но! Лучше все же выход. Не используйте goto!
DAiMor уже приводил пример: set q=0
 for i=1:1 do  quit:q
   . write !,i
   . set:i=5 q=1Здесь, как Вы видите, после вызова процедуры идет команда quit с условием.
...
Рейтинг: 0 / 0
Какая то чертовщина с этим gt.m
    #38880609
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виталийv4567Такой вариант то же не помогает:prog7
        f i=0:1:10 g:i=5 met1 d..
        . w !,i ;0
        . s i=i+1
        . w !,i ;1
        . s i=i+1
        . w !,i ;2
        . s i=i+1
        . w !,i ;3
        . s i=i+1
        . w !,i ;4
        . s i=i+1
        . w !,i ;5
        . s i=i+1
        . w !,i ;6
        w !,"1111"
met1    w !,"2222"
        qВот результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
GTM>zl "prog7.m"

GTM>d ^prog7

0
1
2
3
4
5
6
7
8
9
10
11
12
13
1111
2222
GTM>
Как быть в данном случае?Исправить

f i=0:1:10 g:i=5 met1 d..

на

f i=0:1:10 g:i>=5 met1 d..
...
Рейтинг: 0 / 0
25 сообщений из 40, страница 1 из 2
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Какая то чертовщина с этим gt.m
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]