|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Авг 26, 2003 20:46:57 Хотелось бы в общем поднять и эту тему. Она очень нужна всем тем, кто парсит коммандную строку, файл, черта лысого. Вот мой случай - надо удалить все пробелы в строке. Строка может начинаться с пробелов, может состоять из одних пробелов, может заканчиваться на пробелы. Сама строка пробелов содержать в себе не должна. Пример: " I_am_the_string" "I_am_the_string " " " "I_am_the_string" Во всех четерых случаях должен быть один и тот же результат: "I_am_the_string". Очевидно, тупое нахождение пробелов здесь не подходит. Вернее, сделать-то можно и даже просто, но скорость будет... Алгоритмизаторы, у кого есть какие идеи? Конечные автоматы? Что? |
|
|
Дата: Авг 26, 2003 20:57:10 Что-то не понял, в чём тут проблема, на Перле всё должно быть легко ;-) Только я не понял, что нужно, все пробелы заменить на '_'? |
|
|
Дата: Авг 26, 2003 21:07:15 Во-первых, я работаю не на Перле сейчас, а на С. Во-вторых, регулярные выражения перла тоже построены на принципе конечных автоматов, как мне кажется. В-третьих, мне интерестно увидеть суть! |
|
|
Дата: Авг 26, 2003 21:07:45 volodya Хоть ты иговоришь, что тупое нахождение пробелов не рулит, но самый простой способ, как не странно вот:
.data
in_str db ' 123_str_всякая_лажа ',0
out_str db 15 dup(?)
.code
_start:
....
....
mov esi,offset in_str
mov edi,offset out_str
_loop_:
.if byte ptr[esi]!=0
.if byte ptr[esi]!=20h
mov al,byte ptr[esi]
mov byte ptr[edi],al
.endif
jmp short _loop_
.endif
....
....
end _start
|
|
|
Дата: Авг 26, 2003 21:13:56 KiNDeR Черт, терпеть не могу этот синтаксис... По-моему, цикл бесконечен - это раз. А во-вторых, вероятно, он не оптимален. А в третьих - глянь туда - http://algolist.manual.ru/search/esearch/index.php |
|
|
Дата: Авг 26, 2003 21:21:24 volodya Чем синтаксис-то не понравился? ;-) Единственное что я не уважаю в исходниках это "_" |
|
|
Дата: Авг 26, 2003 21:25:18 Asterix Я имею в виду не синтаксис KiNDeR, у него-то с синтаксисом проблем нет. Я имею в виду эти придурошные макроопределения. Макросы хороши, но не надо ж до абсурда доводить. Покажи вот эту строку .if byte ptr[esi]!=0 любому программеру на С - так он скажет: "и это писал ассемблерщик???". Это ж позор. Извращение самой сути языка. Ты видел как в примере о заголовке MZ к структурам доступаются? Да на хер мне такой ассемблер нужен? Я на С напишу за две минуты! На асме буду как положено [esi+4] делать! Однако ты меня отвлек! Как там на счет подстроки в строке? |
|
|
Дата: Авг 26, 2003 21:51:22 volodya Приношу свои извенения, за корявоть синтаксиса. По ссылочки я сходил. Очень познавательная статья. Спасибо. Я думал изночально о таком коде(хотя ты его зарубил на корню)
mov esi,offset in_str
mov edi,offset out_str
_loop_:
cmp byte ptr[esi],0
je _exit_process
cmp byte ptr [esi],20h
je _go_
mov al,byte ptr [esi]
mov byte ptr [edi],al
inc edi
_go_:
inc esi
jmp short _loop_
|
|
|
Дата: Авг 26, 2003 22:26:45 KiNDeR Ты забыл в конце строки нолик поставить. А в остальном - хороший нормальный самый обычный алгоритм. Очень прост в реализации. На Си, кстати, пришлось бы руки выкручивать. Но, все равно, а что если строка здоровая? Подсчитай, сколько у тебя уйдет сравнений? Или, может, меня и в самом деле глючит и не надо изобретать велосипед там, где его нет. Но есть же алгоритм Кнута-Морисса-Пратта и другие страшные вещи... Не все ж так просто. Эдмонд, где ты? |
|
|
Дата: Авг 27, 2003 07:31:59 volodya Хотелось бы в общем поднять и эту тему. Если надо просто найти подстроку - смотрите реализацию strstr. Если надо парсить строку в общем случае, то убирание пробелов - не самая подходящая задача для обсуждения. Очевидно, тупое нахождение пробелов здесь не подходит. Вернее, сделать-то можно и даже просто, но скорость будет... По-моему, нормальная будет скорость: для поиска пробелов и определения группы пробелов используем scasb, а удаляем пробелы методом, описанным в моём сообщении по теме "Мне бы сортировочку". |
|
|
Дата: Авг 27, 2003 14:24:14 Гы, оказывается удаление пробелов популярная задача. Я в свое время писал это так:
;; compile: nasmw.exe -o s_strip.obj -f coff s_strip.asm
;; s_out can be same string as s_inp
bits 32
section .text
global _s_strip
;; void __cdecl s_strip(char* s_inp, char* s_out);
_s_strip:
mov edx, dword [esp+4] ;; s_inp
mov ecx, dword [esp+8] ;; s_out
.c_skip:
movzx eax, byte [edx]
inc edx
cmp eax, byte 0x20 ;; ' '
jz short .s_skip
mov byte [ecx], al
inc ecx
test eax, eax
jnz short .c_skip
retn
|
|
|
Дата: Авг 27, 2003 21:42:36 · Поправил: Johnikum на чистом асме: + удаление пробелов в начале и в конце на выходе в eax - адрес строки DelStringSpace proc near mov esi,(адрес строки) push esi push esi call GetStringLength or eax,eax jz DSS_exit mov edi,esi cld mov ecx,-1 mov al,' ' repe scasb dec edi xchg esi,edi DSS_Find: lodsb cmp al,' ' jne DSS_Replace stosb DSS_NextSpace: lodsb cmp al,' ' je DSS_NextSpace DSS_Replace: stosb or al,al jnz DSS_Find dec edi dec edi cmp bpt [edi],' ' jne DSS_exit stosb DSS_exit: pop eax ret DelStringSpace endp |
|
|
Дата: Авг 27, 2003 21:44:35 · Поправил: volodya ОК, пойдет. Скоро разрожусь сишным вариантом. |
|
|
Дата: Авг 27, 2003 22:49:12 volodya Наблюдаю как ты ищешь изюминку в куче кода :) и такой вопрос у меня созрел, а как ты тестируешь этот код на профпригодность, ну т.е. скорость работы, пожираемые ресурсы и т.д. |
|
|
Дата: Авг 27, 2003 22:59:13 Asterix А я писал статью о профилировщиках - ушла в рассылку когда-то, но так на сайте и не появилась. Лови: http://subscribe.ru/archive/comp.soft.prog.hitech/200302/17182545.html - там лежит пошкарябаная копия. Если ее сейчас класть на сайт - я бы там кое-что пересмотрел. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.138 |