Forth http://www.fforum.winglion.ru/ |
|
SREAD-LINE перестает видеть переводы строк http://www.fforum.winglion.ru/viewtopic.php?f=20&t=3072 |
Страница 1 из 2 |
Автор: | makrus [ Вс авг 02, 2015 15:59 ] |
Заголовок сообщения: | SREAD-LINE перестает видеть переводы строк |
Всем доброго дня. Столкнулся с тем что слово SREAD-LINE, с какого-то момента и по непонятным причинам перестает видеть символы перевода строк (crlf). Задачка для воспроизведения проблемы: Код: #( CLASSIC-TASK-#-CRLF-Count SingleInstance Time: 28 14 * * * * : CRLF-Count { \ countCRLF -- } ( a u -- ) BEGIN SREAD-LINE WHILE 2DROP countCRLF 1+ TO countCRLF REPEAT 2DROP 2DROP S" Количество найденных строк: " countCRLF N>S S+ CRON-LOG ; Action: S" c:\WINDOWS\Temp\TestFile2.txt" FILE \ 180000 строк, находит 13839 CRLF-Count S" c:\WINDOWS\Temp\TestFile.txt" FILE \ 180000 строк, находит 13817 CRLF-Count )# В логе появляется две строки: Код: 2015 02 Aug 14:28:00 4816- Количество найденных строк: 13839 2015 02 Aug 14:28:00 4816- Количество найденных строк: 13817 Файлы TestFile.txt и TestFile2.txt можно взять тут, либо сделать самим по аналогии. Воспроизведение 100% на 2х машинах с XP и Win7. Само слово SREAD-LINE несложное, нашел в исходниках в файле ../cron\install.f Код: : SREAD-LINE ( a u -- a1 u1 a2 u2 ?) DUP IF 2DUP CRLF SEARCH 0= IF 2DROP 2DUP + 0 2SWAP ELSE 2DUP 2>R NIP - 2R> 2 /STRING 2SWAP THEN TRUE ELSE 2DUP FALSE THEN ; и подозреваю что корни проблемы уходят к SEARCH, которое тоже есть в исходниках в файле ..\SPF3_75\Src\spf314.f (исходники SPF 3.75) Код: CODE SEARCH ( c-addr1 u1 c-addr2 u2 -- c-addr3 u3 flag ) \ 94 STRING \ Произвести поиск в строке, заданной c-addr1 u1, строки, заданной c-addr2 u2. \ Если флаг "истина", совпадение найдено по адресу c-addr3 с оставшимися u3 \ символами. Если флаг "ложь", совпадения не найдено, и c-addr3 есть c-addr1, \ и u3 есть u1. PUSH EDI CLD MOV EBX, [EBP] OR EBX, EBX JZ @@5 MOV EDX, 8 [EBP] MOV EDI, 0C [EBP] ADD EDX, EDI @@4: MOV ESI, 4 [EBP] LODS BYTE MOV ECX, EDX SUB ECX, EDI JCXZ @@1 REPNZ SCAS BYTE JNZ @@1 \ во всей строке нет первого символа искомой строки CMP EBX, # 1 JZ @@2 \ искомая строка имела длину 1 и найдена MOV ECX, EBX DEC ECX MOV EAX, EDX SUB EAX, EDI CMP EAX, ECX JC @@1 \ остаток строки короче искомой строки PUSH EDI REPZ CMPS BYTE POP EDI JNZ @@4 @@2: DEC EDI \ нашли полное совпадение SUB EDX, EDI MOV 0C [EBP], EDI MOV 8 [EBP], EDX @@5: MOV EAX, # -1 JMP @@3 @@1: XOR EAX, EAX @@3: ADD EBP, # 4 MOV [EBP], EAX POP EDI RET END-CODE Но поскольку мои познания ассемблера чуть больше чем равны нулю, то капнуть глубже уже не могу. На всякий случай привожу определение слова /STRING из ..\SPF3_75\INCLUDE\STRING.F Код: : /STRING ( c-addr1 u n -- c-addr2 u2 ) \ 94 STRING \ Укоротить строку символов по адресу c-addr1 на n символов. Результирующая \ строка символов, заданная c-addr2 u2, начинается с c-addr1 плюс n символов и \ длиной u1 минус n символов. >R R@ - SWAP R> + SWAP ; и слова CRLF из ..\nnLib\lib\subst1.f Код: CREATE <CRLF> 13 C, 10 C, : CRLF <CRLF> 2 ; Прошу попробовать воспроизвести у себя и если проблема не во мне, то объяснить почему так происходит и как добиться нормальной работы этого слова. |
Автор: | gudleifr [ Вс авг 02, 2015 16:58 ] |
Заголовок сообщения: | Re: SREAD-LINE перестает видеть переводы строк |
Ну, как бы, приведенные Вами листинги не позволяют утверждать, что ошибка именно там, где Вы ее ищете. Она может быть и в считывании (буферизации) файла, и в необнулении/переполнении переменных, и в форматировании ответа. (Наводит на мысли: 2 в 16-й примерно равно числу-строк минус ответ). И, в общем-то, по официальному местному мнению, FORTH позволяет локализовать ошибку гораздо точнее. |
Автор: | Hishnik [ Вс авг 02, 2015 19:34 ] |
Заголовок сообщения: | Re: SREAD-LINE перестает видеть переводы строк |
А не пропускает ли он только пустые строки (в которых только CRLF)? Что он посчитает для файла, у которого в одной строке один символ, в другой ничего, а в третьей - символ, но нет CRLF? |
Автор: | VoidVolker [ Пн авг 03, 2015 00:22 ] |
Заголовок сообщения: | Re: SREAD-LINE перестает видеть переводы строк |
Для начала надо убедиться, что все переводы строк виндовые, а юниксовые. Во-вторых: для работы со строками есть отличный плагин read-by-line.spf. А в третьих, если надо просто подсчитать количество строк в файле, то надо просто использовать цикл с SEARCH и счетчиком. |
Автор: | makrus [ Пн авг 03, 2015 14:41 ] |
Заголовок сообщения: | Re: SREAD-LINE перестает видеть переводы строк |
Спасибо всем откликнувшимся. Коллеги, обращаю ваше внимание, что первое что я прошу - проверить воспроизводится ли у вас данная проблема. VoidVolker, думаю тебе это будет точно не сложно, т.к. крон у тебя, по идее, должен стоять. Просьба по прежнему в силе gudleifr, листинг тестовой задачи я привел для упрощения и "стандартизации" проверки воспроизводимости данной проблемы. Листинги слов - для того что бы облегчить Вам оказание мне помощи. Все источники возникновения данной проблемы я, насколько мне позволяют мои знания, уже отсеял, и локализовал как смог - дальше сам не могу, поэтому и обращаюсь за помощью к тем кто в этом лучше меня разбирается. Hishnik, из моей, далеко не разовой практики использования этого слова, оно вполне корректно делает то, что требуется - за каждый проход выдает au-строку между двумя символами перевода строк. Если между двумя символами перевода строк нет других символов, то au-строка будет нулевой длины. VoidVolker. 1. Все переводы строки в обоих тестовых файлах - виндовые. Оба файла сгенерированы специально для локализации данной ошибки - каждая строка представляет собой результат от Код: 1000000 RANDOM N>S 2. Да, плагин отличный, но постепенно перешел от построкового чтения из файла к построковому чтению из памяти (если объем свободной оперативки позволяет) 3. Нет, нужна обработка каждой полученной строки. |
Автор: | gudleifr [ Пн авг 03, 2015 15:07 ] |
Заголовок сообщения: | Re: SREAD-LINE перестает видеть переводы строк |
makrus писал(а): Все источники возникновения данной проблемы я, насколько мне позволяют мои знания, уже отсеял Значит, начинаем с нуля:0. Обнуляются ли локальные переменные? 1. Выводит ли в принципе Ваша процедура вывода число 80000? 2. Открывается ли вообще файл для чтения? 3. Какая строка считывается из файла последней? 4. Что будет, если считать каждую десятую строку? Не потому "это все раньше нормально работало", а тупо вбить контрольные выводы! |
Автор: | VoidVolker [ Пн авг 03, 2015 17:08 ] |
Заголовок сообщения: | Re: SREAD-LINE перестает видеть переводы строк |
makrus писал(а): Все переводы строки в обоих тестовых файлах - виндовые. Оба файла сгенерированы специально для локализации данной ошибки - каждая строка представляет собой результат от Код: 1000000 RANDOM N>S А откуда тогда уверенность в том, что в этом файле с рандомным набором чисел именно 18000 строк и именно с 0x0D0A? И откуда там вообще возмутся переводы строк, если содержимое одни только числа диапазона 48-57? Код: 0 VALUE buf 18000 2* VALUE /buf : crlfCounterTest /buf CELL+ ALLOCATE THROW TO buf buf /buf + buf DO 0x0D I C! 0x0A I 1+ C! 2 +LOOP buf /buf S" C:\crlf.txt" FWRITE 0 S" C:\crlf.txt" FILE OVER + SWAP DO I C@ 0x0D = I 1+ C@ 0x0A = AND IF 1+ THEN LOOP ." 0x0D0A counted: " . CR ; Код: crlfCounterTest 0x0D0A counted: 18000 Код: S" C:\crlf.txt" FILE CRLF-Count
16:10:37 1932 Количество найденных строк: 18000 |
Автор: | makrus [ Вт авг 04, 2015 02:11 ] |
Заголовок сообщения: | Re: SREAD-LINE перестает видеть переводы строк |
Мне уже становится интересно, кто же будет ТОТ, кто первым ответит на мой первый вопрос - воспроизводится или нет? gudleifr 0. Про какие локальные переменные идет речь, кроме как в слове CRLF-Count они вроде нигде не используются, а в этом слове она одна и нужна для подсчета. Если намек на повторное использование этого слова в пределах одной задачи, то насколько я знаю, при повторном вызове одного слова они "обнуляются" (а фактически каждый вызов слова работает со своими локальными переменными), но в конкретно данном случае - это не важно, т.к. при своих первоначальных тестах этой задачи, я за каждый запуск задачи обрабатывал только один файл, результаты были те же. 1. Что подразумевается под "моей процедурой вывода"? Что выведет строка S" Количество найденных строк: " 80000 N>S S+ CRON-LOG ? Проверил, вывела 2015 04 Aug 00:11:03 14292- Количество найденных строк: 80000 Все в порядке? 2. Открывается, после прочтения файла в память его последующее сохранение в другой файл дает полную копию прочитанного 3. Строка №13817 в файле "TestFile.txt" содержит строку "243154" Строка №13839 в файле "TestFile2.txt" содержит строку "693725" 4. Завтра, ну т.е. сегодня , но по-позже доработаю задачку, проверю. Просьба сразу сообщить кратность каким числам еще надо будет проверять? VoidVolker Цитата: А откуда тогда уверенность в том, что в этом файле с рандомным набором чисел именно 18000 строк и именно с 0x0D0A? И откуда там вообще возмутся переводы строк, если содержимое одни только числа диапазона 48-57? По-моему ты торопишься!!! Давай начнем с самого начала - откуда вообще берется файл, да еще с 180 тыс. строк, если показана одна строка без какого-либо сохранения в файл?! Ну, а если серьезно, то я же говорил, что эти файлы созданы специально, специально добавлены в конце каждой строки виндовые переводы строк, после этого строка сохранялась в файл и таким образом в этих файлах содержится по 180 тыс. строк. Цитата: ...только числа диапазона 48-57 что это значит - не понял О, код! Проверил у себя, результат тот же - 18 тыс. строк. Попробуй увеличить их количество в 6 раз (объем прочитанных строк, как мне кажется, каким-то образом влияет на их максимальное количество). Я сделал это, в твоем слове, вот так: Код: 18000 6 * 2* VALUE /buf и получил следующий результатКод: 2015 04 Aug 00:41:00 15624- Количество найденных строк: 9697 Переполнение счетчика? |
Автор: | VoidVolker [ Вт авг 04, 2015 08:38 ] |
Заголовок сообщения: | Re: SREAD-LINE перестает видеть переводы строк |
makrus писал(а): По-моему ты торопишься!!! Давай начнем с самого начала - откуда вообще берется файл, да еще с 180 тыс. строк, если показана одна строка без какого-либо сохранения в файл?! Ну, а если серьезно, то я же говорил, что эти файлы созданы специально, специально добавлены в конце каждой строки виндовые переводы строк, после этого строка сохранялась в файл и таким образом в этих файлах содержится по 180 тыс. строк. Предлагаю немножко распутать узелок логики. 1. Создается некий файл, при этом утверждается, что его содержимое известно со 100% точностью. 2. Файл считывается и проверяется его содержимое (код 2). 3. Результат не соответствует ожиданиям. Так? Так. Так вот. Я сделал то же самое - код выше. И проверил каждый этап. На файле из моего кода (код 2) результат проверки содержимого совпадает в обоих случаях (два разных кода - а результат один). Какой из этого можно сделать вывод? Файл создается невалидным. Следовательно, надо проверять код создания файла, а так же проверять содержимое файла третьим инструментом. makrus писал(а): что это значит - не понял Код: CHAR 0 . 48 CHAR 9 . 57 Т.е., код, вида Код: 1000000 RANDOM N>S Выдает строку с числами данного диапазона (с бинарной точки зрения на строку). makrus писал(а): Попробуй увеличить их количество в 6 раз (объем прочитанных строк, как мне кажется, каким-то образом влияет на их максимальное количество). Я сделал это, в твоем слове, вот так: Код: 2015 04 Aug 00:41:00 15624- Количество найденных строк: 9697 А где второй результат? И где сам файл? Код: 1800000 2* VALUE /buf ... crlfCounterTest 0x0D0A counted: 1800000 makrus писал(а): Переполнение счетчика? Какого счетчика? Крон - 32 битный. Переполнение 32 битного счетчика происходит на числе 2147483647. Кроме того, крон может использовать числа двойной длины. makrus писал(а): Про какие локальные переменные идет речь, кроме как в слове CRLF-Count они вроде нигде не используются, а в этом слове она одна и нужна для подсчета. Если намек на повторное использование этого слова в пределах одной задачи, то насколько я знаю, при повторном вызове одного слова они "обнуляются" (а фактически каждый вызов слова работает со своими локальными переменными), но в конкретно данном случае - это не важно, т.к. при своих первоначальных тестах этой задачи, я за каждый запуск задачи обрабатывал только один файл, результаты были те же. В СПФ (а значит в кроне) для локальных перменых используется стек возвратов и они всегда инициализируются нулем. |
Автор: | gudleifr [ Вт авг 04, 2015 09:59 ] |
Заголовок сообщения: | Re: SREAD-LINE перестает видеть переводы строк |
makrus писал(а): т.к. при своих первоначальных тестах этой задачи, я за каждый запуск задачи обрабатывал только один файл, результаты были те же. Это не важно, FORTH-специфика работы с памятью часто дает воспроизводимый мусор. makrus писал(а): Строка №13817 в файле "TestFile.txt" содержит строку "243154" Это ваша программа выдала? Или в файле посмотрели? Размер "считанной части" примерно 100kb. Вроде, "ни о чем", тем более, Вы говорите, файл нормально влезает целиком. Что дает положение этой строки в памяти (относительно других блоков?).Строка №13839 в файле "TestFile2.txt" содержит строку "693725" makrus писал(а): доработаю задачку, проверю. Раз Вы подтвердили, что точная точка останова определена, уже не надо. Поиграть имеет смысл с другими размерами файлов. Например, не 80000, а только 40000. Другими числами - убрать по цифре из первого десятка-сотни слов.P.S. Дело не в том, что мои "рецепты" к чему-то ведут, а к тому, что я пытаюсь Вас заставить посмотреть на код "с другой стороны". Проверяйте все, что придет в голову. |
Автор: | makrus [ Вт авг 04, 2015 16:57 ] |
Заголовок сообщения: | Re: SREAD-LINE перестает видеть переводы строк |
VoidVolker Цитата: Я сделал то же самое - код выше. Нет, твой код только считает найденные символы перевода строк, к данным между ними он доступа не предоставляет, а о том что он мне нужен - я говорил.Цитата: На файле из моего кода (код 2) результат проверки содержимого совпадает в обоих случаях (два разных кода - а результат один). Какой из этого можно сделать вывод? Файл создается невалидным. Из этого можно сделать два вывода, оба про невалидность файла:- твой вывод, что мои файлы невалидны - мой вывод, что твой файл невалиден, потому что мне не нужен правильный файл что бы на нем SREAD-LINE работало нормально, мне надо, что бы это слово нормально работало на всех файлах, в том числе и на моих. Я все никак не могу понять, что мешает тебе скачать два файлика, добавить в кронтаб задачу, подкорректировать пути к скаченным файлам, запустить ее и сообщить результат: совпадает с моим, не совпадает с моим но считает не все строки, считает все строки. А уже после этого можно логически искать ошибку дальше: в файлах, в моих кронах, в SREAD-LINE или еще где... А сейчас получается ты мне доказываешь что я неправильные файлы делаю, что на мой взгляд выглядит немного странно. Касательно правильности файлов и проверки содержимого третьими инструментами - у меня таким инструментов выступает известный тебе SciTE. Открыв в нем оба эти файла, перейдя на последнюю строку слева я вижу его номер 180 000, перевод строки настроен виндовый. Цитата: Выдает строку с числами данного диапазона (с бинарной точки зрения на строку). угу, теперь понял, что имелся ввиду диапазон кодов чисел, спс.Цитата: Какого счетчика? Крон - 32 битный. Переполнение 32 битного счетчика происходит на числе 2147483647. Кроме того, крон может использовать числа двойной длины. Угу, все верно, но другого объяснения появления в логе этого числа я навскидку придумать не смог.gudleifr Цитата: Это не важно, FORTH-специфика работы с памятью часто дает воспроизводимый мусор. В данном случае важно, т.к. меняя файлы для запуска я комментировал одну строку и раскомментировал вторую с последующим сохранением кронтаба и, самое главное, перечитыванием кронтабов кроном, при этом обнуляются вообще ВСЕ переменные, не говоря уже об локальных.Цитата: Это ваша программа выдала? Или в файле посмотрели? Нет, открыв в текстовом редакторе эти файлы и перейдя на соответствующие, по номеру, строки я скопировал их содержимое.Цитата: Что дает положение этой строки в памяти (относительно других блоков?). Если я правильно понял суть этого вопроса, то скажу следующее - у меня есть неподтвержденные пока догадки, что переводы строк перестают видеться после прочтения определенного объема данных в строках. То что в этих двух файлах SREAD-LINE "слепнет" на разных по счету строках можно объяснить тем, что файлы с рандомной длиной строки и не все строки строго длиной 6 байт, есть и меньше.Сделаю еще подобные файлы гарантированной длины в 6 байт и проверю на них - на каких по счету строках это слово будет "слепнуть". Цитата: Раз Вы подтвердили, что точная точка останова определена, уже не надо. Поиграть имеет смысл с другими размерами файлов. Например, не 80000, а только 40000. Другими числами - убрать по цифре из первого десятка-сотни слов. Боюсь, тут надо уже посмотреть на определение слова SEARCH с точки зрения использования им памяти при многократных (десятки тысяч) вызовах в цикле - может там используется область памяти кодофайла (который ограничен в кроне) или еще что-то из области работы с памятью. Жаль для меня все еще и ассемблер и использование Фортом памяти - слабо освоенные области |
Автор: | gudleifr [ Вт авг 04, 2015 17:31 ] |
Заголовок сообщения: | Re: SREAD-LINE перестает видеть переводы строк |
makrus писал(а): Нет, открыв в текстовом редакторе Значит, никакой гарантии, что программа остановилась именно на этой строке, у нас нет. Нужно проверять. И, в случае неудачи - "каждый десятый".makrus писал(а): у меня есть неподтвержденные пока догадки, что переводы строк перестают видеться после прочтения определенного объема данных в строках. Логично. Первая версия - что-то где-то переполняется.makrus писал(а): То что в этих двух файлах SREAD-LINE "слепнет" на разных по счету строках можно объяснить тем, что файлы с рандомной длиной строки и не все строки строго длиной 6 байт, есть и меньше. Тоже логично.makrus писал(а): Боюсь, тут надо уже посмотреть на определение слова SEARCH с точки зрения использования им памяти при многократных (десятки тысяч) вызовах в цикле Пока рано.
|
Автор: | VoidVolker [ Вт авг 04, 2015 20:44 ] |
Заголовок сообщения: | Re: SREAD-LINE перестает видеть переводы строк |
makrus писал(а): Я все никак не могу понять, что мешает тебе скачать два файлика, добавить в кронтаб задачу, подкорректировать пути к скаченным файлам, запустить ее и сообщить результат: совпадает с моим, не совпадает с моим но считает не все строки, считает все строки. Дык а ссылка-то где на файлы? Давно бы уже скачал их. |
Автор: | makrus [ Вт авг 04, 2015 21:26 ] |
Заголовок сообщения: | Re: SREAD-LINE перестает видеть переводы строк |
VoidVolker писал(а): makrus писал(а): Я все никак не могу понять, что мешает тебе скачать два файлика, добавить в кронтаб задачу, подкорректировать пути к скаченным файлам, запустить ее и сообщить результат: совпадает с моим, не совпадает с моим но считает не все строки, считает все строки. Дык а ссылка-то где на файлы? Давно бы уже скачал их. Да в первом же сообщении... Цитата: ... Файлы TestFile.txt и TestFile2.txt можно взять тут, либо сделать самим по аналогии. Воспроизведение 100% на 2х машинах с XP и Win7. ... "тут" ссылка на http://rghost.net/69hZMtdnc |
Автор: | VoidVolker [ Ср авг 05, 2015 12:02 ] |
Заголовок сообщения: | Re: SREAD-LINE перестает видеть переводы строк |
Ааа, так вот они где. Подчеркивания у ссылки нет - вот и не заметил. |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |