The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Последовательности"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"Последовательности"  
Сообщение от naquad email(??) on 09-Янв-09, 10:19 
Доброго времени суток.

Имеет место быть следующий код:


#include <unistd.h>
#include <stdlib.h>

#define INITIAL 'A'
#define INITIATE_NEXT 1
#define MAX '['
#define LENGTH 3

int main(int argc,char* argv[]){
  unsigned char buf[128]={INITIAL};
  int x,k=0;

  while(1){
    write(1,buf,k+1);
    write(1,"\n",1);
    ++buf[k];

    if(buf[k]==MAX){
      x=k;
      while(buf[x]==MAX&&x>-1){
        buf[x]=INITIAL;
        if(--x>-1)
          ++buf[x];
      }

      if(x<0){
        if(++k==LENGTH)
          break;
#if INITIATE_NEXT
        buf[k]=INITIAL;
#endif
      }
    }
  }

  return 0;
}

Есть ли предложения по его оптимизации (особенно второго while'a) или примеры перебора на С?

Заранее благодарен за ответ.

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Последовательности"  
Сообщение от naquad email(??) on 09-Янв-09, 10:20 
что-то мы с форумом друг друга не поняли: вместо ++buf; надо ++buf;
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Последовательности"  
Сообщение от naquad email(ok) on 09-Янв-09, 10:31 
>что-то мы с форумом друг друга не поняли: вместо ++buf; надо ++buf;
>

во, доредактировал

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Последовательности"  
Сообщение от vic (??) on 09-Янв-09, 12:13 
>    write(1,buf,k+1);
>    write(1,"\n",1);

все тут.

сначала сделайте преобразования, и только после этого пишите в дескриптор, и пишите через стандартную библиотеку там хоть буферизация есть.

зы
while(buf[x]==MAX&&x>-1)
ошибка в условии цикла. если x == -1, первая часть условия будет вычислена первой, как следтсвие будет произведе доступ к buf[-1], что есть UB.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "Последовательности"  
Сообщение от naquad email(ok) on 09-Янв-09, 13:52 
>[оверквотинг удален]
>все тут.
>
>сначала сделайте преобразования, и только после этого пишите в дескриптор, и пишите
>через стандартную библиотеку там хоть буферизация есть.
>
>зы
>while(buf[x]==MAX&&x>-1)
>ошибка в условии цикла. если x == -1, первая часть условия будет
>вычислена первой, как следтсвие будет произведе доступ к buf[-1], что есть
>UB.

спасибо, не заметил.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "нескончаемой чередой потянулись студенты"  
Сообщение от Andrey Mitrofanov on 09-Янв-09, 12:50 
>Есть ли предложения по его оптимизации (особенно второго while'a)

Оптимизация по скорости? По объёму памяти? Обе -- бессмысленны: код не зависит от входных данных (argv/argc или чтения чего-либо, рэндом-генераторов и пр.), то есть выводит (опуская возможность "использования" неициализированных данных) _одно_и_то_же_. Размер выводимых данных, вроде, не очень велик. ..."чуть больше" 26^2*3+26^3*4 - ~72k, если я "угадал".

_Существенную_ прибавку в скорости могла бы дать буферизация выходного "потока", если она _уже_ не реализована в write()... А, это у нас ~write(STDOUT,~ типа? Ага. Ну, заменить на fwrite (или как их там...) с включением буфера "побольше-побольше" перед циклами.

Очень желательна "оптимизация" _читабельности_ кода. Использование for(;;) вместо while() -- с собранными, по возможности, в одном месте "операторами", относящимися к циклу, например. Замена "k=0 ... k+1 ... ++k== ..." на "len=1 ... len ... len++ >=" (код с x тоже надо переписать; и перереименовать, возможно), "INITIAL 'A' ... MAX '[' ... ==MAX" на "CHAR_FIRST 'A' ... CHAR_LAST 'Z' ... >CHAR_LAST". Кстати, "1" --> "STDOUT" (или как оно там(тм)) очень облегчил бы чтение. Комментарии тоже не лишни - как отдельных строк/блоков кода, так и описания всей "сверхзадачи" сего генератороа последовательностей.

За _читабельность_ препод может и накинуть, я думаю...

> или примеры перебора на С?

Не на Си, но четвёртый том Кнута -- это Оно. Ж-)))

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "нескончаемой чередой потянулись студенты"  
Сообщение от naquad email(ok) on 09-Янв-09, 13:59 
>[оверквотинг удален]
>Ага. Ну, заменить на fwrite (или как их там...) с включением
>буфера "побольше-побольше" перед циклами.
>
>Очень желательна "оптимизация" _читабельности_ кода. Использование for(;;) вместо while() -- с собранными, по возможности, в одном месте "операторами", относящимися к циклу, например. Замена "k=0 ... k+1 ... ++k== ..." на "len=1 ... len ... len++ >=" (код с x тоже надо переписать; и перереименовать, возможно), "INITIAL 'A' ... MAX '[' ... ==MAX" на "CHAR_FIRST 'A' ... CHAR_LAST 'Z' ... >CHAR_LAST". Кстати, "1" --> "STDOUT" (или как оно там(тм)) очень облегчил бы чтение. Комментарии тоже не лишни - как отдельных строк/блоков кода, так и описания всей "сверхзадачи" сего генератороа последовательностей.
>
>За _читабельность_ препод может и накинуть, я думаю...
>
>> или примеры перебора на С?
>
>Не на Си, но четвёртый том Кнута -- это Оно. Ж-)))

