|
Си |
|
|
|
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. Какие есть варианты реализации функции. Спасибо!
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
 |
Ответов
(270 - 283)
|
Mar 28 2013, 10:51
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(ARV @ Mar 27 2013, 12:27)  1. возможность для автоматических переменных задавать одинаковые идентификаторы во вложенных блоках. Согласен, но с одним уточнением - намеренное использование одинаковых идентификаторов. Иначе программисту придется перед тем, как сделать например такое в какой то функции - Код { int i; for(i=0;i<10;++i) a[i]=i; } просмотреть весь остальной код функции, что бы убедится, что там нигде не используется iЦитата 3. использование "для оптимальности" вариаций 5[a] и аналогичных "трюков". Это не 'трюк', это вообще 'курьез'. Использовать это в программе можно только с явной целью всех запутать.  Так что с этим пунктом тоже согласен.
|
|
|
|
|
Mar 28 2013, 17:02
|
Местный
  
Группа: Свой
Сообщений: 209
Регистрация: 6-01-12
Пользователь №: 69 197

|
Цитата(demiurg_spb @ Mar 28 2013, 17:27)  astyle рулит - за секунду переформатирует любой "страшный" си-код под свои предпочтения. Может подскажите как заставить astyle переменные писать с начала строки а код с таба? Код int fn(int a,int b) { int c; <TAB>c = a+ b; <TAB>какой-то код return c; }
--------------------
|
|
|
|
|
Apr 5 2013, 07:37
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(demiurg_spb @ Apr 5 2013, 11:08)  Вот пример макроса используемого в исходниках Linux. Тот кто сможет это осознать уже заслуживает медали;-) Код #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); (type *)( (char *)__mptr - offsetof(type,member) );}) Вычисляет адрес структуры типа type по известному указателю ptr на ее элемент с именем member
Сообщение отредактировал sasamy - Apr 5 2013, 07:42
|
|
|
|
|
Apr 5 2013, 20:17
|
Местный
  
Группа: Свой
Сообщений: 209
Регистрация: 6-01-12
Пользователь №: 69 197

|
Цитата(neiver @ Apr 5 2013, 14:20)  Тому кто сможет сделать этот макрос без использования трёх применённых там GCC-шных расширений, используя только стандартный С99, тому можно сразу памятник нерукотворный  как то я не вижу трёх расишрений -- вроде ведь только одно (TYPEOF()) ? и TYPEOF() * на void * можно заменить ?
--------------------
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|