for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Л и с о в о д ы   в с е х   с т р а н,  о б ъ е д и н я й т е с ь !!!  

Список Форумов  :: Visual Foxpro, Foxpro for DOS
   :: Помощь сайту :: 

ADIR, глюк с маской "?"
of63
Автор

Сообщений: 12481
Откуда: Н.Новгород
Дата: 12.03.18 15:39:05ОтветитьЦитировать
ADIR, поиск по маске. Странно фокс интерпретирует символ "?":
  
  ? ADIR(AAA, "C:\Windows\WIN?.INI")  && найден 1, хотя нет такого файла "WINx", где x - любой символ  
  ? AAA[1,1]  && найден файл WIN.INI. SYS(2000) тоже найдет его же.  
  ? LIKE("WIN?.INI", "WIN.INI")  && т.е. сам фокс эту маску "?" понимает как символ  
В хелпе ADIR написано: Знак вопроса - означает один любой допустимый символ
В интернетах типа ответы армянского радир майлару пишут, что ? - это 1 символ или отсутствие символа...
В MS про FindFirstFile пишут ... ничего не пишут (The file name can include wildcard characters, for example, an asterisk (*) or a question mark (?).)

Предположение, что "имя файла внутри ОС дополнено пробелами" показало:
  
  ? adir(AAA, "C:\Windows\WIN"+REPLICATE("?",237)+".INI")  && 1  
  ? adir(AAA, "C:\Windows\WIN"+REPLICATE("?",238)+".INI")  && 0

Кому верить, и что делать?
Ratings: 0 negative/0 positive

Re: ADIR, глюк с маской "?"
Igor Korolyov

Сообщений: 32168
Дата: 12.03.18 17:07:15ОтветитьЦитировать
Это так и задумано. Обычная команда dir следует тем же правилам.
Фоксовый LIKE тут вообще не при делах - он не имена объектов файловой системы "сравнивает".
ss64.com
Возможно тут более красиво описано то же самое
www.dostips.com

Не совсем очевиден и момент с именами 8.3 - т.к. dir (и фоксовый ADIR и АПИ FindFirstFile - это суть одно и то же) проверяет ОБА имени (если на томе не запрещены 8.3 имена, конечно)
STRTOFILE("","a.log")  
  STRTOFILE("","a.logging")  
  STRTOFILE("","a.logfile")  
  ? ADIR(laFiles, "*.log")  
  DISP MEMO LIKE laFiles
находит все 3 файла, хотя расширение log вроде бы только у одного из них Но если посмотреть на "короткие имена" - скажем добавить параметры ,"",2) к ADIR, то всё становится ясно.
P.S. Для совсем плохо понимающих буржуйску мову. "Вопросик" может соответствовать "нулю символов" только если эти "ноль символов" будут в конце имени, либо перед точкой. Т.е. в точности твой случай. Ну и "win?.ini?" тоже "сработает".


------------------
WBR, Igor




Исправлено: Igor Korolyov, 12.03.18 17:11
Ratings: 0 negative/0 positive

Re: ADIR, глюк с маской "?"
of63
Автор

Сообщений: 12481
Откуда: Н.Новгород
Дата: 12.03.18 17:34:14ОтветитьЦитировать
Из первой ссылки понятно и на мове ("on the move" по-буржуйски). Непонятно к чему она относится, к ОСи вобщем. Вторую ссылку вообще не осилил, слишком красивая, наверное )

Wildcards
The * wildcard will match any sequence of characters
(0 or more, including NULL characters)

The ? wildcard will match a single character
(or a NULL at the end of a filename)

PS. Игорь, не сомневался, что интернет ты знаешь наизусть. Как нам его отключат, то надежда только на тебя!
Ratings: 0 negative/0 positive

Re: ADIR, глюк с маской "?"
Igor Korolyov

Сообщений: 32168
Дата: 12.03.18 20:52:18ОтветитьЦитировать
Нет, я просто умею в нём искать нужное. Честно говоря до твоего вопроса даже не задумывался о таких штуках, и не знал что оно так хитрО работает
Хотя гугл и Ко с каждым днём делает это занятие всё более и более сложным Слишком много "мусора" и пропихивания наверх туфты вместо реально полезных сайтов...
По 2 ссылке 9-е сообщение (синим выделен заголовок) - вроде как внятно описаны "все правила в окончательном виде".


------------------
WBR, Igor
Ratings: 0 negative/0 positive

о %1=0 EMPTY и ROUND
of63
Автор

Сообщений: 12481
Откуда: Н.Новгород
Дата: 23.05.18 09:12:05ОтветитьЦитировать
Навеяло соседним постом от Simple777 о глюках APPEND FROM. О глюках:
  
  ? 1.00001%1=0       && F - как и ожидается  
  ? 1.000001%1=0      && F - тоже правильно  
  ? 1.000000000000001%1=0  && F - и даже на пределе точности (16 знаков) тоже правильно (при дальнейшем уменьшении дробной части уже будет T, что неправильно ...)  
    
 * и в то же время:  
  ? VAL("1.00001")%1=0  && F  
  ? VAL("1.000001")%1=0 && T - всего 7 значащих разрядов, и ожидаемое неравенство нарушилось!
  ? EMPTY(VAL("1.000001")%1)  && F - а здесь правильно. Т.е. EMPTY сработал правильно, а =0 - неправильно!
    
 * значения в обоих случаях (с VAL и без) вроде бы адекватные и "одинаковые"  
  ? STR(     1.000001,   14,12)  && 1.000001000000  
  ? STR(VAL("1.000001"), 14,12)  && 1.000001000000  
    
 * Интересно, что ROUND до >6 знаков исправляет ситуацию, хотя вроде бы исходных знаков-то всего 6, и фокс это "знает":  
  ? VAL("1.000001")%1=0  && T - неверно  
  ? ROUND(VAL("1.000001"),12)%1=0  && F - верно! Странно, но ROUND до 12 знаков исправил ситуацию с 7ми значным числом  
Эффект проявляется, например, при приеме числовых данных из текстовых файлов, и при чтении Value ячейки Экселя, в которой может быть число, или его символьное представление в зависимости от форматирования ячейки. Без ROUND можно получить разные представления о том целое число в ячейке, или нечто дробное...



Исправлено: of63, 23.05.18 10:00
Ratings: 0 negative/0 positive

Re: ADIR, глюк с маской "?"
Simple777

Сообщений: 20385
Дата: 23.05.18 09:30:59ОтветитьЦитировать
Вообще таких глюков немеряно.

Вот вчера, например. Делаю APPEND BLANK в свободной таблице и заполняю часть полей по команде REPLACE. Потом переключаюсь в другую рабочую область и там делаю перемещения по таблице. С исходной таблицей связей нет. Считываю значение поля в переменную, возвращаюсь в исходную таблицу и выполняю REPLACE для одного поля (занести значение из переменной). Не заносится. :al: Оказывается, указатель стоит на EOF(). Пришлось перед REPLACE выполнить команду GO BOTTOM. Спрашивается - почему так?

Это было в FPD 2.6 Исходная таблица была без индексов.



Исправлено: Simple777, 23.05.18 09:33
Ratings: 0 negative/0 positive

Re: ADIR, глюк с маской "?"
of63
Автор

Сообщений: 12481
Откуда: Н.Новгород
Дата: 23.05.18 09:46:58ОтветитьЦитировать
Криминальный глюк, если это не просто программная ошибка. надо делать контрольный пример, но обычно лень, понятное дело. Сначала подпирается костылем, "это нормально" )

Кстати, у тебя в посте тоже английские слова вперемешку с русскими... Не все смогут прочитать



Исправлено: of63, 23.05.18 09:48
Ratings: 0 negative/0 positive

Re: ADIR, глюк с маской "?"
Simple777

Сообщений: 20385
Дата: 23.05.18 10:13:12ОтветитьЦитировать
of63
Криминальный глюк


Никакой программной ошибки там нету. Простенькая прога лазит по двум свободным не связанным между собой таблицам, да еще и без индексов. \m/


Глюк + Гендель = Бах :bodr:
Ratings: 0 negative/0 positive

Re: о %1=0 EMPTY и ROUND
Igor Korolyov

Сообщений: 32168
Дата: 23.05.18 12:40:20ОтветитьЦитировать
of63
* и в то же время:
? VAL("1.00001")%1=0  && F  
  ? VAL("1.000001")%1=0 && T - всего 7 значащих разрядов, и ожидаемое неравенство нарушилось!

? VAL("1.000001")%1=0.000  
 * или  
  SET DECIMALS TO 3  
  ? VAL("1.000001")%1=0

"Ожидаемое" - лишь для некомпьютерных математиков да бухгалтеров, программист, понимая как именно представляются числа в памяти уже не будет называть это "глюком" - это просто сложное поведение для "ограничено-точных" чисел (вдвойне сложное в фоксе, с его "неявными" форматированиями/округлениями результатов выражений).

of63
* Интересно, что ROUND до >6 знаков исправляет ситуацию, хотя вроде бы исходных знаков-то всего 6, и фокс это "знает":
Нет, не знает! Когда ты пишешь в коде числовой литерал 1.000001 - да, тогда он "знает" что это число с 6-ю знаками после запятой, и проводя вычисления эту информацию использует (результатом вычисления арифметического выражения является не только само число, но ещё и его "формат отображения", который влияет на то как именно ? и некоторые другие команды/функции будут "визуализировать" это самое число). Когда ты используешь VAL то из разбираемой строки никаких форматов не берётся - берётся, видимо, из SET DECIMAL.
Ну а то что = работает не так как empty - это тоже не глюк, а нюанс/фича. В конце концов не удивляет же "странная" работа = для строк Или то что пустая строка и строка с пробелами (формально совсем не пустая) таки EMPTY()


------------------
WBR, Igor
Ratings: 0 negative/0 positive

Re: ADIR, глюк с маской "?"
Sawradym

Сообщений: 1870
Откуда: Винница
Дата: 23.05.18 12:42:51ОтветитьЦитировать
Simple777
Вообще таких глюков немеряно.
Вот вчера, например. Делаю APPEND BLANK в свободной таблице и заполняю часть полей по команде REPLACE. Потом переключаюсь в другую рабочую область и там делаю перемещения по таблице. С исходной таблицей связей нет. Считываю значение поля в переменную, возвращаюсь в исходную таблицу и выполняю REPLACE для одного поля (занести значение из переменной). Не заносится. :al: Оказывается, указатель стоит на EOF(). Пришлось перед REPLACE выполнить команду GO BOTTOM. Спрашивается - почему так?

Это было в FPD 2.6 Исходная таблица была без индексов.

Ни разу с подобным не встречался, вернее встречался, но всегда оказывалось что указатель в EOF() сам и передвигал. Боюсь что здесь тот же случай. Чертей не бывает.


------------------
Ratings: 0 negative/0 positive

Re: ADIR, глюк с маской "?"
Simple777

Сообщений: 20385
Дата: 23.05.18 13:18:43ОтветитьЦитировать
Sawradym
Ни разу с подобным не встречался, вернее встречался, но всегда оказывалось что указатель в EOF() сам и передвигал. Боюсь что здесь тот же случай. Чертей не бывает.

Еще как бывает. Я и в отладке проверял. Когда возвращаюсь в исходную таблицу, она стоит на EOF().
Код простейший без макросов и прочих "наворотов". Иногда, кстати, бывает необходимо выполнить команду go recno(), а то иначе тоже хрень какая-то. В общем, иногда после возврата в исходную рабочую область что-то с указателем записей происходит.
Ratings: 0 negative/0 positive

глюк с Value%1=0 (Double)
of63
Автор

