Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 18:47

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Перенос строк в файле и SPF.
СообщениеДобавлено: Ср ноя 12, 2008 07:48 
Не в сети

Зарегистрирован: Ср окт 01, 2008 06:49
Сообщения: 10
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Наткнулся на что-то странное. В архиве два файла, отличаются они друг от друга тем, что в одном перенос строк 0D0A (DOS-style), в другом 0A (UNIX-style). Один SPF обрабатывает, а другой нет.

http://dump.ru/file/1205127


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср ноя 12, 2008 10:02 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
seu писал(а):
Наткнулся на что-то странное.

А что тут странного - один файл под win, другой под nix.
С другой стороны есть СПФ под win и есть СПФ под nix.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср ноя 12, 2008 10:47 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
https://sourceforge.net/tracker/index.p ... tid=367919

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср ноя 12, 2008 23:14 
Не в сети

Зарегистрирован: Ср окт 01, 2008 06:49
Сообщения: 10
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
chess
Странное тут то, что разделителем должен являться любой байт, числовое значение которого меньше 33.
Код:
: IsDelimiter1 ( char -- flag )
  BL 1+ <
;
VECT IsDelimiter ' IsDelimiter1 (TO) IsDelimiter
Или это не так?


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

Зарегистрирован: Ср окт 01, 2008 06:49
Сообщения: 10
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
И вообще, какой смысл искать 0D0A и считать его за разделитель, когда можно искать и 0D, и 0A, и если находить их в паре, считать за два разделителя. Форту ведь всё равно, сколько их там будет.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт ноя 13, 2008 19:24 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
seu писал(а):
Странное тут то, что разделителем должен являться любой байт, числовое значение которого меньше 33.
Код:: IsDelimiter1 ( char -- flag ) BL 1+ < ;
VECT IsDelimiter ' IsDelimiter1 (TO) IsDelimiterИли это не так?


Верно в СПФе так и есть, разделителем считается все, что имеет код 32 и меньше. Не знаю, как в стандарте (лень туда смотреть), так было не во всех фортах. Были и такие, в которых кодом разделителя был только пробел = 32, остальные символы включая ноль могли находиться в именах. Была даже такая шутка, как слово REFILL, код которого был = 0x0D0A.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт ноя 13, 2008 20:11 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
seu писал(а):
chess
Странное тут то, что разделителем должен являться любой байт, числовое значение которого меньше 33.

Тут причина в том, что при чтении в буфер разбора строк из файла разделителем строк принята последовательность 0D0A
(см. файл spf_win_io.f)

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт ноя 14, 2008 23:53 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Файл обрабатывается как одна строка (т.к. разделитель не найден) и первый же комментарий до (остутствующего) конца строки "съедает" весь файл.
Конец строки можно установить явно словами UNIX-LINES и DOS-LINES.
Вообще, используйте решение приведённое в тикете (правда оно там не очень "правильное", но рабочее)

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс ноя 16, 2008 06:08 
Не в сети

Зарегистрирован: Ср окт 01, 2008 06:49
Сообщения: 10
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
chess писал(а):
seu писал(а):
chess
Странное тут то, что разделителем должен являться любой байт, числовое значение которого меньше 33.

Тут причина в том, что при чтении в буфер разбора строк из файла разделителем строк принята последовательность 0D0A
(см. файл spf_win_io.f)
Ну я и спрашиваю, почему бы не определить концом строки и 0D, и 0A. Ну, будет пустая строка, но Форту-то всё равно. Зато работать будет со всеми файлами без всяких UNIX-LINES и DOS-LINES.


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

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
А при выводе файлов - программисту мудохаться с определением того, какая система, какой конец строки вписывать в конец?

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн ноя 17, 2008 12:29 
Не в сети

Зарегистрирован: Ср окт 01, 2008 06:49
Сообщения: 10
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
WingLion
Не совсем понял. А какие с этим проблемы?


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

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
В виндовсе в конец строки надо вписывать 0D0A, в юниксе - только 0D (или только 0A, не уверен, как правильно).
А программе должно быть пофиг, где она работает, и вывод конца строки должен обрабатываться автоматом.
Вывели строку, выводящее слово само добавило нужный конец строки, а не программисту об этом репу чесать.

p.s. А у меня проблем нет...

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт янв 26, 2010 18:44 
Не в сети
Moderator
Moderator
Аватара пользователя

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

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср янв 27, 2010 00:58 
Не в сети

Зарегистрирован: Сб май 06, 2006 12:01
Сообщения: 959
Откуда: Украина, Харьков
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
А, кстати, как можно решить такие проблемы?
Ведь, как я понимаю, такая же проблема будет если файл читать блоками (используя BLOCK) и строка или число попадет на границу?
И при страничной организации (тоже через блоки) виртуальной памяти снова это же будет?
Интересуют красивые решения. ;)

_________________
With best wishes, in4.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср янв 27, 2010 01:25 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
В начале файла обзательное слово о типе CR и без него вообоще файл не загружать

впрочем, если учесть, что CR в одном типе состоит из одного символа, а в другом - из двух = можно определять автоматически


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

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


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

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


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

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