|
|
  |
Си |
|
|
|
Jan 25 2013, 09:59
|

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

|
Цитата(Буратино @ Jan 25 2013, 12:31)  demiurg_spb, мне не очень понравилось. читаемость отвалилась, а скилов не добавилось как по мне. Профит есть 2 строчки кода с хорошей читаемостью вместо 6..9 строк кода в другой реализации. Вы это поймёте, когда будете писать большие программы, в которых становится важна не только выразительность отдельно взятой процедуры, а модуля целиком... Всему своё время. Цитата(_Pasha @ Jan 25 2013, 09:23)  Код 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; } Кстати  В этом кусочке кода три ошибки (три лишних символа &). А вы говорите хорошая читаемость... Чем лаконичнее, тем ИМХО профессиональнее.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Jan 25 2013, 10:04
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(Буратино @ Jan 25 2013, 12:48)  давайте его допилим и Чо там пилить? CODE void reverse(char *s) { if(s == NULL) return; char *end = s; while(*end) end++; while(s < end) { char c = *s; *s++ = *(--end); *end = c; } }
Упс... может, они это имели в виду, что при передаче не-указателя не нужно его проверять?
Сообщение отредактировал _Pasha - Jan 25 2013, 10:06
|
|
|
|
|
Jan 25 2013, 10:06
|
Частый гость
 
Группа: Свой
Сообщений: 118
Регистрация: 9-12-12
Из: Курск
Пользователь №: 74 767

|
Цитата(Буратино @ Jan 25 2013, 13:35)  по поводу тройной пересылки мы еще поговорим, а вот второй буфер не айс однозначно. во первых b[j--] => a[i++] в 2 раза больше нужно а во вторых место под буфер. Я бы поспорил насчет в два раза, и про место под буфер Так что удачи...
Сообщение отредактировал telix - Jan 25 2013, 10:09
--------------------
улыбаемся ...
|
|
|
|
|
Jan 25 2013, 10:06
|

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

|
Давайте в первом чтении вот такую версию ЗАДАЧИ А от _Pasha обсудим? Код #include <string.h> void reverse ( char *s ) {
char *beg = s; char *end = &s[strlen(s)]; char c;
while(beg < end) { c = *beg; *beg++ = *--end; // благодаря префиксному декременту end терминатор строки '\0' останется на своем месте *end = c; } }
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
Jan 25 2013, 10:17
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Для нелюбителей тройных пересылок есть одна бяка Код while(beg < end) { *beg++ = *(--end); *end = *beg; } Строка "сползает", но ее можно искусственно расширить и передать указ. не на начало, а на s[1] Бред, в общем случае, но.. если у нас не char а нечто более существенное, пересылки могут доставить ЗЫ вот только для чего эти сферокони, не пойму
Сообщение отредактировал _Pasha - Jan 25 2013, 10:21
|
|
|
|
|
Jan 25 2013, 11:00
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(ViKo @ Jan 25 2013, 13:29)  Т.е. начать переносить на 1 символ левее строки? Тогда в середине появится разрыв.  По-моему, без промежуточной переменной - никак! Ага, ошибочка вышла. Да простит меня высокое собрание. Цитата(Буратино @ Jan 25 2013, 13:53)  Какие есть мысли, соображения? Спасбио! На общеприменяемых архитектурах будет хуже. Потому что "лишний" char c есть регистровая переменная. А так - добавляются операции, такие же переменные неявно выделяются компилятором, но самое обидное будет если у нас не char, а long например. В принципе, вместо + - как у Вас надо бы Код поменять местами A,B A ^= B; B ^= A; A ^= B;
Сообщение отредактировал _Pasha - Jan 25 2013, 11:00
|
|
|
|
|
Jan 25 2013, 11:11
|

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

|
Цитата(_Pasha @ Jan 25 2013, 14:00)  Ага, ошибочка вышла. Да простит меня высокое собрание. На общеприменяемых архитектурах будет хуже. Потому что "лишний" char c есть регистровая переменная. А так - добавляются операции, такие же переменные неявно выделяются компилятором, но самое обидное будет если у нас не char, а long например. В принципе, вместо + - как у Вас надо бы Код поменять местами A,B A ^= B; B ^= A; A ^= B; с исключающим или мне не очень, хотя красиво конечно a ^= b ^= a ^= b; Вот еще вариантец, только проверить нужно. Кстати как можно простенькие такие программки потестить? Например в самом ИАРе? Как в отладочное окно выводить результаты всяких printf? Спрашивал однажды и запамятовал к сож( Код #include <string.h> void reverse ( char *s ) {
char *beg = s; char *end = &s[strlen(s)-1];
do *beg += *end - (*end = *beg); while (++beg < --end); }
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
Jan 25 2013, 11:35
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(Буратино @ Jan 25 2013, 15:11)  Вот еще вариантец, только проверить нужно. Кстати как можно простенькие такие программки потестить? У меня три вивария, с чем работаю, симуляторы 1. C::B + Proteus для аврок - всё в два клика, но создать проект под АРМ - муки творчества, ибо визардов нормальных нету, поэтому 2. Кейл, там тоже элементарно, исключительно из-за stm32 и at91sam7s 3. Mplab Сыр-бор весь только чтобы глянуть листинг.
Сообщение отредактировал _Pasha - Jan 25 2013, 11:36
|
|
|
|
|
Jan 25 2013, 11:55
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (Буратино @ Jan 25 2013, 13:11)  Кстати как можно простенькие такие программки потестить? Например в самом ИАРе? Как в отладочное окно выводить результаты всяких printf? CODE C:\user\My documents>echo "#include <stdio.h>\ int main()\ {\ printf (\"Hello, world\");\ return 0;\ }\ " > test.c
C:\user\My documents>gcc test.c -o test.exe C:\user\My documents>test.exe Hello, world C:\user\My documents>
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|