Форум программистов, компьютерный форум CyberForum.ru

Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Есть ли C++ нативный способ быстро обнулить массив (аналог bzero)? + ещё 2 вопроса http://www.cyberforum.ru/cpp-beginners/thread38637.html
Второй вопрос - если конструктор обнаружил условия, препятствующие созданию объекта, есть ли способ "не создавать" объект и не использовать потом дестуктор? Третий - стоит ли использовать динамические переменны внутри локальной области видимости(создать и удалить перед выходом из этой области) Спасибо
C++ функция разбивает файл на биты.... Написать функцию,разбивающую файл на биты и записывающую последовательно эти биты с интервалом в 24 байт в другой файл. В случае нехватки длины 2-го файла вывести предупреждение сообщение и прекратить работу. http://www.cyberforum.ru/cpp-beginners/thread38636.html
C++ Сохранение изображения
Моя программа похожа на PAINT только под DOS в Borland C 3.1. Как мне сохранять рисунки которые я рисую?
Изобразить движение по спирали C++
Помогите зделать движение по спирали(на рисунку). Я так понимаю надо двигатса по елипсу и смещать центр, но не знаю как это зделать.
C++ Двумерные массивы (+символьные) http://www.cyberforum.ru/cpp-beginners/thread38625.html
Вот 5 задач... необходимо помочь братишке... сам я в С++ не особо силен... Сильно прошу вас помочь мне... За оказанную услугу готов оказать услугу написания сайта) очень жду помощи... 1) Дан двумерный массив целых чисел. а) Сформировать одномерный массив, каждый элемент которого ра- вен наибольшему по модулю элементу соответствующего столбца двумерного массива. б) Сформировать...
C++ Минимизация функции методом наименьших квадратов У кого есть исходники реализации метода наименьших квадратов на С++, если есть применение её для оценки какой нибудь функции. подробнее

Показать сообщение отдельно
prazuber
108 / 108 / 3
Регистрация: 29.04.2010
Сообщений: 240
11.04.2011, 23:05     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными.
Ради интереса в 2008 студии продебажил strcmp, strcpy, strlen. Код у мелкомягких написан на асме, но в комментариях пишут алгоритм. Вот что они предлагают:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
int strlen (const char * str)
{
    int length = 0;
 
    while( *str++ )
        ++length;
 
    return( length );
}
 
char * strcpy (char * dst, char * src)
{
    char * cp = dst;
 
    while( *cp++ = *src++ )
            ;               /* Copy src over dst */
    return( dst );
}
 
int strcmp ( unsigned char * src , unsigned char * dst )
{
    int ret = 0 ;
 
    while( ! (ret = *src - *dst) && *dst)
            ++src, ++dst;
 
    if ( ret < 0 )
            ret = -1 ;
    else if ( ret > 0 )
            ret = 1 ;
 
    return( ret );
}
Форматирование сохранено

Добавлено через 5 минут
Правда код на асме у них вроде немного другой.. вот например strlen:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
        CODESEG
 
        public  strlen
 
strlen  proc \
        buf:ptr byte
 
        OPTION PROLOGUE:NONE, EPILOGUE:NONE
 
        .FPO    ( 0, 1, 0, 0, 0, 0 )
 
string  equ     [esp + 4]
 
        mov     ecx,string              ; ecx -> string
        test    ecx,3                   ; test if string is aligned on 32 bits
        je      short main_loop
 
str_misaligned:
        ; simple byte loop until string is aligned
        mov     al,byte ptr [ecx]
        add     ecx,1
        test    al,al
        je      short byte_3
        test    ecx,3
        jne     short str_misaligned
 
        add     eax,dword ptr 0         ; 5 byte nop to align label below
 
        align   16                      ; should be redundant
 
main_loop:
        mov     eax,dword ptr [ecx]     ; read 4 bytes
        mov     edx,7efefeffh
        add     edx,eax
        xor     eax,-1
        xor     eax,edx
        add     ecx,4
        test    eax,81010100h
        je      short main_loop
        ; found zero byte in the loop
        mov     eax,[ecx - 4]
        test    al,al                   ; is it byte 0
        je      short byte_0
        test    ah,ah                   ; is it byte 1
        je      short byte_1
        test    eax,00ff0000h           ; is it byte 2
        je      short byte_2
        test    eax,0ff000000h          ; is it byte 3
        je      short byte_3
        jmp     short main_loop         ; taken if bits 24-30 are clear and bit
                                        ; 31 is set
 
byte_3:
        lea     eax,[ecx - 1]
        mov     ecx,string
        sub     eax,ecx
        ret
byte_2:
        lea     eax,[ecx - 2]
        mov     ecx,string
        sub     eax,ecx
        ret
byte_1:
        lea     eax,[ecx - 3]
        mov     ecx,string
        sub     eax,ecx
        ret
byte_0:
        lea     eax,[ecx - 4]
        mov     ecx,string
        sub     eax,ecx
        ret
 
strlen  endp
 
        end
 
Текущее время: 02:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru