Последний раз редактировалось hobot; 07.04.2021 в 01:49.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Ну смотри. В строке WRITE('Stroka') есть шесть символов с кодами ASCII, т.е. коды эти могут быть от 32 (пробел) до 127 (какая-нить зюка). Как ты сам выяснил, можно в строку пихать переход на новую строку: WRITE('S1
S2'); и табуляцию. Это управляющие коды. И, например, XDev тебе этак запросто их добавить в строку не даст. OMSI Pascal разрешает.
А мы интересуемся вообще добавлять в эту строку любые произвольные управляющие коды, т.е. ниже 32 и выше 127. Чего OMSI Pascal не позволяет по стандарту (набор символов ASCII находится быть в диапазоне 32..127; выше может находиться псевдографика или русские символы. Ниже - управляющие коды. Но они разные на разных машинах. Поэтому стандарт тупо рубит их использование).
Выводить символы с произвольным кодом всё-таки можно - через WRITE(CHR(код)), но Никита спрашивал как их в строку упихнуть. А, получается, что никак нельзя. Но, возможно, в OMSI Pascal 2 что-то такое и можно.
- - - Добавлено - - -
P.S. Под строкой я в данном контексте подразумеваю строчный литерал, взятый в апострофы.
транслятор проверяет только синтаксис и тип данных
позволяет скорее редактор местный текстовый - который единственно правильный для работы
с исходниками может оказаться в некоторых случаях...
тип "СТРОКА" - одна из возможных реализаций для OMSI PASCAL
Код:CONST STRINGMAX=100; TYPE STRING=RECORD LEN: 0..STRINGMAX; CH: PACKED ARRAY[1..STRINGMAX] OF CHAR END; FUNCTION LEN(VAR S:STRING):INTEGER; BEGIN LEN:= S.LEN END; PROCEDURE CLEAR(VAR S:STRING); VAR I: INTEGER; BEGIN S.LEN:=0; FOR I:=1 TO STRINGMAX DO S.CH[I]:=' ' END; PROCEDURE CONCATENATE(VAR S:STRING; VAR T:STRING); VAR I,J: INTEGER; BEGIN IF S.LEN+T.LEN>STRINGMAX THEN J:=STRINGMAX-S.LEN (* OVERFLOW *) ELSE J:=T.LEN; FOR I:=1 TO J DO S.CH[S.LEN+I]:=T.CH[I]; S.LEN:=S.LEN+J; END; FUNCTION SEARCH(VAR S,T:STRING; START:INTEGER):INTEGER; VAR I,J: 0..STRINGMAX; UNEQ: BOOLEAN; BEGIN IF START<1 THEN START:=1; IF (START+T.LEN>S.LEN+1) OR (T.LEN=0) THEN SEARCH:=0 ELSE BEGIN I:=START-1; REPEAT I:=I+1; J:=0; REPEAT J:=J+1; UNEQ:=T.CH[J]<>S.CH[I+J-1]; UNTIL UNEQ OR (J=T.LEN); UNTIL (NOT UNEQ) OR (I=S.LEN-T.LEN+1); IF UNEQ THEN SEARCH:=0 ELSE SEARCH:=I; END; END; PROCEDURE READSTRING(VAR F:TEXT; VAR S:STRING); BEGIN CLEAR(S); WITH S DO WHILE (NOT EOLN(F)) AND (LEN<STRINGMAX) DO BEGIN LEN:=LEN+1; READ(F,CH[LEN]); END; READLN(F); END; PROCEDURE WRITESTRING(VAR F:TEXT; VAR S:STRING); BEGIN WRITE(F,S.CH:S.LEN) END; PROCEDURE SUBSTRING(VAR T:STRING; VAR S:STRING; START,SPAN:INTEGER); VAR I: INTEGER; BEGIN IF SPAN<0 THEN BEGIN SPAN:= -SPAN; START:=START-SPAN END; IF START<1 THEN BEGIN SPAN:=SPAN+START-1; START:=1 END; IF START+SPAN>S.LEN+1 THEN SPAN:=S.LEN-START+1; IF SPAN<=0 THEN CLEAR(T) ELSE BEGIN FOR I:=1 TO SPAN DO T.CH[I]:=S.CH[START+I-1]; FOR I:=SPAN+1 TO STRINGMAX DO T.CH[I]:=' '; T.LEN:=SPAN; END; END; PROCEDURE DELETE(VAR S:STRING; START,SPAN:INTEGER); VAR I,LIMIT: INTEGER; BEGIN IF SPAN<0 THEN BEGIN SPAN:=-SPAN; START:=START-SPAN END; LIMIT:=START+SPAN; IF START<1 THEN START:=1; IF LIMIT>S.LEN+1 THEN LIMIT:=S.LEN+1; SPAN:=LIMIT-START; IF SPAN>0 THEN BEGIN FOR I:=0 TO S.LEN-LIMIT DO S.CH[START+I]:=S.CH[LIMIT+I]; FOR I:=S.LEN-SPAN+1 TO S.LEN DO S.CH[I]:=' '; S.LEN:=S.LEN-SPAN; END; END; PROCEDURE INSERT(VAR S:STRING;VAR T:STRING; P:INTEGER); VAR I,J: INTEGER; BEGIN IF T.LEN>0 THEN IF (P>0) AND (P<=S.LEN+1) THEN BEGIN IF S.LEN+T.LEN<=STRINGMAX THEN S.LEN:=S.LEN+T.LEN ELSE S.LEN:=STRINGMAX (* OVERFLOW *) ; FOR I:=S.LEN DOWNTO P+T.LEN DO S.CH[I]:=S.CH[I-T.LEN]; IF S.LEN<P+T.LEN THEN J:=S.LEN ELSE J:=P+T.LEN-1; FOR I:=P TO J DO S.CH[I]:=T.CH[I-P+1]; END ELSE (* ERROR: NON-CONTIGUOUS STRING *) END;
Ну я ж тебе сказал, что под строкой понимаю литерал, т.е. строковую константу. И пихать мы хотели не на уровне зюк, которые редактор может исказить, а на уровне кодов. В ТурбоПаскаль можно, в Дельфи можно. В OMSI походу нельзя.
Про строчные операции я не спрашивал. И под конкатенацией тоже подразумевал конкатенацию литералов, т.е. на уровне констант. Сможешь объявить строку с кодами в секции CONST - будет тебе респект. Но что-то я в этом сильно сомневаюсь.
Да оно не особо мешает, на то и стандарт. Сначала придумывали стандарты, потом - как их обходить)
это несбыточно... такое "низя!!!", не надо меня на слабо тянуть заведомо несбыточными хотелками...
я подразумевал то что написал... подходит не подходит под "ваши там запросы" - это не мне решать и не моя проблема, а вот информативность данной темы не флудом, а обсуждением и добавление ещё одной шпаргалки я с удовольствием (как видишь) ...
а я на твой вопрос и не отвечал, я просто уточнил твою терминологию, ибо мудрённо вы программисты вещаете...
Кстати сейчас занят "пофиксить" и "пере \ до укомплектовать" образ дискеты по Паскалю... что бы побольше полезностей на 1-ой дискете...позже отпишусь...тут кстати кто то уже для себя поставку полностью пересобрал по паскалю...было обсуждение помнится...
По поводу твоей последней ссылки на какой-то там справочник - хочешь конкретно с ОМСИ работать - надо ДОКи по нему и читать - тогда вопросов не будет ни по УТИЛИТАМ, ни по коду, ни по отладке...
а как тебе вот такой пример?
в начале исходник в редакторе ;-)Код:BEGIN WRITELN('СТРОКА 1 :'); WRITELN('СТРОКА 2',':':14); WRITELN('':20,'ПРИВЕТ!!!'); WRITELN('^C '); END. Exit? Y HD7>PASDWK TRISTR=TRISTR ERRORS DETECTED: 0 FREE MEMORY: 10120 WORDS HD7>MAC TRISTR HD7>LIN TRISTR,PASDWK HD7>RU TRISTR СТРОКА 1 : СТРОКА 2 : ПРИВЕТ!!! HD7>
в конце протокол выполнения, и вставленный символ виден только в редакторе,
если вывести на дисплей системной командой файл исходника - там "как бы пусто"
а в супер функциональном NYS.SAV(он же EDIK.SAV)Код:HD7>TY TRISTR.PAS PROGRAM TROSTROKI; BEGIN WRITELN('СТРОКА 1 :'); WRITELN('СТРОКА 2',':':14); WRITELN('':20,'ПРИВЕТ!!!'); WRITELN(' '); END. HD7>
как видим "оно ест" ))) И чито ви скажите на это уважаемый ?
это опять просто информация по теме, а не ответ и не попытка что то где то притянутьКод:BEGIN WRITELN('СТРОКА 1 :'); WRITELN('СТРОКА 2',':':14); WRITELN('':20,'ПРИВЕТ!!!'); WRITELN('^C '); END. Exit? Y
под "воссоздание" исходника -
Ну мало ли чего ест ваш Эдик ;-) Я как раз против таких подходов, потом можно проблем отгребсти.
все твои проблемы за пределами аутентичной среды, а следовательно тут их обсуждать не корректно и противопоказано, как и прочие всякие ЗЫКС-мейкеры и ДЖАВА... Тут только правильное, аутентичное, с замечательным функционалом, продуманное, человеческое ПО, в реальном времени ;-)
Потихоньку - помаленьку буду компоновать fix. сборник по ПАСКАЛЮ,
пока так (как пишет тов. Хунта ) для затравочки
PASDOC.TXT :Код:Image : PASCAL.DSK Format : DSK : RT-11 Size : 800 Kb Volume ID: RT11A Owner : File Blocks Date Bytes ---------- ------ ----------- ---------- PASDOC.TXT 2 07-Apr-2021 1'024 PASDOC.FCU 220 07-Apr-2021 112'640 PASFPP.FCU 76 07-Apr-2021 38'912 PASFPP.TXT 2 07-Apr-2021 1'024 PASDWK.FCU 70 07-Apr-2021 35'840 PASDWK.TXT 2 07-Apr-2021 1'024 PASY2K.FCU 85 07-Apr-2021 43'520 PASY2K.TXT 2 07-Apr-2021 1'024 < UNUSED > 1127 577'024 ---------- ------ ----------- ---------- 8 Files, 459 Blocks 1127 Free blocks
PASFPP.TXT :Код:List contents of archive: PASDOC.FCU Fcu v2.03. Shurick inc. Dec 23 1994. 7-Apr-89. List contents of archive PASDOC.FCU Name Date Original Compressed ratio PASCAL.LST 7-Apr-89 176 61.742 35% PASUSE.LST 7-Apr-89 161 54.234 34% PASCAL.LAN 7-Apr-89 181 66.477 37% PASCAL.RUK 7-Apr-89 112 37.195 33% 4 Files, 630 blocks. АРХИВ СОДЕРЖИТ ОПИСАНИЕ ЯЗЫКА, РУКОВОДСТВО ПО ПРОГРАММИРОВАНИЮ И ОТЛАДКЕ ПРОГРАММ НА ЯЗЫКЕ ПАСКАЛЬ. archive.pdp-11.org.ru
Код:Create new archive: PASFPP.FCU archiving: 61% PASFPP.SAV 59 07-Apr-89 54% PASFPP.OBJ 74 07-Apr-89 Length of archive: 76 block(s), ratio: 57% PASFPP.FCU 76 07-Apr-2021 List contents of archive: PASFPP.FCU Fcu v2.03. Shurick inc. Dec 23 1994. 7-Apr-89. List contents of archive PASFPP.FCU Name Date Original Compressed ratio PASFPP.SAV 7-Apr-89 59 36.113 61% PASFPP.OBJ 7-Apr-89 74 39.797 54% 2 Files, 133 blocks. АРХИВ СОДЕРЖИТ ОДИН ИЗ ВАРИАНТОВ ТРАНСЛЯТОРА ПАСКАЛЯ И БИБЛИОТЕКИ archive.pdp-11.org.ru
Последний раз редактировалось hobot; 07.04.2021 в 07:02.
Oleg N. Cher(07.04.2021)
Ребят, а что с русским языком в этом Паскале? есть версия с поддержкой КОИ-8 или только КОИ-7 ?
В документации написано что она делает -
The utility program IMP decrases the size of the object code produced by Pascal-1 by replacing branch/jump combinations with sigle branches when possible.
То есть, если идёт подряд BEQ xxxx / JMP yyyy (3 слова) - если yyyy отстоит недалеко, то это заменяется на BNE yyyy (1 слово).
Такая конструкция встречается в каждом IF, FOR, WHILE.
- - - Updated - - -
Вообще в этом Паскале IF, WHILE - относительно лёгкие, а вот FOR довольно громоздкий:
Код:FOR I:=1 TO 10 DO BEGIN WRITELN; END;Итого - 19-21 слов на обеспечение цикла FOR (на два слова меньше если переменная объявлена первой).Код:; FOR I:=1 TO 10 DO BEGIN MOV %5,-(6) ADD #xxxx,%0 MOV #1,-(6) MOV #10,-(6) MOV 2(6),@4(6) L1: CMP @4(6),(6) BLE .+6 JMP L2 ; WRITELN; JSR %7,$B36 ; END; INC @4(6) JMP L1 L2: ADD #6,%6 L0:
Последний раз редактировалось nzeemin; 07.04.2021 в 21:13.
Oleg N. Cher(07.04.2021)
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)