powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / K&R 5.5 Указатели символов и функции. Корректен ли код ?
16 сообщений из 66, страница 3 из 3
K&R 5.5 Указатели символов и функции. Корректен ли код ?
    #38551399
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_SlaDima T Тут на асме этот пример вчера выложил, по сути в машинных кодах. Код после компиляции почти одинаковый получился.ИМХО реализация библиотечной strcpy от while(*s++=*t++) должна сильно отличаться. На асме эффективный по быстродействию код совсем другой.

Ну не сам же я на асме это писал. Попробуй у себя. По ссылке исходник и копипаст из дебагера MSVC 2008 Express. Для просмотра в АСМе поставить BreakPoint, когда остановится правая кнопка и "Go to Disassebly"
Проект "Win32 console Application". Релиз. Настройки компиляции по умолчанию.
Кстати код немного отличается (командой lea)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
	for(i = 1; i < TEST_COUNT; i++) f1(buf, v); // f1() это while(*s++=*t++)
00C81027  xor         eax,eax 
00C81029  lea         esp,[esp] 
00C81030  mov         cl,byte ptr string "1234567890" (0C820F4h)[eax] 
00C81036  inc         eax  
00C81037  test        cl,cl 
00C81039  jne         main+30h (0C81030h) 
00C8103B  sub         edx,1 
00C8103E  jne         main+27h (0C81027h) 
...
	for(i = 1; i < TEST_COUNT; i++) strcpy(buf, v);
00C81081  xor         eax,eax 
00C81083  mov         cl,byte ptr string "1234567890" (0C820F4h)[eax] 
00C81089  inc         eax  
00C8108A  test        cl,cl 
00C8108C  jne         main+83h (0C81083h) 
00C8108E  sub         edx,1 
00C81091  jne         main+81h (0C81081h) 

...
Рейтинг: 0 / 0
K&R 5.5 Указатели символов и функции. Корректен ли код ?
    #38551452
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mingw 4.4.0 release
вместо strcpy компилятор вставил :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
.text:00401552 loc_401552:                             ; CODE XREF: sub_401430+13Fj
.text:00401552                 inc     eax
.text:00401553                 mov     dword ptr [ebx], 34333231h
.text:00401559                 mov     dword ptr [ebx+4], 38373635h
.text:00401560                 mov     word ptr [ebx+8], 3039h
.text:00401566                 mov     byte ptr [ebx+0Ah], 0
.text:0040156A                 cmp     eax, 5F5E100h
.text:0040156F                 jnz     short loc_401552

:-)

