:: Visual Foxpro, Foxpro for DOS
Re: Удаление лишних пробелов
Jlutko

Сообщений: 161
Откуда: Пермская область
Дата регистрации: 27.09.2005
Ну здесь Вы не правы.
Да, есть конкретная трабла... Да, я ее решил в рамках FoxPro...
Но есть понятие "обучение". И мне это интересно!
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
Jlutko

Сообщений: 161
Откуда: Пермская область
Дата регистрации: 27.09.2005
use32
push ebp
mov ebp, esp
push edi
push esi
push eax
push ebx
push ecx
push edx
mov esi, [ebp+08h]
mov eax, [ebp+0Ch]
mov edi, [ebp+10h]
mov ebx, [ebp+14h]
mov ecx, [ebx]
xor ebx, ebx
m2:
cmp al, [esi]
je m1
xor ah, ah
m5:
push dword [esi]
pop dword [edi]
inc esi
inc edi
inc ebx
dec ecx
jne m2
jmp m3
m1:
cmp ah, 01
je m4
inc ah
jmp m5
m4:
inc esi
dec ecx
jne m2
m3:
mov ecx, [ebp+14h]
mov [ecx], ebx
pop edx
pop ecx
pop ebx
pop eax
pop esi
pop edi
mov esp, ebp
pop ebp
ret 0010h
Обалдеть!..
Вспоинил свой первый комп... И первый драйвер, что печатал...
РЕСПЕКТ!
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
Igor Korolyov
Естественно это всё имеет чисто спортивный интерес, т.к. для типичных применений - "облагородить" ввод юзером весьма коротких строк-наименований - даже жутко неэффективный "цикл замены двух пробелов на один до достижения результата" вполне себе подойдёт
А вот ни фига и не спортивный, самый что ни на есть практический. Очистка данных перед загрузкой на sql сервер. Даже на моих не слишком больших объемах и то заметно.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Смотря каких данных... Если это строки (одно поле) по 100-200 символов с парой-тройкой "больших отступов", то даже чисто фоксовый цикл на 2-3 итерации исполнится этак раз в 10 быстрее чем собственно обращение к серверу для сохранения этой записи. И особо большого смысла в оптимизации я не вижу - при том что для эстетов есть reduce - наверняка не супер-оптимально написанный, но существенно быстрее фоксовой реализации.
Конечно, если это "Война и Мир", то имеет смысл озаботиться оптимизацией ассемблерного кода. И даже распараллеливанием работы, отказом от хранения всего содержимого одновременно в памяти (тем более два раза) и прочими нюансами...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
Jlutko

Сообщений: 161
Откуда: Пермская область
Дата регистрации: 27.09.2005
Абсолютно согласен!
Речь идет в выгрузке данных в "кликнт-банк" - Вполне осязаямоя задача.
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
leonid
Так кто ж мешает то? Заодно бы и сравнили. Может как раз все наоборот.

Ну как-то так, только сам алгоритм, без пролога и эпилога функции. У кого есть желание, переложите это в маш.коды для фокса и запилите тест на мегабайтных строках с длинными последовательностями пробелов и не-пробелов. Мне лень))

;на входе: в al пробел, ebx адрес начала результирующего буфера,
;ecx длина исходной строки в байтах, edi адрес начала исходной строки
cld
repe scasb
jz _Exit
_Loop:
mov esi,edi
repne scasb
push ecx
mov ecx,edi
jz _Label1
inc ecx
_Label1:
sub ecx,esi
dec esi
push edi
mov edi,ebx
rep movsb
mov ebx,edi
pop edi
pop ecx
jecxz _Exit
repe scasb
jz _Exit
mov [ebx],al
inc ebx
jmp _Loop
_Exit:



Исправлено 1 раз(а). Последнее : spinz, 13.01.18 14:33
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Я же говорю - BM, 4 сезон, 1 серия. [sm128]



Исправлено 1 раз(а). Последнее : Simple777, 13.01.18 14:53
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
of63
Автор

Сообщений: 25244
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Не знаю, о чем спор (о скорости выполнения? о нужности убирания лишних пробелов?), но бывает, что скорость особо не нужна, тогда решается на фоксе. Если надо побыстрее, то есть SYS(2600) - операции с байтами в памяти. И наконец на ассемблере, может с применением новых команд процессора (например, для управления гиперзвуковыми боеголовками в реальном времени на фоксе на штатовском бытовом проце и ОСи).

