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

 
 
19 страниц V  < 1 2 3 4 5 > »   
Reply to this topicStart new topic
> Си
demiurg_spb
сообщение Jan 25 2013, 09:59
Сообщение #31


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

Группа: Свой
Сообщений: 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;
}
Кстатиsm.gif В этом кусочке кода три ошибки (три лишних символа &).
А вы говорите хорошая читаемость... Чем лаконичнее, тем ИМХО профессиональнее.


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


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Буратино @ Jan 25 2013, 12:53) *
Ищу самую правильную и изящную реализацию, хочу вот именно так и не иначе.

Если речь идет о первом вопросе, то логичнее не попадать в такую ситуацию. Строки не сами по себе появляются в программе. Вот в момент создания и заносить символы в нужном порядке.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 25 2013, 10:04
Сообщение #33


;
******

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


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

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



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

Я бы поспорил насчет в два раза, и про место под буфер
Так что удачи...

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


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


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

Группа: Свой
Сообщений: 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;
   }
}




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


;
******

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



Для нелюбителей тройных пересылок есть одна бяка
Код
while(beg < end)
{
  *beg++ = *(--end);
  *end = *beg;
}

Строка "сползает", но ее можно искусственно расширить и передать указ. не на начало, а на s[1]
Бред, в общем случае, но.. если у нас не char а нечто более существенное, пересылки могут доставить
ЗЫ вот только для чего эти сферокони, не пойму sm.gif

Сообщение отредактировал _Pasha - Jan 25 2013, 10:21
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 25 2013, 10:20
Сообщение #37


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(_Pasha @ Jan 25 2013, 13:17) *
Для нелюбителей тройных пересылок есть одна бяка
...
Строка "сползает"

Так вы потеряете первый символ строки... и т.д.
++ инкрементирует указатель после использования.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 25 2013, 10:23
Сообщение #38


;
******

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



Цитата(ViKo @ Jan 25 2013, 13:20) *
Так вы потеряете первый символ строки... и т.д.

А не надо его терять. Первый символ !=0 и всё, а сама строка начинается со второго. Ассемблерные заморочки sm.gif
Кстати, такая штуковина со "сползанием и перестановкой" может в графике пригодиться

Сообщение отредактировал _Pasha - Jan 25 2013, 10:25
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 25 2013, 10:29
Сообщение #39


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(_Pasha @ Jan 25 2013, 13:23) *
А не надо его терять. Первый символ !=0 и всё, а сама строка начинается со второго. Ассемблерные заморочки sm.gif
Кстати, такая штуковина со "сползанием и перестановкой" может в графике пригодиться

Т.е. начать переносить на 1 символ левее строки? Тогда в середине появится разрыв. laughing.gif
По-моему, без промежуточной переменной - никак!
Go to the top of the page
 
+Quote Post
Буратино
сообщение Jan 25 2013, 10:53
Сообщение #40


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

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



Вот немного "заоптимизировал". Теперь переменной "с" нет, но есть 3 дополнительные арифметич. действия. Какие есть мысли, соображения? Спасбио!
Код
#include <string.h>
void reverse ( char *s ) {

   char *beg = s;
   char *end = &s[strlen(s)-1];

      do {
         *end -= *beg;
         *beg += *end;
         *end = *beg - *end;
      } while (++beg < --end);
}


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


;
******

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



Цитата(ViKo @ Jan 25 2013, 13:29) *
Т.е. начать переносить на 1 символ левее строки? Тогда в середине появится разрыв. laughing.gif
По-моему, без промежуточной переменной - никак!

Ага, ошибочка вышла. Да простит меня высокое собрание.

Цитата(Буратино @ Jan 25 2013, 13:53) *
Какие есть мысли, соображения? Спасбио!

На общеприменяемых архитектурах будет хуже. Потому что "лишний" char c есть регистровая переменная. А так - добавляются операции, такие же переменные неявно выделяются компилятором, но самое обидное будет если у нас не char, а long например.
В принципе, вместо + - как у Вас надо бы
Код
поменять местами A,B
A ^= B;
B ^= A;
A ^= B;


Сообщение отредактировал _Pasha - Jan 25 2013, 11:00
Go to the top of the page
 
+Quote Post
Буратино
сообщение Jan 25 2013, 11:11
Сообщение #42


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

Группа: Свой
Сообщений: 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);
}


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


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Да, верно, с исключающим или можно обойтись без промежуточной переменной (знал, но забыл). Но это не будет эффективнее, чем использовать еще один регистр.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 25 2013, 11:35
Сообщение #44


;
******

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


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post

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

 


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


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