Сообщений: 12481
Откуда: Н.Новгород
Дата: 23.05.18 13:31:46ОтветитьЦитировать
> "Ожидаемое" - лишь для некомпьютерных математиков да бухгалтеров, программист [же] ...не будет называть это "глюком"
Название не важно - глюк, фича, нюанс - это не обьяснение. Также не обьяснение, что числа в фоксе хранятся в Double. Я читал про формат Double. Но отсылка "читай про Double" ничего не обьясняет. Она не обьясняет КАК ФОКС превращает строку в Double в операторе X=VAL("1.001"), и как в операторе X=1.001, и в чем разница. И как TRANSFORM интерпретирует эти два разных X

Пример с TRANSFORM:
  
  x = 1.001  
  ? TRANSFORM(x)  && 1.001 - видимо фокс "запомнил" формат X  
  x = VAL("1.001")  
  ? TRANSFORM(x)  && 1 - "формат" X не найден, SET DECIMAL 2 сработал, TRANS() округлил. Видимо VAL не записывает "формат" в X, а мог бы...

> Ну а то, что = работает не так как empty - это тоже не глюк, а нюанс/фича. В конце концов не удивляет же "странная" работа = для строк
Опять малозначительные термины не нравятся... Ничего меня давно не удивляет (даже когда дети вырывают кишки у многодетной матери в Псебае). Когда нарываюсь на глюк/фичу/нюанс (нужное подчеркнуть), то провожу эксперименты, и делаю костыль согласно их результатам. Попутными мыслями же делюсь от скуки, для общения, не более.

Пример с Empty(" "+CHR(13)+CHR(9)) (.T.) "не удивляет", потому что это его штатное поведение, придуманное еще в первых ФПД, отрекламированное в первой книжице по фоксу, что де "теперь тип нам не важен при определении пустоты", гы-гы.