Вот тут делали похожее - перестановка байтов в строке forum.foxclub.ru
На всякий приложу заготовку для экспериментов из той ветки от leonid-а же:
Часть текста скрыта
CLEAR
Declare Integer GetProcessHeap in Win32API
Declare Integer HeapAlloc in Win32Api Integer, Integer, Integer
Declare RtlMoveMemory in Win32API Integer, String, Integer
SET SAFETY Off
m.str = REPLICATE("0123456789", 10^5) && 10^5 - 1 МБайт
m.sc = SEConds()
? "на ассеблере: "
m.rev = RevertString(m.str) && очень быстро, нет слов, 0.02 сек
??SECONDS() - m.sc
?
m.sc = SEConds()
? "на SYS(2600): "
m.rev = RevertString2600(m.str) && SYS(2600 - 0.5 сек (на порядок медленнее ассеблера, но тоже хорошо)
??SECONDS() - m.sc
?
m.sc = SEConds()
? "на FWRITE: "
m.rev = rev_str2(m.str) && более-менее быстро - 3 сек
??SECONDS() - m.sc
?
m.sc = SEConds()
? "просто SUBSTR: "
m.rev = rev_str1(m.str, 1) && оказалось, что SUBSTR выполняется столько же медленно (что с конкатенацией, что без), странно... 50 сек
??SECONDS() - m.sc
?
m.sc = SEConds()
? "на x = x+SUBSTR: "
m.rev = rev_str1(m.str) && тоже 50 сек...
??SECONDS() - m.sc
?
Function RevertString2600 && на SYS(2600
lparameter m.str
PRIVATE ALL LIKE ?
m.l = len(m.str) && длина входной строки
m.h = GetProcessHeap()
m.p = HeapAlloc(m.h, 0, 2 * (m.l+16)) && место для входной и выходной строк. Выходная строка будет начинаться с позиции m.l
RtlMoveMemory(m.p, m.str, m.l) && заполняем первые L байт входной строкой
#DEFINE iБайтИсходнойСтроки SYS(2600, m.p+m.i, 1) && I = 0..L-1
FOR m.i=0 TO m.l-1
* =m.p+m.l+(m.l-m.i-1)
=SYS(2600, m.p+m.l+(m.l-m.i-1), 1, iБайтИсходнойСтроки) && записываем байт I в выходную строку
ENDFOR
m.r = SYS(2600, m.p+m.l, m.l) && выходная строка
* ? "образец: "+LEFT(m.r, 100) && немного посмотреть
RETURN m.r
FUNCTION rev_str1 && на x = x+SUBSTR
lparameter m.str, m.parDOP
local m.str2, m.i
IF PCOUNT()<2 && SUBSTR с конкатенацией строк
m.str2 = ''
for m.i = len( m.str ) to 1 step -1
m.str2 = m.str2 + substr( str, m.i, 1 )
endfor
ELSE && просто посмотреть SUBSTR без конкатенации
for m.i = len( m.str ) to 1 step -1
=substr( str, m.i, 1 )
endfor
ENDIF
FUNCTION rev_str2 && на FWRITE
lparameter m.str
local m.str2, m.i, m.str_len, m.hnd1, m.hnd2
m.str_len=len(m.str)
if m.str_len=0
return ""
endif
m.str2 = REPLICATE(CHR(0), m.str_len)
STRTOFILE(m.str, "str.txt")
STRTOFILE(m.str2, "str2.txt")
m.hnd1 = FOPEN("str.txt", 0)
m.hnd2 = FOPEN("str2.txt", 1)
FOR m.i = 1 TO m.str_len
FSEEK(m.hnd1, m.str_len - m.i)
FWRITE(m.hnd2, FREAD(m.hnd1, 1))
NEXT
FCLOSE(m.hnd1)
FCLOSE(m.hnd2)
m.str2 = FILETOSTR("str2.txt")
RETURN m.str2
Function RevertString && на ассемблере
lparameter m.str
local m.str_len, m.str1
m.str_len=len(m.str)
if m.str_len=0
return ""
endif
if !pemstatus(_screen,"revw_ptr",5) or _screen.revw_ptr=0
local m.hhnd, m.ptr, m.st2
m.st2= ;
chr(0x55)+chr(0x89)+chr(0xE5)+chr(0x56)+chr(0x57)+chr(0x51)+chr(0x50)+chr(0x8B)+ ;
chr(0x75)+chr(0x08)+chr(0x8B)+chr(0x7D)+chr(0x0C)+chr(0x8B)+chr(0x4D)+chr(0x10)+ ;
chr(0x8A)+chr(0x44)+chr(0x0E)+chr(0xFF)+chr(0x88)+chr(0x07)+chr(0x47)+chr(0x49)+ ;
chr(0x75)+chr(0xF6)+chr(0x58)+chr(0x59)+chr(0x5F)+chr(0x5E)+chr(0x89)+chr(0xEC)+ ;
chr(0x5D)+chr(0xC2)+chr(0x10)+chr(0x00)
m.hhnd=GetProcessHeap()
m.ptr=HeapAlloc(m.hhnd,0,len(m.st2)+16) && место для кода
RtlMoveMemory(m.ptr,m.st2,len(m.st2)) && код
_screen.addproperty("revw_ptr",m.ptr) && адрес кода
endif
m.str1=replicate(chr(0), m.str_len) && место для выходной строки
Declare CallWindowProc in Win32API Integer, String, String @, Integer, Integer
CallWindowProc(_screen.revw_ptr, m.str, @m.str1, m.str_len, 0) && выполняем код
return m.str1 && на ассемблере

Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Насчет ассемблерных вставок "вообще". Если я правильно понял то, что говорит по этому поводу Taran, то ассемблерные вставки в FoxPro - штука не очень надежная, и при интенсивном использовании могут приводить к серьезным глюкам. Что характерно, leonid не стал возражать по этому поводу - то ли ему "влом" возражать, то ли он с этим утверждением согласен.
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
of63
Автор

Сообщений: 25244
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Комп вообще ненадежная штука, и ОСь, и фокс, и програмер. Щас например сплошные косяки в космонавтике по причине ПО, потому что много деталей в устройстве, причем если хотя бы одну составляющую не учесть, сломать - ломается весь прибор... Поэтому пиши на фоксе, он надежен, как время показало, а ассемблер - только при необходимости.
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
of63
пиши на фоксе, он надежен

FPD - да, VFP - наврятли. \m/ [sm128]
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
Да ничо не надежно. Вот прошьет твой процессор быстрый нейтрон из далекой галактики и всё пропало.
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
of63
Автор

Сообщений: 25244
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Меня не подводил. Его ваяли еще те ребята, которые ФПД родили, поверь на слово, по нем видно, что не утратили совместимость с командами (аж с ФПД-1), не утратили дух - простота, не стали делать монстра - не стали навязывать фреймверк навроде дотнета. Все в нем работает.
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
of63
Все в нем работает.

Однако C0000005 его компрометирует. [sm128]
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
of63
Автор

Сообщений: 25244
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Давно не видел C..005. Которые были ошибки, те были не с фоксом связанные, а с... сам чего-то накосячил. У самого фокса огрехи есть (не C..005, а баги, фичи), но они известны, и обходятся.

Вот последние ошибки vfp9err.log, не часто, и то - это на машине разработчика.



Исправлено 1 раз(а). Последнее : of63, 13.01.18 16:40
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
Запилил таки тест на фоксе - результаты очень близкие.

Что весьма странно. Я сделал тупо строку длиной 10М (больше фокс уже начинает ругаться на нехватку памяти), состоящую из непробельных символов

Казалось бы, 10 млн итераций кода
m2:
cmp al, [esi]
je m1
xor ah, ah
m5:
push dword [esi]
pop dword [edi]
inc esi
inc edi
inc ebx
dec ecx
jne m2

должно быть прилично медленней 10млн итераций выполнения одной команды
rep movsb

Однако нифига не так. Видимо, процессоры настолько быстры, что 10млн это очень мало.Надо будет еще потестить через RDTSC на голой системе без ОС, с более длинными строками.
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Simple777
Однако C0000005 его компрометирует.
Если C005 возникает на пустом месте, значит это аппаратная проблема (сбой памяти, процессора, реже - диска или сети). И никакой FPD в таких случаях не будет вести себя "надёжнее". А т.к. сам DOS достаточно хлипкая система, то скорее всего там где VFP "вываливается" по c005, DOS+FPD банально зависнут или "перегрузят" машину.
Программные же ошибки - ну часть из них настолько же серьёзна что повалит и FPD - я правда не в курсе какая именно там возникнет ошибка, но это можно в принципе проверить. "Испорченные" dbf/cdx/fpt файлы - вполне себе могут свалить FPD.
Часть, конечно, возникает за счёт ошибок в подключемых компонентах - ActiveX, ODBC драйвера, всякие разные "левые" dll-ки и fll-ки.
Естественно что поскольку в FPD возможность подключения внешних модулей гораздо более ограничена (но она таки есть!), там меньше шанс поиметь проблему из-за такого "сомнительного" компонента. Но и в VFP зачастую вполне себе можно обойтись без "красоты".
"Подключение" ассемблерных вставок само по себе не является проблемой, и не добавляет никакого риска. Проблемой является лишь написание корректного и безопасного кода для таких вставок - это абсолютно идентично написанию сишных вставок в виде fll для VFP и plb для FPD - если написать их неаккуратно, то можно поиметь кучу проблем.
Замечательная особенность DOS-а, это полное отсутствие разделения между работающими процессами (т.к. система НЕ многозадачная, и любое "параллельное" исполнение задач в ней реализуется весьма и весьма ненадёжными средствами). Т.е. в "настоящей" связке DOS+FPD проблема возникшая в любой подключенной "в фон" (так называемые TSR-задачи), либо же в явно запущенной из FPD программе вызывает крах всей системы. Для VFP запуск внешнего процесса, или же поломка в каком-то фоновом виндовом процессе (если таковая поломка не сломает собственно всю винду, что для современных версий гораздо менее вероятно чем для старинных Win9x) пройдёт совершенно незамеченной. Даже крах вызванной из фокса программы при адекватной обработке (т.е. осознать что оно "не сработало" и, к примеру, брать выходные файлы нельзя) тоже пройдёт незамеченным.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
of63
Автор

Сообщений: 25244
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> 10 млн итераций кода должно быть прилично медленней одной команды rep movsb
Наверное, общее время (количество байтов) должно быть большим, много тиков таймера, чтобы сравнивать. Если скорость памяти 1ГГц = 1000 Млн (слов(?) в сек), то 10 Млн читаются/пишутся за 0.01 с... А сам код проги, из 1 строки, или из 10-100, все равно считывается процом 1 раз, преобразуется в предсказателе, и при частоте выполнения в 2-3 ГГц наверное мало роляет...
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
vic7tar

Сообщений: 48
Дата регистрации: 27.02.2017
Всем привет.
А почему бы действительно не использовать родной STRTRAN, или я не по теме?



Исправлено 1 раз(а). Последнее : vic7tar, 13.01.18 19:39
Ratings: 0 negative/0 positive
Re: Удаление лишних пробелов
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Igor Korolyov
в "настоящей" связке DOS+FPD проблема возникшая в любой подключенной "в фон" (так называемые TSR-задачи), либо же в явно запущенной из FPD программе вызывает крах всей системы.

Дак никто не спорит, что связка DOS+FPD хуже, нежели WIN+FPD. Какой бы ни была устаревшей DOS, с каждой новой версией Windows среда псевдо-DOS таки улучшалась. Иными словами, в скрытой форме MS-DOS таки существовала и развивалась. Что же касаемо критических ошибок в FPD. Бывают, но крайне редко это бывает "по неизвестной причине". Да и по известным причинам это бывает очень редко. Встерал пару раз, быть может, когда система вешалась из-за испорченных таблиц или индексов, но и в этом случае какое-то сообщение выдавалось типа: Invalid buffpoint call. И если в FPD и возникают критические ошибки, то в подавляющем большинстве случаев они воспроизводимы, и можно точно увидеть команду, на которой система вешается. Думается, что в VFP ситуация с критическими ошибками не такая прозрачная.
Ratings: 0 negative/0 positive


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

On-line: 23 (Гостей: 23)

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