From alexeypetrunev на gmail.com Mon Mar 1 03:03:05 2010 From: alexeypetrunev на gmail.com (=?KOI8-R?B?4czFy9PFyiDwxdTS1c6j1w==?=) Date: Mon, 1 Mar 2010 02:03:05 +0300 Subject: [cdev] =?koi8-r?b?+sHEwd7BXzYuIMfSIDEzNQ==?= Message-ID: <8361e7401002281503j6ab77d73w4c854fe2511e7c77@mail.gmail.com> Здравствуйте. Программа компилируется, но не работает. В чем ошибка? Функция *put* просто добавляет элементы в массив *heap*. ----------- следущая часть ----------- Вложение в формате HTML было извлечено… URL: ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: MyQueue.cpp Type: application/octet-stream Size: 1615 bytes Desc: отсутствует URL: From sinclair80 на gmail.com Mon Mar 1 13:07:41 2010 From: sinclair80 на gmail.com (Grigoriy A. Sitkarev) Date: Mon, 1 Mar 2010 12:07:41 +0300 Subject: [cdev] =?utf-8?b?0JfQsNC00LDRh9CwXzYuINCz0YAgMTM1?= In-Reply-To: <8361e7401002281503j6ab77d73w4c854fe2511e7c77@mail.gmail.com> References: <8361e7401002281503j6ab77d73w4c854fe2511e7c77@mail.gmail.com> Message-ID: <73e73bd21003010107j2ebc5e38h69d827a36ae3ad35@mail.gmail.com> Если ответить коротко, то не работает, потому что ты пилишь сук на котором сидишь. В функции prioq_new ты сначала выделил память и для самой структуры очереди и для кучи, при этом указатель на кучу ты тут же присвоил в поле heap. Затем ты структуру обнуляешь через memset(3) и всё её содержимое будет заполнено нулями, в том числе и поле, где у тебя хранился указатель на кучу. Ты "потерял" указатель, теперь попытка получить доступ к куче через queue->heap[i] в queue_put равносильна разыменованию нулевого указателя, что приводит к ошибке сегментации. У тебя в этот момент queue->heap указывает уже в NULL. Тебе нужно сначала выделить память для структуры очереди, очистить её. Затем выделить память для самой кучи (указатель уже можно сохранить в поле структуры очереди - heap), также очистить её. Не забудь проверить что тебе возвращал malloc(3) на каждом из шагов, это обязательно. Если собрать все замечания, то первое что тебе надо сделать, ознакомиться с документом LKCS - Linux Kernel Coding Style и придерживаться его далее. Это по сути осовремененный стиль K&R, который себя хорошо зарекомендовал на практике. http://www.kernel.org/doc/Documentation/CodingStyle Дальше, у тебя какой-то очень странный редактор, потому что в каких-то местах отступы сделаны пробелами, где-то табуляцией, куча лишних пробелов везде оставлено. Расширение файла должно быть `.c' мы же пишем программы для Unix. Компилироваться они должны компилятором GCC. Здесь есть проблемы, потому что видимо тот компилятор, которым пользуешься ты, очень "лоялен" ошибкам и декларациям. Например, в prioq_new():40 и prioq_new():42 ты приводишь значение, возвращаемое malloc(3) к несуществующим (с точки зрения GCC) типам. И вообще говоря этого делать и не надо потому что malloc(3) возвращает void * а он приводится к любому типу. -- Г.А. 1 марта 2010 г. 2:03 пользователь Алексей Петрунёв написал: > Здравствуйте. > > Программа компилируется, но не работает. В чем ошибка? Функция put просто > добавляет элементы в массив heap. > > _______________________________________________ > Cdev mailing list > Cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev > > ----------- следущая часть ----------- Вложение в формате HTML было извлечено… URL: From sinclair80 на gmail.com Mon Mar 1 13:13:19 2010 From: sinclair80 на gmail.com (Grigoriy A. Sitkarev) Date: Mon, 1 Mar 2010 12:13:19 +0300 Subject: [cdev] =?utf-8?b?0JfQsNC00LDRh9CwXzYuINCz0YAgMTM1?= In-Reply-To: <8361e7401002281503j6ab77d73w4c854fe2511e7c77@mail.gmail.com> References: <8361e7401002281503j6ab77d73w4c854fe2511e7c77@mail.gmail.com> Message-ID: <73e73bd21003010113l59e72ea4pc8405d4b2560c784@mail.gmail.com> Да, ещё вот что. Пожалуйста, настрой свой почтовый клиент так, чтобы в список рассылки он слал plain-text письма (не HTML) и вложения тоже надо делать так чтобы они вкладывались как текст. Тогда исходники и патчи будут видны и в архиве списка рассылки. Если вложения идут как некие binary тогда они обработчиком рассылки изымаются и в архив списка не попадают. По идее, если ты вкладываешь в почтовое сообщение файл с расширением `.c' то он будет иметь MIME-заголовок как текст. Твой клиент поставил туда MIME как для бинарного потока: application/octet-stream. -- Г.А. 1 марта 2010 г. 2:03 пользователь Алексей Петрунёв написал: > Здравствуйте. > > Программа компилируется, но не работает. В чем ошибка? Функция *put*просто добавляет элементы в массив > *heap*. > > _______________________________________________ > Cdev mailing list > Cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev > > ----------- следущая часть ----------- Вложение в формате HTML было извлечено… URL: From ElenaKarabanova17 на yandex.ru Fri Mar 5 10:02:58 2010 From: ElenaKarabanova17 на yandex.ru (=?koi8-r?B?68HSwcLBzs/XwSDlzMXOwQ==?=) Date: Fri, 05 Mar 2010 09:02:58 +0300 Subject: [cdev] =?koi8-r?b?+sHEwc7JxSDQzyDV1MnMydTFIEVjaG8=?= Message-ID: <28101267768978@webmail4.yandex.ru> Здравствуйте. Я поставила себе Linux Russian Fedora 11 echo используется в Терминале в качестве команды, получается задание заключается в написание своей команды которая бы выполняла бы все, что делает команда echo, и зарегистрировать её чтобы её можно было бы использовать в Терминале? В качестве средства разработки был выбран KDevelop, можно же в ней писать? Если подскажете хорошие источники литературы, то я буду вам благодарна, чтобы можно было за праздники закончить работу. From alexeypetrunev на gmail.com Sat Mar 6 02:50:15 2010 From: alexeypetrunev на gmail.com (=?KOI8-R?B?4czFy9PFyiDwxdTS1c6j1w==?=) Date: Sat, 6 Mar 2010 01:50:15 +0300 Subject: [cdev] =?koi8-r?b?+sHEwd7BXzYuIMfSIDEzNQ==?= Message-ID: <8361e7401003051450i56e85c49hfaf6a67f3f7d93cf@mail.gmail.com> Здравствуйте. Написана функция *prioq_put. *Кажется работает. Можно пока под Windows писать, а потом уже переделать? ----------- следущая часть ----------- Вложение в формате HTML было извлечено… URL: ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: MyQueue.cpp Type: application/octet-stream Size: 2669 bytes Desc: отсутствует URL: From sinclair80 на gmail.com Sat Mar 6 14:19:42 2010 From: sinclair80 на gmail.com (Grigoriy A. Sitkarev) Date: Sat, 6 Mar 2010 13:19:42 +0300 Subject: [cdev] =?utf-8?b?0JfQsNC00LDQvdC40LUg0L/QviDRg9GC0LjQu9C40YLQtSBF?= =?utf-8?q?cho?= In-Reply-To: <28101267768978@webmail4.yandex.ru> References: <28101267768978@webmail4.yandex.ru> Message-ID: <73e73bd21003060219v195fadedpbcc112ee05a74e08@mail.gmail.com> Очень хорошо что поставили себе ОС Linux, главное чтобы вы чувствовали себя комфортно. Исходя из этих соображений и выбирайте себе дистрибутив. Утилита echo в первую очередь программа, которую вы будете писать. Вот вам надо её реализовать в соответствии со спецификацией OpenGroup, а за образец можете взять реализацию в вашей операционной системе, чтобы проверить как она себя должна вести. Регистрировать никого никуда не надо, если у вас есть программа и путь к каталогу с ней существует в переменной окружения PATH то командный интерпретатор её там найдёт. Например у меня в этой переменной окружения такие пути: $ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/games:/usr/local/gtm В чём вы будете её писать - без разницы. KDevelop это только оболочка над GNU утилитами: gcc, automake, autoconf, make, gdb и т.д. Источники литературы мною упоминались неоднократно. Есть две хорошие, ставшие уже классическими, книги: 1. Язык программирования Си, Брайан Керниган, Деннис  Ритчи. 2. Практика программирования. Брайан Керниган, Роб Пайк. Настоятельно рекомендую к прочтению. Эти книги неоднократно издавались и в СССР и после, их можно найти в интернете бесплатно. Сильно сомневаюсь что "за праздники" вы закончите работу. Потому что у вас ещё конь не валялся, и если он и дальше будет не валяться, то результат будет плачевный. -- Г.А. 2010/3/5 Карабанова Елена > > Здравствуйте. > Я поставила себе Linux Russian Fedora 11 > echo используется в Терминале в качестве команды, получается задание заключается в написание своей команды которая бы выполняла бы все, что делает команда echo, и зарегистрировать её чтобы её можно было бы использовать в Терминале? > В качестве средства разработки был выбран KDevelop, можно же в ней писать? > Если подскажете хорошие источники литературы, то я буду вам благодарна, чтобы можно было за праздники закончить работу. > > _______________________________________________ > Cdev mailing list > Cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From sinclair80 на gmail.com Sat Mar 6 14:29:12 2010 From: sinclair80 на gmail.com (Grigoriy A. Sitkarev) Date: Sat, 6 Mar 2010 13:29:12 +0300 Subject: [cdev] =?utf-8?b?0JfQsNC00LDRh9CwXzYuINCz0YAgMTM1?= In-Reply-To: <8361e7401003051450i56e85c49hfaf6a67f3f7d93cf@mail.gmail.com> References: <8361e7401003051450i56e85c49hfaf6a67f3f7d93cf@mail.gmail.com> Message-ID: <73e73bd21003060229q39c0de4chdf84edd9ac16cf36@mail.gmail.com> Алексей, Очень хорошо что ты исправил ошибку. Но почему-то ты не учёл остальные замечания. 1. Я очень просил чтобы ты настроил свой почтовый клиент так, чтобы он стал слать plain text а не HTML письма. В любом клиенте есть такие настройки и их  можно изменить на ходу, прямо при создании письма. Посмотри пожалуйста, как это можно сделать у тебя. Если ты пользуешься web-клиентом google то у них есть такая настройка и есть ссылка "Простой текст" в редакторе, если её нажать то письмо форматируется как простой текст. 2. Вложения исходников должны вкладываться как текстовые вложения, тогда их будет видно в архиве рассылки сразу. Посмотри что делает твой клиент почтовый, может быть он именно `.cpp' файлы так вкладывает. 3. Стиль у тебя получается ужасный и читать исходники очень тяжело. Сделаем так, я вечером поправлю твой код, приведу в порядок - как он должен выглядеть, а ты каждую строчку потом сравнишь со своей и подумаешь, почему сделано так а не иначе. Переделывать всегда дороже, чем писать сразу хорошо. Если тебе так уж "вломы" ставить нормальную операционную систему, попробуй что ли MinGW установить себе. Это минимальный набор GNU окружения для Win32. Можешь зайти на сайт проекта www.mingw.org и там скачать установочный пакет. -- Г.А. 6 марта 2010 г. 1:50 пользователь Алексей Петрунёв написал: > Здравствуйте. > > Написана функция prioq_put. Кажется работает.  Можно пока  под Windows > писать, а потом уже переделать? > > _______________________________________________ > Cdev mailing list > Cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev > > From sinclair80 на gmail.com Sat Mar 6 22:56:39 2010 From: sinclair80 на gmail.com (Grigoriy A. Sitkarev) Date: Sat, 6 Mar 2010 21:56:39 +0300 Subject: [cdev] =?utf-8?b?0JfQsNC00LDRh9CwXzYuINCz0YAgMTM1?= In-Reply-To: <8361e7401003051450i56e85c49hfaf6a67f3f7d93cf@mail.gmail.com> References: <8361e7401003051450i56e85c49hfaf6a67f3f7d93cf@mail.gmail.com> Message-ID: <73e73bd21003061056h7746a86fic87a9f1aa74cbb06@mail.gmail.com> Я вложил файл с исправленным кодом. Пожалуйста, сравни каждую строчку с тем что было у тебя и с тем что сейчас, стараясь понять каждую конструкцию языка, зачем она нужна и что делает. Обрати внимание на оформление программы и пожалуйста ещё раз прочти LKCS и следуй этому стилю далее. -- Г.А. 6 марта 2010 г. 1:50 пользователь Алексей Петрунёв написал: > Здравствуйте. > > Написана функция prioq_put. Кажется работает.  Можно пока  под Windows > писать, а потом уже переделать? > > _______________________________________________ > Cdev mailing list > Cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev > > ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: prioq.c Type: text/x-csrc Size: 3123 bytes Desc: отсутствует URL: From sinclair80 на gmail.com Sat Mar 6 23:17:36 2010 From: sinclair80 на gmail.com (Grigoriy A. Sitkarev) Date: Sat, 6 Mar 2010 22:17:36 +0300 Subject: [cdev] =?utf-8?b?0JfQsNC00LDRh9CwXzYuINCz0YAgMTM1?= In-Reply-To: <73e73bd21003061056h7746a86fic87a9f1aa74cbb06@mail.gmail.com> References: <8361e7401003051450i56e85c49hfaf6a67f3f7d93cf@mail.gmail.com> <73e73bd21003061056h7746a86fic87a9f1aa74cbb06@mail.gmail.com> Message-ID: <73e73bd21003061117u55b41275qcf9a59cdcafc256e@mail.gmail.com> Там ошибка есть, исправишь, вот патч. --- prioq.c 2010-03-06 21:13:05.000000000 +0300 +++ prioq_fixed.c 2010-03-06 21:35:09.000000000 +0300 @@ -80,10 +80,10 @@ fprintf(stderr, "prioq_put: can't realloc heap\n"); return -1; } + queue->heap = tmp; memset(queue->heap + OLD_SIZE(queue), 0, NEW_SIZE(queue) - OLD_SIZE(queue)); queue->size += GROW_SIZE; - queue->heap = tmp; } i = queue->used++; 6 марта 2010 г. 21:56 пользователь Grigoriy A. Sitkarev написал: > Я вложил файл с исправленным кодом. > > Пожалуйста, сравни каждую строчку с тем что было у тебя и с тем что > сейчас, стараясь понять каждую конструкцию языка, зачем она нужна и > что делает. > > Обрати внимание на оформление программы и пожалуйста ещё раз прочти > LKCS и следуй этому стилю далее. > > -- > Г.А. > > 6 марта 2010 г. 1:50 пользователь Алексей Петрунёв > написал: >> Здравствуйте. >> >> Написана функция prioq_put. Кажется работает.  Можно пока  под Windows >> писать, а потом уже переделать? >> >> _______________________________________________ >> Cdev mailing list >> Cdev на wiki.syktsu.ru >> http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev >> >> > From sinclair80 на gmail.com Sat Mar 13 23:56:14 2010 From: sinclair80 на gmail.com (Grigoriy A. Sitkarev) Date: Sat, 13 Mar 2010 22:56:14 +0300 Subject: [cdev] =?utf-8?b?RndkOiDQl9Cw0LTQsNC90LjQtSBkZCgxKQ==?= In-Reply-To: <73e73bd21003131153g4fd330d7i6f89ce8046bef7a8@mail.gmail.com> References: <73e73bd21003131153g4fd330d7i6f89ce8046bef7a8@mail.gmail.com> Message-ID: <73e73bd21003131156v7a8437d3i4d8da602e8d1c7fd@mail.gmail.com> Приветствую всех. Есть ряд  соображений и небольших подсказок по реализации утилиты dd. 1. Спецификация Open Group говорит что размеры ibs и obs могут задаваться следующими способами: а) целое положительное число (получается что размер блока может быть любым). б) целое положительное число с постфиксом k (например 10k, 10 килобайт) которое должно быть помножено на 1024 чтобы получить размер блока в байтах. в) целое положительное число с постфиксом b (например 5b, 5 блоков по 512 байт) которое должно быть помножено на 512 чтобы получить размер блока в байтах. г) два или более положительных числа с постфиксами `k' или `b' разделённых `x', которые требуется перемножить чтобы получить размер блока в байтах. Это у вас простенький такой интерпретатор-умножитель должен быть. Например, может быть задан такой аргумент для bs - "10x1024k" что должно дать 10*1024 килобайт. На степень двойки помножать очень просто, например чтобы получить число по множителю 1024 нужно просто сдвинуть целое число на 10 бит влево. switch (c) { case 'k':         bytes <<= 10;         break; case 'b':         bytes <<= 9;         break; default:         /* Shouldn't reach. */         break; } 2. Блоки должны писаться и читаться read(2) и write(2) кусками по ibs, obs или bs байт. Пространство памяти для буфера чтения/записи очевидно должно выделяться динамически. Спецификация Open Group определяет поведение программы в случае если read(2) прочитал блок размера меньше чем ibs или bs, аналогично если write(2) записал блок не полностью за один раз, т.е. вернул меньше obs или bs. В секции STDERR указано как должна вести себя программа и что она должна выводить на стандартный вывод об ошибках в таком случае. -- Г.А. From astroori на mail.ru Sun Mar 14 00:47:07 2010 From: astroori на mail.ru (ka50) Date: Sat, 13 Mar 2010 23:47:07 +0300 Subject: [cdev] =?koi8-r?b?IPrBxMHOycUgcHM=?= Message-ID: <1268513227.5352.11.camel@ubuntu.ubuntu-domain> Добрый вечер. Отчитаюсь о проделанной работе: внесены рекомендованные исправления, в структуру добавлены uid и uname, а так же gid и gname. Жду дальнейших рекомендаций и указаний по реализации задания. KA50 ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: main.c Type: text/x-csrc Size: 4857 bytes Desc: отсутствует URL: From sinclair80 на gmail.com Sun Mar 14 01:24:31 2010 From: sinclair80 на gmail.com (Grigoriy A. Sitkarev) Date: Sun, 14 Mar 2010 00:24:31 +0300 Subject: [cdev] =?utf-8?b?0JfQsNC00LDQvdC40LUgcHM=?= In-Reply-To: <1268513227.5352.11.camel@ubuntu.ubuntu-domain> References: <1268513227.5352.11.camel@ubuntu.ubuntu-domain> Message-ID: <73e73bd21003131324s2fa1b972n96cb9fe85c3c5c42@mail.gmail.com> Анатолий, тебе надо было начинать новую тему, ну да ладно. Я сейчас посмотрю что вы там ещё забыли доделать и кое-какие идеи и соображения выскажу, несколько позже. Вы если ещё спать не легли, прочтите спецификацию Open Group. http://www.opengroup.org/onlinepubs/000095399/utilities/ps.html Я выберу оттуда наиболее важные и употребимые опции и вы их реализуете. Надеюсь что этот труд доставит вам удовольствие. Так держать. -- Г.А. 13 марта 2010 г. 23:47 пользователь ka50 написал: > Добрый вечер. > > Отчитаюсь о проделанной работе: внесены рекомендованные исправления, в > структуру добавлены uid и uname, а так же gid и gname. > > Жду дальнейших рекомендаций и указаний по реализации задания. > > KA50 From sinclair80 на gmail.com Sun Mar 14 04:25:48 2010 From: sinclair80 на gmail.com (Grigoriy A. Sitkarev) Date: Sun, 14 Mar 2010 03:25:48 +0300 Subject: [cdev] =?utf-8?b?0JfQsNC00LDQvdC40LUgcHM=?= In-Reply-To: <73e73bd21003131324s2fa1b972n96cb9fe85c3c5c42@mail.gmail.com> References: <1268513227.5352.11.camel@ubuntu.ubuntu-domain> <73e73bd21003131324s2fa1b972n96cb9fe85c3c5c42@mail.gmail.com> Message-ID: <73e73bd21003131625h29b87558l4620e753a9cb85e5@mail.gmail.com> Соображения по поводу ps у меня такие. 1. Мне не нравилось что у вас там развёрнутый массив и выход из ситуации на мой взгляд в использовании другой форматной строки в fscanf/sscanf. Если включить после `%' модификатор `*' то запись аргумента подавляется. Таким образом можно пропустить те поля, которые нам не нужны. Если вы ознакомились со спецификацией Open Group то обратили внимание что используется ограниченное количество полей, и не вся информация, которая есть в /proc//stat нам нужна. F, S, UID, PID, PPID, C, PRI, NI, ADDR, SZ, WCHAN, STIME, TTY, TIME, CMD - все поля описаны в спецификации, и обратите внимание, что в круглых скобках дополнительно указано когда это поле нужно отображать. Некоторые поля отображаются всегда, некоторые только если указаны опции -f или -l. Значит из stat нам нужны следующие поля: flags, state, pid, ppid, priority, nice, kstkeip, rss, vsize, comm, utime, stime. Я мог что-то пропустить или забыть, потом разберёмся. С полем WCHAN отдельная тема, чтобы оно работало нужно ядро собирать с опцией компилятора, которая сохраняет кадр стека. Вам можно там пока просто чёрточку `-' ставить. Потом доделаем, если что. Одного вызова fscanf/sscanf должно быть достаточно, просто у вас форматная строка получится подлиннее, например "%d %u %*lu %*lu %*lu" и т.п. Сами разберётесь, как она должна выглядеть, с учётом пропускаемых полей. 2. Нужно выводить время, затраченное CPU, суммарное, у нас есть поля в jiffies для времени в режиме ядра и в режиме пользователя (utime, stime). Их надо суммировать. Эти единицы не в секундах а в тиках таймера ядра, если ядро делает 100 прерываний в секунду, то один jiffie это 10 миллисекунд. Сколько тиков будет в секунду, задаётся при сборке ядра - есть такой макрос HZ (от единицы измерения частоты - Герц) и параметр в конфигурации ядра CONFIG_HZ. Определять сколько тиков в секунду нужно самому, способов я думаю есть минимум два: а) Смотреть в /proc/irq/0/spurious в поле count и замерять сколько будет прерываний, заснув на 100 миллисекунд например в nanosleep(2). После чего, считав заново это поле, вычислить количество тиков в секунду. б) Через gettimeofday(2) и times(2), замерять сколько времени пройдёт между соседними тиками. Функция times(2) возвращает количество тиков, прошедших с определённого момента времени. Может быть есть ещё варианты. 3. Хотелось бы иметь опции -l и -f как минимум. Очень желаетельно бы ещё и опцию -o увидеть, которая задаёт формат отображения. Задание интересное, с практической точки зрения. Время уже позднее, замечания по коду есть, днём напишу. -- Г.А. 14 марта 2010 г. 0:24 пользователь Grigoriy A. Sitkarev написал: > Я выберу оттуда наиболее важные и употребимые опции и вы их > реализуете. Надеюсь что этот труд доставит вам удовольствие. > > Так держать. > 13 марта 2010 г. 23:47 пользователь ka50 написал: >> Жду дальнейших рекомендаций и указаний по реализации задания. From lenad89 на list.ru Sun Mar 14 10:39:41 2010 From: lenad89 на list.ru (=?koi8-r?Q?=EC=C5=CE=C1_=E4=CF=D7=D6=CB=CF?=) Date: Sun, 14 Mar 2010 09:39:41 +0300 Subject: [cdev] =?koi8-r?b?0sXBzMnawcPJ0SDV1MnMydTZIGZpbmQ=?= Message-ID: ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: find.c Type: application/octet-stream Size: 6648 bytes Desc: отсутствует URL: From sinclair80 на gmail.com Sun Mar 14 17:50:31 2010 From: sinclair80 на gmail.com (Grigoriy A. Sitkarev) Date: Sun, 14 Mar 2010 16:50:31 +0300 Subject: [cdev] =?utf-8?b?0YDQtdCw0LvQuNC30LDRhtC40Y8g0YPRgtC40LvQuNGC0Ysg?= =?utf-8?q?find?= In-Reply-To: References: Message-ID: <73e73bd21003140650w429b5cbbk25cce426f14fed48@mail.gmail.com> Для начала. 1. Приведите пожалуйста стиль в порядок. Я неоднократно вас предупреждал, что у нас есть требование - соблюдать стиль. Если вы забыли, где про это можно прочитать, напоминаю - Linux Kernel Coding Style. Настройте свой текстовый редактор чтобы TAB был размером в 8 пробелов. Отступы в файлах с исходным текстом сохранять TAB-ами. http://www.kernel.org/doc/Documentation/CodingStyle Точку с запятой ставить после фигурных скобок не нужно везде. Например: if (a == b) { }; <--- здесь не надо точку с запятой, она лишняя. Она нужна только в описании структуры или union. struct my_struct { int a; int b; }; <--- здесь нужна точка с запятой. 2. Вы могли бы сделать так чтобы ваша утилита выводила подсказку по её использованию, если ей передали неизвестные аргументы. 3. Я проверил вашу утилиту на большом каталоге со множеством подкаталогов и она у меня "сломалась" с сообщением: не удалось открыть каталог : Too many open files Программа не работает. 4. Почему у вас сообщения и на английском и на русском языках в куче? Локаль у вас не используется (setlocale(3) и т.д.), поэтому должно быть на каком-то одном языке. Есть ещё множество замечаний, но для начала приведите пожалуйста в порядок всё вышеописанное. -- Г.А. 14 марта 2010 г. 9:39 пользователь Лена Довжко написал: > > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev > > From sinclair80 на gmail.com Sun Mar 14 19:22:21 2010 From: sinclair80 на gmail.com (Grigoriy A. Sitkarev) Date: Sun, 14 Mar 2010 18:22:21 +0300 Subject: [cdev] =?utf-8?b?0JfQsNC00LDQvdC40LUgcHM=?= In-Reply-To: <73e73bd21003131625h29b87558l4620e753a9cb85e5@mail.gmail.com> References: <1268513227.5352.11.camel@ubuntu.ubuntu-domain> <73e73bd21003131324s2fa1b972n96cb9fe85c3c5c42@mail.gmail.com> <73e73bd21003131625h29b87558l4620e753a9cb85e5@mail.gmail.com> Message-ID: <73e73bd21003140822x94975e9y877aa76228221bf1@mail.gmail.com> Замечаний много, перечислю самые основные. 1. Не злоупотребляйте typedef потому что за-typedef-ливание типов ведёт к их неоптимальному использованию (не видно являются ли они базовыми типами или же структурами) и усложняет понимание программы. В некоторых случаях использование typedef оправдано, особенно в целях переносимости, когда через typedef определяются машинно-зависимые типы. Поэтому стуктуру process оставьте без всяких typedef. Кроме того, вам не нужна дополнительная структура tnode. Просто в struct process добавьте поле: struct process *next; в самом верху, и всё. Делайте список из них сразу напрямую. 2. Из структуры process надо "подчистить" поля которые мы использовать не будем а также добавить те, которые мы будем вычислять, например использованное время. Это можно сделать по мере реализации частей программы. 3. При выводе списка процессов поля имеют заголовки. Посмотрите в спецификацию Open Group и посмотрите как это делает ps(1) в Linux: $ ps -Al $ ps -Af Вам надо будет очень красиво написать функцию вывода полей. Дизайн должен предусматривать возможность включить и выключить вывод каждого поля в отдельности. Каждое поле вы должны определить как бит в маске (например через макрос) и функция вывода списка процессов должна будет как минимум один аргумент в виде битовой маски получать на вход. #define SHOW_FLAGS   0x01 #define SHOW_STATE   0x02 #define SHOW_UID     0x04 #define SHOW_PID     0x08 #define SHOW_PPID    0x10 ... #define SHOW_LONG    (SHOW_FLAGS | SHOW_STATE | ...) #define SHOW_FULL    (SHOW_UID | SHOW_PPID | ...) #define SHOW_ALL     (SHOW_PID | SHOW_TTY | ...) int mask; mask = SHOW_LONG | SHOW_ALL; 4. Для проверки имени каталога в /proc, является ли оно числом, можно было использовать несколько подходов, проще: а) воспользоваться функцией strtoul(3), если после преобразования строки в число **endptr не равен 0, тогда не вся строка была преобразована а значит она не является целым числом. б) переписать функцию isproc проще, а у вас очень сложно, получится что-то вроде: int isprocdir(const char *dn) {     while (isdigit(*dn))         dn++;     return (*dn == 0); } 4. По поводу памяти вы видимо меня не совсем поняли. Вам надо было написать функцию xmalloc которая: а) выделяет запрошенную память. б) проверяет значение, которое вернул malloc(3). в) в случае если malloc(3) вернул NULL, завершает работу программы через exit(2) c сообщением на stderr или через errx(3). void *xmalloc(size_t size); 5. Когда вам надо скопировать строку в буфер, память под который вы динамически выделяете, это удобнее сделать с использовании стандартной функции strdup(3) или strndup(3). Так как эти функции могут и не выделить памяти, надо проверять значение, которое они вернули. Удобно их также обвернуть в xstrdup и xstrndup, по аналогии с xmalloc. Вам вероятнее всего strndup(3) не понадобится, хотя во многих случаях нельзя доверять исходной строке или же целесообразно ограничивать размер копируемой строки. 6. Обработка ошибок не сделана, потому что во-первых, они должны печататься на stderr, для этого у нас есть целый дескриптор, который всегда открыт. Поэтому: fprintf(stderr, "error: %s\n", strerror(errno)); Описание ошибки должно быть кратким и понятным. Вы должны не только проверять наличие ошибки и печатать сообщение, но и алгоритм работы вашей программы должен изменяться если что-то пошло не так. Например, если вам не удалось открыть каталог с файлами /proc/ то наверное этот каталог надо пропустить, потому что вы ничего из него не прочтёте и смысла читать его нет. 7. Я нашёл ещё один вариант, как узнать сколько тиков в секунду у системного таймера. POSIX говорит что функция sysconf(3) для этого подходит, но надо проверить будет: int ticks_per_sec; ticks_per_sec = sysconf(_SC_CLK_TCK); 8. Есть нюанс с аргументами командной строки в /proc//cmdline. У нас там может быть пусто ещё и потому что процесс стал зомби. Поэтому вам нужно смотреть в поле state, которое вы прочитаете из stat, там буквами определено состояние процесса и зомби он или нет вы легко определите. Если вспомню что-то ещё, напишу. Обратите внимание, что само задание у вас есть, это спецификация Open Group. Поэтому что вам ещё доделывать - написано там. Я в предыдущем письме просил как минимум -l и -f опции, -A и -a конечно же придётся тоже (это само собой разумеющееся). -- Г.А. From lenad89 на list.ru Sun Mar 14 19:48:32 2010 From: lenad89 на list.ru (lenad89) Date: Sun, 14 Mar 2010 18:48:32 +0300 Subject: [cdev] =?koi8-r?b?ydPQ0sHXzMXOycUgZmluZA==?= Message-ID: <1268581712.4706.17.camel@jam-top> Там ошибка. исправление: в функции mreaddir после цикла while проходящего каталог нужно добавить closedir(dir); Пробовала на домашней папке find(утилита системы) и ./find результат одинаковый. Остальное постараюсь поправить сегодня. From astroori на mail.ru Sun Mar 14 23:29:55 2010 From: astroori на mail.ru (=?utf-8?B?0JDQvdCw0YLQvtC70LjQuSDQmtC+0YDQsNCx0LvRkdCy?=) Date: Sun, 14 Mar 2010 22:29:55 +0300 Subject: [cdev] =?utf-8?b?0JfQsNC00LDQvdC40LUgcHM=?= References: <1268513227.5352.11.camel@ubuntu.ubuntu-domain> Message-ID: Возникли следующие вопросы: 1) В файле stat у нас tty имеет числовое значение, при том, что ps выводит название: как по числовому значению получить название? 2) В файле stat поле flags представляет собой unsigned int, а ps выводит символ - что выводит ps и как это получить? 3) Что означают следующие поля при выводе ps: C, ADDR и откуда их получить? Заранее спасибо. KA50 From sinclair80 на gmail.com Mon Mar 15 00:26:32 2010 From: sinclair80 на gmail.com (Grigoriy A. Sitkarev) Date: Sun, 14 Mar 2010 23:26:32 +0300 Subject: [cdev] =?utf-8?b?0JfQsNC00LDQvdC40LUgcHM=?= In-Reply-To: References: <1268513227.5352.11.camel@ubuntu.ubuntu-domain> Message-ID: <73e73bd21003141326n2c5997dbk1fe0037624962f@mail.gmail.com> > 1) В файле stat у нас tty имеет числовое значение, при том, что ps выводит > название: как по числовому значению получить название? Да, всё верно, в stat поле tty_nr дано одним числовым значением. Фактически, туда упаковано два числа, в битах 31 по 20 и с 7 по 0 находится младший номер (minor number) а в битах с 15 по 8 старший номер (major number). Чтобы извлечь два целых числа упакованных таким образом, напишите пару макросов, которые будут битовыми сдвигами извлекать нужные вам части, например DEV_MAJOR и DEV_MINOR. Это надо ещё всё проверить, но я думаю что я тут не ошибся. Вы эти major и minor номера видите в полях, которые обычно в выводе ls(1) задействованы под размер и количество жёстких ссылок. Если вы листаете файлы устройств, то в этих колонках показаны старший и младший номера. $ ls -la /dev/ttyS0 crw-rw---- 1 root dialout 4, 64 Mar 14 15:31 /dev/ttyS0 Здесь 4 и 64 соответственно старший и младший номера устройства. Они однозначно идентифицируют драйвер, который должно ядро использовать, когда вы делаете open(2) с этим файлом. Вам чтобы получить имя из minor и major номеров придётся бегать по каталогу /dev и искать там файл устройства (символьного), у которого будет совпадение. Системный вызов stat(2) в struct stat в поле st_rdev должен вам в том же формате упаковки эти два числа вернуть для файла, имя которого указано в первом аргументе. Есть ещё один способ, может быть он окажется оптимальнее. В Linux в каталоге /proc/tty есть файл drivers. Обычный текстовый файл с полями разделёнными пробелами. Третье и четвёртое поля это соответственно старший номер (major) и область значений младших номеров (minor) от и до, с чёрточкой разделителем. В Unix принято именовать файлы устройства с цифрой в конце, которая совпадает с младшим номером устройства. Можно использовать этот факт. Кроме того, в /proc//fd есть ссылки. На самом деле они выглядят только как ссылки. Имя ссылки это номер файлового дескриптора (целое число), а значение ссылки (её можно прочитать вызовом readlink(2)) это имя файла, которое соответствует дескриптору. Вы бы могли, если у процесса есть ассоциированный терминал, пробежаться только по этим ссылкам (с 0 по 2-ю) и найти ассоциированное устройство терминала не лазая по всему /dev. Имейте в виду, что в теории, у процесса могут быть разные устройства "привязаны" на стандартный ввод, вывод и вывод ошибок. Поэтому их надо проверить на совпадение major/minor с тем что вы прочитали в файле stat в поле tty_nr. И взять имя только того устройства, с которым есть совпадение, потому что ассоциированный терминал только один - его и следует показать в поле TTY в выводе. > 2) В файле stat поле flags представляет собой unsigned int, а ps выводит > символ - что выводит ps и как это получить? Open Group говорит что формат вывода этого поля implementation defined. Вы его просто выводите целым десятичным числом, и всё. Эти флаги они зависят и от версии ядра в т.ч. > 3) Что означают следующие поля при выводе ps: C, ADDR и откуда их получить? Поле C определено Open Group как CPU utilization, правда сам стандарт не говорит о том как его вычислять, говориться что это некие данные по использованию процессорного времени в ближайший момент. Я ещё подумаю как это лучше сделать, дело в том что стандартно в Unix можно получить процессорное время, использованное процессом (через getrusage(2) например или в stat оно есть) но считать его нужно относительно последнего момента. Сейчас я думаю что пришлось бы замерять время в тиках, потреблённое процессом, два раза (у вас оно есть в файле stat в полях cutime и cstime) и потом высчитывать сколько каждый процесс "съел" от общего числа, зная общее количество тиков в секунду, но может быть позже придумаю способ проще. Поле ADDR я бы пока не трогал, писал бы там чёрточку. Я думаю что предназначалось это поле для отображения адреса текущего программного счётчика, (регистр EIP или PC). Он кстати есть в файле stat в поле kstkeip. -- Г.А. From astroori на mail.ru Mon Mar 15 01:43:46 2010 From: astroori на mail.ru (ka50) Date: Mon, 15 Mar 2010 00:43:46 +0300 Subject: [cdev] =?koi8-r?b?+sHEwc7JxSBwcw==?= Message-ID: <1268603026.3069.2.camel@ubuntu.ubuntu-domain> Выкладываю промежуточную версию программы - может кому что пригодится. ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: main.c Type: text/x-csrc Size: 7755 bytes Desc: отсутствует URL: From megabot88 на gmail.com Mon Mar 15 14:38:10 2010 From: megabot88 на gmail.com (=?KOI8-R?B?98nMxdbBzsnOz9cg98HTyczJyg==?=) Date: Mon, 15 Mar 2010 13:38:10 +0300 Subject: [cdev] Utility bc Message-ID: <6e5939861003150338x79de44a7x5fc8ecf69b13a430@mail.gmail.com> Здравствуйте. Что нужно реализовать в данной утилите? ----------- следущая часть ----------- Вложение в формате HTML было извлечено… URL: From ElenaKarabanova17 на yandex.ru Mon Mar 15 14:53:12 2010 From: ElenaKarabanova17 на yandex.ru (=?koi8-r?B?68HSwcLBzs/XwSDlzMXOwQ==?=) Date: Mon, 15 Mar 2010 13:53:12 +0300 Subject: [cdev] =?koi8-r?b?RndkOiAg+sHEwc7JxSDQzyDV1MnMydTFIEVjaG8=?= Message-ID: <450501268650392@webmail86.yandex.ru> -------- Пересылаемое сообщение -------- 15.03.10, 10:55, "Карабанова Елена" : Здравствуйте! Я разобралась с функцией getopt. Можете посмотреть код программы с комментариями (он прилагается), чтобы хоть понять правильным ли я путем двигаюсь У меня вопрос, как можно отследить в строке аргументов "\", чтобы можно было обработать допустим параметр - \b argv - это же массив указателей на аргументы (слова) которые ввел пользователей по идеи посимвольно смотреть нужно каждое слово, вот только как обратиться незнаю к символу и вот стандартная утилита echo, она начинает реагировать на параметр \b только после ввода \\b почему так? echo -e \\t ----- В пересылаемое сообщение вложены файлы: ----- echo2 -------- Завершение пересылаемого сообщения -------- -- Здесь спама нет http://mail.yandex.ru/nospam/sign ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: echo2 Type: application/octet-stream Size: 4360 bytes Desc: отсутствует URL: From astroori на mail.ru Mon Mar 15 15:22:30 2010 From: astroori на mail.ru (ka50) Date: Mon, 15 Mar 2010 14:22:30 +0300 Subject: [cdev] =?koi8-r?b?+sHEwc7JxSBwcw==?= Message-ID: <1268652150.5248.5.camel@ubuntu.ubuntu-domain> На данный момент выполнено: * обработка некоторых ошибок * реализована функция, позволяющая отображать любые поля по переданной в функцию маске * с помощью вышеописанной функции реализованы флаги -l, -f, -a и их любые комбинации (с использованием разбора опций командной строки) Разработка временно приостановлена до сдачи экзамена по теории игр (18.03). KA50 From astroori на mail.ru Mon Mar 15 15:23:54 2010 From: astroori на mail.ru (ka50) Date: Mon, 15 Mar 2010 14:23:54 +0300 Subject: [cdev] =?koi8-r?b?+sHEwc7JxSBwcw==?= Message-ID: <1268652234.5248.7.camel@ubuntu.ubuntu-domain> На данный момент выполнено: * обработка некоторых ошибок * реализована функция, позволяющая отображать любые поля по переданной в функцию маске * с помощью вышеописанной функции реализованы флаги -l, -f, -a и их любые комбинации (с использованием разбора опций командной строки) Разработка временно приостановлена до сдачи экзамена по теории игр (18.03). KA50 Код программы приведён во вложении. ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: main.c Type: text/x-csrc Size: 8564 bytes Desc: отсутствует URL: From sinclair80 на gmail.com Mon Mar 15 18:40:05 2010 From: sinclair80 на gmail.com (Grigoriy A. Sitkarev) Date: Mon, 15 Mar 2010 17:40:05 +0300 Subject: [cdev] Utility bc In-Reply-To: <6e5939861003150338x79de44a7x5fc8ecf69b13a430@mail.gmail.com> References: <6e5939861003150338x79de44a7x5fc8ecf69b13a430@mail.gmail.com> Message-ID: <73e73bd21003150740n1609a7dvff029e86be3378fc@mail.gmail.com> Хороший вопрос. Вы читали спецификацию Open Group для утилиты bc? Вам ещё надо бы установить себе операционную систему где вам будет удобно этими вещами заниматься, и поэкспериментировать с уже готовой утилитой bc(1). Основной смысл этого задания был в том чтобы простимулировать учащегося к изучению и конструированию компиляторов и интерпретаторов. Без этой теоретической базы задание останется для вас непонятным и запрограммировать вы его не сможете. 1. Спецификация Open Group для bc дана в виде описания лексики и грамматики языка. Вам нужно разобраться что это такое. 2. Вам нужно разобраться как вообще работают компиляторы и интерпретаторы, из каких частей они состоят, как парсить синтаксические конструкции и строить из них дерево и каким образом и т.д. 3. После того как вы разобрались с построением дерева, вам можно будет пропустить шаг оптимизации и пытаться сделать интерпретатор, который будет "натравлен" на дерево, которое у вас строится. Есть очень хорошая книга, ставшая классической, она в трёх изданиях выходила (в 1977 г., 1986 г. и 2006 г.) - Compilers: Principles, Techniques and Tools. Эта книга известна также под названием Dragon Book. Сканы этих книг были в интернете выложены, на русском языке они не издавались (к большому сожалению). И я думаю что это не случайность. Если вы сделаете хотя бы лексический анализатор, соответствующий спецификации Open Group, я согласен поставить вам зачёт. -- Г.А. 15 марта 2010 г. 13:38 пользователь Вилежанинов Василий написал: >   Здравствуйте. > >   Что нужно реализовать в данной утилите? > > > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev > > From sinclair80 на gmail.com Mon Mar 15 19:08:06 2010 From: sinclair80 на gmail.com (Grigoriy A. Sitkarev) Date: Mon, 15 Mar 2010 18:08:06 +0300 Subject: [cdev] =?utf-8?b?0JfQsNC00LDQvdC40LUgcHM=?= In-Reply-To: <1268652150.5248.5.camel@ubuntu.ubuntu-domain> References: <1268652150.5248.5.camel@ubuntu.ubuntu-domain> Message-ID: <73e73bd21003150808h26903c62l4f011b9a11877e5a@mail.gmail.com> Толик и Ваня. Почему вы всё время отвечаете в чужих нитях обсуждений? Ещё раз пожалуйста внимательно, с карандашом, перечитайте все мои сообщения, и очень внимательно то письмо, где я перечислил замечания к вашему коду. Такое ощущение что вы их проигнорировали и побежали дальше лепить туда функции и опции. Вам нужно понять какой смысл в каждом из этих замечаний. Когда будете готовы работать дальше, просигнальте. Я вас ещё озадачу, потому что придумал как получить количество тиков в секунду (на самом деле sysconf(_SC_CLK_TCK) может дать неверное значение, если ядро пересобрано с CONFIG_HZ=1000 то sysconf(_SC_CLK_TCK) будет всё равно возвращать 100) и нужно ещё массу всего править. Вам надо сделать по-человечески вывод заголовка таблицы, печать таблицы. Там нужно завернуть в цикл вывод полей процесса через таблицу просмотра (lookup table). Сейчас она у вас развёрнута. Есть ещё ряд мелких гадостей, например вам надо было сделать глобальную переменную struct process *plist и она была бы у вас указателем на начало списка. У вас её нет, поэтому вы функции list используете некрасивый счётчик cnt. Выглядит нелепо и не идиоматично. Функциям надо дать более ясные имена, я бы list() заменил на show_proc_list() или что-то в этом духе. У вас программа должна читаться как проза и имена функций, идентификаторов нужно выбирать продуманно, потому что это часть документации программы. -- Г.А. 15 марта 2010 г. 14:22 пользователь ka50 написал: > На данный момент выполнено: >        * обработка некоторых ошибок >        * реализована функция, позволяющая отображать любые поля по переданной > в функцию маске >        * с помощью вышеописанной функции реализованы флаги -l, -f, -a и их > любые комбинации (с использованием разбора опций командной строки) > > > Разработка временно приостановлена до сдачи экзамена по теории игр > (18.03). > > KA50 > > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev > From sitkarev на komitex.ru Mon Mar 15 19:15:26 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Mon, 15 Mar 2010 18:15:26 +0300 Subject: [cdev] =?koi8-r?b?+sHEwc7JxSDQzyDV1MnMydTFIEVjaG8=?= In-Reply-To: <194091268639713@webmail23.yandex.ru> References: <28101267768978@webmail4.yandex.ru> <73e73bd21003060219v195fadedpbcc112ee05a74e08@mail.gmail.com> <194091268639713@webmail23.yandex.ru> Message-ID: <4B9E4F0E.5070209@komitex.ru> Очень много замечаний. У меня ощущение что это писали не вы. Придётся с вами очно встречаться перед сдачей. 1. Прочтите LKCS и следуйте этому стилю, я неоднократно упоминал где это можно сделать. Пересмотрите архивы подписки - http://wiki.syktsu.ru/pipermail/cdev/. 2. В Си нельзя делать вложенные функции, откуда это у вас - я не знаю. 3. Файлы с исходным текстом должны иметь расширение `*.c'. 4. Комментарии в Си начинаются с `/*' и заканчиаются `*/'. И хотя большинство современных компиляторов понимают и стиль C++ `//' но лучше пользовать родной стиль языка. 5. Так как, ещё раз повторюсь, кто-то писал вам это - весь исходник перекомментирован. Даже совсем очевидные вещи, где комментировать не надо. Программу на помойку можно выкидывать. Она должна компилироваться gcc для начала. Дизайн программы не верный, у вас могут быть опции -n и -e одновременно. Теперь по вашим вопросам. 1. Ходить посимвольно можно очень просто. Если у вас есть указатель на первый символ строки, в данном случае это argv[i] то вам можно сделать что-то вроде: /*------------------------------*/ char *c; ... c = argv[i]; while (*c) { if (*c == '\') { ++c; switch (*c) { case 'a': ... break; case 'b': ... break; case '\\': ... break; ... } } else { ... } } /*------------------------------*/ В этом примере показан и "скелет" обработки специальных последовательностей - ответ на вопрос об обработке параметров `\b' и т.д. 2. Утилита echo(1) срабатывает только с двумя обратными слешами с командной строки потому что обратный слеш имеет специальное значение для командного интерпретатора - это ESC-символ. Поэтому если вам нужно передать с командной строки в аргументы сам символ `\', то вам надо вставить его два раза `\\'. Первый обратный слеш сигнализирует что следующий символ нужно передать таким какой он есть буквально, а второй обратный слеш сам символ, который будет передан в аргументы программе. Если вы хотите чтобы утилита echo, запущенная с опцией -e, напечатала символ `\' то с командной строки вы его туда целых четыре раза введёте. Потому что первый раз это будет ESC-символ, второй раз обратный слеш для указания специальной последовательности, третий должен быть ESC-символом для четвёртого символа обратного слеша. $ echo -e aa\\\\aa aa\aa -- Г.А. Карабанова Елена пишет: > Здравствуйте! > Я разобралась с функцией getopt. > Можете посмотреть код программы с комментариями (он прилагается), чтобы хоть понять правильным ли я путем двигаюсь > > У меня вопрос, как можно отследить в строке аргументов "\", чтобы можно было обработать допустим параметр - \b > argv - это же массив указателей на аргументы (слова) которые ввел пользователей > по идеи посимвольно смотреть нужно каждое слово, вот только как обратиться незнаю к символу > > и вот стандартная утилита echo, она начинает реагировать на параметр \b только после ввода \\b почему так? > echo -e \\t > > > From megabot88 на gmail.com Mon Mar 15 20:30:10 2010 From: megabot88 на gmail.com (=?KOI8-R?B?98nMxdbBzsnOz9cg98HTyczJyg==?=) Date: Mon, 15 Mar 2010 19:30:10 +0300 Subject: [cdev] Fwd: Utility bc In-Reply-To: <6e5939861003150755w50aa37a6i208ed58652298027@mail.gmail.com> References: <6e5939861003150338x79de44a7x5fc8ecf69b13a430@mail.gmail.com> <73e73bd21003150740n1609a7dvff029e86be3378fc@mail.gmail.com> <6e5939861003150755w50aa37a6i208ed58652298027@mail.gmail.com> Message-ID: <6e5939861003150930j28e22ffai32bd4c60576984e3@mail.gmail.com> ---------- Пересланное сообщение ---------- От кого: Вилежанинов Василий Дата: 15 марта 2010 г. 17:55 Тема: Re: [cdev] Utility bc Кому: "Grigoriy A. Sitkarev"   Еще раз здравствуйте.   ОС я поставил Debian Lenny, пишу в ней на kdevelop.   Спецификацию OpenGroup я немного поглядел, тк с английским не дружу, но посмотрю еще что там есть. Также я сделал что-то похожее на разбор входящей строки и вывод ответа, но я "уже" не строю там дерево.   В bc, я смотрел, есть своя лексика, похожая на си. По крайней мере там можно задавать свои функции и использовать их. Мне такое тоже надо делать? Просто пока я не представляю даже как это делать :).   Программу скину позже, но она вам вряд ли понравится. 15 марта 2010 г. 17:40 пользователь Grigoriy A. Sitkarev написал: > > Хороший вопрос. > > Вы читали спецификацию Open Group для утилиты bc? Вам ещё надо бы > установить себе операционную систему где вам будет удобно этими вещами > заниматься, и поэкспериментировать с уже готовой утилитой bc(1). > > Основной смысл этого задания был в том чтобы простимулировать > учащегося к изучению и конструированию компиляторов и интерпретаторов. > Без этой теоретической базы задание останется для вас непонятным и > запрограммировать вы его не сможете. > > 1. Спецификация Open Group для bc дана в виде описания лексики и > грамматики языка. Вам нужно разобраться что это такое. > 2. Вам нужно разобраться как вообще работают компиляторы и > интерпретаторы, из каких частей они состоят, как парсить > синтаксические конструкции и строить из них дерево и каким образом и > т.д. > 3. После того как вы разобрались с построением дерева, вам можно будет > пропустить шаг оптимизации и пытаться сделать интерпретатор, который > будет "натравлен" на дерево, которое у вас строится. > > Есть очень хорошая книга, ставшая классической, она в трёх изданиях > выходила (в 1977 г., 1986 г. и 2006 г.) - Compilers: Principles, > Techniques and Tools. Эта книга известна также под названием Dragon > Book. Сканы этих книг были в интернете выложены, на русском языке они > не издавались (к большому сожалению). И я думаю что это не > случайность. > > Если вы сделаете хотя бы лексический анализатор, соответствующий > спецификации Open Group, я согласен поставить вам зачёт. > > -- > Г.А. > > 15 марта 2010 г. 13:38 пользователь Вилежанинов Василий > написал: > >   Здравствуйте. > > > >   Что нужно реализовать в данной утилите? > > > > > > > > _______________________________________________ > > cdev mailing list > > cdev на wiki.syktsu.ru > > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev > > > > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: megabc.c Type: text/x-csrc Size: 4764 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Mon Mar 15 21:15:36 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Mon, 15 Mar 2010 20:15:36 +0300 Subject: [cdev] Utility bc In-Reply-To: <6e5939861003150755w50aa37a6i208ed58652298027@mail.gmail.com> References: <6e5939861003150338x79de44a7x5fc8ecf69b13a430@mail.gmail.com> <73e73bd21003150740n1609a7dvff029e86be3378fc@mail.gmail.com> <6e5939861003150755w50aa37a6i208ed58652298027@mail.gmail.com> Message-ID: <4B9E6B38.7040802@komitex.ru> Отвечу по порядку. > Еще раз здравствуйте. > > ОС я поставил Debian Lenny, пишу в ней на kdevelop. Очень хорошо. > Спецификацию OpenGroup я немного поглядел, тк с английским не дружу, > но посмотрю еще что там есть. Также я сделал что-то похожее на разбор > входящей строки и вывод ответа, но я "уже" не строю там дерево. В том то и дело что "похожее" потому что ваше задание - не реализация алгоритма Бауэера-Замельзона. На базе того что вы изобразили, сделать интерпретатор похожий на bc вряд ли получится. Вообще для генерации кода лексического анализатора и синтаксического из спецификаций есть генераторы кода lex и yacc (flex и bison в GNU мире). Они могут генерировать код анализаторов по спецификациям формальным но вам надо этот код делать вручную, во-первых для того чтобы научиться программировать а во-вторых чтобы понять как это должно работать изнутри. > > В bc, я смотрел, есть своя лексика, похожая на си. По крайней мере > там можно задавать свои функции и использовать их. Мне такое тоже надо > делать? Просто пока я не представляю даже как это делать :) . Я вам уже сказал что если вы сделаете хотя бы лексический анализатор, соответствующий спецификации, уже будет зачёт. Прочитайте что это такое и потом вернитесь к спецификации Open Group. В Драконовой Книге очень хорошо это всё описано, рекомендую её найти и прочитать соответствующие главы. > Программу скину позже, но она вам вряд ли понравится. Конечно не понравится. 1. Не проверяете что вернул malloc(3). 2. Не высвобождаете память заголовков после выталкивания элементов из стека. Память будет утекать. 3. Если я введу больше 80 символов на стандартный ввод то буфер будет переполнен и программа будет работать некорректно потому что затрёт чужой кусок или вообще повредит его. Функцию gets(3) вообще использовать не рекомендуется, это потенциальная ошибка всегда. 4. Огромное количество предупреждений при компиляции с -Wall. 5. ASCII символы от '0' до '9' идут в лексикографическом порядке. Поэтому узнать является ли код символа числом, можно очень просто: if (s[i] >= '0' && s[i] <= '9') { ... } И сравнивать 10 раз не нужно. Для этого есть и стандартная функция библиотеки Си isdigit(3). Что использовать - зависит от случая и часто дело вкуса. -- Г.А. From megabot88 на gmail.com Mon Mar 15 22:02:46 2010 From: megabot88 на gmail.com (maegabot88) Date: Mon, 15 Mar 2010 21:02:46 +0300 Subject: [cdev] Utility bc In-Reply-To: <4B9E6B38.7040802@komitex.ru> References: <6e5939861003150338x79de44a7x5fc8ecf69b13a430@mail.gmail.com> <73e73bd21003150740n1609a7dvff029e86be3378fc@mail.gmail.com> <6e5939861003150755w50aa37a6i208ed58652298027@mail.gmail.com> <4B9E6B38.7040802@komitex.ru> Message-ID: <4B9E7646.3060402@gmail.com> Мне все переделывать? 15.03.2010 20:15, Grigoriy A. Sitkarev пишет: > Отвечу по порядку. >> Еще раз здравствуйте. >> >> ОС я поставил Debian Lenny, пишу в ней на kdevelop. > Очень хорошо. >> Спецификацию OpenGroup я немного поглядел, тк с английским не дружу, >> но посмотрю еще что там есть. Также я сделал что-то похожее на разбор >> входящей строки и вывод ответа, но я "уже" не строю там дерево. > В том то и дело что "похожее" потому что ваше задание - не реализация > алгоритма Бауэера-Замельзона. На базе того что вы изобразили, сделать > интерпретатор похожий на bc вряд ли получится. > > Вообще для генерации кода лексического анализатора и синтаксического > из спецификаций есть генераторы кода lex и yacc (flex и bison в GNU > мире). Они могут генерировать код анализаторов по спецификациям > формальным но вам надо этот код делать вручную, во-первых для того > чтобы научиться программировать а во-вторых чтобы понять как это > должно работать изнутри. >> >> В bc, я смотрел, есть своя лексика, похожая на си. По крайней мере >> там можно задавать свои функции и использовать их. Мне такое тоже надо >> делать? Просто пока я не представляю даже как это делать :) . > Я вам уже сказал что если вы сделаете хотя бы лексический анализатор, > соответствующий спецификации, уже будет зачёт. Прочитайте что это > такое и потом вернитесь к спецификации Open Group. В Драконовой Книге > очень хорошо это всё описано, рекомендую её найти и прочитать > соответствующие главы. >> Программу скину позже, но она вам вряд ли понравится. > Конечно не понравится. > > 1. Не проверяете что вернул malloc(3). > 2. Не высвобождаете память заголовков после выталкивания элементов из > стека. Память будет утекать. > 3. Если я введу больше 80 символов на стандартный ввод то буфер будет > переполнен и программа будет работать некорректно потому что затрёт > чужой кусок или вообще повредит его. Функцию gets(3) вообще > использовать не рекомендуется, это потенциальная ошибка всегда. > 4. Огромное количество предупреждений при компиляции с -Wall. > 5. ASCII символы от '0' до '9' идут в лексикографическом порядке. > Поэтому узнать является ли код символа числом, можно очень просто: > > if (s[i] >= '0' && s[i] <= '9') { > ... > } > > И сравнивать 10 раз не нужно. Для этого есть и стандартная функция > библиотеки Си isdigit(3). Что использовать - зависит от случая и часто > дело вкуса. > > -- > Г.А. > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From sitkarev на komitex.ru Mon Mar 15 21:32:13 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Mon, 15 Mar 2010 20:32:13 +0300 Subject: [cdev] Utility bc In-Reply-To: <4B9E7646.3060402@gmail.com> References: <6e5939861003150338x79de44a7x5fc8ecf69b13a430@mail.gmail.com> <73e73bd21003150740n1609a7dvff029e86be3378fc@mail.gmail.com> <6e5939861003150755w50aa37a6i208ed58652298027@mail.gmail.com> <4B9E6B38.7040802@komitex.ru> <4B9E7646.3060402@gmail.com> Message-ID: <4B9E6F1D.8020000@komitex.ru> Думаю что да. Начните с лексического анализа. -- Г.А. maegabot88 пишет: > Мне все переделывать? > From astroori на mail.ru Mon Mar 15 22:23:01 2010 From: astroori на mail.ru (=?koi8-r?B?4c7B1M/Mycog68/SwcLMo9c=?=) Date: Mon, 15 Mar 2010 21:23:01 +0300 Subject: [cdev] =?koi8-r?b?IM/C09XWxMXOycUg0sXBzMnawcPJySBwcw==?= Message-ID: <509276E6F6BB4E91A6F2D27BCF6AADCC@KOMP> Все таки мне совершенно не понятен смысл перегружать структуру process указателем на следующй элемент списка (struct process *next) и можно сказать усложнять читаемость кода. Как оговаривалось с субботу может появиться необходимость расширить функционал программы и создавать динамический массив процессов после применения фильтра - тогда как раз структура process в текущем виде может оказаться более внятной. При наличиии отдельной структуры для связного списка сама структыра программы становится более понятной для чтения (четко видно что есть связный список структур-процессов а не какая то двусмысленная структыра которая для каждого процесса определяет некоторый следующий процесс) и более гибкой (позволяет легко расширить этот список до более сложных структыр не переписывая половину кода). Поэтому позволю себе не согласиться с тем, что уплотнение структуры "связный список процессов" до одной структуры является оправаднным (выигрыш в быстродействии минимален а читаемость кода резко ухудшается и появляется двусмысленность структуры). С удовольствием уже сейчас услышу про получение количества тиков в секунду и про использование lookup table - не целыми же днями готовиться к экзамену - ночью можно и код пописать. Что касается предыдущих замечаний - все замечания выписаны отдельно и будут исправлены в обязательном порядке - просто есть привычка сначала реализовывать функционал и порадоваться за то, что хоть что то работает, а затем уже "причесывать" код. KA50. ----------- следущая часть ----------- Вложение в формате HTML было извлечено… URL: From sitkarev на komitex.ru Mon Mar 15 22:23:20 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Mon, 15 Mar 2010 21:23:20 +0300 Subject: [cdev] =?utf-8?b?0L7QsdGB0YPQttC00LXQvdC40LUg0YDQtdCw0LvQuNC30LA=?= =?utf-8?b?0YbQuNC4IHBz?= In-Reply-To: <509276E6F6BB4E91A6F2D27BCF6AADCC@KOMP> References: <509276E6F6BB4E91A6F2D27BCF6AADCC@KOMP> Message-ID: <4B9E7B18.8060904@komitex.ru> Отвечу по-порядку. Анатолий Кораблёв пишет: > Все таки мне совершенно не понятен смысл перегружать структуру process > указателем на следующй элемент списка (struct process *next) и можно сказать > усложнять читаемость кода. > Как оговаривалось с субботу может появиться необходимость расширить > функционал программы и создавать динамический массив процессов после > применения фильтра - тогда как раз структура process в текущем виде может > оказаться более внятной. > При наличиии отдельной структуры для связного списка сама структыра > программы становится более понятной для чтения (четко видно что есть связный > список структур-процессов а не какая то двусмысленная структыра которая для > каждого процесса определяет некоторый следующий процесс) и более гибкой > (позволяет легко расширить этот список до более сложных структыр не > переписывая половину кода). Поэтому позволю себе не согласиться с тем, что > уплотнение структуры "связный список процессов" до одной структуры является > оправаднным (выигрыш в быстродействии минимален а читаемость кода резко > ухудшается и появляется двусмысленность структуры). Правильно делаете что сомневаетесь. В Си программах это идиоматический приём - включение в структуру описателя указателей, которые позволяют формировать различные структуры (списки, деревья и т.д.). В таком случае сразу видно что из них будет формироваться список или много списков. А глобальная переменная, которая будет указывать на начало списка, снабжается комментарием. struct process *plist; /* list of processes data */ Си упаковывает структуры в том порядке, в каком они перечислены в определении. Сейчас ваша struct tnode аналогична структуре: struct process { int pid; char state; ... struct process *next; }; и она здесь лишняя. А надо бы: struct process { struct process *next; int pid; char state; ... }; Это идиома в Си и никакой двусмысленности здесь нет, также как и ухудшения читаемости. Если тебе надо будет хранить этот элемент в ещё одном списке, то вы добавите ещё один указатель. Список бы тогда вы обходили так: struct process *pp; for (pp = plist; pp != NULL; pp = pp->next) { ... } что тоже является идиомой. И никаких счётчиков не надо. Когда вы будете делать сортированный массив, то вы будете делать массив указателей - struct process **. Если там будет абстрактный void ** то это тоже оправдано только в случае если вы пишете абстрактный тип "массив указателей". Уловили в чём соль? С производительностью тоже дело такое, indirections ведут к тому что кеш используется неэффективно. И на самом деле производительность там заметно возрастает. По этой же причине часто самые простые алгоритмы оказываются быстрее чем сложные. Честно - массив это самая эффективная структура, всё дело в кеше. > С удовольствием уже сейчас услышу про получение количества тиков в секунду и > про использование lookup table - не целыми же днями готовиться к экзамену - > ночью можно и код пописать. Про тики я вам расскажу, а вот как вам завернуть в цикл распечатку заголовка и таблицы подумаете сами. Подумайте, какие данные вам нужны для этого, какими полями они должны быть представлены в структуре, сформируйте такую структуру, статически инициализируйте её. Потом напишите в цикле уже вывод. По поводу тиков идея такая ещё появилась: а) в /proc/uptime есть два числа, в первом секунды uptime системы во втором секунды в течении которых система простаивала без загрузки. б) в /proc/stat в строке, начинающейся с "cpu " дано четыре числа. Сумма этих чисел - количество тиков прошедших с момента инициализации системы, т.е. времени отсчёта uptime. Если мы возьмём (uptime / total_ticks) то получим приблизительно сколько у нас тиков в секунду. Это в теории. На практике при чтении файлов и выковыривании полей у нас могут быть задержки, и надо проверить что промежуток времени, в течении которого читались файлы из /proc, был небольшой. Считать надо аккуратно, да ещё и прикинуть погрешность и если она велика, заново пересчитать (перечитать) значения. Далее, примерно прикинуть, по результату, какое CONFIG_HZ могло быть в ядре. В нашем случае можно ограничиться случаями 100 Hz, 250 Hz и 1000 Hz. Хотя для других архитектур там могут быть и другие значения. > Что касается предыдущих замечаний - все замечания выписаны отдельно и будут > исправлены в обязательном порядке - просто есть привычка сначала > реализовывать функционал и порадоваться за то, что хоть что то работает, а > затем уже "причесывать" код. Хорошо, если так. -- Г.А. From lenad89 на list.ru Tue Mar 16 04:29:39 2010 From: lenad89 на list.ru (lenad89) Date: Tue, 16 Mar 2010 03:29:39 +0300 Subject: [cdev] =?koi8-r?b?ydPQ0sHXzMXOycUgZmluZA==?= In-Reply-To: <1268581712.4706.17.camel@jam-top> References: <1268581712.4706.17.camel@jam-top> Message-ID: <1268699379.5184.61.camel@jam-top> Здравствуйте. 1. Стиль я исправила. Возможно не полностью, но вроде бы соответствует LKCS. Текстовый редактор настроила: tab=8пробелов. 2. ; тоже убрала, где не надо. 3. Подсказку добавлю, когда исправлю разбор опций. 4. Программу проверяла на диске в 30 гб, не сломалась.(отработала как find, правда работала дольше) 5. Все сообщения теперь на русском.(пока) 6. Так же изменила cmalloc на xmalloc. 7. Изменила функцию получения каталога на основе этой части man 3 getcwd ?Расширение стандарта POSIX.1 для Linux (libc4, libc5, glibc) предусматривает следующее: если при вызове buf равно NULL, getcwd(), то буфер выделяется динамически с помощью функции malloc(). В этом случае выделенный буфер имеет размер size; если size равно нулю, то выделяется buf необходимого размера. Возможно (и даже рекомендуется) после использования освободить выделенные таким образом буферы с помощью free(). ? (если она плохая, предложите как получать.( Использовать buf[256]?)) 8. Функцию mreaddir разделила на две. passgdir - проверяет тип (нужно ли это делать?можно ли обойтись без lstat?очень тормозит работу программы) и если каталог открывает его. mreaddir ? получает открытый каталог и проходит его пропуская ?.? и ?..? 9. функции проверки и вставки(вывода) и разбор опций будут зависеть от ответов на следующие вопросы. Возникшие вопросы : Сколько каталогов должна получать моя утилита (один или несколько)? Нужно ли приделывать опцию exec? Как проверять ошибки системных вызовов? Например не удалось прочитать stat файла, тогда в зависимости от errno либо выход , либо сообщение и игнорирование файла, либо еще что-то. Нужно ли перед выходом(из-за ошибки) освобождать память(строки, возможно массив структур ,если добавлять другие опции) или это сделает ОС? Вложила исправленный исходный код. Пока вызывать программу можно следующими способами ./find - выводит все в текущем каталоге. ./find абсолютный путь - выводи все файлы в указном каталоге ./find абсолютный путь к каталогу шаблон ? выводи все файлы в указном каталоге удовлетворяющих шаблону. Можно в main исправить кое-что и сделать еще ./find шаблон ? выводи все файлы в текущем каталоге удовлетворяющих шаблону. (станет стандартной после написания разбора опций) From sitkarev на komitex.ru Tue Mar 16 03:58:06 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Tue, 16 Mar 2010 02:58:06 +0300 Subject: [cdev] =?utf-8?b?0LjRgdC/0YDQsNCy0LvQtdC90LjQtSBmaW5k?= In-Reply-To: <1268699379.5184.61.camel@jam-top> References: <1268581712.4706.17.camel@jam-top> <1268699379.5184.61.camel@jam-top> Message-ID: <4B9EC98E.3070506@komitex.ru> А код где?? Имейте в виду что с вами я тоже буду встречаться очно. И вам придётся ответить на мои вопросы. -- Г.А. lenad89 пишет: > Здравствуйте. > > 1. Стиль я исправила. Возможно не полностью, но вроде бы > соответствует LKCS. Текстовый редактор настроила: > tab=8пробелов. > > 2. ; тоже убрала, где не надо. > > 3. Подсказку добавлю, когда исправлю разбор опций. > > 4. Программу проверяла на диске в 30 гб, не сломалась.(отработала > как find, правда работала дольше) > > 5. Все сообщения теперь на русском.(пока) > > 6. Так же изменила cmalloc на xmalloc. > > 7. Изменила функцию получения каталога на основе этой части man 3 > getcwd > > ?Расширение стандарта POSIX.1 для Linux (libc4, libc5, glibc) > > предусматривает следующее: если при вызове buf равно NULL, > getcwd(), то > > буфер выделяется динамически с помощью функции malloc(). В этом > случае > > выделенный буфер имеет размер size; если size равно нулю, то > выделяется > > buf необходимого размера. Возможно (и даже рекомендуется) после > использования освободить выделенные таким образом буферы с > помощью free(). ? > > (если она плохая, предложите как получать.( Использовать > buf[256]?)) > > 8. Функцию mreaddir разделила на две. > > passgdir - проверяет тип (нужно ли это делать?можно ли обойтись > без lstat?очень тормозит работу программы) и если каталог > открывает его. > > mreaddir ? получает открытый каталог и проходит его пропуская > ?.? и ?..? From lenad89 на list.ru Tue Mar 16 04:47:40 2010 From: lenad89 на list.ru (lenad89) Date: Tue, 16 Mar 2010 03:47:40 +0300 Subject: [cdev] =?koi8-r?b?ydPQ0sHXzMXOycUgZmluZA==?= In-Reply-To: <4B9EC98E.3070506@komitex.ru> References: <1268581712.4706.17.camel@jam-top> <1268699379.5184.61.camel@jam-top> <4B9EC98E.3070506@komitex.ru> Message-ID: <1268700460.23201.1.camel@jam-top> Вот код. ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: find.c Type: text/x-csrc Size: 2965 bytes Desc: отсутствует URL: From megabot88 на gmail.com Tue Mar 16 19:11:46 2010 From: megabot88 на gmail.com (mbot) Date: Tue, 16 Mar 2010 18:11:46 +0300 Subject: [cdev] Utility bc In-Reply-To: <4B9E6F1D.8020000@komitex.ru> References: <6e5939861003150338x79de44a7x5fc8ecf69b13a430@mail.gmail.com> <73e73bd21003150740n1609a7dvff029e86be3378fc@mail.gmail.com> <6e5939861003150755w50aa37a6i208ed58652298027@mail.gmail.com> <4B9E6B38.7040802@komitex.ru> <4B9E7646.3060402@gmail.com> <4B9E6F1D.8020000@komitex.ru> Message-ID: <4B9F9FB2.5090509@gmail.com> Здравствуйте. Вот новый код. Grigoriy A. Sitkarev wrote: > Думаю что да. > > Начните с лексического анализа. > > -- > Г.А. _________ Вилежанинов Василий. ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: mybc2.c Type: text/x-csrc Size: 2564 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Tue Mar 16 20:33:51 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Tue, 16 Mar 2010 19:33:51 +0300 Subject: [cdev] =?utf-8?b?0LjRgdC/0YDQsNCy0LvQtdC90LjQtSBmaW5k?= In-Reply-To: <1268700460.23201.1.camel@jam-top> References: <1268581712.4706.17.camel@jam-top> <1268699379.5184.61.camel@jam-top> <4B9EC98E.3070506@komitex.ru> <1268700460.23201.1.camel@jam-top> Message-ID: <4B9FB2EF.60902@komitex.ru> Много замечаний конечно. Пока что самые основные, всё остальное я думаю вы сами увидите и исправите после того как начнёт более-менее работать ваша программа. 1. После скобок, завершающих тело функции, точку с запятой не надо ставить. Она там лишняя. Аргументы функции должны быть разделены пробелами. Пробелы должны быть и после операторов +,-,=,!=,== и т.д. Вы посмотрите ещё раз LKCS, там много примеров, всё же понятно должно быть. Секция 3.1 как раз говорит про пробелы. 2. Имена в верхнем регистре принято использовать для макросов, переменных с такими именами желательно избегать. 3. Функцию xstrcpy надо убрать и заменить на xstrdup тогда. Что-то в таком духе должно быть, проверите как работает. char * xstrdup(const char *str) { char *rs; size_t len; len = strlen(str); rs = malloc(len+1); if (rs == NULL) { fprintf(stderr, "xstrdup: out of memory\n"); exit(1); } memcpy(rs, str, len); rs[len] = 0; return rs; } 4. Вы не понимаете смысла модификатора extern. Он нужен если переменная, которую вы хотите использовать, объявлена в другом файле. В вашем случае его использовать не нужно. Перечитайте пожалуйста в литературе по языку Си про extern подробнее. 5. С getcwd(3) думаю можно обойтись так. Вам это проверить тоже надо. char * xgetcwd(void) { #define CWD_GROW_UP 32 size_t len; char *rs, *s; len = 0; do { rs = realloc(rs, len+CWD_GROW_UP); if (rs == NULL) { fprintf(stderr, "xgetcwd: out of memory\n"); exit(1); } len += CWD_GROW_UP; s = getcwd(rs, len); } while ((s == NULL) && (errno == ERANGE)); if (s == NULL) { fprintf(stderr, "xgetcwd: can't get current dir: %s\n", strerror(errno)); exit(1); } return rs; } 6. Вам надо сделать конечно чтобы в нескольких каталогах можно было делать поиск и -exec бы надо приделать тоже. Начните с первого пока. Кроме того, шаблон, по которому задаётся поиск, это аргумент операнда -name. У вас его вообще нет. 7. Почему вы решили что именно lstat(2) тормозит? 8. По поводу проверки ошибок системных вызовов, в каждой man-странице к системному вызову есть секция ERRORS. При ошибке системные вызова возвращают -1 и устанавливают переменную errno. Прочтите errno(3) и strerror(3) также. Как обрабатывать ошибку, зависит от контекста. Если ошибка фатальная и вы ничего не можете сделать, то программу надо завершать. Если ошибка не фатальная, то как правило, алгоритм должен предусматривать её обработку каким то образом. Как это делать - зависит от ситуации. Что-то ещё вспомню - напишу. lenad89 пишет: > Вот код. > > > ------------------------------------------------------------------------ > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From sitkarev на komitex.ru Tue Mar 16 20:38:33 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Tue, 16 Mar 2010 19:38:33 +0300 Subject: [cdev] =?utf-8?b?0LjRgdC/0YDQsNCy0LvQtdC90LjQtSBmaW5k?= In-Reply-To: <4B9FB2EF.60902@komitex.ru> References: <1268581712.4706.17.camel@jam-top> <1268699379.5184.61.camel@jam-top> <4B9EC98E.3070506@komitex.ru> <1268700460.23201.1.camel@jam-top> <4B9FB2EF.60902@komitex.ru> Message-ID: <4B9FB409.2080907@komitex.ru> В xgetcwd() надо локальную переменную rs инициализировать в NULL. Исправьте пожалуйста, кто будет пользовать: rs = NULL; сразу после len = 0; вставить. -- Г.А. Grigoriy A. Sitkarev пишет: > Много замечаний конечно. > char * > xgetcwd(void) > { > #define CWD_GROW_UP 32 > size_t len; > char *rs, *s; > > len = 0; > > do { > rs = realloc(rs, len+CWD_GROW_UP); > if (rs == NULL) { > fprintf(stderr, "xgetcwd: out of memory\n"); > exit(1); > } > len += CWD_GROW_UP; > s = getcwd(rs, len); > } while ((s == NULL) && (errno == ERANGE)); > > if (s == NULL) { > fprintf(stderr, "xgetcwd: can't get current dir: %s\n", > strerror(errno)); > exit(1); > } > > return rs; > } > From sitkarev на komitex.ru Wed Mar 17 14:23:53 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Wed, 17 Mar 2010 13:23:53 +0300 Subject: [cdev] Utility bc In-Reply-To: <4B9F9FB2.5090509@gmail.com> References: <6e5939861003150338x79de44a7x5fc8ecf69b13a430@mail.gmail.com> <73e73bd21003150740n1609a7dvff029e86be3378fc@mail.gmail.com> <6e5939861003150755w50aa37a6i208ed58652298027@mail.gmail.com> <4B9E6B38.7040802@komitex.ru> <4B9E7646.3060402@gmail.com> <4B9E6F1D.8020000@komitex.ru> <4B9F9FB2.5090509@gmail.com> Message-ID: <4BA0ADB9.8040409@komitex.ru> Василий, боюсь вам не понятно задание. Вы не понимаете что вам нужно сделать. Думаю что следует предложить вам выбрать какое-то другое задание, более ясное для вас. Если свободных заданий не осталось, придумаем для вас вариант. -- Г.А. mbot пишет: > Здравствуйте. > > Вот новый код. > > Grigoriy A. Sitkarev wrote: >> Думаю что да. >> >> Начните с лексического анализа. >> >> -- >> Г.А. > _________ > Вилежанинов Василий. > > > ------------------------------------------------------------------------ > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From megabot88 на gmail.com Wed Mar 17 15:30:26 2010 From: megabot88 на gmail.com (=?KOI8-R?B?98nMxdbBzsnOz9cg98HTyczJyg==?=) Date: Wed, 17 Mar 2010 14:30:26 +0300 Subject: [cdev] Utility bc In-Reply-To: <4BA0ADB9.8040409@komitex.ru> References: <6e5939861003150338x79de44a7x5fc8ecf69b13a430@mail.gmail.com> <73e73bd21003150740n1609a7dvff029e86be3378fc@mail.gmail.com> <6e5939861003150755w50aa37a6i208ed58652298027@mail.gmail.com> <4B9E6B38.7040802@komitex.ru> <4B9E7646.3060402@gmail.com> <4B9E6F1D.8020000@komitex.ru> <4B9F9FB2.5090509@gmail.com> <4BA0ADB9.8040409@komitex.ru> Message-ID: <6e5939861003170430m2a17b8daif6b0ae2c4ada8048@mail.gmail.com> Я так понимаю, лексический анализатор должен распознавать строку на переменные, числа, функции, операторы. Разве не так? 17 марта 2010 г. 13:23 пользователь Grigoriy A. Sitkarev написал: > Василий, боюсь вам не понятно задание. Вы не понимаете что вам нужно > сделать. Думаю что следует предложить вам выбрать какое-то другое задание, > более ясное для вас. > > Если свободных заданий не осталось, придумаем для вас вариант. > > -- > Г.А. > > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev > From sitkarev на komitex.ru Wed Mar 17 15:17:45 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Wed, 17 Mar 2010 14:17:45 +0300 Subject: [cdev] Utility bc In-Reply-To: <6e5939861003170430m2a17b8daif6b0ae2c4ada8048@mail.gmail.com> References: <6e5939861003150338x79de44a7x5fc8ecf69b13a430@mail.gmail.com> <73e73bd21003150740n1609a7dvff029e86be3378fc@mail.gmail.com> <6e5939861003150755w50aa37a6i208ed58652298027@mail.gmail.com> <4B9E6B38.7040802@komitex.ru> <4B9E7646.3060402@gmail.com> <4B9E6F1D.8020000@komitex.ru> <4B9F9FB2.5090509@gmail.com> <4BA0ADB9.8040409@komitex.ru> <6e5939861003170430m2a17b8daif6b0ae2c4ada8048@mail.gmail.com> Message-ID: <4BA0BA59.3080109@komitex.ru> Правильно понимаете, но задание не понимаете. У вас в задании есть спецификация лексики и грамматики. Вам нужно лексический анализатор делать по этой спецификации. Грубо говоря, у вас должна быть написана функция get_next_token(), которая должна возвращать тип следующего токена из файла или потока, который предварительно был назначен анализатору как входной. Имена токенов, ключевые слова, форматы и т.д. - всё подробно в спецификации перечислено и расписано. -- Г.А. Вилежанинов Василий пишет: > Я так понимаю, лексический анализатор должен распознавать строку на > переменные, числа, функции, операторы. Разве не так? > > 17 марта 2010 г. 13:23 пользователь Grigoriy A. Sitkarev > написал: >> Василий, боюсь вам не понятно задание. Вы не понимаете что вам нужно >> сделать. Думаю что следует предложить вам выбрать какое-то другое задание, >> более ясное для вас. >> >> Если свободных заданий не осталось, придумаем для вас вариант. >> >> -- >> Г.А. From ElenaKarabanova17 на yandex.ru Wed Mar 17 16:13:35 2010 From: ElenaKarabanova17 на yandex.ru (=?koi8-r?B?68HSwcLBzs/XwSDlzMXOwQ==?=) Date: Wed, 17 Mar 2010 15:13:35 +0300 Subject: [cdev] =?koi8-r?b?9dTJzMnUwSBFY2hv?= Message-ID: <676021268828015@webmail15.yandex.ru> Здравствуйте, спасибо большое за вашу подсказку она очень мне помогла. Функцию свою я вынесла за пределы main и изменила логику программы я в начале используя getopt, нахожу месторасположение опций -e -E -n далее если опций не было указано то печатается вся строка кроме команды, а если указаны опции, то я смотрю какая опция была последней 1) если последняя была -е, то я обрабатываю аргументы с учетом команд \\t \\n и т.д . 2) если последняя была -E, то я вывожу все аргуметы без учета команд \\t \\n и т.д. 3) если последняя была -n, то я проверяю была ли указана также опция -е, если была указана, то проверяю чтобы -е было написано позже опции -E если эти условия прошли то я обрабатываю аргументы с учетом команд \\t \\n и т.д. если нет то я вывожу все аргуметы без учета команд \\t \\n и т.д. на текущий момент моя утилита понимает опции -e -E -n, но только если они идут сразу после команды пример: если написать echo2 -e 1234\\t123 выдаст 1234 123 если написать echo2 -e -E 1234\\t123 выдаст 1234\t123 если написать echo2 -e -E -n 1234\\t123 выдаст 1234\t123 но не перейдёт на новую строчку а вот стандартная утилита echo если написать echo 1234 -e 5678 так и выведет 1234 -e 5678 а моя утилита выведет 1234 5678 так как после работы getopt вносит изменения в расположение аргументов argv[0] = echo; argv[1] = -e; argv[2] = 1234; argv[3] = 5678; можно сделать, чтобы если сразу после команды не указано опций, то чтобы дальше по всей строчке аргументов которые ввел пользователь не шёл поиск я читала статью http://habrahabr.ru/blogs/nix_coding/55665/ и нашла там следующее "Следует заметить, что стандартная функция getopt() останавливается сразу как только найдет первый аргумент начинающийся не с символа "-", GNU вариант функции просматривает в поисках опций, всю командную строку. Поведение GNU функции можно изменить (но это выходит за рамки статьи)." наверное это мой случай не работает команда "\\" выдает ошибку если написать echo2 -e \\ ORBIT_SOCKETDIR=/tmp/orbit-Elena не работает команда "\\с" проблема с реализацией я вам посылаю исходный код, и откомпиллированный файл у меня стоит Fedora12, а писала я программу в KDevelop: С/С++ пробовала откомпиллировать исходный код в терминале, используя gcc откомпиллировалось успешно ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: echo2 Type: application/octet-stream Size: 6896 bytes Desc: отсутствует URL: ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: main.c Type: application/octet-stream Size: 3682 bytes Desc: отсутствует URL: From megabot88 на gmail.com Wed Mar 17 16:24:08 2010 From: megabot88 на gmail.com (=?KOI8-R?B?98nMxdbBzsnOz9cg98HTyczJyg==?=) Date: Wed, 17 Mar 2010 15:24:08 +0300 Subject: [cdev] Utility bc In-Reply-To: <4BA0BA59.3080109@komitex.ru> References: <6e5939861003150338x79de44a7x5fc8ecf69b13a430@mail.gmail.com> <73e73bd21003150740n1609a7dvff029e86be3378fc@mail.gmail.com> <6e5939861003150755w50aa37a6i208ed58652298027@mail.gmail.com> <4B9E6B38.7040802@komitex.ru> <4B9E7646.3060402@gmail.com> <4B9E6F1D.8020000@komitex.ru> <4B9F9FB2.5090509@gmail.com> <4BA0ADB9.8040409@komitex.ru> <6e5939861003170430m2a17b8daif6b0ae2c4ada8048@mail.gmail.com> <4BA0BA59.3080109@komitex.ru> Message-ID: <6e5939861003170524iaf83b31sdb79ac191f760baf@mail.gmail.com> Просто я не знаю как задать токен, поэтому просто печатал. Можете привести, как задать токен, например для цифры, а также для множества, допустим, * / %? Зарезервированые слова (например if while) тоже нужно хранить где-то? 17 марта 2010 г. 14:17 пользователь Grigoriy A. Sitkarev написал: > Правильно понимаете, но задание не понимаете. > > У вас в задании есть спецификация лексики и грамматики. > > Вам нужно лексический анализатор делать по этой спецификации. > > Грубо говоря, у вас должна быть написана функция get_next_token(), которая > должна возвращать тип следующего токена из файла или потока, который > предварительно был назначен анализатору как входной. > > Имена токенов, ключевые слова, форматы и т.д. - всё подробно в спецификации > перечислено и расписано. > > -- > Г.А. > > > > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev > From sitkarev на komitex.ru Wed Mar 17 16:37:07 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Wed, 17 Mar 2010 15:37:07 +0300 Subject: [cdev] Utility bc In-Reply-To: <6e5939861003170524iaf83b31sdb79ac191f760baf@mail.gmail.com> References: <6e5939861003150338x79de44a7x5fc8ecf69b13a430@mail.gmail.com> <73e73bd21003150740n1609a7dvff029e86be3378fc@mail.gmail.com> <6e5939861003150755w50aa37a6i208ed58652298027@mail.gmail.com> <4B9E6B38.7040802@komitex.ru> <4B9E7646.3060402@gmail.com> <4B9E6F1D.8020000@komitex.ru> <4B9F9FB2.5090509@gmail.com> <4BA0ADB9.8040409@komitex.ru> <6e5939861003170430m2a17b8daif6b0ae2c4ada8048@mail.gmail.com> <4BA0BA59.3080109@komitex.ru> <6e5939861003170524iaf83b31sdb79ac191f760baf@mail.gmail.com> Message-ID: <4BA0CCF3.9070200@komitex.ru> 1. В спецификации даже имена перечислены. Очевидно, что это должны быть константы. Можно их задать или как макросы через #define или в union. union { EOF, NEWLINE, STRING, LETTER, NUMBER, MUL_OP, ... }; Это токен. Есть токены с которыми ещё и значение какое-то связано, это значение должно куда-то в глобальную переменную помещаться, для текущего токена. Вероятно, это тоже будет union. 2. Конечно нужно. Я бы хранил их в сортированном массиве и искал бы бинарным поиском. Хотя можно и линейным (для начала) их там не так много. -- Г.А. Вилежанинов Василий пишет: > Просто я не знаю как задать токен, поэтому просто печатал. > > Можете привести, как задать токен, например для цифры, а также для > множества, допустим, * / %? > > Зарезервированые слова (например if while) тоже нужно хранить где-то? > From sitkarev на komitex.ru Wed Mar 17 17:02:45 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Wed, 17 Mar 2010 16:02:45 +0300 Subject: [cdev] =?utf-8?b?0KPRgtC40LvQuNGC0LAgRWNobw==?= In-Reply-To: <676021268828015@webmail15.yandex.ru> References: <676021268828015@webmail15.yandex.ru> Message-ID: <4BA0D2F5.2000302@komitex.ru> Отвечу по порядку. Карабанова Елена пишет: > Здравствуйте, > спасибо большое за вашу подсказку она очень мне помогла. Я там забыл только второй обратный слеш нарисовать в условии (*c = '\\') но это вы сообразили что ошибка и поправили. > Функцию свою я вынесла за пределы main и изменила логику программы Это я вижу. Но стиль у вас не в порядке. Приведите пожалуйста так чтобы было приятно смотреть. Отступы у вас должны быть TAB-ами (а не пробелами), редактор настройте так, чтобы каждый TAB показывался как 8 пробелов. Вам будет удобно. В функции main() у вас должны быть отступы: int main(int argc, char *argv[]) { int flags; int opt; ... } А у вас их нет. Не должно быть смешанных регистров в именах функций и идентификаторов. Print_Words - не допустимо (do_echo бы подошло). Почему-то уехали директивы препроцессора #include вправо. Там не надо отступов, они пишутся сразу: #include > на текущий момент моя утилита понимает опции -e -E -n, но только если они идут сразу после команды > пример: > если написать echo2 -e 1234\\t123 выдаст 1234 123 > если написать echo2 -e -E 1234\\t123 выдаст 1234\t123 > если написать echo2 -e -E -n 1234\\t123 выдаст 1234\t123 но не перейдёт на новую строчку Можете не расписывать подробно что делает ваша программа. Мне достаточно вашего кода для этого. Не тратьте силы зря. > а вот стандартная утилита echo если написать echo 1234 -e 5678 так и выведет 1234 -e 5678 > а моя утилита выведет 1234 5678 Не вижу в поведении вашей утилиты нарушения Open Group спецификации. )) > не работает команда "\\" выдает ошибку если написать echo2 -e \\ > ORBIT_SOCKETDIR=/tmp/orbit-Elena Она работает. Вам надо четыре обратных слеша потому что bash его использует как ESC-символ (два раза). $ echo -e \\\\ \ > > не работает команда "\\с" проблема с реализацией В спецификации Open Group говорится что \c должна подавлять вывод символа новой строки \n. Все символы после \c должны игнорироваться. В чём проблема реализовать? По умолчанию, у вас должен быть символ конца строки в выводе. Если встретится \c, то вы не должны его выводить. Так как вы пользуетесь форматированным вводом-выводом, то в конце должны делать fflush(3) на дескрипторе потока (хотя libc и флюшит все потоки при exit(1)). Я бы сделал очень просто. static int with_newline = 1; /* Enabled by default. */ ... while ((opt = getopt(...)) { switch (opt) { ... case 'n': /* Disable output of newline. */ with_newline = 0; break; ... } } Потом вы в выводе используете эту переменную и если она не нулевая, то выводите символ новой строки. while (*c) { if (*c == '\\') { c++; switch (*c) { case '\\': ... case '\c': with_newline = 1; goto flush; } } ... } flush: if (with_newline) putc('\n'); fflush(stdout); return; Если вам встретилась команда '\c' то вы просто устанавливаете with_newline = 1 и немедленно переходите к метке flush (или обзовите её как считаете нужным) через goto. Или изобразите нечто похожее, это не догма, так - мысли в слух. > я вам посылаю исходный код, и откомпиллированный файл > > у меня стоит Fedora12, а писала я программу в KDevelop: С/С++ > пробовала откомпиллировать исходный код в терминале, используя gcc откомпиллировалось успешно Если в KDevelop компилируется то проверять отдельно "в терминале" не обязательно. KDevelop это только оболочка над gcc, binutils, gdb и т.д. Он на самом деле их запускает "в терминале" вы даже можете видеть их вывод. -- Г.А. From ElenaKarabanova17 на yandex.ru Wed Mar 17 22:17:34 2010 From: ElenaKarabanova17 на yandex.ru (=?koi8-r?B?68HSwcLBzs/XwSDlzMXOwQ==?=) Date: Wed, 17 Mar 2010 21:17:34 +0300 Subject: [cdev] =?koi8-r?b?9dTJzMnUwSBFY2hv?= Message-ID: <250831268849854@webmail35.yandex.ru> Здравствуйте я привела в порядок оформление текста исходного кода и сделала обработку команды "\\с" ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: echo2 Type: application/octet-stream Size: 6916 bytes Desc: отсутствует URL: ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: main.c Type: application/octet-stream Size: 3129 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Thu Mar 18 08:20:07 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Thu, 18 Mar 2010 07:20:07 +0300 Subject: [cdev] =?utf-8?b?0KPRgtC40LvQuNGC0LAgRWNobw==?= In-Reply-To: <250831268849854@webmail35.yandex.ru> References: <250831268849854@webmail35.yandex.ru> Message-ID: <4BA1A9F7.9030701@komitex.ru> Дизайн вашей программы очень сложный для такой простой задачи. Вообще, я давно заметил что у наших учащихся есть такое стремление к необоснованному усложнению - не могу понять, откуда корни растут, может быть где-то ещё остались реликты эго "я такие программы пишу - НИКТО понять не может!". С другой стороны часто усложнение - это причина непонимания внутренних принципов языка или машины. Сделать сложно всегда проще чем сделать просто. Я сейчас объясню. Логика поведения echo такая: 1. По умолчанию не обрабатываются ESC-символы '\' и всегда вывод завершается символом '\n' (переход на новую строку). 2. Если задана опция -n то вывод символа новой строки отменяется. 3. Если задана опция -e то включается обработка ESC-символов '\'. 4. Существует опция -E которая отключает ESC-символы, т.е. её использование равнозначно поведению по умолчанию. Вы начинаете делать какие-то сложнейшие пассы и манипуляции с подсчётом опций и т.д. Вам это всё не нужно. Всё гораздо проще. Переформулируем задачу. 1. ESC-символы могут обрабатываться (по умолчанию не обрабатываются). 2. Символ новой строки может выводиться (по умолчанию выводится). Это значит что нам достаточно двух глобальных переменных, где мы будем хранить эти признаки (ДА/НЕТ) а программа должна модифицировать их значения при разборе опций. int handle_escapes = 0; int put_newline = 1; Сейчас эти глоб. переменные отражают переформулированные пункты 1 и 2 со значениями по умолчанию. Дальше, когда вы в getopt(3) разбираете опции, то если вы встретите известные вам опции -e, -E, -n вы модифицируете эти переменные (включатете/выключаете handle_escapes или put_newline). Ничего там считать не надо. Если опции являются взаимоисключающими, как например -e и -E, то "побеждает" самая последняя переданная в аргументах. $ echo -e -E -e -e -e -E -E -E -e -E "test me" Здесь "победит" опция -E потому что она последняя была. Вам нужно после разбора опций забрать остальную часть аргументов и интерпретировать как строки чтобы выводить на stdout. Тут тоже всё проще должно быть. После того как вы закончили с getopt(3), вам всё что было в argv уже не нужно. Сделайте так: argc -= optind; argv += optind; Теперь у вас в argv останутся (начиная с 0) остальные аргументы а в argc будет их количество. Вы не понимаете областей видимости в Си. Поэтому задавали разные имена всем аргументам функций. Этого делать не надо, потому что в Си аргументы относятся к локальным переменным и эти имена не перекрываются у разных функций. В Си правила областей видимости очень простые, обратитесь к литературе, перечтите ещё раз соотв. главы. Со стилем у вас всё ещё не порядок. Не все блоки имеют отступы, ещё раз внимательно всё пересмотрите. В принципе, switch я вам рекомендую выравнивать вот так: switch (opt) { case 'a': ... break; case 'b': ... break; } Делать функции с именами типа do_echo2 - в вашем случае некорректно. Если в Linux например есть системный вызов mmap2(2), то это оправдано потому что он ничем не отличается от mmap(2), только во втором случае размер задаётся в байтах а в mmap2(2) в страницах. У вас же функции ведут себя по-разному, поэтому вам или надо их слить в одну или же назвать do_echo2 по-другому. Название функции должно отражать то что она делает иначе ваши программы будет трудно понимать. Вам бы надо предусмотреть обработку случая когда пользователь ввёл неизвестную опцию. Вы должны в таком случае вывести краткую подсказку по использованию утилиты. И на последок, можете не присылать бинарники сюда. Достаточно исходных файлов. Что-то ещё вспомню, напишу. -- Г.А. Карабанова Елена пишет: > Здравствуйте > > я привела в порядок оформление текста исходного кода > и сделала обработку команды "\\с" > > > ------------------------------------------------------------------------ > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From malkov-stanislav на yandex.ru Thu Mar 18 17:01:11 2010 From: malkov-stanislav на yandex.ru (Malkov Stanislav) Date: Thu, 18 Mar 2010 16:01:11 +0300 Subject: [cdev] =?koi8-r?b?9dTJzMnUwSBwcw==?= Message-ID: <8131268917271@webmail90.yandex.ru> Здравствуйте. Отправляем код ps на данный момент. -- Кимаск К., Малков С. ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: myps.c Type: text/x-csrc Size: 3366 bytes Desc: отсутствует URL: From ElenaKarabanova17 на yandex.ru Thu Mar 18 17:09:29 2010 From: ElenaKarabanova17 на yandex.ru (=?koi8-r?B?68HSwcLBzs/XwSDlzMXOwQ==?=) Date: Thu, 18 Mar 2010 16:09:29 +0300 Subject: [cdev] =?koi8-r?b?9dTJzMnUwSBFY2hv?= Message-ID: <14971268917769@webmail38.yandex.ru> Здравствуйте Я упростила код, спасибо за подсказку и написала, чтобы выводилась справка, если была введена неправильная опция. ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: main.c Type: application/octet-stream Size: 2554 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Thu Mar 18 23:17:04 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Thu, 18 Mar 2010 22:17:04 +0300 Subject: [cdev] =?utf-8?b?0KPRgtC40LvQuNGC0LAgcHM=?= In-Reply-To: <8131268917271@webmail90.yandex.ru> References: <8131268917271@webmail90.yandex.ru> Message-ID: <4BA27C30.2090401@komitex.ru> Стас и Ксюша, я вижу что вы что-то пытаетесь написать, но у вас тут почему-то очень много кода который к ps никакого отношения не имеет. Это помоему реликт вашей предыдущей работы - вы тренировались сделать простой вариант ls(1). Если я правильно понимаю, то ваши усилия это пока тренировка, проба сил так сказать, после чего вы начнёте уже делать то что по спецификации. Просматривая ваш код я заметил следующее: 1. Чтобы проверить является ли каталог числом, можно поступить гораздо проще чем у вас. Ваша функция (очевидно, повзаимствованная и я даже знаю у кого) numericproc очень громоздка для своей задачи. На вскидку есть два варианта как её решить (гораздо проще). int dir_is_proc(const char *dname) { if (dname == NULL || *dname == 0) return 0; while (isdigit(*dname)) ++dname; return (*dname == 0); } Здесь isdigit(3) можно заменить на: while (*dname >= '0' && *dname <= '9') Есть также вариант с использованием функции strtoul(3). С её помощью вы можете и проверить что каталог - число, и сразу же сконвертировать в номер процесса: pid_t get_pid_from_dir(const char *dname) { pid_t res; char *endp; if (dname == NULL || *dname == 0) return -1; res = strtoul(dname, &endp, 10); return (*endp == 0 ? res : -1); } (Все эти функции проверите) 2. У вас не правильно выделяется память. Вы это делаете так: char *ss = malloc(*ss); И допускаете две ошибки. Во-первых, не проверяете, что вернул malloc(3), во-вторых, *ss переданное в malloc будет мусором - первым байтом массива, который никуда не указывает. Вам там нужен размер в байтах. Так что уже когда вы читаете через fread(3) у вас уже память попорчена. Вам надо просто сделать статический буфер и читать туда, на мой взгляд выделять память динамически не нужно. Обратите внимание что ниже точно такая же ошибка. 3. Нигде не проверяете что вернули вам вызовы, например fopen(3) но я надеюсь что это вы пока только экспериментируете, и исправите, напишете обработчик и т.д. Продолжайте трудиться. -- Г.А. Malkov Stanislav пишет: > Здравствуйте. > > Отправляем код ps на данный момент. > > -- > Кимаск К., Малков С. > > > ------------------------------------------------------------------------ > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From sitkarev на komitex.ru Fri Mar 19 00:34:50 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Thu, 18 Mar 2010 23:34:50 +0300 Subject: [cdev] =?utf-8?b?0KPRgtC40LvQuNGC0LAgRWNobw==?= In-Reply-To: <14971268917769@webmail38.yandex.ru> References: <14971268917769@webmail38.yandex.ru> Message-ID: <4BA28E6A.6040002@komitex.ru> По оформлению - перечитайте и пересмотрите ещё раз пожалуйста LKCS, там масса примеров как надо делать (и как НЕ надо - тоже есть). Не хочу повторяться, а там всё есть. У вас не всё в порядке, надо выправить. Программу тяжело читать, всё уплывает куда-то. Дальше, по коду: 1. Есть глобальная переменная write_newline и локальная переменная в main с таким же именем. У вас из-за этого неправильно обрабатывается опция -n. Комментарии в Си это предложения осмысленного текста между `/*' и `*/'. Стиль `//' для однострочных комментариев gcc конечно понимает, но лучше его не использовать. 2. В Unix принят несколько другой подход для подсказок. У вас утилита наверное должна вывести нечто вроде: Usage: echo [-n][-E][-e] string Хотя некоторые GNU утилиты выводят подсказку в столбик, но в нашем случае очень мало опций, поэтому столбика не надо. Вообще Open Group спецификация не предусматривает никаких подсказок для echo но мы делаем потому что мне надо заставить вас сделать пусть и очень простую программу, но ОТ и ДО. 3. Почему вы не стали делать способ, как я вам подсказал? argc -= optind; argv += optind; Очень просто всё будет. Вы этого не делаете, поэтому у вас у функции do_echo три (!!!) аргумента. Ей достаточно передавать всего два - argc и argv. 4. При компиляции с -Wall много предупреждений. Их все надо поправить. Если у вас не включен этот флаг, то в KDevelop это легко сделать. В automake менеджере на каталог src (скорее всего у вас он так называется) вызвать контекстное меню, выбрать "Параметры" далее "Компилятор->Параметры компилятора" C (CFLAGS): и туда вписать -Wall. После чего при компиляции будет перезапущен automake/autoconf. Ну или проверяйте с командной строки запуская компилятор с -Wall опцией. Он вам всё скажет, где ему чего не нравится. -- Г.А. Карабанова Елена пишет: > Здравствуйте > > Я упростила код, спасибо за подсказку и написала, чтобы выводилась справка, если была введена неправильная опция. > > > ------------------------------------------------------------------------ > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From lenad89 на list.ru Fri Mar 19 12:20:38 2010 From: lenad89 на list.ru (lenad89) Date: Fri, 19 Mar 2010 11:20:38 +0300 Subject: [cdev] =?koi8-r?b?ydPQ0sHXzMXOycUgZmluZA==?= In-Reply-To: <4B9FB409.2080907@komitex.ru> References: <1268581712.4706.17.camel@jam-top> <1268699379.5184.61.camel@jam-top> <4B9EC98E.3070506@komitex.ru> <1268700460.23201.1.camel@jam-top> <4B9FB2EF.60902@komitex.ru> <4B9FB409.2080907@komitex.ru> Message-ID: <1268986838.5262.11.camel@jam-top> Здравствуйте. Вот исправленная версия: поддерживает работу с несколькими каталогами и опцию name. В случае неправильного ввода выдает подсказку. ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: find.c Type: text/x-csrc Size: 4507 bytes Desc: отсутствует URL: From ElenaKarabanova17 на yandex.ru Fri Mar 19 12:28:22 2010 From: ElenaKarabanova17 на yandex.ru (=?koi8-r?B?68HSwcLBzs/XwSDlzMXOwQ==?=) Date: Fri, 19 Mar 2010 11:28:22 +0300 Subject: [cdev] =?koi8-r?b?9dTJzMnUwSBFY2hv?= Message-ID: <40481268987302@webmail9.yandex.ru> Здравствуйте я не понимаю в чем моя первая ошибка, >Есть глобальная переменная write_newline и локальная переменная в >main с таким же именем. У вас из-за этого неправильно обрабатывается >опция -n. моя глобальная переменная была задана один раз, в main я её второй раз не объявляла, опция -n работает подсказку исправила на стандартную в функцию передаются только 2 параметра при компиляции не выдается предупреждений стиль поправлен под стандарт Linux Kernel Coding Style ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: main.c Type: application/octet-stream Size: 2070 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Fri Mar 19 12:44:55 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Fri, 19 Mar 2010 11:44:55 +0300 Subject: [cdev] =?utf-8?b?0KPRgtC40LvQuNGC0LAgRWNobw==?= In-Reply-To: <40481268987302@webmail9.yandex.ru> References: <40481268987302@webmail9.yandex.ru> Message-ID: <4BA33987.4030606@komitex.ru> Это не Linux Kernel Coding Style. Вы не смотрели LKCS. Скобки фигурные не так расставляются и пробелов не должно быть после `(' и до `)'. После условия нельзя писать на той-же строке выражение. if (a) a += b; <-- не правильно if (a) a += b; <-- правильно Карабанова Елена пишет: > Здравствуйте > > я не понимаю в чем моя первая ошибка, Я в другой исходник смотрел и ошибся. Бывает. >> Есть глобальная переменная write_newline и локальная переменная в >> main с таким же именем. У вас из-за этого неправильно обрабатывается >> опция -n. > > моя глобальная переменная была задана один раз, в main я её второй раз не объявляла, опция -n работает Всё верно у вас. > подсказку исправила на стандартную Хорошо. > в функцию передаются только 2 параметра Есть ещё нюанс. И я потребую чтобы вы его тоже поправили. Если значение переменой нас интересует как булево (true/false) то в операциях сравнения мы им и пользуемся как логическим. У вас: if (put_newline == 1) а по идее надо бы: if (put_newline) Конечно, они тогда и с нулём не сравниваются а было бы: if (!put_newline) > при компиляции не выдается предупреждений Это так. Но в do_echo_with_escapes нет обработки случая, если после `\' встретился неподдерживаемый символ, например '\z' не будет обработано. Нет также обработки случая, когда после `\' вообще больше ничего нет, и в argv[i] был только этот один символ всего. Я вас предупреждал, что давал вам только скелет. Подумайте, как просто и красиво сделать обработку этих возможных ситуаций. -- Г.А. From ElenaKarabanova17 на yandex.ru Fri Mar 19 14:20:54 2010 From: ElenaKarabanova17 на yandex.ru (=?koi8-r?B?68HSwcLBzs/XwSDlzMXOwQ==?=) Date: Fri, 19 Mar 2010 13:20:54 +0300 Subject: [cdev] =?koi8-r?b?9dTJzMnUwSBFY2hv?= Message-ID: <119151268994054@webmail116.yandex.ru> Учла замечания, просто прошлый раз нажала на кнопку Переформатировать код вот все и сбилось > Это не Linux Kernel Coding Style. Вы не смотрели LKCS. > Скобки фигурные не так расставляются и пробелов не должно быть после `(' > и до `)'. > После условия нельзя писать на той-же строке выражение. > if (a) a += b; <-- не правильно > if (a) > a += b; <-- правильно > Карабанова Елена пишет: > > Развернуть > > Здравствуйте > > > > я не понимаю в чем моя первая ошибка, > Я в другой исходник смотрел и ошибся. Бывает. > > Развернуть > > > Развернуть > > > Есть глобальная переменная write_newline и локальная переменная в > > > main с таким же именем. У вас из-за этого неправильно обрабатывается > > > опция -n. > > моя глобальная переменная была задана один раз, в main я её второй раз не объявляла, опция -n работает > Всё верно у вас. > > Развернуть > > подсказку исправила на стандартную > Хорошо. > > Развернуть > > в функцию передаются только 2 параметра > Есть ещё нюанс. > И я потребую чтобы вы его тоже поправили. Если значение переменой нас > интересует как булево (true/false) то в операциях сравнения мы им и > пользуемся как логическим. > У вас: > if (put_newline == 1) > а по идее надо бы: > if (put_newline) > Конечно, они тогда и с нулём не сравниваются а было бы: > if (!put_newline) > > Развернуть > > при компиляции не выдается предупреждений > Это так. > Но в do_echo_with_escapes нет обработки случая, если после `\' > встретился неподдерживаемый символ, например '\z' не будет обработано. > Нет также обработки случая, когда после `\' вообще больше ничего нет, и > в argv[i] был только этот один символ всего. Я вас предупреждал, что > давал вам только скелет. Подумайте, как просто и красиво сделать > обработку этих возможных ситуаций. > -- > Г.А. > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev > Здесь спама нет http://mail.yandex.ru/nospam/sign ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: main.c Type: application/octet-stream Size: 2007 bytes Desc: отсутствует URL: From megabot88 на gmail.com Fri Mar 19 15:18:06 2010 From: megabot88 на gmail.com (=?KOI8-R?B?98nMxdbBzsnOz9cg98HTyczJyg==?=) Date: Fri, 19 Mar 2010 14:18:06 +0300 Subject: [cdev] =?koi8-r?b?99LFzdEg19PU0sXeyQ==?= Message-ID: <6e5939861003190418g3d95fd7ctbbcd4d70036aaa92@mail.gmail.com> Здравствуйте, Григорий Александрович. Пишу вам от лица группы. Во сколько вы сможете встретиться с нами в субботу? На следующей неделе времени будет меньше - нужно готовиться к экзамену. From sitkarev на komitex.ru Fri Mar 19 17:15:34 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Fri, 19 Mar 2010 16:15:34 +0300 Subject: [cdev] =?utf-8?b?0JLRgNC10LzRjyDQstGB0YLRgNC10YfQuA==?= In-Reply-To: <6e5939861003190418g3d95fd7ctbbcd4d70036aaa92@mail.gmail.com> References: <6e5939861003190418g3d95fd7ctbbcd4d70036aaa92@mail.gmail.com> Message-ID: <4BA378F6.6010201@komitex.ru> Я могу прийти завтра (т.е. в субботу). Другое дело будет ли группа готова что-то показать, потому что пока большая часть вообще себя никак не проявила практически. Нам бы нужна 425-я аудитория, я не уверен что в субботу она будет свободна. Но в теории, мы можем в любой свободной засесть, только вы несите тогда свой код если не присылали его в рассылку. Тогда к 2-м часам пожалуй. -- Г.А. Вилежанинов Василий пишет: > Здравствуйте, Григорий Александрович. > > Пишу вам от лица группы. Во сколько вы сможете встретиться с нами в > субботу? На следующей неделе времени будет меньше - нужно готовиться к > экзамену. > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From sitkarev на komitex.ru Fri Mar 19 17:17:54 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Fri, 19 Mar 2010 16:17:54 +0300 Subject: [cdev] =?utf-8?b?0KPRgtC40LvQuNGC0LAgRWNobw==?= In-Reply-To: <119151268994054@webmail116.yandex.ru> References: <119151268994054@webmail116.yandex.ru> Message-ID: <4BA37982.6050802@komitex.ru> Замечания остались. 1. Не везде у вас аргументы функциям отделены пробелами и не везде лишние пробелы убраны. Посмотрите ещё раз всё внимательно. 2. Случай с одним '\' на вводе у вас не обрабатывается. Надо доделать. -- Г.А. Карабанова Елена пишет: > Учла замечания, просто прошлый раз нажала на кнопку Переформатировать код вот все и сбилось From megabot88 на gmail.com Fri Mar 19 19:42:29 2010 From: megabot88 на gmail.com (=?KOI8-R?B?98nMxdbBzsnOz9cg98HTyczJyg==?=) Date: Fri, 19 Mar 2010 18:42:29 +0300 Subject: [cdev] =?koi8-r?b?99LFzdEg19PU0sXeyQ==?= In-Reply-To: <4BA378F6.6010201@komitex.ru> References: <6e5939861003190418g3d95fd7ctbbcd4d70036aaa92@mail.gmail.com> <4BA378F6.6010201@komitex.ru> Message-ID: <6e5939861003190842g112a12a6yff00f9273054b0f7@mail.gmail.com> 19 марта 2010 г. 16:15 пользователь Grigoriy A. Sitkarev написал: > Я могу прийти завтра (т.е. в субботу). > > Другое дело будет ли группа готова что-то показать, потому что пока большая > часть вообще себя никак не проявила практически. > > Нам бы нужна 425-я аудитория, я не уверен что в субботу она будет свободна. > Но в теории, мы можем в любой свободной засесть, только вы несите тогда свой > код если не присылали его в рассылку. > > Тогда к 2-м часам пожалуй. > > -- > Г.А. > > Вилежанинов Василий пишет: >> >> Здравствуйте, Григорий Александрович. >> >> Пишу вам от лица группы. Во сколько вы сможете встретиться с нами в >> субботу? На следующей неделе времени будет меньше - нужно готовиться к >> экзамену. >> _______________________________________________ >> cdev mailing list >> cdev на wiki.syktsu.ru >> http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev > > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev > From megabot88 на gmail.com Fri Mar 19 19:43:52 2010 From: megabot88 на gmail.com (=?KOI8-R?B?98nMxdbBzsnOz9cg98HTyczJyg==?=) Date: Fri, 19 Mar 2010 18:43:52 +0300 Subject: [cdev] =?koi8-r?b?99LFzdEg19PU0sXeyQ==?= In-Reply-To: <6e5939861003190842g112a12a6yff00f9273054b0f7@mail.gmail.com> References: <6e5939861003190418g3d95fd7ctbbcd4d70036aaa92@mail.gmail.com> <4BA378F6.6010201@komitex.ru> <6e5939861003190842g112a12a6yff00f9273054b0f7@mail.gmail.com> Message-ID: <6e5939861003190843q1fcba49ct53069da976365987@mail.gmail.com> Извиняюсь за спам, случайно нажал. По теме: хорошо, кому надо тот придет. From ElenaKarabanova17 на yandex.ru Fri Mar 19 19:44:52 2010 From: ElenaKarabanova17 на yandex.ru (=?koi8-r?B?68HSwcLBzs/XwSDlzMXOwQ==?=) Date: Fri, 19 Mar 2010 18:44:52 +0300 Subject: [cdev] =?koi8-r?b?9dTJzMnUwSBFY2hv?= In-Reply-To: <4BA37982.6050802@komitex.ru> References: <119151268994054@webmail116.yandex.ru> <4BA37982.6050802@komitex.ru> Message-ID: <156161269013492@webmail104.yandex.ru> вроде все пробелы устранены и случай когда за \\ пустота тоже учтён 19.03.10, 16:17, "Grigoriy A. Sitkarev" : > Замечания остались. > > 1. Не везде у вас аргументы функциям отделены пробелами и не везде > лишние пробелы убраны. Посмотрите ещё раз всё внимательно. > > 2. Случай с одним '\' на вводе у вас не обрабатывается. Надо доделать. > > -- > Г.А. > > Карабанова Елена пишет: > > Учла замечания, просто прошлый раз нажала на кнопку Переформатировать код вот все и сбилось > > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev > > -- Яндекс.Почта. Письма есть. Спама - нет. http://mail.yandex.ru/nospam/sign ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: main.c Type: application/octet-stream Size: 2060 bytes Desc: отсутствует URL: From malkov-stanislav на yandex.ru Fri Mar 19 19:46:11 2010 From: malkov-stanislav на yandex.ru (Malkov Stanislav) Date: Fri, 19 Mar 2010 18:46:11 +0300 Subject: [cdev] =?koi8-r?b?9dTJzMnUwSBwcw==?= In-Reply-To: <4BA27C30.2090401@komitex.ru> References: <8131268917271@webmail90.yandex.ru> <4BA27C30.2090401@komitex.ru> Message-ID: <140741269013571@webmail77.yandex.ru> Здравствуйте, спасибо за комментарии. Сделали что могли. ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: myps.c Type: application/octet-stream Size: 2052 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Fri Mar 19 21:43:54 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Fri, 19 Mar 2010 20:43:54 +0300 Subject: [cdev] =?utf-8?b?0KPRgtC40LvQuNGC0LAgRWNobw==?= In-Reply-To: <156161269013492@webmail104.yandex.ru> References: <119151268994054@webmail116.yandex.ru> <4BA37982.6050802@komitex.ru> <156161269013492@webmail104.yandex.ru> Message-ID: <4BA3B7DA.7050806@komitex.ru> Строка 141 и 143 так и остались с неразделёнными аргументами. Такое ощущение что вас программисты-теоретики насмерть запугали и вы оператор goto теперь боитесь использовать, или вам декремент делать указателя там кажется логичнее?? Я уже второй раз замечаю, что для вас goto это такое табу... Это называется не пустота, а символ окончания строки или нуль-терминатор. -- Г.А. Карабанова Елена пишет: > вроде все пробелы устранены > > и случай когда за \\ пустота тоже учтён > From ElenaKarabanova17 на yandex.ru Fri Mar 19 22:42:38 2010 From: ElenaKarabanova17 на yandex.ru (=?koi8-r?B?68HSwcLBzs/XwSDlzMXOwQ==?=) Date: Fri, 19 Mar 2010 21:42:38 +0300 Subject: [cdev] =?koi8-r?b?9dTJzMnUwSBFY2hv?= Message-ID: <169521269024158@webmail108.yandex.ru> 141 и 143 строчку исправила, goto нам действительно говорили стараться не использовать, так как считается плохим стилем задание вроде готово, что теперь делать? > Строка 141 и 143 так и остались с неразделёнными аргументами. > Такое ощущение что вас программисты-теоретики насмерть запугали и вы > оператор goto теперь боитесь использовать, или вам декремент делать > указателя там кажется логичнее?? Я уже второй раз замечаю, что для вас > goto это такое табу... > Это называется не пустота, а символ окончания строки или нуль-терминатор. > -- > Г.А. > Карабанова Елена пишет: > > Развернуть > > вроде все пробелы устранены > > > > и случай когда за \\ пустота тоже учтён > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev > Здесь спама нет http://mail.yandex.ru/nospam/sign ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: main.c Type: application/octet-stream Size: 2062 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Fri Mar 19 22:55:22 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Fri, 19 Mar 2010 21:55:22 +0300 Subject: [cdev] =?utf-8?b?0KPRgtC40LvQuNGC0LAgcHM=?= In-Reply-To: <140741269013571@webmail77.yandex.ru> References: <8131268917271@webmail90.yandex.ru> <4BA27C30.2090401@komitex.ru> <140741269013571@webmail77.yandex.ru> Message-ID: <4BA3C89A.6040502@komitex.ru> 1. Обработка ошибок сделана на мой взгляд не верно. У вас fopen(3) может вернуть NULL потому что такой процесс уже завершился - в промежутке между чтением записи из каталога и открытием файла /proc//cmdline. В таком случае вы сделать ничего не можете, вам надо просто перейти к следующей записи в каталоге и всё. Но завершать здесь программу пожалуй не надо. Аналогично при открытии /proc//stat. 2. Вы не разобрались с функцией fscanf(3). Вам бы надо было прочитать man-страницы по каждой из библиотечных функций, которые вы используете. Вы пытаетесь идти посимвольно с помощью fscanf(3) это нехорошо, хотя и работает (если уж хотите ходить посимвольно то для этого есть getc(3)). Я бы на вашем месте вообще целиком бы считывал файлы в буфер и разбирал потом как строку. Так было бы проще. Например, выдрать имя процесса, находящееся между двух скобок где-то в буфере-строке buf: char *b; char buf[1024]; char pname[NAME_MAX]; ... while ((dp = readdir(dirh)) != NULL) { ... b = strchr(buf, '('); if (!b) continue; ptr = ++b; b = strchr(b, ')'); if (!b) continue; /* Terminate with zero. */ *b++ = 0; /* String in ptr is a process name. */ strncpy(pname, ptr, sizeof(pname)); ... } Что-то в таком духе (надо проверить). Вы можете в fscanf(3) в форматной строке несколько символов задавать и читать в несколько переменных. Никто не запрещает. Посмотрите, в списке было это, поройтесь в архивах. 3. В /proc//cmdline аргументы, которые были переданы с командной строки разделены нулём, т.е. символом, который обозначает в Си завершение строки. Поэтому вам надо их там особым образом все прочитать поля. $ hexdump -c /proc/self/cmdline 0000000 h e x d u m p \0 - c \0 / p r o c 0000010 / s e l f / c m d l i n e \0 000001e Кроме того, это строки, задаваемые пользователем. А пользователь может быть очень коварным, и может туда засунуть всё что угодно, и символ табуляции и переноса каретки и т.д. По идее, все непечатные символы надо оттуда убрать (экранировать). 4. Что вам вернул getpwuid(3) вы не проверяете. Надо это делать обязательно потому что никто не гарантирует что для данного UID найдётся запись учётная с именем. Я думаю что вам ещё нужно потрудиться. Задел неплохой есть. -- Г.А. Malkov Stanislav пишет: > > Здравствуйте, спасибо за комментарии. Сделали что могли. From sitkarev на komitex.ru Fri Mar 19 22:59:20 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Fri, 19 Mar 2010 21:59:20 +0300 Subject: [cdev] =?utf-8?b?0KPRgtC40LvQuNGC0LAgRWNobw==?= In-Reply-To: <169521269024158@webmail108.yandex.ru> References: <169521269024158@webmail108.yandex.ru> Message-ID: <4BA3C988.5050005@komitex.ru> Плохим стилем считается писать плохим стилем. А goto никто не отменял. Туда он вписывался очень хорошо. У вас ещё лишние пробелы есть после функций и между ними кое где. Надо бы прибрать. Потом man-страницу напишете. Я кажется говорил что "от и до"?? Завершением вашей работы будет документация для пользователя. -- Г.А. Карабанова Елена пишет: > 141 и 143 строчку исправила, > goto нам действительно говорили стараться не использовать, так как считается плохим стилем > > задание вроде готово, что теперь делать? > >> Строка 141 и 143 так и остались с неразделёнными аргументами. >> Такое ощущение что вас программисты-теоретики насмерть запугали и вы >> оператор goto теперь боитесь использовать, или вам декремент делать >> указателя там кажется логичнее?? Я уже второй раз замечаю, что для вас >> goto это такое табу... >> Это называется не пустота, а символ окончания строки или нуль-терминатор. >> -- >> Г.А. From lenad89 на list.ru Sat Mar 20 00:01:23 2010 From: lenad89 на list.ru (lenad89) Date: Fri, 19 Mar 2010 23:01:23 +0300 Subject: [cdev] =?koi8-r?b?ydPQ0sHXzMXOycUgZmluZA==?= In-Reply-To: <1268986838.5262.11.camel@jam-top> References: <1268581712.4706.17.camel@jam-top> <1268699379.5184.61.camel@jam-top> <4B9EC98E.3070506@komitex.ru> <1268700460.23201.1.camel@jam-top> <4B9FB2EF.60902@komitex.ru> <4B9FB409.2080907@komitex.ru> <1268986838.5262.11.camel@jam-top> Message-ID: <1269028883.5160.23.camel@jam-top> В старой версии не нужные действия ( char **path не нужен). Как я уже говорила, уже обходит несколько каталогов и получает аргумент опции name. Следующий этап exec или еще нужно что-то доделывать? ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: find.c Type: text/x-csrc Size: 4246 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Sat Mar 20 01:03:21 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Sat, 20 Mar 2010 00:03:21 +0300 Subject: [cdev] =?utf-8?b?0LjRgdC/0YDQsNCy0LvQtdC90LjQtSBmaW5k?= In-Reply-To: <1269028883.5160.23.camel@jam-top> References: <1268581712.4706.17.camel@jam-top> <1268699379.5184.61.camel@jam-top> <4B9EC98E.3070506@komitex.ru> <1268700460.23201.1.camel@jam-top> <4B9FB2EF.60902@komitex.ru> <4B9FB409.2080907@komitex.ru> <1268986838.5262.11.camel@jam-top> <1269028883.5160.23.camel@jam-top> Message-ID: <4BA3E699.9090803@komitex.ru> Мне кажется что молодой человек, который вам помогает, очень устал. Потому что есть некая небрежность - даже код, который я посылал в список рассылки, был просто вырезан и вставлен, без форматирования. Есть масса замечаний и как минимум одна ошибка (в коде) связанная с выделением памяти (строка 189). Я думаю что завтра я вас увижу лично (можете вашего помощника тоже привести, мне будет интересно познакомиться). Ещё хочу сказать что всем надо читать всё, а не только то что относится к заданию пары, и стараться вникать в суть потому что в этом и была цель рассылки, её педагогическая ценность. -- Г.А. lenad89 пишет: > В старой версии не нужные действия ( char **path не нужен). > > Как я уже говорила, уже обходит несколько каталогов и получает аргумент > опции name. > > Следующий этап exec или еще нужно что-то доделывать? > > > > ------------------------------------------------------------------------ > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From sitkarev на komitex.ru Sat Mar 20 01:31:55 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Sat, 20 Mar 2010 00:31:55 +0300 Subject: [cdev] =?utf-8?b?0KPRgtC40LvQuNGC0LAgcHM=?= In-Reply-To: <4BA3C89A.6040502@komitex.ru> References: <8131268917271@webmail90.yandex.ru> <4BA27C30.2090401@komitex.ru> <140741269013571@webmail77.yandex.ru> <4BA3C89A.6040502@komitex.ru> Message-ID: <4BA3ED4B.7060807@komitex.ru> Тут есть некоторая неточность, я объясню в чём дело. strncpy(3) это такая не очень хорошая функция и я обычно её заменяю на написанную отдельно xstrncpy или safe_strncpy. Странность поведения strncpy(3) библиотечной в следующем: если в n символах строки src отсутствует '\0' (завершающий строку ноль) то строка в dst не будет нуль-терминирована. Но в нашем примере мы уверены, что в sizeof(NAME_MAX) символах будет завершающий ноль (мы его туда сами положили). Хотя, если быть педантом, то конечно, следовало бы принудительно её занультерминировать, потому что можно сказать что в теории имя процесса между '(' и ')' может оказаться длинее NAME_MAX (в какой нибудь сломаной версии или когда злоумышленник получил доступ к /proc). Если мы не уверены что такой нуль-терминатор есть, следовало бы инкрементировать b после этой операции а не до. Потому что нам тогда удобно получить длину строки, не пользуя strlen(3) т.к. указатель b уже указывает на её конец, а адрес начала нам известен, это ptr. /* Terminate with zero. */ *b = 0; /* String in ptr is a process name. */ strncpy(pname, ptr, sizeof(pname)); pname[b-ptr] = 0; ++b; или можно: pname[b++-ptr] Но лучше тогда: pname[(b++)-ptr] -- Г.А. > Например, выдрать имя процесса, находящееся между двух скобок где-то в > буфере-строке buf: > > char *b; > char buf[1024]; > char pname[NAME_MAX]; > > ... > > while ((dp = readdir(dirh)) != NULL) { > ... > b = strchr(buf, '('); > if (!b) > continue; > ptr = ++b; > b = strchr(b, ')'); > if (!b) > continue; > /* Terminate with zero. */ > *b++ = 0; > /* String in ptr is a process name. */ > strncpy(pname, ptr, sizeof(pname)); > ... > } From lenad89 на list.ru Sat Mar 20 01:49:33 2010 From: lenad89 на list.ru (lenad89) Date: Sat, 20 Mar 2010 00:49:33 +0300 Subject: [cdev] =?koi8-r?b?ydPQ0sHXzMXOycUgZmluZA==?= In-Reply-To: <4BA3E699.9090803@komitex.ru> References: <1268581712.4706.17.camel@jam-top> <1268699379.5184.61.camel@jam-top> <4B9EC98E.3070506@komitex.ru> <1268700460.23201.1.camel@jam-top> <4B9FB2EF.60902@komitex.ru> <4B9FB409.2080907@komitex.ru> <1268986838.5262.11.camel@jam-top> <1269028883.5160.23.camel@jam-top> <4BA3E699.9090803@komitex.ru> Message-ID: <1269035373.5160.35.camel@jam-top> 189,какая? В Сбт, 20/03/2010 в 00:03 +0300, Grigoriy A. Sitkarev пишет: > Мне кажется что молодой человек, который вам помогает, очень устал. > Потому что есть некая небрежность - даже код, который я посылал в список > рассылки, был просто вырезан и вставлен, без форматирования. > > Есть масса замечаний и как минимум одна ошибка (в коде) связанная с > выделением памяти (строка 189). > > Я думаю что завтра я вас увижу лично (можете вашего помощника тоже > привести, мне будет интересно познакомиться). > > Ещё хочу сказать что всем надо читать всё, а не только то что относится > к заданию пары, и стараться вникать в суть потому что в этом и была цель > рассылки, её педагогическая ценность. > > -- > Г.А. > > lenad89 пишет: > > В старой версии не нужные действия ( char **path не нужен). > > > > Как я уже говорила, уже обходит несколько каталогов и получает аргумент > > опции name. > > > > Следующий этап exec или еще нужно что-то доделывать? > > > > > > > > ------------------------------------------------------------------------ > > > > _______________________________________________ > > cdev mailing list > > cdev на wiki.syktsu.ru > > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev > > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From sitkarev на komitex.ru Sat Mar 20 01:51:34 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Sat, 20 Mar 2010 00:51:34 +0300 Subject: [cdev] =?utf-8?b?0LjRgdC/0YDQsNCy0LvQtdC90LjQtSBmaW5k?= In-Reply-To: <1269035373.5160.35.camel@jam-top> References: <1268581712.4706.17.camel@jam-top> <1268699379.5184.61.camel@jam-top> <4B9EC98E.3070506@komitex.ru> <1268700460.23201.1.camel@jam-top> <4B9FB2EF.60902@komitex.ru> <4B9FB409.2080907@komitex.ru> <1268986838.5262.11.camel@jam-top> <1269028883.5160.23.camel@jam-top> <4BA3E699.9090803@komitex.ru> <1269035373.5160.35.camel@jam-top> Message-ID: <4BA3F1E6.6010806@komitex.ru> Вы подумайте. И вокруг неё тоже посмотрите. И завтра скажите. У меня всё равно очень много вопросов будет и пожеланий. -- Г.А. lenad89 пишет: > 189,какая? > В Сбт, 20/03/2010 в 00:03 +0300, Grigoriy A. Sitkarev пишет: >> Мне кажется что молодой человек, который вам помогает, очень устал. >> Потому что есть некая небрежность - даже код, который я посылал в список >> рассылки, был просто вырезан и вставлен, без форматирования. >> >> Есть масса замечаний и как минимум одна ошибка (в коде) связанная с >> выделением памяти (строка 189). >> >> Я думаю что завтра я вас увижу лично (можете вашего помощника тоже >> привести, мне будет интересно познакомиться). >> >> Ещё хочу сказать что всем надо читать всё, а не только то что относится >> к заданию пары, и стараться вникать в суть потому что в этом и была цель >> рассылки, её педагогическая ценность. >> >> -- >> Г.А. From megabot88 на gmail.com Sat Mar 20 17:32:36 2010 From: megabot88 на gmail.com (=?KOI8-R?B?98nMxdbBzsnOz9cg98HTyczJyg==?=) Date: Sat, 20 Mar 2010 16:32:36 +0300 Subject: [cdev] Utility bc In-Reply-To: <4BA0CCF3.9070200@komitex.ru> References: <6e5939861003150338x79de44a7x5fc8ecf69b13a430@mail.gmail.com> <4B9E6B38.7040802@komitex.ru> <4B9E7646.3060402@gmail.com> <4B9E6F1D.8020000@komitex.ru> <4B9F9FB2.5090509@gmail.com> <4BA0ADB9.8040409@komitex.ru> <6e5939861003170430m2a17b8daif6b0ae2c4ada8048@mail.gmail.com> <4BA0BA59.3080109@komitex.ru> <6e5939861003170524iaf83b31sdb79ac191f760baf@mail.gmail.com> <4BA0CCF3.9070200@komitex.ru> Message-ID: <6e5939861003200632t77fe5aebya18b463ba0d8ef3a@mail.gmail.com> last ----------- ???????? ????? ----------- A non-text attachment was scrubbed... Name: mybc2.c Type: application/octet-stream Size: 5175 bytes Desc: ??????????? URL: From astroori на mail.ru Sat Mar 20 18:23:22 2010 From: astroori на mail.ru (=?koi8-r?B?4c7B1M/Mycog68/SwcLMo9c=?=) Date: Sat, 20 Mar 2010 17:23:22 +0300 Subject: [cdev] =?koi8-r?b?z8LT1dbExc7JxSDSxcHMydrBw8nJIHBz?= References: <509276E6F6BB4E91A6F2D27BCF6AADCC@KOMP> <4B9E7B18.8060904@komitex.ru> Message-ID: Выкладываю сегодняшнюю версию кода, продемонстрированную в универе. to Иван: все оставлено как было в универе, ничего не изменял. ----------- следущая часть ----------- An embedded and charset-unspecified text was scrubbed... Name: main.c URL: From lenad89 на list.ru Sat Mar 20 20:50:27 2010 From: lenad89 на list.ru (lenad89) Date: Sat, 20 Mar 2010 19:50:27 +0300 Subject: [cdev] =?koi8-r?b?ydPQ0sHXzMXOycUgZmluZA==?= In-Reply-To: <4BA3E699.9090803@komitex.ru> References: <1268581712.4706.17.camel@jam-top> <1268699379.5184.61.camel@jam-top> <4B9EC98E.3070506@komitex.ru> <1268700460.23201.1.camel@jam-top> <4B9FB2EF.60902@komitex.ru> <4B9FB409.2080907@komitex.ru> <1268986838.5262.11.camel@jam-top> <1269028883.5160.23.camel@jam-top> <4BA3E699.9090803@komitex.ru> Message-ID: <1269103827.5367.5.camel@jam-top> Насчет использования лишней памяти. Это относится к каталогам? Т.е. Нужно завести внешнюю переменную, в которой хранить каталог, который обходится в данный момент? И менять его при завершении обхода этого каталога или при входе в новый? From sitkarev на komitex.ru Sat Mar 20 21:07:10 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Sat, 20 Mar 2010 20:07:10 +0300 Subject: [cdev] =?utf-8?b?0LjRgdC/0YDQsNCy0LvQtdC90LjQtSBmaW5k?= In-Reply-To: <1269103827.5367.5.camel@jam-top> References: <1268581712.4706.17.camel@jam-top> <1268699379.5184.61.camel@jam-top> <4B9EC98E.3070506@komitex.ru> <1268700460.23201.1.camel@jam-top> <4B9FB2EF.60902@komitex.ru> <4B9FB409.2080907@komitex.ru> <1268986838.5262.11.camel@jam-top> <1269028883.5160.23.camel@jam-top> <4BA3E699.9090803@komitex.ru> <1269103827.5367.5.camel@jam-top> Message-ID: <4BA500BE.9030903@komitex.ru> Там дело не в лишней памяти, а в том как сама программа спроектирована. Я вам завтра утром напишу обстоятельно потому что сегодня уже сил нет никаких. -- Г.А. lenad89 пишет: > Насчет использования лишней памяти. > > Это относится к каталогам? > > Т.е. Нужно завести внешнюю переменную, в которой хранить каталог, > который обходится в данный момент? И менять его при завершении обхода > этого каталога или при входе в новый? > > > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From malkov-stanislav на yandex.ru Sat Mar 20 22:06:50 2010 From: malkov-stanislav на yandex.ru (Malkov Stanislav) Date: Sat, 20 Mar 2010 21:06:50 +0300 Subject: [cdev] =?koi8-r?b?9dTJzMnUwSBwcw==?= In-Reply-To: <4BA3C89A.6040502@komitex.ru> References: <8131268917271@webmail90.yandex.ru> <4BA27C30.2090401@komitex.ru> <140741269013571@webmail77.yandex.ru> <4BA3C89A.6040502@komitex.ru> Message-ID: <86571269108410@web88.yandex.ru> Здравствуйте. Григорий Александрович Мы исправили некоторые недочеты, можете посмотреть, если будет время. Но у нас есть проблема, мы не понимаем значение третьего пункта замечаний, объясните пожалуйста поподробнее: что может случиться, как этого избежать и как это проверить??? > 3. В /proc//cmdline аргументы, которые были переданы с командной > строки разделены нулём, т.е. символом, который обозначает в Си > завершение строки. Поэтому вам надо их там особым образом все прочитать > поля. > > $ hexdump -c /proc/self/cmdline > 0000000 h e x d u m p \0 - c \0 / p r o c > 0000010 / s e l f / c m d l i n e \0 > 000001e > > Кроме того, это строки, задаваемые пользователем. А пользователь может > быть очень коварным, и может туда засунуть всё что угодно, и символ > табуляции и переноса каретки и т.д. По идее, все непечатные символы надо > оттуда убрать (экранировать). ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: myps.c.c Type: application/octet-stream Size: 2055 bytes Desc: отсутствует URL: From ElenaKarabanova17 на yandex.ru Sun Mar 21 03:39:41 2010 From: ElenaKarabanova17 на yandex.ru (=?koi8-r?B?68HSwcLBzs/XwSDlzMXOwQ==?=) Date: Sun, 21 Mar 2010 02:39:41 +0300 Subject: [cdev] =?koi8-r?b?9dTJzMnUwSBFY2hv?= In-Reply-To: <4BA3C988.5050005@komitex.ru> References: <169521269024158@webmail108.yandex.ru> <4BA3C988.5050005@komitex.ru> Message-ID: <360171269128381@webmail62.yandex.ru> Здравствуйте Высылаю man-страницу и документацию пользователя при создании man-страницы очень помогла страничка http://www.linuxfocus.org/Russian/November2003/article309.shtml 19.03.10, 21:59, "Grigoriy A. Sitkarev" : > Плохим стилем считается писать плохим стилем. А goto никто не отменял. > Туда он вписывался очень хорошо. > > У вас ещё лишние пробелы есть после функций и между ними кое где. Надо > бы прибрать. Потом man-страницу напишете. Я кажется говорил что "от и > до"?? Завершением вашей работы будет документация для пользователя. > > -- > Г.А. > > Карабанова Елена пишет: > > 141 и 143 строчку исправила, > > goto нам действительно говорили стараться не использовать, так как считается плохим стилем > > > > задание вроде готово, что теперь делать? > > > >> Строка 141 и 143 так и остались с неразделёнными аргументами. > >> Такое ощущение что вас программисты-теоретики насмерть запугали и вы > >> оператор goto теперь боитесь использовать, или вам декремент делать > >> указателя там кажется логичнее?? Я уже второй раз замечаю, что для вас > >> goto это такое табу... > >> Это называется не пустота, а символ окончания строки или нуль-терминатор. > >> -- > >> Г.А. > > > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev > > -- Здесь спама нет http://mail.yandex.ru/nospam/sign ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: echo2.1 Type: application/octet-stream Size: 1410 bytes Desc: отсутствует URL: ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: Echo2.odt Type: application/octet-stream Size: 11723 bytes Desc: отсутствует URL: ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: main.c Type: application/octet-stream Size: 2041 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Sun Mar 21 19:10:15 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Sun, 21 Mar 2010 18:10:15 +0300 Subject: [cdev] Utility bc In-Reply-To: <6e5939861003200632t77fe5aebya18b463ba0d8ef3a@mail.gmail.com> References: <6e5939861003150338x79de44a7x5fc8ecf69b13a430@mail.gmail.com> <4B9E6B38.7040802@komitex.ru> <4B9E7646.3060402@gmail.com> <4B9E6F1D.8020000@komitex.ru> <4B9F9FB2.5090509@gmail.com> <4BA0ADB9.8040409@komitex.ru> <6e5939861003170430m2a17b8daif6b0ae2c4ada8048@mail.gmail.com> <4BA0BA59.3080109@komitex.ru> <6e5939861003170524iaf83b31sdb79ac191f760baf@mail.gmail.com> <4BA0CCF3.9070200@komitex.ru> <6e5939861003200632t77fe5aebya18b463ba0d8ef3a@mail.gmail.com> Message-ID: <4BA636D7.3060703@komitex.ru> 1. Я думаю что константы, определяющие токены, было лучше определить в union а не через #define. Хотя я не рекомендую злоупотреблять typedef, в случае с константами здесь можно было бы определить новый тип: typedef enum { EOF = 0, NEWLINE, STRING, NUMBER, ... } token_t; Здесь нет "зла" потому что мы определяем тип, выводя его напрямую из базового типа. И там где этот тип используется, вы бы писали token_t а не int. struct keywords { char *name; token_t val; }; При отладке gdb показывал бы символические имена токенов а не десятичные значения. 2. Когда вы инициализируете массив с ключевыми словами, то следовало бы делать так: struct keywords tbl[] = { { "auto", Auto }, { "ibase", Ibase }, .. { NULL, 0 } }; Я бы их ещё и сразу в сортированном порядке там разместил, тогда потом можно было бы добавить и поиск бинарный, если что. Функция get_next_token тогда должна быть объявлена так: token_t get_next_token(); Токен DEGREE лучше переименовать в CARET. 3. В дизайне есть ошибка. Вы полагаете что ввод может осуществляться только с stdin. Если вы внимательно перечтёте мои сообщения, то увидите что я упомянул о том что лексическому анализатору назначается откуда брать ввод. Стандартная bc(1) может читать программу не только с stdin но и из файла: $ cat input.bc ibase=10 a=4; b=3; a+b; quit $ bc -s -q input.bc 7 Open Group спецификация в первых строках говорит о том что сначала интерпретируются файлы, и только потом stdin. 4. Комментарии не обрабатываются. В bc они похожи на комментарии в языке Си - начинаются с '/*' и заканчиваются '*/'. 5. В строке 225 вы определяете что далее следует дробная часть числа, после точки, но также проверяете не является ли это началом целого числа, и получаете его как число с плавающей точкой. Здесь сразу несколько ошибок: а) bc внутри работает с десятичной арифметикой, хотя для ввода и вывода можно задать разные базы (основания систем счисления) через регистры ibase и obase. Числа имеют произвольную точность т.е. разрядность не фиксирована. б) все числа представляются в десятичной форме, вне зависимости от базы, и округляются, если невозможно получить точного представления. в) внутренний регистр scale задаёт количество цифр после десятичной точки для некоторых операций и для каждого числа в отдельности. В зависимости от операции, используется или scale числа (переменной) или операции. Например, при делении у результата цифр десятичных после точки будет столько, сколько на момент операции было в регистре scale. г) Даже если бы вы хотели получить число с плавающей точкой в соответствии со спецификацией OpenGroup, вы это делаете не верно. Потому что спецификация задаёт его так: NUMBER : integer | '.' integer | integer '.' | integer '.' integer ; Если я на вход подам 924.343e+12 по идее ваш лексический анализатор должен прочитать это как последовательность: NUMBER, VARIABLE, PLUS, NUMBER. Но на самом деле, он у вас его прочтёт как один NUMBER. 6. Проверять символ чтобы потом натравить на него getop() достаточно странное решение, но для вас в лоб оно работает. С точки зрения дизайна это не правильно. Потому что getop у вас большой switch и он в состоянии обнаружить что попался символ "не тот" поэтому сравнение в strchr(3) явно лишнее. 7. Дальше у вас ошибка в том что числа для лексического анализатора могут быть прочитаны по основанию от 2 до 16 и это есть в спецификации. Вы читаете только десятичные числа, что уже не верно. В функции getf у вас ошибка. Вы к сожалению не понимаете, каким образом Си работает с памятью, у вас везде где вы выделяете память через malloc(3) ошибки которые приведут к краху вашей программы. Просто вам повезло что она работает недолго, но память вы уже корёжите везде, где есть malloc(3). Это самое основное, больше уже просто писать не могу потому что надо ответить другим. Вам надо ещё серьёзно поработать. Василий, вы понимаете что в первую очередь программист это читатель и только потом уже писатель? По вашему коду видно что вы что-то понимаете, но не всё и вам надо копать глубже и разбираться. Кроме того вам надо стать читателем и в обязательном порядке освоить идиомы языка (это кстати всех касается, не только вас лично), на котором вы программируете. Литературу и проекты которые на мой взгляд стоило бы изучить я неоднократно упоминал. -- Г.А. Вилежанинов Василий пишет: > last > > > ------------------------------------------------------------------------ > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From sitkarev на komitex.ru Sun Mar 21 19:37:36 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Sun, 21 Mar 2010 18:37:36 +0300 Subject: [cdev] =?utf-8?b?0KPRgtC40LvQuNGC0LAgRWNobw==?= In-Reply-To: <360171269128381@webmail62.yandex.ru> References: <169521269024158@webmail108.yandex.ru> <4BA3C988.5050005@komitex.ru> <360171269128381@webmail62.yandex.ru> Message-ID: <4BA63D40.9070505@komitex.ru> Я не вижу тут man-страницы. Я вижу некий документ в формате ODT. Страницу, ссылку на которую вы прислали, вы видимо сами не прочитали. Лишние пробелы вы так и не убрали и goto до сих пор боитесь. Можете показать фигу программистам-теоретикам, и поставить goto в свою программу. -- Г.А. Карабанова Елена пишет: > Здравствуйте > Высылаю man-страницу и документацию пользователя > при создании man-страницы очень помогла страничка > http://www.linuxfocus.org/Russian/November2003/article309.shtml > From lenad89 на list.ru Sun Mar 21 19:50:44 2010 From: lenad89 на list.ru (lenad89) Date: Sun, 21 Mar 2010 18:50:44 +0300 Subject: [cdev] =?koi8-r?b?9dTJzMnUwSBFY2hv?= In-Reply-To: <4BA63D40.9070505@komitex.ru> References: <169521269024158@webmail108.yandex.ru> <4BA3C988.5050005@komitex.ru> <360171269128381@webmail62.yandex.ru> <4BA63D40.9070505@komitex.ru> Message-ID: <1269186644.11039.0.camel@jam-top> echo2.1 From megabot88 на gmail.com Sun Mar 21 19:52:53 2010 From: megabot88 на gmail.com (=?KOI8-R?B?98nMxdbBzsnOz9cg98HTyczJyg==?=) Date: Sun, 21 Mar 2010 18:52:53 +0300 Subject: [cdev] Utility bc In-Reply-To: <4BA636D7.3060703@komitex.ru> References: <6e5939861003150338x79de44a7x5fc8ecf69b13a430@mail.gmail.com> <4B9E6F1D.8020000@komitex.ru> <4B9F9FB2.5090509@gmail.com> <4BA0ADB9.8040409@komitex.ru> <6e5939861003170430m2a17b8daif6b0ae2c4ada8048@mail.gmail.com> <4BA0BA59.3080109@komitex.ru> <6e5939861003170524iaf83b31sdb79ac191f760baf@mail.gmail.com> <4BA0CCF3.9070200@komitex.ru> <6e5939861003200632t77fe5aebya18b463ba0d8ef3a@mail.gmail.com> <4BA636D7.3060703@komitex.ru> Message-ID: <6e5939861003210852i2da47560mad8daefab1bafeab@mail.gmail.com> Я тут подумал, что у меня много чего неправильно (если не все) и переделывать, то же самое, что писать заново. Поэтому можно я возьму другую задачу, например, про id вместе со Старцевым? From sitkarev на komitex.ru Sun Mar 21 19:57:31 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Sun, 21 Mar 2010 18:57:31 +0300 Subject: [cdev] =?utf-8?b?0KPRgtC40LvQuNGC0LAgRWNobw==?= In-Reply-To: <1269186644.11039.0.camel@jam-top> References: <169521269024158@webmail108.yandex.ru> <4BA3C988.5050005@komitex.ru> <360171269128381@webmail62.yandex.ru> <4BA63D40.9070505@komitex.ru> <1269186644.11039.0.camel@jam-top> Message-ID: <4BA641EB.5090309@komitex.ru> Файла нет. И вы бы дождались, пока я вам напишу что у вас в дизайне не то. -- Г.А. lenad89 пишет: > echo2.1 > > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From sitkarev на komitex.ru Sun Mar 21 20:10:09 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Sun, 21 Mar 2010 19:10:09 +0300 Subject: [cdev] Utility bc In-Reply-To: <6e5939861003210852i2da47560mad8daefab1bafeab@mail.gmail.com> References: <6e5939861003150338x79de44a7x5fc8ecf69b13a430@mail.gmail.com> <4B9E6F1D.8020000@komitex.ru> <4B9F9FB2.5090509@gmail.com> <4BA0ADB9.8040409@komitex.ru> <6e5939861003170430m2a17b8daif6b0ae2c4ada8048@mail.gmail.com> <4BA0BA59.3080109@komitex.ru> <6e5939861003170524iaf83b31sdb79ac191f760baf@mail.gmail.com> <4BA0CCF3.9070200@komitex.ru> <6e5939861003200632t77fe5aebya18b463ba0d8ef3a@mail.gmail.com> <4BA636D7.3060703@komitex.ru> <6e5939861003210852i2da47560mad8daefab1bafeab@mail.gmail.com> Message-ID: <4BA644E1.9070703@komitex.ru> Быстро сдались. Почему вы решили что id вы напишите хорошо? У вас же проблема в том что вам не ясны важные моменты взаимодействия языка и машины. И вам нужно сесть за литературу или вопросы задавать в рассылку, что вам не понятно и т.д. Смысл ваших заданий в том чтобы я смог найти где у вас пробелы и помог вам их закрыть. Старцев один пишет id или у него есть помошник? Я не против, но там надо от и до. Она простая. -- Г.А. Вилежанинов Василий пишет: > Я тут подумал, что у меня много чего неправильно (если не все) и > переделывать, то же самое, что писать заново. Поэтому можно я возьму > другую задачу, например, про id вместе со Старцевым? > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From sitkarev на komitex.ru Sun Mar 21 20:14:37 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Sun, 21 Mar 2010 19:14:37 +0300 Subject: [cdev] =?utf-8?b?0KPRgtC40LvQuNGC0LAgcHM=?= In-Reply-To: <86571269108410@web88.yandex.ru> References: <8131268917271@webmail90.yandex.ru> <4BA27C30.2090401@komitex.ru> <140741269013571@webmail77.yandex.ru> <4BA3C89A.6040502@komitex.ru> <86571269108410@web88.yandex.ru> Message-ID: <4BA645ED.8090307@komitex.ru> Лучше обращаться к рассылке в целом. Она не моя личная, а ваша)) Вас больше тут чем меня. Дело в том что коварный пользователь может процесс любой запустить с любыми значениями которые окажутся в argv[]. Это как раз то что вы видите в cmdline. Это значит что любой символ из набора ASCII и выше там может очутиться. Если вы посмотрите в ASCII таблицу, то увидите что там не все символы печатные, т.е. отображаемые. Некоторые имеют специальное значение, например символ табуляции '\t' с кодом 0x09. Кроме того, для терминалов комбинации из специальных символов могут являться командами. Например, для linux-консоли (похож на vt-220) последователность ESC [ 2 J (где ESC это 0x1b) очистит весь экран. Подробнее про управляющие последовательности linux-консоли можно прочитать в console_codes(4). Если пользователь в argv[] передаст такую последовательность, то ваш ps просто экран будет стирать при выводе cmdline, если вы не экранируете ESC. Можете проверить, как работают эти управляющие последовательности: $ echo -e \\033[2J В ctype.h есть определения функций стандартной библиотеки, которые вам помогут определить категорию символа. Посмотрите man-страницу по isprint(3) и iscntrl(3). Получается что вам нужно посимвольно пробежаться по буферу, куда вы поместили выковыренные строки из cmdline (они там разделены нулём) и проверить, к какой категории относится каждый символ. Результат помещаете в выходной буфер. Я думаю что выходной буфер должен передаваться как аргумент в функцию экранирования вместе со своим размером. -- Г.А. Malkov Stanislav пишет: > Здравствуйте. Григорий Александрович Мы исправили некоторые недочеты, можете посмотреть, если будет время. Но у нас есть проблема, мы не понимаем значение третьего пункта замечаний, объясните пожалуйста поподробнее: что может случиться, как этого избежать и как это проверить??? > > >> 3. В /proc//cmdline аргументы, которые были переданы с командной >> строки разделены нулём, т.е. символом, который обозначает в Си >> завершение строки. Поэтому вам надо их там особым образом все прочитать >> поля. >> >> $ hexdump -c /proc/self/cmdline >> 0000000 h e x d u m p \0 - c \0 / p r o c >> 0000010 / s e l f / c m d l i n e \0 >> 000001e >> >> Кроме того, это строки, задаваемые пользователем. А пользователь может >> быть очень коварным, и может туда засунуть всё что угодно, и символ >> табуляции и переноса каретки и т.д. По идее, все непечатные символы надо >> оттуда убрать (экранировать). From megabot88 на gmail.com Sun Mar 21 20:24:27 2010 From: megabot88 на gmail.com (=?KOI8-R?B?98nMxdbBzsnOz9cg98HTyczJyg==?=) Date: Sun, 21 Mar 2010 19:24:27 +0300 Subject: [cdev] Utility bc In-Reply-To: <4BA644E1.9070703@komitex.ru> References: <6e5939861003150338x79de44a7x5fc8ecf69b13a430@mail.gmail.com> <4BA0ADB9.8040409@komitex.ru> <6e5939861003170430m2a17b8daif6b0ae2c4ada8048@mail.gmail.com> <4BA0BA59.3080109@komitex.ru> <6e5939861003170524iaf83b31sdb79ac191f760baf@mail.gmail.com> <4BA0CCF3.9070200@komitex.ru> <6e5939861003200632t77fe5aebya18b463ba0d8ef3a@mail.gmail.com> <4BA636D7.3060703@komitex.ru> <6e5939861003210852i2da47560mad8daefab1bafeab@mail.gmail.com> <4BA644E1.9070703@komitex.ru> Message-ID: <6e5939861003210924t3e65233fnabfc818597819a55@mail.gmail.com> 1. Я не говорю, что хорошо напишу. Она проще, а времени мало. 2. Старцев пишет один. 3. Возникает вопрос: id выводит информацию о текущем или указанном пользователе. А где хранится эта информация? 21 марта 2010 г. 19:10 пользователь Grigoriy A. Sitkarev написал: > Быстро сдались. > > Почему вы решили что id вы напишите хорошо? У вас же проблема в том что вам > не ясны важные моменты взаимодействия языка и машины. И вам нужно сесть за > литературу или вопросы задавать в рассылку, что вам не понятно и т.д. Смысл > ваших заданий в том чтобы я смог найти где у вас пробелы и помог вам их > закрыть. > > Старцев один пишет id или у него есть помошник? > > Я не против, но там надо от и до. Она простая. > > -- > Г.А. From ElenaKarabanova17 на yandex.ru Sun Mar 21 20:34:46 2010 From: ElenaKarabanova17 на yandex.ru (=?koi8-r?B?68HSwcLBzs/XwSDlzMXOwQ==?=) Date: Sun, 21 Mar 2010 19:34:46 +0300 Subject: [cdev] =?koi8-r?b?9dTJzMnUwSBFY2hv?= In-Reply-To: <4BA63D40.9070505@komitex.ru> References: <169521269024158@webmail108.yandex.ru> <4BA3C988.5050005@komitex.ru> <360171269128381@webmail62.yandex.ru> <4BA63D40.9070505@komitex.ru> Message-ID: <461311269189286@webmail62.yandex.ru> Все правильно Echo2.odt документация пользователя main.c - исходный код а echo2.1 man страница я вам пересылаю её 21.03.10, 18:37, "Grigoriy A. Sitkarev" : > Я не вижу тут man-страницы. Я вижу некий документ в формате ODT. > Страницу, ссылку на которую вы прислали, вы видимо сами не прочитали. > > Лишние пробелы вы так и не убрали и goto до сих пор боитесь. Можете > показать фигу программистам-теоретикам, и поставить goto в свою программу. > > -- > Г.А. > > Карабанова Елена пишет: > > Здравствуйте > > Высылаю man-страницу и документацию пользователя > > при создании man-страницы очень помогла страничка > > http://www.linuxfocus.org/Russian/November2003/article309.shtml > > > > > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev > > -- Яндекс.Почта. Письма есть. Спама - нет. http://mail.yandex.ru/nospam/sign ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: echo2.1 Type: application/octet-stream Size: 1410 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Sun Mar 21 20:37:52 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Sun, 21 Mar 2010 19:37:52 +0300 Subject: [cdev] Utility bc In-Reply-To: <6e5939861003210924t3e65233fnabfc818597819a55@mail.gmail.com> References: <6e5939861003150338x79de44a7x5fc8ecf69b13a430@mail.gmail.com> <4BA0ADB9.8040409@komitex.ru> <6e5939861003170430m2a17b8daif6b0ae2c4ada8048@mail.gmail.com> <4BA0BA59.3080109@komitex.ru> <6e5939861003170524iaf83b31sdb79ac191f760baf@mail.gmail.com> <4BA0CCF3.9070200@komitex.ru> <6e5939861003200632t77fe5aebya18b463ba0d8ef3a@mail.gmail.com> <4BA636D7.3060703@komitex.ru> <6e5939861003210852i2da47560mad8daefab1bafeab@mail.gmail.com> <4BA644E1.9070703@komitex.ru> <6e5939861003210924t3e65233fnabfc818597819a55@mail.gmail.com> Message-ID: <4BA64B60.4040208@komitex.ru> Времени у вас было с начала месяца. И о текущем выводит и об указанном. Прочитайте внимательно man-страницу реализованного id(1). getuid(2), getgid(2), getpwuid(3), getgrnam(3), getgrgid(3). Полезно прочитать: http://www.gnu.org/s/libc/manual/html_node/Users-and-Groups.html#Users-and-Groups Вилежанинов Василий пишет: > 1. Я не говорю, что хорошо напишу. Она проще, а времени мало. > > 2. Старцев пишет один. > > 3. Возникает вопрос: id выводит информацию о текущем или указанном > пользователе. А где хранится эта информация? > From sitkarev на komitex.ru Sun Mar 21 20:40:42 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Sun, 21 Mar 2010 19:40:42 +0300 Subject: [cdev] =?utf-8?b?0KPRgtC40LvQuNGC0LAgRWNobw==?= In-Reply-To: <461311269189286@webmail62.yandex.ru> References: <169521269024158@webmail108.yandex.ru> <4BA3C988.5050005@komitex.ru> <360171269128381@webmail62.yandex.ru> <4BA63D40.9070505@komitex.ru> <461311269189286@webmail62.yandex.ru> Message-ID: <4BA64C0A.9070508@komitex.ru> Теперь вижу. Просто она у вас имеет MIME-заголовок как binary во вложении. Показалось что это вы бинарник программы прислали. Код доделайте как я прошу. Осталось то всего да ничего! Makefile уже просить не буду. -- Г.А. Карабанова Елена пишет: > Все правильно Echo2.odt документация пользователя > main.c - исходный код > а echo2.1 man страница > я вам пересылаю её From megabot88 на gmail.com Sun Mar 21 20:42:25 2010 From: megabot88 на gmail.com (=?KOI8-R?B?98nMxdbBzsnOz9cg98HTyczJyg==?=) Date: Sun, 21 Mar 2010 19:42:25 +0300 Subject: [cdev] Utility bc In-Reply-To: <4BA64B60.4040208@komitex.ru> References: <6e5939861003150338x79de44a7x5fc8ecf69b13a430@mail.gmail.com> <4BA0BA59.3080109@komitex.ru> <6e5939861003170524iaf83b31sdb79ac191f760baf@mail.gmail.com> <4BA0CCF3.9070200@komitex.ru> <6e5939861003200632t77fe5aebya18b463ba0d8ef3a@mail.gmail.com> <4BA636D7.3060703@komitex.ru> <6e5939861003210852i2da47560mad8daefab1bafeab@mail.gmail.com> <4BA644E1.9070703@komitex.ru> <6e5939861003210924t3e65233fnabfc818597819a55@mail.gmail.com> <4BA64B60.4040208@komitex.ru> Message-ID: <6e5939861003210942p183ca3c4n21c142772f33ffc1@mail.gmail.com> Редкий студент делает задание с того момента, когда его задали) По теме: почитаю From ElenaKarabanova17 на yandex.ru Sun Mar 21 22:17:50 2010 From: ElenaKarabanova17 на yandex.ru (=?koi8-r?B?68HSwcLBzs/XwSDlzMXOwQ==?=) Date: Sun, 21 Mar 2010 21:17:50 +0300 Subject: [cdev] =?koi8-r?b?9dTJzMnUwSBFY2hv?= Message-ID: <117361269195470@webmail23.yandex.ru> Я внимательно просмотрела код, где нашла там поправила, я не знаю, уже где я могла пробелы недоставить или поставить лишние. 21.03.10, 19:40, "Grigoriy A. Sitkarev" : > Теперь вижу. Просто она у вас имеет MIME-заголовок как binary во > вложении. Показалось что это вы бинарник программы прислали. > > Код доделайте как я прошу. Осталось то всего да ничего! > > Makefile уже просить не буду. > > -- > Г.А. > > Карабанова Елена пишет: > > Все правильно Echo2.odt документация пользователя > > main.c - исходный код > > а echo2.1 man страница > > я вам пересылаю её > > > > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev > > -- Яндекс.Почта. Письма есть. Спама - нет. http://mail.yandex.ru/nospam/sign ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: main.c Type: application/octet-stream Size: 2041 bytes Desc: отсутствует URL: ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: Makefile Type: application/octet-stream Size: 4479 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Tue Mar 23 19:59:10 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Tue, 23 Mar 2010 18:59:10 +0300 Subject: [cdev] =?utf-8?b?0KPRgtC40LvQuNGC0LAgRWNobw==?= In-Reply-To: <117361269195470@webmail23.yandex.ru> References: <117361269195470@webmail23.yandex.ru> Message-ID: <4BA8E54E.2070807@komitex.ru> В самом конце файла лишние пробелы внизу. -- Г.А. Карабанова Елена пишет: > Я внимательно просмотрела код, где нашла там поправила, я не знаю, уже где я могла пробелы недоставить или поставить лишние. > From ElenaKarabanova17 на yandex.ru Tue Mar 23 23:07:11 2010 From: ElenaKarabanova17 на yandex.ru (=?koi8-r?B?68HSwcLBzs/XwSDlzMXOwQ==?=) Date: Tue, 23 Mar 2010 22:07:11 +0300 Subject: [cdev] =?koi8-r?b?9dTJzMnUwSBFY2hv?= In-Reply-To: <4BA8E54E.2070807@komitex.ru> References: <117361269195470@webmail23.yandex.ru> <4BA8E54E.2070807@komitex.ru> Message-ID: <209121269371231@webmail111.yandex.ru> Добрый вечер, действительно я нашла один лишний пробел там где вы сказали, но он уже ниначто впринципе не влиял!!! argc -= optind; argv += optind; /* выполняется если ,была указана опция -е */ if (enabled_escapes) do_echo_with_escapes(argc, argv); else do_echo(argc, argv); if (put_newline) printf("\n"); exit(EXIT_SUCCESS); } если вы имели ввиду пропуски, так они для Удобства чтения. 23.03.10, 18:59, "Grigoriy A. Sitkarev" : > В самом конце файла лишние пробелы внизу. > > -- > Г.А. > > Карабанова Елена пишет: > > Я внимательно просмотрела код, где нашла там поправила, я не знаю, уже где я могла пробелы недоставить или поставить лишние. > > > > > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev > > -- Яндекс.Почта. Письма есть. Спама - нет. http://mail.yandex.ru/nospam/sign ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: main.c Type: application/octet-stream Size: 2034 bytes Desc: отсутствует URL: From malkov-stanislav на yandex.ru Wed Mar 24 16:23:28 2010 From: malkov-stanislav на yandex.ru (Malkov Stanislav) Date: Wed, 24 Mar 2010 15:23:28 +0300 Subject: [cdev] =?koi8-r?b?9dTJzMnUwSBwcw==?= In-Reply-To: <4BA645ED.8090307@komitex.ru> References: <8131268917271@webmail90.yandex.ru> <4BA27C30.2090401@komitex.ru> <140741269013571@webmail77.yandex.ru> <4BA3C89A.6040502@komitex.ru> <86571269108410@web88.yandex.ru> <4BA645ED.8090307@komitex.ru> Message-ID: <136421269433408@webmail102.yandex.ru> Выкладываю исправленную версию кода. ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: myps.c Type: text/x-csrc Size: 2163 bytes Desc: отсутствует URL: From astroori на mail.ru Wed Mar 24 21:55:29 2010 From: astroori на mail.ru (=?koi8-r?B?4c7B1M/Mycog68/SwcLMo9c=?=) Date: Wed, 24 Mar 2010 20:55:29 +0300 Subject: [cdev] =?koi8-r?b?z8LT1dbExc7JxSDSxcHMydrBw8nJIHBz?= References: <509276E6F6BB4E91A6F2D27BCF6AADCC@KOMP><4B9E7B18.8060904@komitex.ru> Message-ID: <7D0DA6CCAE564A98A88FA5B1633E4EBD@KOMP> Выкладываю текущую версию программы - сделана обработка cmdline от "злых" пользователей и приведена в порядок функция listdev (C)Иван. ----------- следущая часть ----------- An embedded and charset-unspecified text was scrubbed... Name: main.c URL: From lenad89 на list.ru Wed Mar 24 22:56:32 2010 From: lenad89 на list.ru (lenad89) Date: Wed, 24 Mar 2010 21:56:32 +0300 Subject: [cdev] =?koi8-r?b?ydPQ0sHXzMXOycUgZmluZA==?= In-Reply-To: <4BA3F1E6.6010806@komitex.ru> References: <1268581712.4706.17.camel@jam-top> <1268699379.5184.61.camel@jam-top> <4B9EC98E.3070506@komitex.ru> <1268700460.23201.1.camel@jam-top> <4B9FB2EF.60902@komitex.ru> <4B9FB409.2080907@komitex.ru> <1268986838.5262.11.camel@jam-top> <1269028883.5160.23.camel@jam-top> <4BA3E699.9090803@komitex.ru> <1269035373.5160.35.camel@jam-top> <4BA3F1E6.6010806@komitex.ru> Message-ID: <1269456992.5468.19.camel@jam-top> Здравствуйте, Григорий Александрович. Мы внесли некоторые изменения. ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: find-1.0.c Type: text/x-csrc Size: 3695 bytes Desc: отсутствует URL: From megabot88 на gmail.com Wed Mar 24 23:17:51 2010 From: megabot88 на gmail.com (=?KOI8-R?B?98nMxdbBzsnOz9cg98HTyczJyg==?=) Date: Wed, 24 Mar 2010 22:17:51 +0300 Subject: [cdev] =?koi8-r?b?9dTJzMnUwSBpZA==?= Message-ID: <6e5939861003241217r19e64asca19cb7780574a56@mail.gmail.com> Здравствуйте. Вот набросок кода id. Возник вопрос, что делает опция -r? ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: myid.c Type: text/x-csrc Size: 3597 bytes Desc: отсутствует URL: From megabot88 на gmail.com Thu Mar 25 03:13:40 2010 From: megabot88 на gmail.com (=?KOI8-R?B?98nMxdbBzsnOz9cg98HTyczJyg==?=) Date: Thu, 25 Mar 2010 02:13:40 +0300 Subject: [cdev] =?koi8-r?b?9dTJzMnUwSBpZA==?= In-Reply-To: <6e5939861003241217r19e64asca19cb7780574a56@mail.gmail.com> References: <6e5939861003241217r19e64asca19cb7780574a56@mail.gmail.com> Message-ID: <6e5939861003241613s7f760dg752dc22dac49fba5@mail.gmail.com> Небольшие изменения. Вопрос остается в силе. ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: myid.c Type: text/x-csrc Size: 3761 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Thu Mar 25 16:11:26 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Thu, 25 Mar 2010 15:11:26 +0300 Subject: [cdev] =?utf-8?b?0KPRgtC40LvQuNGC0LAgRWNobw==?= In-Reply-To: <209121269371231@webmail111.yandex.ru> References: <117361269195470@webmail23.yandex.ru> <4BA8E54E.2070807@komitex.ru> <209121269371231@webmail111.yandex.ru> Message-ID: <4BAB52EE.7000102@komitex.ru> У вас будет зачёт. Я хотел чтобы вы почувствовали, как делать законченные вещи. Боюсь что без подсказок со стороны это было бы не возможно. Вам надо больше читать и изучать хорошо написанные программы. И не бояться goto )) -- Г.А. Карабанова Елена пишет: > Добрый вечер, действительно я нашла один лишний пробел там где вы сказали, но он уже ниначто впринципе не влиял!!! From sitkarev на komitex.ru Thu Mar 25 16:18:07 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Thu, 25 Mar 2010 15:18:07 +0300 Subject: [cdev] =?utf-8?b?0KPRgtC40LvQuNGC0LAgcHM=?= In-Reply-To: <136421269433408@webmail102.yandex.ru> References: <8131268917271@webmail90.yandex.ru> <4BA27C30.2090401@komitex.ru> <140741269013571@webmail77.yandex.ru> <4BA3C89A.6040502@komitex.ru> <86571269108410@web88.yandex.ru> <4BA645ED.8090307@komitex.ru> <136421269433408@webmail102.yandex.ru> Message-ID: <4BAB547F.8030008@komitex.ru> Вы сделайте хотя бы ещё пару полей. Ведь этого так мало и совсем недостаточно для зачёта. Хотя-бы выковыривание из cmdline сделайте записей, разделённых пробелами. Если вам надо пропустить один параметр, как вы делаете в fscanf, то можно поставить модификатор-звёздочку, тогда это означает что запись в аргумент игнорируется (пропускается): fscanf("%*s %s", buf); Такое чтение кстати потенциально опасно, потому что вы не ограничиваете количество символов, которое должно быть помещено в буфер. Надо передавать ограничение туда, например так: fscanf("%*s %80s", buf); Тогда вы будете уверены что в буфер будет записано не более 80+1 символов (не учитывается завершающий '\0'). -- Г.А. Malkov Stanislav пишет: > Выкладываю исправленную версию кода. > > > ------------------------------------------------------------------------ > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From sitkarev на komitex.ru Thu Mar 25 16:20:10 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Thu, 25 Mar 2010 15:20:10 +0300 Subject: [cdev] =?utf-8?b?0KPRgtC40LvQuNGC0LAgcHM=?= In-Reply-To: <4BAB547F.8030008@komitex.ru> References: <8131268917271@webmail90.yandex.ru> <4BA27C30.2090401@komitex.ru> <140741269013571@webmail77.yandex.ru> <4BA3C89A.6040502@komitex.ru> <86571269108410@web88.yandex.ru> <4BA645ED.8090307@komitex.ru> <136421269433408@webmail102.yandex.ru> <4BAB547F.8030008@komitex.ru> Message-ID: <4BAB54FA.6020800@komitex.ru> Забыл первый аргумент указать для fscanf. Должно быть: fscanf(f, "%*s %80s", buf); Но вы меня всё равно поняли. -- Г.А. Grigoriy A. Sitkarev пишет: > Вы сделайте хотя бы ещё пару полей. > > Ведь этого так мало и совсем недостаточно для зачёта. > > Хотя-бы выковыривание из cmdline сделайте записей, разделённых пробелами. > > Если вам надо пропустить один параметр, как вы делаете в fscanf, то > можно поставить модификатор-звёздочку, тогда это означает что запись в > аргумент игнорируется (пропускается): > > fscanf("%*s %s", buf); > > Такое чтение кстати потенциально опасно, потому что вы не ограничиваете > количество символов, которое должно быть помещено в буфер. Надо > передавать ограничение туда, например так: > > fscanf("%*s %80s", buf); > > Тогда вы будете уверены что в буфер будет записано не более 80+1 > символов (не учитывается завершающий '\0'). > > -- > Г.А. From sitkarev на komitex.ru Thu Mar 25 16:31:59 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Thu, 25 Mar 2010 15:31:59 +0300 Subject: [cdev] =?utf-8?b?0LjRgdC/0YDQsNCy0LvQtdC90LjQtSBmaW5k?= In-Reply-To: <1269456992.5468.19.camel@jam-top> References: <1268581712.4706.17.camel@jam-top> <1268699379.5184.61.camel@jam-top> <4B9EC98E.3070506@komitex.ru> <1268700460.23201.1.camel@jam-top> <4B9FB2EF.60902@komitex.ru> <4B9FB409.2080907@komitex.ru> <1268986838.5262.11.camel@jam-top> <1269028883.5160.23.camel@jam-top> <4BA3E699.9090803@komitex.ru> <1269035373.5160.35.camel@jam-top> <4BA3F1E6.6010806@komitex.ru> <1269456992.5468.19.camel@jam-top> Message-ID: <4BAB57BF.7080703@komitex.ru> C вами вообще отдельная песня, потому что мне надо не чтобы вы правили ошибки свои, а начали разбираться с программированием вообще. Я тут немного посидел, и сделал для вас пример один, чтобы вы посмотрели как можно удобно обвернуть обход каталогов. Хотя это и всей рассылки касается, пусть тоже смотрят. Утилита find должна иметь ещё специальную опцию -L, если она есть то в таком случае по ссылкам нужно ходить. Но в таком случае может быть проблема с их зацикливанием, надо следить. Здесь есть вариант решения такой задачи. Конечно, этот файл я бы разбил на несколько: macros.h, xfuncs.c, traverse-directory.c и т.д. но для удобства в списке я всё в одном файле сохраняю. Там могут быть ошибки, но в целом вроде бы всё работает. Посмотрите, как сделаны опции: FOLLOW_SYMLINKS - следовать за символическими ссылками PREVENT_LOOPING - обнаруживать зацикливание каталогов SKIP_DOT_FILES - пропускать файлы с точкой DIRS_ONLY - сканировать только каталоги Посмотрите вообще сам принцип организации механизма взаимодействия с пользователем через callbacks. Компилировать можно так: $ gcc -O0 -g -Wall -G_GNU_SOURCE -o find_utils find_utils.c Поменяйте в примере каталог, который вы будете обходить потому что там у меня мой домашний стоит. Жду вопросов. -- Г.А. lenad89 пишет: > Здравствуйте, Григорий Александрович. > > Мы внесли некоторые изменения. > > > ------------------------------------------------------------------------ > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: find_utils.c Type: text/x-csrc Size: 14507 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Thu Mar 25 16:40:04 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Thu, 25 Mar 2010 15:40:04 +0300 Subject: [cdev] =?utf-8?b?0KPRgtC40LvQuNGC0LAgaWQ=?= In-Reply-To: <6e5939861003241613s7f760dg752dc22dac49fba5@mail.gmail.com> References: <6e5939861003241217r19e64asca19cb7780574a56@mail.gmail.com> <6e5939861003241613s7f760dg752dc22dac49fba5@mail.gmail.com> Message-ID: <4BAB59A4.7070405@komitex.ru> Дело в том что в Unix есть два (на самом деле три, ещё сохранённый) идентификатора которые поддерживаются ОС. Соответственно есть функции getuid(2) и geteuid(2) которые возвращают реальный и эффективный идентификаторы пользователя. Эффективный uid этот тот, с правами которого исполняется файл, например если был установлен SUID бит. Т.е. чаще всего uid == euid, но не всегда. Потому и опция -r нужна, чтобы показать действительный а не эффективный uid. Прочтите man-страницы внимательно, они все были давно переведены и на русский в т.ч. Вам станет понятно что это. Вилежанинов Василий пишет: > Небольшие изменения. Вопрос остается в силе. > > > ------------------------------------------------------------------------ > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From megabot88 на gmail.com Thu Mar 25 17:23:50 2010 From: megabot88 на gmail.com (=?KOI8-R?B?98nMxdbBzsnOz9cg98HTyczJyg==?=) Date: Thu, 25 Mar 2010 16:23:50 +0300 Subject: [cdev] =?koi8-r?b?9dTJzMnUwSBpZA==?= In-Reply-To: <4BAB59A4.7070405@komitex.ru> References: <6e5939861003241217r19e64asca19cb7780574a56@mail.gmail.com> <6e5939861003241613s7f760dg752dc22dac49fba5@mail.gmail.com> <4BAB59A4.7070405@komitex.ru> Message-ID: <6e5939861003250623h34bb1de6j9676b0a1846e947d@mail.gmail.com> А, допустим, консоль была запущена от user1, а я пишу id user2. Тогда geteuid вернет эффективный идентификатор user1. Как с этим быть, т е надо установить идентификатор например с помощью seteuid? 2010/3/25 Grigoriy A. Sitkarev : > Дело в том что в Unix есть два (на самом деле три, ещё сохранённый) > идентификатора которые поддерживаются ОС. Соответственно есть функции > getuid(2) и geteuid(2) которые возвращают реальный и эффективный > идентификаторы пользователя. > > Эффективный uid этот тот, с правами которого исполняется файл, например если > был установлен SUID бит. Т.е. чаще всего uid == euid, но не всегда. Потому и > опция -r нужна, чтобы показать действительный а не эффективный uid. > > Прочтите man-страницы внимательно, они все были давно переведены и на > русский в т.ч. Вам станет понятно что это. > From malkov-stanislav на yandex.ru Thu Mar 25 17:32:24 2010 From: malkov-stanislav на yandex.ru (Malkov Stanislav) Date: Thu, 25 Mar 2010 16:32:24 +0300 Subject: [cdev] =?koi8-r?b?9dTJzMnUwSBwcw==?= In-Reply-To: <4BAB547F.8030008@komitex.ru> References: <8131268917271@webmail90.yandex.ru> <4BA27C30.2090401@komitex.ru> <140741269013571@webmail77.yandex.ru> <4BA3C89A.6040502@komitex.ru> <86571269108410@web88.yandex.ru> <4BA645ED.8090307@komitex.ru> <136421269433408@webmail102.yandex.ru> <4BAB547F.8030008@komitex.ru> Message-ID: <11451269523944@webmail76.yandex.ru> Григорий Александрович, так вы же нам сказали написать только поля, входящие в busybox ps. From megabot88 на gmail.com Thu Mar 25 19:11:46 2010 From: megabot88 на gmail.com (=?KOI8-R?B?98nMxdbBzsnOz9cg98HTyczJyg==?=) Date: Thu, 25 Mar 2010 18:11:46 +0300 Subject: [cdev] =?koi8-r?b?9dTJzMnUwSBpZA==?= In-Reply-To: <6e5939861003250623h34bb1de6j9676b0a1846e947d@mail.gmail.com> References: <6e5939861003241217r19e64asca19cb7780574a56@mail.gmail.com> <6e5939861003241613s7f760dg752dc22dac49fba5@mail.gmail.com> <4BAB59A4.7070405@komitex.ru> <6e5939861003250623h34bb1de6j9676b0a1846e947d@mail.gmail.com> Message-ID: <6e5939861003250811r35bfbcecu27c2398bc0d7d18f@mail.gmail.com> Добавил -r ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: myid.c Type: text/x-csrc Size: 5070 bytes Desc: отсутствует URL: From lenad89 на list.ru Thu Mar 25 21:21:04 2010 From: lenad89 на list.ru (=?koi8-r?Q?=EC=C5=CE=C1_=E4=CF=D7=D6=CB=CF?=) Date: Thu, 25 Mar 2010 20:21:04 +0300 Subject: [cdev] =?koi8-r?b?ydPQ0sHXzMXOycUgZmluZA==?= In-Reply-To: <4BAB57BF.7080703@komitex.ru> References: <4BAB57BF.7080703@komitex.ru> Message-ID: Пока еще не все разобрали, но возник такой вопрос: можно ли вместо stack`a использовать st_dev && st_ino ? Вроде как они уникальны для каталога, т.е. хранить не полные пути,а два этих значения ( возможно их как-то упорядочивать , тогда не надо будет ходить по всему списку) для тех каталогов, которые прошли. From sitkarev на komitex.ru Thu Mar 25 21:29:52 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Thu, 25 Mar 2010 20:29:52 +0300 Subject: [cdev] =?utf-8?b?0LjRgdC/0YDQsNCy0LvQtdC90LjQtSBmaW5k?= In-Reply-To: References: <4BAB57BF.7080703@komitex.ru> Message-ID: <4BAB9D90.4010606@komitex.ru> В теории можно, но вам тогда придётся хранить их для всех компонентов пути. Мне кажется что строку пути проще сделать. Ссылки могут быть "многоходовыми", например: /home/sitkarev/0/1/2/3 -> /tmp /tmp -> /var/tmp /var/tmp -> /home и т.д. Безусловно, там не самым оптимальным образом сделано, например можно было бы делать не список а стек из указателей да ещё и хранить его в сортированном виде, но на мой взгляд эта оптимизация излишняя. Точнее, на данном этапе, это бы существенно усложнило понимание для вас. Оптимизация это всегда ПОСЛЕДНИЙ шаг, и делать его нужно тогда когда она начнёт оказывать влияние на работу системы или программы. -- Г.А. Лена Довжко пишет: > Пока еще не все разобрали, но возник такой вопрос: можно ли вместо stack`a использовать st_dev && st_ino ? Вроде как они уникальны для каталога, т.е. хранить не полные пути,а два этих значения ( возможно их как-то упорядочивать , тогда не надо будет ходить по всему списку) для тех каталогов, которые прошли. > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From sitkarev на komitex.ru Thu Mar 25 21:56:28 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Thu, 25 Mar 2010 20:56:28 +0300 Subject: [cdev] =?utf-8?b?0KPRgtC40LvQuNGC0LAgcHM=?= In-Reply-To: <11451269523944@webmail76.yandex.ru> References: <8131268917271@webmail90.yandex.ru> <4BA27C30.2090401@komitex.ru> <140741269013571@webmail77.yandex.ru> <4BA3C89A.6040502@komitex.ru> <86571269108410@web88.yandex.ru> <4BA645ED.8090307@komitex.ru> <136421269433408@webmail102.yandex.ru> <4BAB547F.8030008@komitex.ru> <11451269523944@webmail76.yandex.ru> Message-ID: <4BABA3CC.2090508@komitex.ru> Не начинайте торговаться. У меня задачи педагогические, а вы торгуетесь, как бы вам не перетрудиться и сделать по установленному законом минимуму (в данном случае моим словом). PATH_MAX это только то что в пути может быть (законный минимум, который вы можете использовать), а у вас ещё и аргументы. В любом случае, надо проверять не вышли ли вы за границу буфера, у вас нигде проверок нет. Это ошибка. Алгоритмы обработки ошибок системных вызовов у вас не верны. Уберите хотя-бы все предупреждения при компиляции с -Wall. Они существенны. -- Г.А. Malkov Stanislav пишет: > Григорий Александрович, так вы же нам сказали написать только поля, входящие в busybox ps. > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From sitkarev на komitex.ru Thu Mar 25 22:02:12 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Thu, 25 Mar 2010 21:02:12 +0300 Subject: [cdev] =?utf-8?b?0LjRgdC/0YDQsNCy0LvQtdC90LjQtSBmaW5k?= In-Reply-To: References: <4BAB57BF.7080703@komitex.ru> Message-ID: <4BABA524.1090307@komitex.ru> Есть ещё одно важное преимущество такого подхода, на мой взгляд оно заключается в том что если вы храните путь, то тогда не нужно вызывать lstat(2) для каждого из компонентов пути, это если бы мы хранили st_dev и st_ino. А системный вызов вещь затратная - это же переключение контекста! Только вы видимо это пока ещё не совсем понимаете, вот как раз повод разобраться. А так никакого переключения контекста нет. Сравниваем строки - является ли один путь частью иерархии другого пути. -- Г.А. Лена Довжко пишет: > Пока еще не все разобрали, но возник такой вопрос: можно ли вместо stack`a использовать st_dev && st_ino ? Вроде как они уникальны для каталога, т.е. хранить не полные пути,а два этих значения ( возможно их как-то упорядочивать , тогда не надо будет ходить по всему списку) для тех каталогов, которые прошли. > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From sitkarev на komitex.ru Thu Mar 25 23:17:37 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Thu, 25 Mar 2010 22:17:37 +0300 Subject: [cdev] =?utf-8?b?0KPRgtC40LvQuNGC0LAgaWQ=?= In-Reply-To: <6e5939861003250811r35bfbcecu27c2398bc0d7d18f@mail.gmail.com> References: <6e5939861003241217r19e64asca19cb7780574a56@mail.gmail.com> <6e5939861003241613s7f760dg752dc22dac49fba5@mail.gmail.com> <4BAB59A4.7070405@komitex.ru> <6e5939861003250623h34bb1de6j9676b0a1846e947d@mail.gmail.com> <6e5939861003250811r35bfbcecu27c2398bc0d7d18f@mail.gmail.com> Message-ID: <4BABB6D1.6020500@komitex.ru> Вы не понимаете как работает getopt(3). Перечитайте пожалуйста man-страницу, там внизу был очень хороший пример. -- Г.А. Вилежанинов Василий пишет: > Добавил -r > > > ------------------------------------------------------------------------ > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From astroori на mail.ru Fri Mar 26 00:16:41 2010 From: astroori на mail.ru (=?koi8-r?B?4c7B1M/Mycog68/SwcLMo9c=?=) Date: Thu, 25 Mar 2010 23:16:41 +0300 Subject: [cdev] =?koi8-r?b?Wz8/IFByb2JhYmxlIFNwYW1dICBSZTogIPfSxc3RINfT?= =?koi8-r?b?1NLF3sk=?= References: <6e5939861003190418g3d95fd7ctbbcd4d70036aaa92@mail.gmail.com><4BA378F6.6010201@komitex.ru><6e5939861003190842g112a12a6yff00f9273054b0f7@mail.gmail.com> <6e5939861003190843q1fcba49ct53069da976365987@mail.gmail.com> Message-ID: <08E485B3E9FC48439DD1DD02EAD53F9E@KOMP> Григорий Александрович. Пишу Вам от имени группы: группа очень хочет с вами встретиться завтра, поскольку сессия закрывается совсем свосем скоро... Если Вам удобно - например в 14:00 или в другое время после обеда... (С)145 группа From sitkarev на komitex.ru Fri Mar 26 00:25:36 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Thu, 25 Mar 2010 23:25:36 +0300 Subject: [cdev] =?utf-8?b?Wz8/IFByb2JhYmxlIFNwYW1dICBSZTog0JLRgNC10LzRjyA=?= =?utf-8?b?0LLRgdGC0YDQtdGH0Lg=?= In-Reply-To: <08E485B3E9FC48439DD1DD02EAD53F9E@KOMP> References: <6e5939861003190418g3d95fd7ctbbcd4d70036aaa92@mail.gmail.com><4BA378F6.6010201@komitex.ru><6e5939861003190842g112a12a6yff00f9273054b0f7@mail.gmail.com> <6e5939861003190843q1fcba49ct53069da976365987@mail.gmail.com> <08E485B3E9FC48439DD1DD02EAD53F9E@KOMP> Message-ID: <4BABC6C0.30705@komitex.ru> А что мне группа хочет интересно такого показать, что она стесняется в рассылке сделать? На текущий момент у нас не так много кандидатов на зачёт. К большому сожалению. У меня завтра запланирована встреча с Владимиром Леонидовичем, но мы договаривались на 17 часов, я могу прийти пораньше, например в 16 или в 15.30. Что касается допусков, то они обычно отправляются письмом на кафедру. Процедура стандартная. -- Г.А. Анатолий Кораблёв пишет: > Григорий Александрович. Пишу Вам от имени группы: группа очень хочет с > вами встретиться завтра, поскольку сессия закрывается совсем свосем > скоро... > Если Вам удобно - например в 14:00 или в другое время после обеда... > (С)145 группа > > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From astroori на mail.ru Fri Mar 26 00:30:54 2010 From: astroori на mail.ru (=?koi8-r?B?4c7B1M/Mycog68/SwcLMo9c=?=) Date: Thu, 25 Mar 2010 23:30:54 +0300 Subject: [cdev] =?koi8-r?b?Wz8/IFByb2JhYmxlIFNwYW1dICBSZTog99LFzdEg19PU?= =?koi8-r?b?0sXeyQ==?= References: <6e5939861003190418g3d95fd7ctbbcd4d70036aaa92@mail.gmail.com><4BA378F6.6010201@komitex.ru><6e5939861003190842g112a12a6yff00f9273054b0f7@mail.gmail.com> <6e5939861003190843q1fcba49ct53069da976365987@mail.gmail.com><08E485B3E9FC48439DD1DD02EAD53F9E@KOMP> <4BABC6C0.30705@komitex.ru> Message-ID: <1CD91F71D34548288E82A88E50E4DDBD@KOMP> Ну видимо боятся, что Вы в рассылке что то не правильно поймёте=))) (С)KA50 Давайте тогда в 15:30 если Вам удобно. И ещё - группа интересуется и просит огласить список кандидатов на получение зачета... (C)группа From sitkarev на komitex.ru Fri Mar 26 00:36:12 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Thu, 25 Mar 2010 23:36:12 +0300 Subject: [cdev] =?utf-8?b?Wz8/IFByb2JhYmxlIFNwYW1dICBSZTog0JLRgNC10LzRjyA=?= =?utf-8?b?0LLRgdGC0YDQtdGH0Lg=?= In-Reply-To: <1CD91F71D34548288E82A88E50E4DDBD@KOMP> References: <6e5939861003190418g3d95fd7ctbbcd4d70036aaa92@mail.gmail.com><4BA378F6.6010201@komitex.ru><6e5939861003190842g112a12a6yff00f9273054b0f7@mail.gmail.com> <6e5939861003190843q1fcba49ct53069da976365987@mail.gmail.com><08E485B3E9FC48439DD1DD02EAD53F9E@KOMP> <4BABC6C0.30705@komitex.ru> <1CD91F71D34548288E82A88E50E4DDBD@KOMP> Message-ID: <4BABC93C.6020604@komitex.ru> Я уверен практически на 100% что те кто ничего ещё не показывали, вряд ли получат зачёт. Если ты, Анатолий, вспомнишь, то я и вам делал массу замечаний, что уж говорить про остальных? Список будет завтра. Те кто его получат - уже знают об этом. -- Г.А. Анатолий Кораблёв пишет: > Ну видимо боятся, что Вы в рассылке что то не правильно поймёте=))) (С)KA50 > Давайте тогда в 15:30 если Вам удобно. > И ещё - группа интересуется и просит огласить список кандидатов на > получение зачета... > (C)группа > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From astroori на mail.ru Fri Mar 26 00:43:15 2010 From: astroori на mail.ru (=?koi8-r?B?4c7B1M/Mycog68/SwcLMo9c=?=) Date: Thu, 25 Mar 2010 23:43:15 +0300 Subject: [cdev] =?koi8-r?b?Wz8/IFByb2JhYmxlIFNwYW1dICBSZTog99LFzdEg19PU?= =?koi8-r?b?0sXeyQ==?= References: <6e5939861003190418g3d95fd7ctbbcd4d70036aaa92@mail.gmail.com><4BA378F6.6010201@komitex.ru><6e5939861003190842g112a12a6yff00f9273054b0f7@mail.gmail.com> <6e5939861003190843q1fcba49ct53069da976365987@mail.gmail.com><08E485B3E9FC48439DD1DD02EAD53F9E@KOMP> <4BABC6C0.30705@komitex.ru><1CD91F71D34548288E82A88E50E4DDBD@KOMP> <4BABC93C.6020604@komitex.ru> Message-ID: <3657260E216445DDB559679DE93C4ADB@KOMP> О замечаниях помню - они потихонечку исправляются и программа дорабатывается. Завтра в 15:30 кому есть что показать, тот придет. From megabot88 на gmail.com Fri Mar 26 03:20:38 2010 From: megabot88 на gmail.com (=?KOI8-R?B?98nMxdbBzsnOz9cg98HTyczJyg==?=) Date: Fri, 26 Mar 2010 02:20:38 +0300 Subject: [cdev] =?koi8-r?b?9dTJzMnUwSBpZA==?= In-Reply-To: <4BABB6D1.6020500@komitex.ru> References: <6e5939861003241217r19e64asca19cb7780574a56@mail.gmail.com> <6e5939861003241613s7f760dg752dc22dac49fba5@mail.gmail.com> <4BAB59A4.7070405@komitex.ru> <6e5939861003250623h34bb1de6j9676b0a1846e947d@mail.gmail.com> <6e5939861003250811r35bfbcecu27c2398bc0d7d18f@mail.gmail.com> <4BABB6D1.6020500@komitex.ru> Message-ID: <6e5939861003251620o4508622fu9ed0d5e64f5c3271@mail.gmail.com> Переделал. ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: myid.c Type: text/x-csrc Size: 4711 bytes Desc: отсутствует URL: From malkov-stanislav на yandex.ru Fri Mar 26 04:17:28 2010 From: malkov-stanislav на yandex.ru (Malkov Stanislav) Date: Fri, 26 Mar 2010 03:17:28 +0300 Subject: [cdev] =?koi8-r?b?9dTJzMnUwSBwcw==?= In-Reply-To: <4BABA3CC.2090508@komitex.ru> References: <8131268917271@webmail90.yandex.ru> <4BA27C30.2090401@komitex.ru> <140741269013571@webmail77.yandex.ru> <4BA3C89A.6040502@komitex.ru> <86571269108410@web88.yandex.ru> <4BA645ED.8090307@komitex.ru> <136421269433408@webmail102.yandex.ru> <4BAB547F.8030008@komitex.ru> <11451269523944@webmail76.yandex.ru> <4BABA3CC.2090508@komitex.ru> Message-ID: <437881269562648@webmail34.yandex.ru> Добавили поле PPID и избавились от предупреждений. ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: myps.c Type: text/x-csrc Size: 2191 bytes Desc: отсутствует URL: From astroori на mail.ru Fri Mar 26 23:04:28 2010 From: astroori на mail.ru (=?koi8-r?B?4c7B1M/Mycog68/SwcLMo9c=?=) Date: Fri, 26 Mar 2010 22:04:28 +0300 Subject: [cdev] =?koi8-r?b?z8LT1dbExc7JxSDSxcHMydrBw8nJIHBz?= References: <509276E6F6BB4E91A6F2D27BCF6AADCC@KOMP><4B9E7B18.8060904@komitex.ru> <7D0DA6CCAE564A98A88FA5B1633E4EBD@KOMP> Message-ID: <6DC1AD9D88C44432A7B3ED3FF63A6090@KOMP> Текущая версия программы - поразбирались с cmdline, а также начали работу с корректым вычислением ticks_per_second. ----------- следущая часть ----------- An embedded and charset-unspecified text was scrubbed... Name: main.c URL: From alexeypetrunev на gmail.com Wed Mar 31 04:01:13 2010 From: alexeypetrunev на gmail.com (=?KOI8-R?B?4czFy9PFyiDwxdTS1c6j1w==?=) Date: Wed, 31 Mar 2010 03:01:13 +0400 Subject: [cdev] =?koi8-r?b?+sHEwd7BXzYuIMfSIDEzNQ==?= Message-ID: <8361e7401003301601x35b63520lbf60a8bc684c3d89@mail.gmail.com> Здравствуйте. Написаны функции prioq_remove и prioq_heapify. ----------- следущая часть ----------- #include #include #include #define RIGHT_CHILD(i) (((i) * 2) + 2) #define PARENT(i) (((i) - 1) / 2) #define INIT_SIZE 2 #define GROW_SIZE 32 typedef int (*prioq_compare_t)(struct prioq_head *a, struct prioq_head *b); struct prioq_head{ int index; }; struct user_data{ struct prioq_head head; int data; }; struct prioq{ struct prioq_head **heap; size_t size; size_t used; prioq_compare_t compare; }; /*Создание очереди */ struct prioq *prioq_new(prioq_compare_t compare){ struct prioq *queue; struct prioq_head **hp; queue = (prioq *)malloc(sizeof(struct prioq)); memset(queue,0,sizeof(struct prioq));//clear hp = (prioq_head**)malloc(INIT_SIZE*(sizeof(struct prioq_head*))); memset(hp,0,sizeof(struct prioq));//clear if (queue == NULL) { fprintf(stderr, "prioq_new(): out of memory !\n"); return NULL; } queue-> heap = hp; queue->size = INIT_SIZE; queue->used = 0; queue->compare = compare; return queue; } #define NEW_SIZE(q) (((q)->size + GROW_SIZE) * sizeof(struct prioq_head *)) #define OLD_SIZE(q) ((q)->size * sizeof(struct prioq_head *)) int prioq_put(struct prioq *queue, struct prioq_head *hp){ int i; struct prioq_head** tmp; if (queue == NULL || hp == NULL) fprintf(stderr, "prioq_put: NULL args\n"); if (queue->size == queue->used) { tmp = (struct prioq_head**)realloc(queue->heap, NEW_SIZE(queue)); if (!tmp) { fprintf(stderr, "prioq_put: can't realloc heap\n"); return -1; } memset(queue->heap + OLD_SIZE(queue), 0, NEW_SIZE(queue) - OLD_SIZE(queue)); queue->size += GROW_SIZE; queue->heap = tmp; } i = queue->used++; while (i && queue->compare(queue->heap[PARENT(i)], hp) < 0) { queue->heap[i] = queue->heap[PARENT(i)]; queue->heap[i]->index = i; i = PARENT(i); } queue->heap[i] = hp; hp->index = i; return 0; } /*Функция сравнения*/ int compare(struct prioq_head *a, struct prioq_head *b) { struct user_data *ap = (struct user_data *) a; struct user_data *bp = (struct user_data *) b; if (ap->data > bp->data) return 1; else if (ap->data < bp->data) return -1; return 0; } /*---------------------------------------------*/ #define LEFT_CHILD(i) (((i) * 2) + 1) int prioq_heapify(struct prioq *queue) { int index, largest; struct prioq_head* tmp; for (index = 0,largest = LEFT_CHILD(index); largest < queue->used; index = largest, largest = LEFT_CHILD(index)) { if (queue->compare(queue->heap[largest],queue->heap[largest++]) < 0) { largest++; } if (queue->compare(queue->heap[index],queue->heap[largest])<0) { tmp = queue->heap[largest]; queue->heap[largest] = queue->heap[index]; queue->heap[index] = tmp; } else return 0; } if ((largest == queue->used) && (queue->compare(queue->heap[index],queue->heap[largest]) < 0)) { tmp = queue->heap[largest]; queue->heap[largest] = queue->heap[index]; queue->heap[index] = tmp; } } /*------------------------------------------------*/ void prioq_remove(struct prioq *queue, struct prioq_head *hp) { if (hp->index > queue->used) fprintf(stderr,"prioq_remove: inedx out of range\n"); int index = hp->index; while (index > 0){ queue->heap[index] = queue->heap[PARENT(index)]; index = PARENT(index); } queue->used-=1; int used = queue->used; queue->heap[0] = queue->heap[used]; prioq_heapify(queue); } int main(void){ struct prioq *q=prioq_new(compare); struct user_data a,b,c; struct prioq_head *p,*s,*t; struct user_data *ab; a.data = 0; b.data = 5; p = &a.head; s = &b.head; prioq_put(q,p); prioq_put(q,s); prioq_remove(q,p); return 1; } From lenad89 на list.ru Wed Mar 31 19:33:21 2010 From: lenad89 на list.ru (=?koi8-r?Q?=EC=C5=CE=C1_=E4=CF=D7=D6=CB=CF?=) Date: Wed, 31 Mar 2010 18:33:21 +0400 Subject: [cdev] =?koi8-r?b?+sHEwd7BXzYuIMfSIDEzNQ==?= In-Reply-To: <8361e7401003301601x35b63520lbf60a8bc684c3d89@mail.gmail.com> References: <8361e7401003301601x35b63520lbf60a8bc684c3d89@mail.gmail.com> Message-ID: queue = malloc(sizeof(struct prioq)); if (queue == NULL) { fprintf(stderr, "prioq_new(): out of memory !\n"); return NULL; } memset(queue,0,sizeof(struct prioq));//clear hp = malloc(INIT_SIZE*(sizeof(struct prioq_head*))); if (queue == NULL) { fprintf(stderr, "prioq_new(): out of memory !\n"); return NULL; } memset(hp,0,sizeof(struct prioq));//clear > #define NEW_SIZE(q) (((q)->size + GROW_SIZE) * sizeof(struct prioq_head *)) > #define OLD_SIZE(q) ((q)->size * sizeof(struct prioq_head *)) > > int prioq_put(struct prioq *queue, struct prioq_head *hp){ > > int i; > struct prioq_head** tmp; > > if (queue == NULL || hp == NULL) > fprintf(stderr, "prioq_put: NULL args\n"); > > if (queue->size == queue->used) { > tmp = (struct prioq_head**)realloc(queue->heap, NEW_SIZE(queue)); > if (!tmp) { > fprintf(stderr, "prioq_put: can't realloc heap\n"); > return -1; > } > memset(queue->heap + OLD_SIZE(queue), 0, > NEW_SIZE(queue) - OLD_SIZE(queue)); > queue->size += GROW_SIZE; > queue->heap = tmp; > } > > i = queue->used++; > > while (i && queue->compare(queue->heap[PARENT(i)], hp) < 0) { > queue->heap[i] = queue->heap[PARENT(i)]; > queue->heap[i]->index = i; > i = PARENT(i); > } > > queue->heap[i] = hp; > hp->index = i; > > return 0; > > } > > /*Функция сравнения*/ > int > compare(struct prioq_head *a, struct prioq_head *b) > { > struct user_data *ap = (struct user_data *) a; > struct user_data *bp = (struct user_data *) b; > > if (ap->data > bp->data) > return 1; > else if (ap->data < bp->data) > return -1; > return 0; > } > > /*---------------------------------------------*/ > #define LEFT_CHILD(i) (((i) * 2) + 1) > int > prioq_heapify(struct prioq *queue) > { > int index, largest; > > struct prioq_head* tmp; > > for (index = 0,largest = LEFT_CHILD(index); > largest < queue->used; > index = largest, largest = LEFT_CHILD(index)) { > > if (queue->compare(queue->heap[largest],queue->heap[largest++]) < 0) { > largest++; > } > if (queue->compare(queue->heap[index],queue->heap[largest])<0) { > tmp = queue->heap[largest]; > queue->heap[largest] = queue->heap[index]; > queue->heap[index] = tmp; > } > else return 0; > } > if ((largest == queue->used) > && (queue->compare(queue->heap[index],queue->heap[largest]) < 0)) { > > tmp = queue->heap[largest]; > queue->heap[largest] = queue->heap[index]; > queue->heap[index] = tmp; > } > > } > > > /*------------------------------------------------*/ > void > prioq_remove(struct prioq *queue, struct prioq_head *hp) > { > > if (hp->index > queue->used) > fprintf(stderr,"prioq_remove: inedx out of range\n"); > > int index = hp->index; > > while (index > 0){ > queue->heap[index] = queue->heap[PARENT(index)]; > index = PARENT(index); > } > > queue->used-=1; > > int used = queue->used; > queue->heap[0] = queue->heap[used]; > > prioq_heapify(queue); > } > > > int main(void){ > struct prioq *q=prioq_new(compare); > struct user_data a,b,c; > struct prioq_head *p,*s,*t; > struct user_data *ab; > > a.data = 0; > b.data = 5; > p = &a.head; > s = &b.head; > > > > prioq_put(q,p); > prioq_put(q,s); > > prioq_remove(q,p); > return 1; > } > > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev > From lenad89 на list.ru Wed Mar 31 19:39:56 2010 From: lenad89 на list.ru (=?koi8-r?Q?=EC=C5=CE=C1_=E4=CF=D7=D6=CB=CF?=) Date: Wed, 31 Mar 2010 18:39:56 +0400 Subject: [cdev] =?koi8-r?b?+sHEwd7BXzYuIMfSIDEzNQ==?= In-Reply-To: References: Message-ID: предыдущее письмо отослано по ошибке queue = malloc(sizeof(struct prioq)); if (queue == NULL) { fprintf(stderr, "prioq_new(): out of memory !\n"); return NULL; } memset(queue,0,sizeof(struct prioq)); hp = malloc(INIT_SIZE*(sizeof(struct prioq_head*))); if (hp == NULL) { fprintf(stderr, "prioq_new(): out of memory !\n"); return NULL; } memset(hp,0,sizeof(struct prioq)); можно написать xmalloc() :) в remove нету free ^_^ (а где-то он должен быть) From lenad89 на list.ru Wed Mar 31 20:34:25 2010 From: lenad89 на list.ru (=?koi8-r?Q?=EC=C5=CE=C1_=E4=CF=D7=D6=CB=CF?=) Date: Wed, 31 Mar 2010 19:34:25 +0400 Subject: [cdev] =?koi8-r?b?ydPQ0sHXzMXOycUgZmluZA==?= In-Reply-To: <4BABA524.1090307@komitex.ru> References: <4BABA524.1090307@komitex.ru> Message-ID: Здравствуйте. Вы хотели рассказать как реализовывать интерпретатор для find ?(тока без кода) И куда лучше все записывать, чтобы потом проверять удобно было.( а то ведь от порядка скобок и смысл выражения зависит и много их может быть) Может структуру какую, где будут указтель на функциию обработчик и параметры? А потом их вызывать в определенном порядке. (Личное письмо, было отправлено случайно, использовался браузер, а не почтовый клиент, и в поле кому был не тот адрес) From sitkarev на komitex.ru Wed Mar 31 20:35:54 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Wed, 31 Mar 2010 19:35:54 +0400 Subject: [cdev] =?utf-8?b?0LjRgdC/0YDQsNCy0LvQtdC90LjQtSBmaW5k?= In-Reply-To: References: <4BABA524.1090307@komitex.ru> Message-ID: <4BB36BDA.4060307@komitex.ru> Я не забыл, ждал когда вы спросите. Напишу. Кода не будет, я вам только структуры данных покажу, а алгоритмы у вас тогда сами сразу встанут на место. Сегодня я если успею то сделаю, может быть ночью. Это интересное, очень хорошее задание. Думаю, всем будет полезно увидеть и разобраться. -- Г.А. Лена Довжко пишет: > Здравствуйте. > Вы хотели рассказать как реализовывать интерпретатор для find ?(тока без кода) > И куда лучше все записывать, чтобы потом проверять удобно было.( а то ведь от порядка скобок и смысл выражения зависит и много их может быть) > Может структуру какую, где будут указтель на функциию обработчик и параметры? А потом их вызывать в определенном порядке. > (Личное письмо, было отправлено случайно, использовался браузер, а не почтовый клиент, и в поле кому был не тот адрес) > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From lenad89 на list.ru Wed Mar 31 20:40:55 2010 From: lenad89 на list.ru (=?koi8-r?Q?=EC=C5=CE=C1_=E4=CF=D7=D6=CB=CF?=) Date: Wed, 31 Mar 2010 19:40:55 +0400 Subject: [cdev] =?koi8-r?b?+sHEwd7BXzYuIMfSIDEzNQ==?= In-Reply-To: References: Message-ID: free(queue); не хватает и в main return 0; и в prioq_heapify () warning: control reaches end of non-void function. и http://wiki.syktsu.ru/pipermail/cdev/2010-March/000016.html From sitkarev на komitex.ru Wed Mar 31 21:20:24 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Wed, 31 Mar 2010 20:20:24 +0400 Subject: [cdev] =?utf-8?b?0JfQsNC00LDRh9CwXzYuINCz0YAgMTM1?= In-Reply-To: References: Message-ID: <4BB37648.80003@komitex.ru> Лена Довжко пишет: > > можно написать xmalloc() :) Можно было написать. Потому что Лёша забывает например в prioq_new() проверить что вернул первый malloc(3) хотя я ему посылал свой пример там была проверка. Дело в том что не всегда xmalloc(), который просто вызывает exit(2) если не удалось памяти выделить, панацея - объясню почему. Предположим вы пишите какой-нибудь сервер, который обслуживает много подключений. При попытке инициировать новое подключение закончилась память и malloc(2) вернул NULL. В таком случае рационально отказать в новой сессии клиенту, но не вызывать exit(2) т.к. остальные смогут продолжить работу. Если мы делаем например библиотеку общего применения, то лучше чтобы функции возвращали коды, по которым можно было определить что за ошибка произошла, а обработку этой ошибки отдать на уровень выше. > > в remove нету free ^_^ (а где-то он должен быть) Нет, у Лёши в этом смысле всё верно. Потому что prioq_remove() только извлекает элемент из очереди и ничего высвобождать не должна. Теперь по ошибкам. 1. Сначала мои ошибки и неточности, я в prioq_put() забыл сказать return после проверки аргументов на NULL. На самом деле я привык делать макросы и пользоваться ими, приведу их здесь: #define return_if_fail(expr) \ { \ if (!(expr)) { \ fprintf(stderr, "%s:%d:%s(): expression `%s' failed\n", \ __FILE__, \ __LINE__, \ __FUNCTION__, \ #expr); \ return; \ } \ } #define return_val_if_fail(expr, val) \ { \ if (!(expr)) { \ fprintf(stderr, "%s:%d:%s(): expression `%s' failed\n", \ __FILE__, \ __LINE__, \ __FUNCTION__, \ #expr); \ return (val); \ } \ } Какой макрос использовать для проверки аргументов на валидность, зависит от того возвращает ли функция какое-то значение или нет. Если не возвращает, тогда мы просто делаем return. Если возвращает, тогда используем return_val_if_fail. Эти макросы надо использовать для public функций и проверять на валидность аргументы, если какие-то из них обязательны и т.д. Кроме того, я часто заключаю их в #ifdef DEBUG и делаю пустышки с такими же именами, когда DEBUG не определён, т.е. этот код можно будет исключить на стадии компиляции (после отладки). #ifdef DEBUG #define return_val_if_fail(expr, val) \ .... #define return_if_fail(expr, val) \ ... #else #define return_val_if_fail(expr, val) #define return_if_fail(expr, val) #endif Поэтому в prioq_put() стоило бы проверить аргументы так: int prioq_put(struct prioq *q, struct prioq_head *h) { int i; return_val_if_fail(q != NULL, -1); return_val_if_fail(h != NULL, -1); ... } 2. Лёша, алгоритмы у тебя не везде верно реализованы. Во-первых, ты забываешь, что мы вынуждены в заголовке prioq_head поддерживать правильнй индекс в очереди. Если у тебя где-то идёт перестановка элементов, то ты должен менять это поле индекса корректно, иначе будет проблема потом при удалении, потому что позиция элемента и поле индекса не будут совпадать. Я тебе говорил что в псевдокоде этого нет (ты сам знаешь где это сделать). 3. В prioq_heapify() посмотри внимательно на псевдокод и на то что у тебя получилось. if (queue->compare(queue->heap[largest], queue->heap[largest++]) < 0) largest++; Вот здесь ошибка, потому что уже после проверки увеличивается largest на 1 и потом ещё раз увеличивается на 1. Сверься с псевдокодом, ведь там largest в первый раз использовался как largset+1 (но само значение largest не изменялось) и только потом, если условие было верно, к нему прибавлялся 1. 4. В prioq_remove(), в Си есть и инкремент (++) и декремент (--) причём оба могут быть как в префиксной форме (сначала изменяем значение, изменённое значение результат выражения) и в постфиксной (значение выражения изменяется после). Поэтому: queue->used -= 1; не хорошо, лучше: queue->used--; или (здесь без разницы): --queue->used; Опять же обрати внимание что ты переставляешь тут элементы в очереди, но не меняешь у них поле index в заголовке. 5. Ещё раз прошу обратить внимание на оформление, что-то всё уползает куда-то. Да, и проверь компиляцию с -Wall, не должно быть предупреждений. Что-то ещё замечу, напишу. Надо делать, тебе чуть-чуть осталось. -- Г.А. From sitkarev на komitex.ru Wed Mar 31 21:22:41 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Wed, 31 Mar 2010 20:22:41 +0400 Subject: [cdev] =?utf-8?b?0JfQsNC00LDRh9CwXzYuINCz0YAgMTM1?= In-Reply-To: References: Message-ID: <4BB376D1.3040503@komitex.ru> Лена Довжко пишет: > free(queue); не хватает Нет, там всё верно. А функцию prioq_free() он ещё пока не сделал. Вот там будет и free(queue->heap) и free(queue). > и в main return 0; > и в prioq_heapify () warning: control reaches end of non-void function. > и http://wiki.syktsu.ru/pipermail/cdev/2010-March/000016.html Да, я подозреваю что у Алексея не gcc компилятор ))) Видимо C++ какой-то (не GNU) пользует судя по характеру кода. -- Г.А. From lenad89 на list.ru Wed Mar 31 21:35:37 2010 From: lenad89 на list.ru (=?koi8-r?Q?=EC=C5=CE=C1_=E4=CF=D7=D6=CB=CF?=) Date: Wed, 31 Mar 2010 20:35:37 +0400 Subject: [cdev] =?koi8-r?b?+sHEwd7BXzYuIMfSIDEzNQ==?= In-Reply-To: <4BB376D1.3040503@komitex.ru> References: <4BB376D1.3040503@komitex.ru> Message-ID: free(queue)- не хватает в обработке ошибки если память не получили, когда hp == NULL (в предыдущем сообщении моем). From sitkarev на komitex.ru Wed Mar 31 22:33:57 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Wed, 31 Mar 2010 21:33:57 +0400 Subject: [cdev] =?utf-8?b?0JfQsNC00LDRh9CwXzYuINCz0YAgMTM1?= In-Reply-To: References: <4BB376D1.3040503@komitex.ru> Message-ID: <4BB38785.4020101@komitex.ru> Вы не очень понятно пишите, вам надо указывать функцию и говорить что и где. Иначе вас не понять. И потом вы говорили про remove а там действительно не надо никаких free(2) у Алексея там верно. В prioq_new() у него с памятью не верно сделано, он исправит. -- Г.А. Лена Довжко пишет: > free(queue)- не хватает в обработке ошибки если память не получили, когда hp == NULL (в предыдущем сообщении моем). > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev