|
Си |
|
|
|
Jan 24 2013, 19:24
|

Профессионал
    
Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215

|
ЗАДАЧА АЕсть функция (K&R), которая обращает порядок символов в строке. Вот она: Код #include <string.h>
void reverse (char s[]) { int c, i, j; for (i = 0, j = strlen(s) - 1; i < j; i++, j--) { c = s[i]; s[i] = s[j]; s[j] = c; } } Вопросы: 1. Какие слабые места у данной реализации. 2. Как можно оптимизировать код. И что конкретно это даст. 3. Какие есть варианты реализации функции. Спасибо!
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
19 страниц
1 2 3 > »
|
 |
Ответов
(1 - 14)
|
Jan 24 2013, 20:15
|

Профессионал
    
Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215

|
Цитата(telix @ Jan 24 2013, 22:37)  В коде ошибка поставьте j--  да ,сори. ЗАДАЧА БЕсть реализация функции перевода "типа" bool в строку. Код char *b2s (char b) { static char *name[] = {"Out Of Range", "False", "True"}; return (b < 0 || b > 1) ? name[0] : name [b+1]; } Вопросы: 1. Какие слабые/ошибочные места у данной реализации. 2. Как можно оптимизировать код. И что конкретно это даст. 3. Какие есть варианты реализации функции.
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
Jan 24 2013, 20:31
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
В смысле AVR, может выглядеть так CODE #include <avr/io.h> #include <string.h> void reverse(char s[]) { char *beg = (char *)&(s[0]); char *end = (char *)&(s[strlen(s)]); while(beg < end) { char c = *beg; *beg++ = *(--end); *end = c; } } CODE 82: fc 01 movw r30, r24 84: 01 90 ld r0, Z+ 86: 00 20 and r0, r0 88: e9 f7 brne .-6 ; 0x84 <reverse+0x2> 8a: 31 97 sbiw r30, 0x01 ; 1 8c: e8 1b sub r30, r24 8e: f9 0b sbc r31, r25 90: e8 0f add r30, r24 92: f9 1f adc r31, r25 94: dc 01 movw r26, r24 96: 04 c0 rjmp .+8 ; 0xa0 <reverse+0x1e> 98: 8c 91 ld r24, X 9a: 92 91 ld r25, -Z 9c: 9d 93 st X+, r25 9e: 80 83 st Z, r24 a0: ae 17 cp r26, r30 a2: bf 07 cpc r27, r31 a4: c8 f3 brcs .-14 ; 0x98 <reverse+0x16> a6: 08 95 ret
|
|
|
|
|
Jan 25 2013, 05:38
|
Знающий
   
Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045

|
Цитата(_Pasha @ Jan 25 2013, 08:23)  Неправда! Область значений, согласно stdbool.h -это true,false. Исходя из того, что в Си bool это всего лишь костыль для пришедших из других языков, и любое не 0-ое значение является истиной для условных операторов, то, ИМХО редактор прав. Задачу А можно оптимизировать сильнее всего исходя из контекста.
|
|
|
|
|
Jan 25 2013, 05:49
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(gotty @ Jan 25 2013, 08:38)  и любое не 0-ое значение является истиной для условных операторов, то, ИМХО редактор прав. if(0) - выражение в скобках сейчас == 0 if(!0) - выражение в скобках сейчас == 1 Ы? Цитата(gotty @ Jan 25 2013, 08:38)  Задачу А можно оптимизировать сильнее всего исходя из контекста. Работа непосредственно с двумя указателями выигрывает на любых pic/avr/arm/x51
|
|
|
|
|
Jan 25 2013, 06:08
|
Знающий
   
Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045

|
Цитата(_Pasha @ Jan 25 2013, 08:49)  if(0) - выражение в скобках сейчас == 0 if(!0) - выражение в скобках сейчас == 1 Ы? Я имел ввиду немного другое Код if (42) { printf("True\n"); } else { printf("False\n"); } Какая ветка условного оператора будет выполнена? Третьего "outofrange" не дано, увы.
|
|
|
|
|
Jan 25 2013, 06:16
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(gotty @ Jan 25 2013, 09:08)  Я имел ввиду немного другое Дык это несовместимость типов.  Почему к случаям явного приведения int к указателю всегда люди относятся настороженно, а к "притягиванию" bool к char - типа что это нормально? Примеров привести не могу, у меня не очень богатый сишный опыт. Только анекдот Цитата #define true false // собаки, ковыряйтесь теперь сами
|
|
|
|
|
Jan 25 2013, 06:33
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
В армоводческом смысле reverse() с указателями CODE 0x0800024A B570 PUSH {r4-r6,lr} 0x0800024C 4605 MOV r5,r0 0x0800024E 462C MOV r4,r5 0x08000250 4628 MOV r0,r5 0x08000252 F000F84F BL.W strlen (0x080002F4) 0x08000256 1946 ADDS r6,r0,r5 0x08000258 E007 B 0x0800026A 0x0800025A 7820 LDRB r0,[r4,#0x00] 0x0800025C 1E71 SUBS r1,r6,#1 0x0800025E 460E MOV r6,r1 0x08000260 7809 LDRB r1,[r1,#0x00] 0x08000262 F8041B01 STRB r1,[r4],#0x01 0x08000266 7030 STRB r0,[r6,#0x00] 0x08000268 BF00 NOP 0x0800026A 42B4 CMP r4,r6 0x0800026C D3F5 BCC 0x0800025A 0x0800026E BD70 POP {r4-r6,pc}
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|