Вобще-то по-скорости. Препод нипричём :) пишется для себя. Вобщем-то сие движок будующего
тула для генерации последовательностей (uchar там пока что для удобства чтоб можно было
видеть как отрабатывает, а будут int'ы). Спасибо за подсказку про Кнута, обязательно
почитаю. По поводу читабельности: я привык так писать и этот код наврядли кто-то, кроме
меня будет трогать. Буфферизацию добавлю. Больше всего интересует сам алгоритм инкремента.

P.S. stdout, stdin, stderr - FILE*

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

9. "философские асекты написания вложенных цЫклАФ"  
Сообщение от Andrey Mitrofanov on 09-Янв-09, 15:24 
>>Не на Си, но четвёртый том Кнута -- это Оно. Ж-)))
>Вобще-то по-скорости. Препод нипричём :) пишется для себя. Вобщем-то сие движок будующего тула для генерации последовательностей (uchar там пока что для удобства чтоб можно
>было видеть как отрабатывает,

Вот до этого места ещё можно было бы смотреть на john the ripper (да. гугль. нараз.) - его генерацию паролей для перебора...

> а будут int'ы).

Впрочем, int-ы (чего не unsigned-ы?--) не отменяют на john-а посмотреть. Но добавляют, может быть, всякие библиотеки манипулирования с числами "неограниченной точности" (на вскидку - не назову... bcd чего-нибудь? Исходники GNU bc?...).

>почитаю. По поводу читабельности: я привык так писать и этот код наврядли кто-то, кроме меня будет трогать.

Так, если и когда ты _сам_ этот/такой код потрогаешь после перерыва в неделю-месяц-два... Обязательно запомни свои _ощущения_ (Вставь одну строчку с комментарием-"напоминалкой" в код -- прямо сейчас, "шоб не забыть"!) от "вспоминиания" и разбирания по-новой. Подумай, как _собственные_ ощущения изменятся (-ились бы) от пущей читабельности. Как/сколько времени _себе_ сэкономишь/потратишь. _Процесс_ -- он, конечно, важен, но потратив на него лишнюю Ж) минуту, ты пропустил (или даже _потерял_ навегда!) минуту более интеерсных занятий. :)))))

...
Прототипы на коленке легче клепать на скриптовых языках. Оптимизацию _нужно_ откладывать на потом. Рекомендую: taoup (да, находится нараз в гугле. да, _есть_ перевод на русский в книжных.) ESR-а. Там -- глава про оптимизацию, отдельная.

>Буфферизацию добавлю. Больше всего интересует сам алгоритм инкремента.

Я тебя умоляю -- только не самописной реализацией в том же спагетти коде и плавным использованием _всех_ названий переменных из одной латинской буквы. :))

>P.S. stdout, stdin, stderr - FILE*

Наверное, поэтому тебе и говорили про _fwrite_?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

10. "философские асекты написания вложенных цЫклАФ"  
Сообщение от naquad email(??) on 09-Янв-09, 20:33 
>[оверквотинг удален]
>
>>Буфферизацию добавлю. Больше всего интересует сам алгоритм инкремента.
>
>Я тебя умоляю -- только не самописной реализацией в том же спагетти
>коде и плавным использованием _всех_ названий переменных из одной латинской буквы.
>:))
>
>>P.S. stdout, stdin, stderr - FILE*
>
>Наверное, поэтому тебе и говорили про _fwrite_?

ну вобщем-то коммент по теме и полезен :) про латинскую букву: там их не 23. Да и это прототип на коленке сваянный.

про fwrite мне говорили, а вот как write'ом голым писать в stdout/in/err - нет :) разве что write(fileno(stdout),...) :)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

11. "философские асекты написания вложенных цЫклАФ"  
Сообщение от vic (??) on 09-Янв-09, 21:59 
>про fwrite мне говорили, а вот как write'ом голым писать в stdout/in/err
>- нет :) разве что write(fileno(stdout),...) :)

ну в in писать это что-то новое в области кодостроения :)
fwrite() вообще-то как бы по итогу сам вызывает write(), ну а выше было "write(STDOUT..", а не "write(stdout..", есть разница ;)))


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

12. "философские асекты написания вложенных цЫклАФ"  
Сообщение от naquad email(ok) on 10-Янв-09, 13:12 
>>про fwrite мне говорили, а вот как write'ом голым писать в stdout/in/err
>>- нет :) разве что write(fileno(stdout),...) :)
>
>ну в in писать это что-то новое в области кодостроения :)
>fwrite() вообще-то как бы по итогу сам вызывает write(), ну а выше
>было "write(STDOUT..", а не "write(stdout..", есть разница ;)))

угу :) STDOUT нету :) есть STDOUT_FILENO

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "нескончаемой чередой потянулись студенты"  
Сообщение от naquad email(ok) on 09-Янв-09, 14:08 
у нас по магазинам что-то не наблюдается 4-й (или его выпуски). может кто-то подскажет где взять? (англ/рус - не важно)
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "точно не студенты? %)"  
Сообщение от Andrey Mitrofanov on 09-Янв-09, 14:28 
>у нас по магазинам что-то не наблюдается 4-й
>может кто-то подскажет где

http://google.ru/search?q=taocp+vol+4

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру