Доброго времени суток.Имеет место быть следующий код:
#include <unistd.h>
#include <stdlib.h>#define INITIAL 'A'
#define INITIATE_NEXT 1
#define MAX '['
#define LENGTH 3int 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) или примеры перебора на С?
Заранее благодарен за ответ.
что-то мы с форумом друг друга не поняли: вместо ++buf; надо ++buf[i];
>что-то мы с форумом друг друга не поняли: вместо ++buf; надо ++buf[i];
>во, доредактировал
> write(1,buf,k+1);
> write(1,"\n",1);все тут.
сначала сделайте преобразования, и только после этого пишите в дескриптор, и пишите через стандартную библиотеку там хоть буферизация есть.
зы
while(buf[x]==MAX&&x>-1)
ошибка в условии цикла. если x == -1, первая часть условия будет вычислена первой, как следтсвие будет произведе доступ к buf[-1], что есть UB.
>[оверквотинг удален]
>все тут.
>
>сначала сделайте преобразования, и только после этого пишите в дескриптор, и пишите
>через стандартную библиотеку там хоть буферизация есть.
>
>зы
>while(buf[x]==MAX&&x>-1)
>ошибка в условии цикла. если x == -1, первая часть условия будет
>вычислена первой, как следтсвие будет произведе доступ к buf[-1], что есть
>UB.спасибо, не заметил.
>Есть ли предложения по его оптимизации (особенно второго 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" (или как оно там(тм)) очень облегчил бы чтение. Комментарии тоже не лишни - как отдельных строк/блоков кода, так и описания всей "сверхзадачи" сего генератороа последовательностей.
За _читабельность_ препод может и накинуть, я думаю...
> или примеры перебора на С?
Не на Си, но четвёртый том Кнута -- это Оно. Ж-)))
>[оверквотинг удален]
>Ага. Ну, заменить на 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*
>>Не на Си, но четвёртый том Кнута -- это Оно. Ж-)))
>Вобще-то по-скорости. Препод нипричём :) пишется для себя. Вобщем-то сие движок будующего тула для генерации последовательностей (uchar там пока что для удобства чтоб можно
>было видеть как отрабатывает,Вот до этого места ещё можно было бы смотреть на john the ripper (да. гугль. нараз.) - его генерацию паролей для перебора...
> а будут int'ы).
Впрочем, int-ы (чего не unsigned-ы?--) не отменяют на john-а посмотреть. Но добавляют, может быть, всякие библиотеки манипулирования с числами "неограниченной точности" (на вскидку - не назову... bcd чего-нибудь? Исходники GNU bc?...).
>почитаю. По поводу читабельности: я привык так писать и этот код наврядли кто-то, кроме меня будет трогать.
Так, если и когда ты _сам_ этот/такой код потрогаешь после перерыва в неделю-месяц-два... Обязательно запомни свои _ощущения_ (Вставь одну строчку с комментарием-"напоминалкой" в код -- прямо сейчас, "шоб не забыть"!) от "вспоминиания" и разбирания по-новой. Подумай, как _собственные_ ощущения изменятся (-ились бы) от пущей читабельности. Как/сколько времени _себе_ сэкономишь/потратишь. _Процесс_ -- он, конечно, важен, но потратив на него лишнюю Ж) минуту, ты пропустил (или даже _потерял_ навегда!) минуту более интеерсных занятий. :)))))
...
Прототипы на коленке легче клепать на скриптовых языках. Оптимизацию _нужно_ откладывать на потом. Рекомендую: taoup (да, находится нараз в гугле. да, _есть_ перевод на русский в книжных.) ESR-а. Там -- глава про оптимизацию, отдельная.>Буфферизацию добавлю. Больше всего интересует сам алгоритм инкремента.
Я тебя умоляю -- только не самописной реализацией в том же спагетти коде и плавным использованием _всех_ названий переменных из одной латинской буквы. :))
>P.S. stdout, stdin, stderr - FILE*
Наверное, поэтому тебе и говорили про _fwrite_?
>[оверквотинг удален]
>
>>Буфферизацию добавлю. Больше всего интересует сам алгоритм инкремента.
>
>Я тебя умоляю -- только не самописной реализацией в том же спагетти
>коде и плавным использованием _всех_ названий переменных из одной латинской буквы.
>:))
>
>>P.S. stdout, stdin, stderr - FILE*
>
>Наверное, поэтому тебе и говорили про _fwrite_?ну вобщем-то коммент по теме и полезен :) про латинскую букву: там их не 23. Да и это прототип на коленке сваянный.
про fwrite мне говорили, а вот как write'ом голым писать в stdout/in/err - нет :) разве что write(fileno(stdout),...) :)
>про fwrite мне говорили, а вот как write'ом голым писать в stdout/in/err
>- нет :) разве что write(fileno(stdout),...) :)ну в in писать это что-то новое в области кодостроения :)
fwrite() вообще-то как бы по итогу сам вызывает write(), ну а выше было "write(STDOUT..", а не "write(stdout..", есть разница ;)))
>>про fwrite мне говорили, а вот как write'ом голым писать в stdout/in/err
>>- нет :) разве что write(fileno(stdout),...) :)
>
>ну в in писать это что-то новое в области кодостроения :)
>fwrite() вообще-то как бы по итогу сам вызывает write(), ну а выше
>было "write(STDOUT..", а не "write(stdout..", есть разница ;)))угу :) STDOUT нету :) есть STDOUT_FILENO
у нас по магазинам что-то не наблюдается 4-й (или его выпуски). может кто-то подскажет где взять? (англ/рус - не важно)
>у нас по магазинам что-то не наблюдается 4-й
>может кто-то подскажет где