полный листинг
Код: plaintext
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.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
.text:00401430 ; Attributes: bp-based frame
.text:00401430
.text:00401430 sub_401430      proc near               ; CODE XREF: sub_401150+F6p
.text:00401430
.text:00401430 var_140         = dword ptr -140h
.text:00401430 var_13C         = dword ptr -13Ch
.text:00401430 var_138         = dword ptr -138h
.text:00401430 var_134         = dword ptr -134h
.text:00401430 var_124         = dword ptr -124h
.text:00401430 var_120         = dword ptr -120h
.text:00401430 var_11C         = dword ptr -11Ch
.text:00401430 var_118         = dword ptr -118h
.text:00401430 var_10          = dword ptr -10h
.text:00401430 arg_0           = dword ptr  4
.text:00401430
.text:00401430                 lea     ecx, [esp+arg_0]
.text:00401434                 and     esp, 0FFFFFFF0h
.text:00401437                 push    dword ptr [ecx-4]
.text:0040143A                 push    ebp
.text:0040143B                 mov     ebp, esp
.text:0040143D                 push    edi
.text:0040143E                 push    esi
.text:0040143F                 mov     esi, 1
.text:00401444                 push    ebx
.text:00401445                 lea     ebx, [ebp+var_118]
.text:0040144B                 push    ecx
.text:0040144C                 sub     esp, 128h       ; hWnd
.text:00401452                 call    sub_405540
.text:00401457                 call    GetTickCount
.text:0040145C                 mov     [ebp+var_120], eax
.text:00401462                 mov     [esp+140h+var_134], 0
.text:0040146A                 mov     [esp+140h+var_138], offset aF1 ; "f1"
.text:00401472                 mov     [esp+140h+var_13C], offset aF1 ; "f1"
.text:0040147A                 mov     [esp+140h+var_140], 0
.text:00401481                 call    MessageBoxA
.text:00401486                 sub     esp, 10h        ; hWnd
.text:00401489                 lea     esi, [esi+0]
.text:00401490
.text:00401490 loc_401490:                             ; CODE XREF: sub_401430+82j
.text:00401490                 mov     edx, offset a1234567890 ; "1234567890"
.text:00401495                 mov     eax, ebx
.text:00401497                 mov     esi, esi
.text:00401499                 lea     edi, [edi+0]
.text:004014A0
.text:004014A0 loc_4014A0:                             ; CODE XREF: sub_401430+79j
.text:004014A0                 movzx   ecx, byte ptr [edx]
.text:004014A3                 inc     edx
.text:004014A4                 mov     [eax], cl
.text:004014A6                 inc     eax
.text:004014A7                 test    cl, cl
.text:004014A9                 jnz     short loc_4014A0
.text:004014AB                 inc     esi
.text:004014AC                 cmp     esi, 5F5E100h
.text:004014B2                 jnz     short loc_401490
.text:004014B4                 call    GetTickCount
.text:004014B9                 mov     edi, 1
.text:004014BE                 mov     [ebp+var_124], eax
.text:004014C4                 call    GetTickCount
.text:004014C9                 mov     [esp+140h+var_134], 0
.text:004014D1                 mov     esi, eax
.text:004014D3                 mov     [esp+140h+var_138], offset aF2 ; "f2"
.text:004014DB                 mov     [esp+140h+var_13C], offset aF2 ; "f2"
.text:004014E3                 mov     [esp+140h+var_140], 0
.text:004014EA                 call    MessageBoxA
.text:004014EF                 sub     esp, 10h        ; hWnd
.text:004014F2
.text:004014F2 loc_4014F2:                             ; CODE XREF: sub_401430+E2j
.text:004014F2                 mov     byte ptr [ebp+var_118], 31h
.text:004014F9                 mov     edx, offset a1234567890 ; "1234567890"
.text:004014FE                 mov     eax, ebx
.text:00401500
.text:00401500 loc_401500:                             ; CODE XREF: sub_401430+D9j
.text:00401500                 inc     eax
.text:00401501                 inc     edx
.text:00401502                 movzx   ecx, byte ptr [edx]
.text:00401505                 mov     [eax], cl
.text:00401507                 test    cl, cl
.text:00401509                 jnz     short loc_401500
.text:0040150B                 inc     edi
.text:0040150C                 cmp     edi, 5F5E100h
.text:00401512                 jnz     short loc_4014F2
.text:00401514                 call    GetTickCount
.text:00401519                 mov     edi, eax
.text:0040151B                 call    GetTickCount
.text:00401520                 mov     [ebp+var_11C], eax
.text:00401526                 mov     [esp+140h+var_134], 0
.text:0040152E                 mov     [esp+140h+var_138], offset aF3 ; "f3"
.text:00401536                 mov     [esp+140h+var_13C], offset aF3 ; "f3"
.text:0040153E                 mov     [esp+140h+var_140], 0
.text:00401545                 call    MessageBoxA
.text:0040154A                 mov     eax, 1
.text:0040154F                 sub     esp, 10h        ; char *
.text:00401552
.text:00401552 loc_401552:                             ; CODE XREF: sub_401430+13Fj
.text:00401552                 inc     eax
.text:00401553                 mov     dword ptr [ebx], 34333231h
.text:00401559                 mov     dword ptr [ebx+4], 38373635h
.text:00401560                 mov     word ptr [ebx+8], 3039h
.text:00401566                 mov     byte ptr [ebx+0Ah], 0
.text:0040156A                 cmp     eax, 5F5E100h
.text:0040156F                 jnz     short loc_401552
.text:00401571                 call    GetTickCount
.text:00401576                 sub     edi, esi
.text:00401578                 sub     eax, [ebp+var_11C]
.text:0040157E                 mov     [esp+140h+var_138], edi
.text:00401582                 mov     [esp+140h+var_134], eax
.text:00401586                 mov     eax, [ebp+var_124]
.text:0040158C                 sub     eax, [ebp+var_120]
.text:00401592                 mov     [esp+140h+var_140], offset aF1DMsF2DMsStrc ; "f1() %d ms  f2() %d ms  strcpy() = %d m"...
.text:00401599                 mov     [esp+140h+var_13C], eax
.text:0040159D                 call    printf
.text:004015A2                 lea     esp, [ebp-10h]
.text:004015A5                 xor     eax, eax
.text:004015A7                 pop     ecx
.text:004015A8                 pop     ebx
.text:004015A9                 pop     esi
.text:004015AA                 pop     edi
.text:004015AB                 leave
.text:004015AC                 lea     esp, [ecx-4]
.text:004015AF                 retn

