The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Последовательности, !*! naquad, 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) или примеры перебора на С?

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

  • Последовательности, !*! naquad, 10:20 , 09-Янв-09 (1)
    что-то мы с форумом друг друга не поняли: вместо ++buf; надо ++buf[i];
  • Последовательности, !*! vic, 12:13 , 09-Янв-09 (3)
    >    write(1,buf,k+1);
    >    write(1,"\n",1);

    все тут.

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

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

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

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

  • нескончаемой чередой потянулись студенты, !*! Andrey Mitrofanov, 12:50 , 09-Янв-09 (4)
    >Есть ли предложения по его оптимизации (особенно второго 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" (или как оно там(тм)) очень облегчил бы чтение. Комментарии тоже не лишни - как отдельных строк/блоков кода, так и описания всей "сверхзадачи" сего генератороа последовательностей.

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

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

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

    • нескончаемой чередой потянулись студенты, !*! naquad, 13:59 , 09-Янв-09 (6)
      >[оверквотинг удален]
      >Ага. Ну, заменить на 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*

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    • нескончаемой чередой потянулись студенты, !*! naquad, 14:08 , 09-Янв-09 (7)
      у нас по магазинам что-то не наблюдается 4-й (или его выпуски). может кто-то подскажет где взять? (англ/рус - не важно)



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

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