Странная работа = не может вообще удивлять, потому что представляю строки как набор байтов, и абстрактный процессорный оператор сравнения, который синхронно "бежит" по обоим строкам и сравнивает байты (остановка по # и по SET EXACT). Вообще, программирование - это умение поставить себя на место процессора (не в аппаратном смысле, а в смысле ЯП) и "пройти" команды по шакам в уме, мтк.

А вот, например, "АБВ "="абв" (.T.) должен скорее удивлять любителей SET COLLATE TO machine, а вот у фанатов SET COLLATE TO russian на этом половина строчных функция расчитывает
Ratings: 0 negative/0 positive

Re: глюк с Value%1=0 (Double)
Igor Korolyov

Сообщений: 32168
Дата: 23.05.18 14:48:59ОтветитьЦитировать
of63
Она не обьясняет КАК ФОКС превращает строку в Double в операторе X=VAL("1.001"), и как в операторе X=1.001, и в чем разница. И как TRANSFORM интерпретирует эти два разных X

В double то они одинаково "превращаются" (хотя первое во время исполнения - из "строки" прошитой как в исходном, так и в исполняемом/объектном/откомпилированном коде, а второе - на этапе компиляции, из строки aka литерала имеющегося только в исходнике - в объектном коде уже будет НЕ 1.001 а то самое double, ПЛЮС "формат отображения").

www.foxclub.ru

Структура Value. Для числовых значений помимо самого "значения" в ev_real хранятся "ширина" и "число десятичных знаков" в полях ev_width и ev_length соответственно.
В фоксе не бывает вещественных числовых значений без этих самых двух "дополнений". Даже для Integer (целочисленных) значений и то фокс хранит "ширину". Так что VAL записывает и "ширину" и "точность" - но не из обработанных парсером данных, а из настроек среды. Хотя парсер - тот кто преобразуем "символы циферок" в одно общее значение - всё же влияет на этот процесс. Т.к.
? VAL("1e20")  
  ? VAL("100000000000000000000")
Выглядят таки по разному, при том что "внутри" числа хранятся одинаковые.


------------------
WBR, Igor




Исправлено: Igor Korolyov, 23.05.18 14:49
Ratings: 0 negative/0 positive

Re: ADIR, глюк с маской "?"
akvvohinc

Сообщений: 2812
Откуда: Москва
Дата: 23.05.18 16:41:54ОтветитьЦитировать
Simple777
Еще как бывает. Я и в отладке проверял. Когда возвращаюсь в исходную таблицу, она стоит на EOF().
Код простейший без макросов и прочих "наворотов".

Без примера не верю.
В EOF() переводит указатель что-то реальное, что ты не видишь или не знаешь, а не черти.
И если ты проверял в отладке, то не мог не заметить, после какой именно команды указатель переходит в EOF().
Из твоих слов следует, что после SELECT.
Ratings: 0 negative/0 positive

Re: ADIR, глюк с маской "?"
Simple777

Сообщений: 20385
Дата: 23.05.18 17:21:43ОтветитьЦитировать
akvvohinc
Без примера не верю.

Вот до чего же народ недоверчивый пошел.

Уже ведь и комп выключил. Пришлось включать.

Создал отдельную папку. Переписал туда одну *.prg и убрал GO BOTT в нескольких местах. Без этой команды все формируется корректно. Исходник не корректировал.

Какой отсюда вывод?

Получается, что никакой.


Когда был этот странный глюк, я несколько часов работал в сеансе FPD. Делал всякие разные вещи через командное окно. Потом выходил и запускал из FAR FPD 2.6 c запуском prg-модуля. Глюк воспроизводился. В результате одно важное символьное поле формировалось в некоторых записях пустое. То бишь это никак не могло мне "показаться". Когда именно появлялся EOF(), cейчас затрудняюсь сказать. Но после добавления команды GO BOTT все работало корректно.

Так что вот даже и не знаю, как такое возможно. Но это было - поле формировалось не во всех записях (были разные ветки), а исходник я не трогал больше. Правда, компьютер вчера перезагружать тоже не пробовал.



Исправлено: Simple777, 23.05.18 17:25
Ratings: 0 negative/0 positive

Re: ADIR, глюк с маской "?"
Sawradym

Сообщений: 1870
Откуда: Винница
Дата: 23.05.18 17:37:17ОтветитьЦитировать
Почему Go Bott, зачем Go Bott? По моему гораздо очевиднее сделать Select Replaced_Alias перед Replace и уже наплевать что там в других алиасах, конечно, если не подтягивать напрямую из других алиасов данные.


------------------
Ratings: 0 negative/0 positive

Re: ADIR, глюк с маской "?"
Igor Korolyov

Сообщений: 32168
Дата: 23.05.18 17:47:08ОтветитьЦитировать
Ну мало ли какие там ON KEY LABEL или ON ERROR могли сработать "посреди процесса", при том совершенно незаметно "нагадить" и вернуть управление обратно...
Без воспроизводимого примера это не глюк фокса, а глюк твоей программы. Такие дела...


------------------
WBR, Igor
Ratings: 0 negative/0 positive

Re: ADIR, глюк с маской "?"
Simple777

Сообщений: 20385
Дата: 23.05.18 18:02:40ОтветитьЦитировать
Да не использовал я никаких там хитрых настроек, и даже CONFIG.FP переписал тот же.

И вааще это была разовая конвертация данных. Так что было и прошло... [sm021] :danc: [sm128]
Ratings: 0 negative/0 positive

Re: ADIR, глюк с маской "?"
Simple777

Сообщений: 20385
Дата: 23.05.18 18:09:30ОтветитьЦитировать
Sawradym
Почему Go Bott, зачем Go Bott?

В данном частном случае указатель должен был находиться на последней записи. Поэтому даже нет резона сохранять номер записи - индексов тоже нет. И если указатель перешел почему-то на EOF(), то GO BOTT заведомо вернет указатель на последнюю запись, а именно на нее и надо было вернуться.
Ratings: 0 negative/0 positive

Re: ADIR, глюк с маской "?"
Simple777

Сообщений: 20385
Дата: 23.05.18 18:21:37ОтветитьЦитировать
А вот ресурсный файл я не копировал в новую папку. Возможно, что-то там в этом ресурсном файле - какой-то глюк был.
Ratings: 0 negative/0 positive



Извините, только зарегистрированные пользователи могут писать в этом форуме.

On-line: 43 Mitchman Simple777  and Guests: 41


© 2000-2018 Fox Club 
Яндекс.Метрика