Для быстрого поиска циклов добавил вызовы MessageBox.
...
Рейтинг: 0 / 0
K&R 5.5 Указатели символов и функции. Корректен ли код ?
    #38551462
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_Slamingw 4.4.0 release
вместо strcpy компилятор вставил ...
Продуманный компилятор. Так точно быстрее будет. И строку исходную можно не хранить отдельно. Такому компилятору надо строки длиной кратно 4 давать (с учетом нуля в конце), тогда он только mov dword ... будет вставлять.
...
Рейтинг: 0 / 0
K&R 5.5 Указатели символов и функции. Корректен ли код ?
    #38556580
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощение, вышеприведённый код неверный.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
int strcmpr_test(char* s, char* t) /* RETURN <0 IF S<T, 0 IF S==T, >0 IF S>T */
{
	while (*s++ == *t++)
	{
		if (*s == '\0' && *t != '\0')
		{
			return 1;
		}
		else if (*t == '\0' && *s != '\0')
		{
			return -1;
		}
		else if (*t == '\0' && *s == '\0')
		{
			return 0;
		}
	}
	return 0;
}



Правильно
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
int strcmpr_test(char* s, char* t) /* RETURN <0 IF S<T, 0 IF S==T, >0 IF S>T */
{
	while (*s == *t)
	{
		if (*s++ == '\0' && *t++ != '\0')
		{
			return -1;
		}
		else if (*t++ == '\0' && *s++ != '\0')
		{
			return 1;
		}
		else if (*t++ == '\0' && *s++ == '\0')
		{
			return 0;
		}
	}
	return (*s-*t);
}
...
Рейтинг: 0 / 0
K&R 5.5 Указатели символов и функции. Корректен ли код ?
    #38556593
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И то этот код мне не нравится. Мне кажется что он может быть короче и красивее
...
Рейтинг: 0 / 0
K&R 5.5 Указатели символов и функции. Корректен ли код ?
    #38556662
wst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первые 2 if-а внутри цикла никогда не выполнятся.
...
Рейтинг: 0 / 0
K&R 5.5 Указатели символов и функции. Корректен ли код ?
    #38556673
wst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь, просто не ожидал увидеть ТАКОЕ. Выполнится конечно когда-нибудь. Без поллитры результат выполения сего поделия сразу и не предскажешь.
...
Рейтинг: 0 / 0
K&R 5.5 Указатели символов и функции. Корректен ли код ?
    #38556700
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wst,
тут всё очень просто. Почему вы так удивляетесь ?
Лучше предложите аналогичный, но более короткий аналог
...
Рейтинг: 0 / 0
K&R 5.5 Указатели символов и функции. Корректен ли код ?
    #38556798
