Добавлено: 18 июл 2003, 22:07
[to kirya85]
Во первых, простите, если показалось, что я имею что-то против вас. Просто, согласитесь, код был не очень оптимальным.
Новый код получше. Но все равно библиотечные функции при каждой итерации while делают по проходу строки, которая правда уменьшается, т. к. строка обрезается спереди. Да и теперь мой код выглядит проще (и не использует библиотечных функций)
, а также хорошо ляжет на асм IA32, в то время, как библиотечные функции выльются в нечто большое (опять же - эти функции универсальны, а я написал узко специализированную функцию, где вся их мощь ни к чему).
Совет: надо читать че-нить по построению эффективных алгоритмов. Ведь зачем придумывать то, что уже придумано, тем более, что очень (ну очень) большое количество алгоритмов самому придумать очень (ну очень) сложно
))
P. S. На счет b[strlen(a)] в GCC - удивлен. По стандарту там константное выражение. Но наверное он пропускает это потому, что размер a фиксирован и известен на этапе компиляции...
P. P. S. На счет "ляжет на асм":
// NASM
Не намного больше, чем на С (я просто показал этим кодом то, что имел в виду. Мне кажется, что в любом случае будет быстрее, так что подумайте на счет эффективных алгоритмов.
Во первых, простите, если показалось, что я имею что-то против вас. Просто, согласитесь, код был не очень оптимальным.
Новый код получше. Но все равно библиотечные функции при каждой итерации while делают по проходу строки, которая правда уменьшается, т. к. строка обрезается спереди. Да и теперь мой код выглядит проще (и не использует библиотечных функций)

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

P. S. На счет b[strlen(a)] в GCC - удивлен. По стандарту там константное выражение. Но наверное он пропускает это потому, что размер a фиксирован и известен на этапе компиляции...
P. P. S. На счет "ляжет на асм":
// NASM
Код: Выделить всё
[BITS 16]
[ORG 100h]
mov ah, 9h
mov dx, _from
int 21h
mov di, _from
mov si, _to
call strip
mov ah, 9h
mov dx, _to
int 21h
int 20h
; ============================================================================
strip:
.loop:
cmp byte [di], '$'
je .end_strip
cmp byte [di], ' ' ; if (from[i] == ' ')
jne .not_space
cmp byte [state], 0 ; if (state == 0)
jne .end_loop
mov byte [si], ' ' ; to[p++] = ' '
inc si ;
mov byte [state], 1 ; state = 1
jmp .end_loop
.not_space:
mov ah, [di] ; to[p++] = from[i];
mov byte [si], ah ;
inc si ;
cmp byte [state], 1 ; if (state == 1)
jne .end_loop
mov byte [state], 0 ; state = 0;
.end_loop:
inc di
jmp .loop
.end_strip:
mov byte [si], '$'
ret
; ============================================================================
state db 0
_from db 'ab ra ka da bra', 13, 10, '$'
_to db ' '