реклама на сайте
подробности

 
 
> Си
Буратино
сообщение Jan 24 2013, 19:24
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 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. Какие есть варианты реализации функции.

Спасибо!


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
19 страниц V   1 2 3 > »   
Start new topic
Ответов (1 - 14)
telix
сообщение Jan 24 2013, 19:37
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 118
Регистрация: 9-12-12
Из: Курск
Пользователь №: 74 767




В коде ошибка поставьте j-- sm.gif

Сообщение отредактировал telix - Jan 24 2013, 19:42


--------------------
улыбаемся ...
Go to the top of the page
 
+Quote Post
Буратино
сообщение Jan 24 2013, 20:15
Сообщение #3


Профессионал
*****

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



Цитата(telix @ Jan 24 2013, 22:37) *
В коде ошибка поставьте j-- sm.gif


да ,сори.

ЗАДАЧА Б
Есть реализация функции перевода "типа" 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. Какие есть варианты реализации функции.


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 24 2013, 20:31
Сообщение #4


;
******

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
редактор
сообщение Jan 25 2013, 05:16
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315



По задаче Б.
переменная типа bool принимает значение 0 и !0 (не 0). В зависимости от реализации компиляторе !0 может выглядеть любым целым числом, поэтому "Out Of Range" - некоррекное заявление.

Сообщение отредактировал редактор - Jan 25 2013, 05:16


--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 25 2013, 05:23
Сообщение #6


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(редактор @ Jan 25 2013, 08:16) *
По задаче Б.
переменная типа bool принимает значение 0 и !0 (не 0). В зависимости от реализации компиляторе !0 может выглядеть любым целым числом, поэтому "Out Of Range" - некоррекное заявление.

Неправда! Область значений, согласно stdbool.h -это true,false. Отсюда
Код
static const char strue[]="TRUE";
static const char sfalse[]="FALSE";
static const char sndef[]="OUT OF RANGE";
switch(boolean)
{
  case true:
   return &strue;
  case false:
   return &sfalse;
  default:
   return &sndef;
}
Go to the top of the page
 
+Quote Post
msalov
сообщение Jan 25 2013, 05:38
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Цитата(_Pasha @ Jan 25 2013, 08:23) *
Неправда! Область значений, согласно stdbool.h -это true,false.

Исходя из того, что в Си bool это всего лишь костыль для пришедших из других языков, и любое не 0-ое значение является истиной для условных операторов, то, ИМХО редактор прав.

Задачу А можно оптимизировать сильнее всего исходя из контекста.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 25 2013, 05:49
Сообщение #8


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(gotty @ Jan 25 2013, 08:38) *
и любое не 0-ое значение является истиной для условных операторов, то, ИМХО редактор прав.

biggrin.gif
if(0) - выражение в скобках сейчас == 0
if(!0) - выражение в скобках сейчас == 1
Ы?

Цитата(gotty @ Jan 25 2013, 08:38) *
Задачу А можно оптимизировать сильнее всего исходя из контекста.

Работа непосредственно с двумя указателями выигрывает на любых pic/avr/arm/x51
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Jan 25 2013, 05:59
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



В задаче А вижу только один недостаток - это нет проверки на пустую строку. Если длина будет 0, то произойдёт переполнение и запись за пределы строки. По производительности тоже проблем не наблюдаю - можно было бы сделать какой-нибудь ассемблерный SWAP или хотя бы промежуточную переменную поместить в регистр, но это от архитектуры зависит.
В задаче Б всякая жесть. Тип заявлен bool, а передаётся char. Сравнение почему-то с 0 и 1, хотя false и true может быть определена иначе. Нужно сравнивать с настоящими false и true, теми которые используются вашим компилятором.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 25 2013, 05:59
Сообщение #10


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



грубовато...
Код
const char* b2s (unsigned char b) {
   static const char* name[] = {"False", "True", "Out Of Range", "Out Of Range"};
   return name[b&3];
}


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 25 2013, 06:04
Сообщение #11


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(demiurg_spb @ Jan 25 2013, 08:59) *
return name[b&3];

Ага, щаз! А если b например... b=0x0C
Go to the top of the page
 
+Quote Post
msalov
сообщение Jan 25 2013, 06:08
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Цитата(_Pasha @ Jan 25 2013, 08:49) *
biggrin.gif
if(0) - выражение в скобках сейчас == 0
if(!0) - выражение в скобках сейчас == 1
Ы?
Я имел ввиду немного другое
Код
    if (42)
    {
        printf("True\n");
    }
    else
    {
        printf("False\n");
    }

Какая ветка условного оператора будет выполнена? Третьего "outofrange" не дано, увы.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 25 2013, 06:16
Сообщение #13


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(gotty @ Jan 25 2013, 09:08) *
Я имел ввиду немного другое

Дык это несовместимость типов. laughing.gif Почему к случаям явного приведения int к указателю всегда люди относятся настороженно, а к "притягиванию" bool к char - типа что это нормально?
Примеров привести не могу, у меня не очень богатый сишный опыт. Только анекдот
Цитата
#define true false // собаки, ковыряйтесь теперь сами


sm.gif
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 25 2013, 06:31
Сообщение #14


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(_Pasha @ Jan 25 2013, 10:04) *
Ага, щаз! А если b например... b=0x0C
Ну так я и сказал что грубоватоsm.gif
Код
const char* b2s (unsigned char b) {
   static const char* name[] = {"False", "True", "Out Of Range"};
   return name[(b>1)? 2:b];
}


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 25 2013, 06:33
Сообщение #15


;
******

Группа: Участник
Сообщений: 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}
Go to the top of the page
 
+Quote Post

19 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 18:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.01509 секунд с 7
ELECTRONIX ©2004-2016