Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Вт апр 23, 2024 12:30

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Проблемы с READ-LINE в LINUX
СообщениеДобавлено: Чт янв 12, 2012 13:11 
Не в сети

Зарегистрирован: Сб янв 07, 2012 12:33
Сообщения: 5
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Кажется нашел в чем проблема. Слово READ-LINE в реализации под Linux работает не совсем корректно.
Оно использует слово READ-FILE которое в свою очередь, используя системную функцию read, читает из входного потока. При тестировании оказалось, что из STDIN читается несколько строк, но READ-LINE берет из них только первую, а все остальные игнорируются.
Может у кого будут идеи, как это пофиксить?

UPD. Возможно проблема не совсем в READ-LINE, а в более поздней интерепретации вычитаных строк. Разбираюсь.
UPD2. Все таки проблема в READ-LINE. Он использует REPOSITION-FILE для переноса текущей позиции чтения из входного потока на конец вычитанной строки. Это работает если STDIN это файл, но, если данные пишутся напрямую, то такой подход не работает. Эта же проблема будет и в Windows версии.


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

Зарегистрирован: Сб янв 07, 2012 12:33
Сообщения: 5
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Как временное решение переопределил REFILL-STDIN:
Код:
: ACCEPT3 ( c-addr +n1 -- +n2 )
  OVER SWAP
  H-STDIN READ-FILE TRUE SWAP
 
  DUP 109 = IF DROP -1002 THEN THROW ( ~ruv)
  0= IF -1002 THROW THEN ( ~ac)
 
  TUCK TO-LOG
  EOLN TO-LOG \ Если ввод с user-device записать cr в лог, то есть нажали Enter
;

: REFILL-STDIN ( -- flag ) \  from user input
  SOURCE-ID -1 = IF FALSE EXIT THEN ( evaluate string )
  TIB C/L ['] ACCEPT3 CATCH
  \ -1002=конец файла или pipe
  \ остальные ошибки - ошибки чтения
  DUP -1002 = IF DROP 2DROP 0 0 ELSE THROW -1 THEN
  TAKEN-TIB
;


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Муравьи
СообщениеДобавлено: Чт янв 12, 2012 18:29 
HaronK писал(а):
Слово READ-LINE в реализации под Linux работает не совсем корректно.

Да, эта проблема возникает и при перенаправлении стандартного ввода, и при использовании пайпов. Решение:
Код:
REQUIRE CORE_OF_REFILL  ~pinka/spf/fix-refill.f


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Муравьи
СообщениеДобавлено: Чт янв 12, 2012 20:02 
Не в сети

Зарегистрирован: Сб янв 07, 2012 12:33
Сообщения: 5
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
spf писал(а):
Да, эта проблема возникает и при перенаправлении стандартного ввода, и при использовании пайпов. Решение:

Спасибо. А почему эта проблема не решена в основной ветке SPF?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Муравьи
СообщениеДобавлено: Пт янв 13, 2012 05:35 
HaronK писал(а):
А почему эта проблема не решена в основной ветке SPF?
Наверное, никто не заявлял до сих пор (а значит, никому не надо). На spf.sf.net работает багтрекер.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Муравьи
СообщениеДобавлено: Пт янв 13, 2012 11:09 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
spf писал(а):
HaronK писал(а):
Слово READ-LINE в реализации под Linux работает не совсем корректно.

Код:
REQUIRE CORE_OF_REFILL  ~pinka/spf/fix-refill.f

И эта виртуализация всего ввода/вывода ради одного только READ-LINE ?
Не проще реализовать READ-LINE в виде побайтного цикла?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Муравьи
СообщениеДобавлено: Сб янв 14, 2012 07:49 
Mihail писал(а):
И эта виртуализация всего ввода/вывода ради одного только READ-LINE ?
там буфферизация ввода, а не виртуализация.

Mihail писал(а):
Не проще реализовать READ-LINE в виде побайтного цикла?
Проще, но и на порядок медленней, наверное. Еще есть вариант через fgets из MSVCRT, но он непортабельный и вроде тоже медленней форт-реализации.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Проблемы с READ-LINE в LINUX
СообщениеДобавлено: Вс янв 15, 2012 11:16 
Не в сети
Moderator
Moderator
Аватара пользователя

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

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


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

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


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

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


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

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