>> ps: хз как сдавать лабу буду, хорошо бы glibc и хедеры под винду найти где-нибудь....
> http://www.mingw.org/
Там, AFAIR, нет getopt'а, т.е. конкретно этот код собрать не полчится.
f0rk, IMHO, вариант один - LiveCD, тот же KNOPPIX.
Хотя нас за самовольную загрузку чего-то своего на машины в терминалке сильно ругали. Правда, это давно уже было, LiveCD тогда не было, равно как и CD-ромов на машинах ;)
P.S.
За установку софта (это к вопросу про MinGW) тоже сильно ругали.
>Надо всё-таки отталкиваться от того что это лабы, а цель их - >показать свои знания решением задачи. Смотри в сторону стандартов >ISO C, C99 и т.д.
>los_nikos (*) (18.11.2006 20:39:16)
Угу, именно... думаю для сдачи этой лабы преподу гораздо интересней было бы увидеть собственную реализацию парсинга аргументов командной строки, а не видеть зачем-то притащеный glibc с ним... Заодно портабельней бы было, собственная-то реализация... И совет - отделяй парсинг данных командной строки(оно же в гуях называется представлением) от алгоритма твоей программы(оно же движок), т.е. юзай функции... приведённый фрагмент толком ничего не делает, а занимает уже аж экран - нормальный преп похоронит...
Кстати, если программа остается в рамках стандартных либ, то тогда можно под виндой откомпилировать родным транслятором. Из бесплатных есть борлондовский, Digital Mars C/C++ и тот же Visual C++ ;)
>В САД!
>>Никогда не используйте do/while для БЕСКОНЕЧНОГО цикла
[quote из хорошей книжки]
60. Избегайте циклов do/while
Цикл do/while опасен в принципе, так как вы обязательно
выполняете его тело хотя бы один раз. Следовательно, вы должны
проверить условия завершения до входа в этот цикл. Я часто вижу код,
похожий на следующий:
if( !проверить_нечто )
return ERROR;
do
{
начинка();
} while( проверить_нечто );
Вам гораздо лучше сделать так:
while( проверить_нечто )
начинка();
Похожий случай:
if( некое_условие() )
do
// масса материала
while( некое_условие() && другой_материал() );
легче трактовать следующим образом:
while( некое_условие() )
{
// масса материала
if( !другой_материал() )
break;
}
Я профессионально занимаюсь программированием с 1979 года и за это
время использовал цикл do/while всего два раза.
[/quote]
Совет сишника. В C++ можно объявлять переменные внутри блока. Тогда для реализации, например, математических алгоритмов цикл do {} while очень удобен - в начале цикла создаются нулевые внутренние переменные, которые будут использоваться, и нужен хотя бы один проход цикла чтоб проверить, сразу ли выполнится условие или нужно еще покрутить. В этом случае легко избегается типичная регрессионная ошибка - занулить перед рассчетами не все переменные( если их много - разнообразных dxx, dxy, dxz и т.п.) Так что лучше судить не по книжкам, а по собственному опыту +)
Насчёт konky, он вообще умеет не мерцая (тоесть используя двойной буфер), не убивать иконки на десктопе. own_window yes использовать не прикольно, так как постоянно висит открытое окошко, которое напрягает больше чем его обновления. Вариант - иконки зло, не покатит, нужно иенно так. А скрин приятный.
gtkrc:
style "notebook" = "default"
{
xthickness = 1
ythickness = 0
}
class "GtkNotebook" style "notebook"
~/.config/Terminal/terminalrc
MiscTabCloseButtons=FALSE
С такими изменениями табы почти в два раза уже.
Ну, не плохо. Работа с файловыми дескрипторами, getopt_long. Только вот вместо do/while с abort лучше было бы использовать while с default "use --help". А то, аварийный останов понимаешь происходит :)
Программирование под Линуксом это 5+ !!! Молодец. А сдавать можно конечно разными способами. Я, на пример, с ноутам сейчас сдаю, если нужен GUI интерфейс, правда носить его не люблю, поэтому по возможности пишу на простом С и до сдачи подправляю код в институте на Борлондо-Билдоровском компиляторе. Компы в институте обычно настроены так, что загружать с CD нельзя, так что с liveCD сдавать - редкий вариант.
Блин, ну вы даете... Какая разница где программировать такие тривиальные приложения - под винду или линукс или солярис? Программировать надо под задачу, а не под систему... Вы можете весь код написать под Visual C++ 6.0 c Visual Assist и установленым ICC, а затем просто скопировать на линуксовую машину и скомпилять... А можете и в vim'е накатать прогу и скомпилять её потом в VS2005... И круть ваша, как начинающих программистов, будет только в том, чтоб и в том и в другом случае одинаковый код компилился без ошибок, warning'ов и info-в всяких, для чего его лучше затем прогонять чем-то вроде lint ну и компилять со всякими ключами типа -pedantic в gcc... так что учитесь студенты, что отнюдь не IDE и текстовый редактор определяют качество кода...
так лаконичнее и понятнее (хотя это один из очень немногих случаев когда имеетсмысл объединять в одной строке присваивание и проверку - ибо идиома).
и по незнакомой опции надо вызывать не abort - зачем тебе корка в этом случае, а что-то типа usage() - который печатает краткую справку и выходит с ненулевым статусом.
>там, AFAIR, нет getopt'а, т.е. конкретно этот код собрать не получится.
Автор тут использует даже не getopt() а вообще getopt_long() -- такой код даже на *BSD и разные специфические юниксы может быть проблематично переносить. getopt() хотя бы есть в POSIX, а вот getopt_long() нет :(
>while( (option = getopt()) != -1 ) { swith (option) { так лаконичнее и понятнее
Полностью согласен.
>(хотя это один из очень немногих случаев когда имеетсмысл объединять в одной строке присваивание и проверку - ибо идиома).
У меня присваивание с проверкой встречается в программе ровно один раз: при использовании getopt()
>и по незнакомой опции надо вызывать не abort - зачем тебе корка в этом случае, а что-то типа usage() - который печатает краткую справку и выходит с ненулевым статусом.
P.S. Если правильно помню, то в универе у меня было в точности такое же
задание с книжками :) Вот только писать надо было на Pascal'e.
*покопавшись в ~/Pascal* Мда.. почти такая же.. там про книжную полку :)
Прикольно.. Вот кусок из моего меню (я тогда ещё и комментарии и вывод
программы писал на русском):
1 Program my_bookshelf;
2 (*
3
4 Author: php-coder <php-coder / ngs.ru>
5 Date: 22.12.2004
6 Last update: 22.12.2004
7
8 Powered by gvim! Made in Russia! :))
...
234 (*----------------------------------------*)
235 (* S T A R T P R O G R A M ! :-) *)
236 (*----------------------------------------*)
237 Begin
238 bookbd := '/home/coder/Pascal/irgz/bookbd.dat';
239
240 clrscr;
241 writeln('Что сделать? Эта программа способна:',
242 #13#10, '1) Добавить запись о новой книге в базу данных',
243 #13#10, '2) Осуществить распечатку о книгах по программированию',
244 #13#10, '3) Распечатать список задачников по алгебре',
245 #13#10, '4) Определить количество книг, превышающих по объему 300 страниц',
246 #13#10, '5) Распечатать название и цену самой дорогой книги по истории',
247 #13#10, '6) Выйти');
248
249 repeat
250 write(#13#10, 'Введите номер требуемой операции: ');
251 readln(what);
252
253 case what of
254 1: add_book();
255 2: print_program_books();
256 3: print_algebra();
257 4: calculate_more300();
258 5: print_most_dearly_history_book();
259 end;
260
261 until what = 6;
262
263 End.
Низачот за такой ненастроеный вим. Для начала хотя бы сделай set bg=dark (а то он схему для белого фона поставил и получилось нечитабельно), потом возьми чей-нибудь приличный vimrc, и наконец сделай хороший свой..
>почитай еще книжку "Веревка достаточной длины, чтобы выстрелить себе в ногу" Алена Голуба :)
Enough rope to shoot yourself in the foot
Где здесь про длину?!! "Достаточно верёвки, чтобы прострелить себе ногу".
Книга интересна только как описание мытарств автора во времена дорогого машинного времени :) Вместо всего остального читай "Искусство программирования в UNIX".
Если погуглишь, то найдешь программу, способную его из BIOS'а достать.
Софтина, кажется, из одного файла на С состоит. Под Linux'ом откомпилировалась сразу и без проблем (вот что значит кроссплатформенность) и я вспомнил пароль... после того, как его увидел :-)