wst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пишу сейчас с планшета, поэтому код смогу только вечером отписать. Проблема же в избытке инкрементов внутре short-circuit операторов (&&) которые делают ход выполнения в цикле не вполне очевидным. Так что рекомендую просто взять "неверную" версию функции и исправить только последний return.
...
Рейтинг: 0 / 0
K&R 5.5 Указатели символов и функции. Корректен ли код ?
    #38556825
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЛучше предложите аналогичный, но более короткий аналог
Вот аналог (только я не понял зачем ты его переписывать начал)
SashaMercury
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
int strcmpr_test(char* s, char* t) //должен ли тут быть const ?
{
	for (; *s == *t; s++, t++) /* RETURN <0 IF S<T, 0 IF S==T, >0 IF S>T */
	{
		if (*s == '\0')
		{
			return 0;
		}
	}
	return(*s - *t);
}


или еще понятней через while()
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
int strcmpr_test(char* s, char* t) //должен ли тут быть const ?
{
	while(*s == *t)
	{
		if(*s == 0) return 0;
		s++;
		t++;
	}
	return(*s - *t);
}
...
Рейтинг: 0 / 0
K&R 5.5 Указатели символов и функции. Корректен ли код ?
    #38556854
wst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если совсем точно то это не аналог, потому как версия с 6 инкрементами на цикл должна возвращать 0 для s="11" t="121". А тут просто честное сравнение строк.
...
Рейтинг: 0 / 0
K&R 5.5 Указатели символов и функции. Корректен ли код ?
    #38557173
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
int strcmpr_test(char* s, char* t) //должен ли тут быть const ?
{
	while(*s == *t)
	{
		if(*s == 0) return 0;
		s++;
		t++;
	}
	return(*s - *t);
}





Если сравнивать f e "aa" и "aab" вернёт 0. А должно быть 1(либо -1 не помню) Верно ведь ?
...
Рейтинг: 0 / 0
K&R 5.5 Указатели символов и функции. Корректен ли код ?
    #38557203
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЕсли сравнивать f e "aa" и "aab" вернёт 0. А должно быть 1(либо -1 не помню) Верно ведь ?

Есть простой способ проверить: взять, запустить и посмотреть что получилось.
...
Рейтинг: 0 / 0
K&R 5.5 Указатели символов и функции. Корректен ли код ?
    #38557435
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЕсть простой способ проверить: взять, запустить и посмотреть что получилось
Ну, так любой сможет.
А вот в уме проиграть код и посмотреть что получилось...
Вот это реально прочищает мозги :)

ЗЫ. Я в 9-м классе как-то в лагере без компа за пару недель написал ассемблер, в уме отладил, потом вернулся домой, набрал текст из тетради, и сразу заработало без отладки. Вот что Forth животворящий делает :)
На С конечно такое "без компа" вряд ли возможно для программ размером больше страницы.
...
Рейтинг: 0 / 0
K&R 5.5 Указатели символов и функции. Корректен ли код ?
    #38557592
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЗЫ. Я в 9-м классе как-то в лагере без компа за пару недель написал ассемблер, в уме отладил ...
Ты не один такой был, тоже начинал с компилирования в тетрадке :)
Был у меня в 9 классе первый комп ПК Львов с процом 8080. Как загрузишь есть бэйсик встроенный и никаких возможностей (лично у меня) куда-то что-то сохранить. Набил, запустил, поигрался. Бэйсик быстро надоел, т.к. на нем самое элементарное тормозило, но в инструкции к компу был описан АСМ с кодами команд, простенький самплес как этот байт-код запустить. Синтаксис не помню, примерно так
Код: plaintext
1.
2.
func = {123,32,34,54 и т.д.};
call func;


напишешь сначала в тетрадке на асме, рядом "откомпилируешь" в байты, байты долбишь в комп. Накосячил - все повиснет, ребут, поиск ошибок в тетрадке и долби по новой. Стимулировало думать, понимать и внимательно перепроверять чтобы не долбить лишний раз.
...
Рейтинг: 0 / 0
K&R 5.5 Указатели символов и функции. Корректен ли код ?
    #38557956
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima_TВот аналог (только я не понял зачем ты его переписывать начал)

И правда, код нормальный
...
Рейтинг: 0 / 0
16 сообщений из 66, страница 3 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / K&R 5.5 Указатели символов и функции. Корректен ли код ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]