From sitkarev на komitex.ru Thu Apr 1 00:15:07 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Wed, 31 Mar 2010 23:15:07 +0400 Subject: [cdev] =?utf-8?b?0JfQsNC00LDRh9CwXzYuINCz0YAgMTM1?= In-Reply-To: References: <4BB376D1.3040503@komitex.ru> Message-ID: <4BB39F3B.8090802@komitex.ru> Хорошо что вы начали комментировать. Вот только нет уверенности пока что человек, представленный в списке адресом lena89 на list.ru и есть Лена+Маргарита. Я думаю чтобы вам понятнее была задача у Лёши - пошлю ка я повторно псевдокод, который он делает. Сначала была задача ему сделать по API очередь с приоритетами, но это показалось несколько сложным для начинающего, поэтому я придумал свой собственный стиль псевдокода (эдакая смесь Си и Pascal) и сделал в нём реализацию. А Алексею оставалось её перенести на наш язык, в данном случае Си (с учётом структур данных которые мы вывели). -- Г.А. Лена Довжко пишет: > free(queue)- не хватает в обработке ошибки если память не получили, когда hp == NULL (в предыдущем сообщении моем). > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev ----------- следущая часть ----------- An embedded and charset-unspecified text was scrubbed... Name: pseudoqueue.txt URL: ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: prioq.h Type: text/x-chdr Size: 885 bytes Desc: отсутствует URL: From alexeypetrunev на gmail.com Thu Apr 1 02:00:13 2010 From: alexeypetrunev на gmail.com (=?KOI8-R?B?4czFy9PFyiDwxdTS1c6j1w==?=) Date: Thu, 1 Apr 2010 01:00:13 +0400 Subject: [cdev] =?koi8-r?b?+sHEwd7BXzYuIMfSIDEzNQ==?= Message-ID: Здравствуйте. Постарался исправить все, что надо исправить. Написал функцию prioq_free, конечно  я не уверен что она именно так должна выглядеть. ----------- следущая часть ----------- An embedded and charset-unspecified text was scrubbed... Name: MyQueue.txt URL: From lenad89 на list.ru Thu Apr 1 02:20:18 2010 From: lenad89 на list.ru (lenad89) Date: Thu, 01 Apr 2010 01:20:18 +0400 Subject: [cdev] =?koi8-r?b?+sHEwd7BXzYuIMfSIDEzNQ==?= In-Reply-To: References: Message-ID: <1270070418.8198.5.camel@jam-top> ошибка сигментации. может не while (i <= queue->used) { ptr = (struct user_data*)queue->heap[i]; free(ptr); i++; } а просто free(queue->heap); посмотри как ты ее выделяешь, вроде через realloc? man malloc(3),realloc(3),free(3). все есть на opennet.ru Поставь линукс на виртуальную машину:) В Чтв, 01/04/2010 в 01:00 +0400, Алексей Петрунёв пишет: > Здравствуйте. Постарался исправить все, что надо исправить. Написал > функцию prioq_free, конечно я не уверен что она именно так должна > выглядеть. > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From sitkarev на komitex.ru Thu Apr 1 02:27:40 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Thu, 01 Apr 2010 01:27:40 +0400 Subject: [cdev] =?utf-8?b?0JfQsNC00LDRh9CwXzYuINCz0YAgMTM1?= In-Reply-To: <1270070418.8198.5.camel@jam-top> References: <1270070418.8198.5.camel@jam-top> Message-ID: <4BB3BE4C.3070309@komitex.ru> Молодой человек, вы бы подписались под своим почтовым адресом. А то как-то Леной вас назвать язык не поворачивается. Я советую быть очень аккуратным в советах и смысл нашей рассылки в общем не в том чтобы у человека код заработал, а в том чтоб он понял _почему_ у него не работает и почему делать надо так а не по-другому. Мы здесь стараемся не кидаться друг в друга неработающими исходниками а научиться. Поэтому ответы хотелось бы видеть развёрнутые, с чувством, толком и расстановкой. Есть ошибки пока, но мы их найдём и я прокомментирую позже. -- Г.А. lenad89 пишет: > ошибка сигментации. > может не while (i <= queue->used) { > ptr = (struct user_data*)queue->heap[i]; > free(ptr); > i++; > } > а просто > free(queue->heap); > посмотри как ты ее выделяешь, вроде через realloc? > man malloc(3),realloc(3),free(3). все есть на opennet.ru > Поставь линукс на виртуальную машину:) > > В Чтв, 01/04/2010 в 01:00 +0400, Алексей Петрунёв пишет: >> Здравствуйте. Постарался исправить все, что надо исправить. Написал >> функцию prioq_free, конечно я не уверен что она именно так должна >> выглядеть. From alexeypetrunev на gmail.com Thu Apr 1 05:12:11 2010 From: alexeypetrunev на gmail.com (=?KOI8-R?B?4czFy9PFyiDwxdTS1c6j1w==?=) Date: Thu, 1 Apr 2010 04:12:11 +0400 Subject: [cdev] =?koi8-r?b?+sHEwd7BXzYuIMfSIDEzNQ==?= Message-ID: Я почему-то решил, решил что область памяти где находятся переменные типа struct user_data тоже можно освободить. В  функции prioq_free просто убрал цикл while. Так что наверно достаточно написать free(queue) ----------- следущая часть ----------- An embedded and charset-unspecified text was scrubbed... Name: MyQueue.txt URL: From sitkarev на komitex.ru Thu Apr 1 05:24:00 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Thu, 01 Apr 2010 04:24:00 +0400 Subject: [cdev] =?utf-8?b?0LjRgdC/0YDQsNCy0LvQtdC90LjQtSBmaW5k?= In-Reply-To: References: <4BABA524.1090307@komitex.ru> Message-ID: <4BB3E7A0.5000806@komitex.ru> Вернёмся к find. Подход к решению задачи в find очень правильный. Заранее неизвестно, по каким комбинациям параметров пользователю захочется вести поиск, поэтому даём ему возможность задавать любые комбинации, а для этого нужен некий очень простой язык. Этот язык стандартизован и мы пользуемся спецификацией Open Group. В find у нас есть несколько выражений, перечислю их в порядке убывания приоритетов, из primaries можно составлять комбинации: (expr) - выражение в скобках !expr - отрицание выражения expr -a expr - логическое AND expr -o expr - логическое OR Можно записать в формальном синтаксисе: primary_or_expr = primary | '(' or_expr ')' neg_or_expr = '!' neg_or_expr | primary_or_expr and_expr = and_expr '-a' neg_or_expr | neg_or_expr or_expr = or_expr '-o' and_expr | and_expr cmd = NULL | or_expr Стартовый символ грамматики тогда будет cmd. Можно объяснить всё несколько проще, например так. У нас есть два оператора логических, OR и AND. Приоритет у AND выше поэтому: aaa -a bbb -a ccc -o xxx -a yyy -a zzz -o ppp -a qqq -a rrr Иначе можно написать (используя операторы Си) как: (aaa && bbb && ccc) || (xxx && yyy && zzz) || (ppp -a -qqq -a rrr) Т.е. пока нам после выражения встречается оператор AND (-a) - все эти выражения относятся к одной группе выражений и их надо вычислять, одно за другим, пока хотя бы одно не станет ложным или они все не будут вычислены. Если хотя бы одно стало ложным, значит результат вычисления этой группы - ложь и дальше его уже можно и не вычислять. Тогда получается что оператор OR собирает группы. Выполнить группу 1 ИЛИ если результат вычисления группы 1 ложь, выполнить группу 2 ИЛИ если разультат вычисления группы 2 ложь, выполнить группу 3 ИЛИ ... У нас есть ещё выражение в скобках, приоритет у которого выше чем у операторов AND и OR. Но мы можем воспользоваться рекурсией здесь, и сказать что если мы увидели выражение в скобках, то мы выполняем нашу процедуру для групп рекурсивно для всего выражения в скобках. Если там ещё раз встретятся скобки, мы ещё раз рекурсивно в них "зайдём" и т.д. Только надо убедиться, что закрывающие скобки для нашего уровня рекурсии всегда есть и мы их видим в выражении. Также заметим, что мы можем сказать что в принципе OR у нас всегда присутствует, но в нём может быть только одна группа (т.е. присутствует только левый операнд). Что касается выражения отрицания, то нам достаточно хранить просто один флаг, каждый раз когда мы встречаем оператор '!', изменять его значение на противоположное. Потом этот флаг будет сохраняться в описании команды. Как всё это представить в виде структур данных? Я думаю что было бы хорошо всё выражение, которое надо "посчитать", представить в виде групп команд и собственно команд. Каждая группа команд это часть выражения OR (или левая сторона или правая) а команда часть выражения AND (или левая или правая сторона). Общее представление структуры команды - в ней три поля, ссылка на следующую команду в группе, указатель на функцию-обработчик и поле отрицания результата команды (оно или истина или ложь). Далее для каждого primary у нас есть структура, которая включает в себя поля команды и добавляет туда ещё свои специфичные. Так как у нас функция-обработчик ждёт указатель на struct command а у нас во всех структурах *_primary поле cmd идёт первым, мы можем передавать ей указатель на структуру *_primary - у них один и тот же адрес с cmd. Поле cmd первое в структуре поэтому адреса одинаковые. Чтобы Си не ругался, сделаем преобразование явное. int find_command(struct command *cmd) { int res = 0; struct find_primary *prm; prm = (struct find_primary *) cmd; ... return res; } /* Command group */ struct cgroup { /* pointer to next group in OR list */ struct cgroup *next; /* struct command *grp[ncmds] */ struct command **grp; /* number of commands in the group */ size_t ncmds; /* number of pointers in grp */ size_t nalloc; }; struct command { /* pointer to next command in the group */ struct command *next; /* pointer to command */ int (fn)(struct command *cmd); /* shoud we negate the command? */ int negate; }; struct name_primary { struct command cmd; char *pattern; }; struct perm_primary { struct command cmd; mode_t mode; int exact_match; }; struct type_primary { struct command cmd; enum { F_CHAR = 'c', F_BLOCK = 'b', F_DIR = 'd', F_LINK = 'l', F_FIFO = 'f', F_SOCK = 's' } type; }; struct size_primary { struct command cmd; /* 0, 1, or -1 is no flag, '+' or '-' respectively */ int sign; /* file size */ size_t size; }; Для скобочного выражения нам надо делать рекурсию, тогда получается что выражение в скобках это тоже команда, но у неё будет свой список из групп команд а те в свою очередь тоже могут быть скобочными выражениями и могут иметь свои такие же и т.д. struct type_quoted { /* command data */ struct command cmd; /* list of command groups */ struct cgroup *list; }; Для вычисления выражения пишем функцию, которая будет возвращать целое (истина/ложь) и получает всего один аргумент, это список из групп команд. int eval_expr(struct cgroup *grp); На первый взгляд так. Все алгоритмы дальше встают на свои места. В теории, можно было бы и группы команд сделать в массиве указателей а не списком, можно было и команды сделать не в массиве указаталей а списком, всё это вариации "на тему" но сути не меняет (меняется скорость при большом количестве выражений). Дальше можно "усилить" задачу, и делать некоторую оптимизацию, потому что некоторые primaries вычисляются быстрее, некоторые медленнее и т.д. Простор для творчества большой. Т.к. уже 4 утра и очень хочется спать, ищите у меня ошибки. -- Г.А. Лена Довжко пишет: > Здравствуйте. > Вы хотели рассказать как реализовывать интерпретатор для find ?(тока без кода) > И куда лучше все записывать, чтобы потом проверять удобно было.( а то ведь от порядка скобок и смысл выражения зависит и много их может быть) > Может структуру какую, где будут указтель на функциию обработчик и параметры? А потом их вызывать в определенном порядке. > (Личное письмо, было отправлено случайно, использовался браузер, а не почтовый клиент, и в поле кому был не тот адрес) > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From sitkarev на komitex.ru Thu Apr 1 05:26:07 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Thu, 01 Apr 2010 04:26:07 +0400 Subject: [cdev] =?utf-8?b?0JfQsNC00LDRh9CwXzYuINCz0YAgMTM1?= In-Reply-To: References: Message-ID: <4BB3E81F.2010202@komitex.ru> Алексей Петрунёв пишет: > Я почему-то решил, решил что область памяти где находятся переменные > типа struct user_data тоже можно освободить. В функции prioq_free > просто убрал цикл while. Так что наверно достаточно написать > free(queue) Лёша, тебе нельзя их освобождать эти структуры потому что ими пользователь заведует. И ты не знаешь наверняка, хочет ли он их освобождать после уничтожения очереди или нет. Кроме того, не известно, были ли они динамически выделены malloc(3)/realloc(3) или же определены статически. В функции prioq_free() ты освобождаешь только известные тебе ресурсы - память для кучи и память структуры очереди. Я утром проверю ошибки, сегодня уже поздно. > > ------------------------------------------------------------------------ > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From alexeypetrunev на gmail.com Thu Apr 1 05:47:44 2010 From: alexeypetrunev на gmail.com (=?KOI8-R?B?4czFy9PFyiDwxdTS1c6j1w==?=) Date: Thu, 1 Apr 2010 04:47:44 +0400 Subject: [cdev] =?koi8-r?b?5MHKxNbF09Qg09DJ08vBINLB09PZzMvJIGNkZXY7INTP?= =?koi8-r?b?zSAzLCDX2dDV08sgMQ==?= In-Reply-To: References: Message-ID: free(queue->heap) очистит массив, а другие поля: used, size будут иметь прежние значения. Нам нужно вообще очередь очистить, то есть ее не должно существовать. > > Message: 4 > Date: Thu, 01 Apr 2010 01:20:18 +0400 > From: lenad89 > Subject: Re: [cdev] Задача_6. гр 135 > To: Young C/UNIX developers > Message-ID: <1270070418.8198.5.camel на jam-top> > Content-Type: text/plain; charset="UTF-8" > > ошибка сигментации. > может не   while (i <= queue->used) { >                    ptr = (struct user_data*)queue->heap[i]; >                        free(ptr); >                        i++; >            } >        а просто >                free(queue->heap); > посмотри как ты ее выделяешь, вроде через realloc? > man malloc(3),realloc(3),free(3). все есть на opennet.ru > Поставь линукс на виртуальную машину:) From lenad89 на list.ru Thu Apr 1 12:32:36 2010 From: lenad89 на list.ru (lenad89) Date: Thu, 01 Apr 2010 11:32:36 +0400 Subject: [cdev] =?koi8-r?b?5MHKxNbF09Qg09DJ08vBINLB09PZzMvJIGNkZXY7INTP?= =?koi8-r?b?zSAzLCDX2dDV08sgMQ==?= In-Reply-To: References: Message-ID: <1270107156.5230.45.camel@jam-top> Ну так и нужно освободить массив указателей. Если ты сначала удалишь queue, то потеряешь указатель на этот массив. Ты выделяешь память только два раза : 1) Под хранение структуры prioq; 2) Под массив указатлей (в structprioq_head **heap) (потом увеличиваешь этот массив если нужно); значит тебе и нужно освободить сначала массив указателей, а потом уже и структуру. поля used, size будут только до вызова free(queue), ты же выделил память под хранение указателя и эти поля. Кстати там все равно косяк какой-то с памятью :) и еще вот (это скорее всего опечатка): memset(queue->heap + OLD_SIZE(queue), 0, NEW_SIZE(queue) - OLD_SIZE(queue)); queue->size += GROW_SIZE; queue->heap = tmp; - не верно, нужно поставить queue->heap = tmp перед memset ; У тебя указатель queue->heap указывает на старый блок памяти, а новый лежит по указателю tmp. Т.е. ты чистишь старую память(за пределами этой памяти), в не новую. Нужно поместить queue->heap адрес нового участка и потом уже его использовать. p.s: ты залез не в ту тему :) From sitkarev на komitex.ru Thu Apr 1 15:01:16 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Thu, 01 Apr 2010 14:01:16 +0400 Subject: [cdev] =?utf-8?b?0JTQsNC50LTQttC10YHRgiDRgdC/0LjRgdC60LAg0YDQsNGB?= =?utf-8?b?0YHRi9C70LrQuCBjZGV2OyDRgtC+0LwgMywg0LLRi9C/0YPRgdC6IDE=?= In-Reply-To: <1270107156.5230.45.camel@jam-top> References: <1270107156.5230.45.camel@jam-top> Message-ID: <4BB46EEC.9070105@komitex.ru> lenad89 пишет: > и еще вот (это скорее всего опечатка): > > memset(queue->heap + OLD_SIZE(queue), 0, > NEW_SIZE(queue) - OLD_SIZE(queue)); > queue->size += GROW_SIZE; > queue->heap = tmp; > - не верно, нужно поставить queue->heap = tmp перед memset ; > > У тебя указатель queue->heap указывает на старый блок памяти, а новый > лежит по указателю tmp. Т.е. ты чистишь старую память(за пределами этой > памяти), в не новую. Нужно поместить queue->heap адрес нового участка и > потом уже его использовать. Это моя опечатка была и я посылал к ней исправление в виде патча. Почему то Алексей не заметил её (или забыл). http://wiki.syktsu.ru/pipermail/cdev/2010-March/000016.html http://wiki.syktsu.ru/pipermail/cdev/2010-March/000017.html И ещё. У Лёши в API (объявления даны в queue.h) функция prioq_free() была объявлена так: void prioq_free(strict prioq **queue) И ей передаётся указатель на указатель на структуру очереди. Почему именно указатель на указатель, с какой целью? Только с одной - чтобы функция занулила сам указатель и им никто не смог воспользоваться (ошибочно) после освобождения. Как минимум, надо проверить сначала валидность **queue потом *queue и лишь потом высвободить ресурсы. А затем и занулить сам *queue. Если бы мы передавали просто *queue, то мы конечно можем сделать так: queue = NULL; Но т.к. в функцию передаются копии значений (в данном случае queue будет локальной переменной в которой хранится адрес структуры очереди) то нужного эффекта мы не получим, потому что нам нужно занулить именно указатель которым пользуется пользователь. Поясню на примере: Если у нас prioq_free работает с указателем, то все изменения этого указателя внутри неё - локальны. void prioq_free(struct prioq *queue); struct prioq *queue; ... prioq_free(queue); /* Указатель queue никогда не изменится после вызова prioq_free */ А здесь мы передадим сам адрес где хранится указатель, тогда мы его сможем изменить внутри prioq_free. void prioq_free(struct prioq **queue); struct prioq *queue; ... prioq_free(&queue); /* Здесь prioq_free может изменить значение queue */ -- Г.А. From alexeypetrunev на gmail.com Thu Apr 1 19:29:48 2010 From: alexeypetrunev на gmail.com (=?KOI8-R?B?4czFy9PFyiDwxdTS1c6j1w==?=) Date: Thu, 1 Apr 2010 18:29:48 +0400 Subject: [cdev] =?koi8-r?b?+sHEwd7BXzYuIMfSIDEzNQ==?= Message-ID: void prioq_free(struct prioq* queue) { unsigned int i = 0; if (queue == NULL) { fprintf(stderr, "prioq_free:The queue not exists\n"); } else { free(queue->heap); free(queue); fprintf(stderr,"prioq_free: the queue is free\n"); } } Так что-ли? From sitkarev на komitex.ru Thu Apr 1 20:56:10 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Thu, 01 Apr 2010 19:56:10 +0400 Subject: [cdev] =?utf-8?b?0JfQsNC00LDRh9CwXzYuINCz0YAgMTM1?= In-Reply-To: References: Message-ID: <4BB4C21A.20600@komitex.ru> Лёша, я думаю что тебе надо почитать одну книгу, она называется "Практика программирования" автор Р. Пайк и Б. Керниган. У меня она есть на английском, но было как минимум два издания на русском языке с хорошим переводом, там на обложке такса с указкой нарисована. Эта книга тебе нужна для того чтобы ты смог освоить идиомы языков программирования потому что в целом тебе понятны конструкции if, else, for и т.д. но как ими хорошо пользоваться не очень понятно пока. Книга написана простым, понятным языком, снабжена массой примеров, читается очень легко (один из авторов книги - создатель языка Си). К слову, в книге не только про язык Си речь идёт, и Java и ещё кое что. И полезно её прочитать всем, это классическая литература. void prioq_free(struct prioq *queue) { return_if_vail(queue != NULL); free(queue->heap); free(queue); } Или лучше в том варианте как было у тебя в API: void prioq_free(struct prioq **queue) { return_if_fail(queue != NULL); return_if_fail(*queue != NULL); free((*queue)->heap); free(*queue); (*queue) = NULL; } -- Г.А. Алексей Петрунёв пишет: > void > prioq_free(struct prioq* queue) > { > unsigned int i = 0; > if (queue == NULL) { > fprintf(stderr, "prioq_free:The queue not exists\n"); > } > else { > free(queue->heap); > free(queue); > fprintf(stderr,"prioq_free: the queue is free\n"); > } > > } > > Так что-ли? > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From alexeypetrunev на gmail.com Fri Apr 2 02:40:47 2010 From: alexeypetrunev на gmail.com (=?KOI8-R?B?4czFy9PFyiDwxdTS1c6j1w==?=) Date: Fri, 2 Apr 2010 01:40:47 +0400 Subject: [cdev] =?koi8-r?b?+sHEwd7BXzYuIMfSIDEzNQ==?= Message-ID: struct prioq_head * prioq_peek(struct prioq*queue) { struct user_data* ptr; struct prioq_head* head = queue->heap[0]; if (queue == NULL) { fprintf(stderr, "prioq_peek: Can't peek head from queue\n"); return NULL; } if (queue != NULL) { if (queue->heap == NULL) { fprintf(stderr, "prioq_peek: Can't peek head from queue\n"); return NULL; } if ((queue->heap != NULL) && (head != NULL)) { ptr = (struct user_data*)head; fprintf(stderr,"prioq_peek:head of queue\n data:%i\n index:%d\n",ptr->data,0); } else { fprintf(stderr, "prioq_peek: Can't peek head from queue\n"); return NULL; } } return head; } Я опять тут что-то написал. Верхушка очереди это же всегда элемент массива heap с индексом 0? From alexeypetrunev на gmail.com Fri Apr 2 06:03:25 2010 From: alexeypetrunev на gmail.com (=?KOI8-R?B?4czFy9PFyiDwxdTS1c6j1w==?=) Date: Fri, 2 Apr 2010 05:03:25 +0400 Subject: [cdev] =?koi8-r?b?+sHEwd7BXzYuIMfSIDEzNQ==?= Message-ID: Написал prioq_get, посмотрите. ----------- следущая часть ----------- #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{ unsigned 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; queue = (struct prioq*)malloc(sizeof(struct prioq)); if (queue == NULL) { fprintf(stderr, "prioq_new: can't allocate queue\n"); return NULL; } memset(queue, 0, sizeof(*queue)); queue->heap = (struct prioq_head**)malloc(sizeof(struct prioq_head *) * INIT_SIZE); if (queue->heap == NULL) { fprintf(stderr, "prioq_new: can't allocate heap\n"); free(queue); return NULL; } memset(queue->heap, 0, sizeof(struct prioq_head *) * INIT_SIZE); queue->size = INIT_SIZE; queue->used = 0; queue->compare = ((compare != NULL) ? 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"); return NULL; } 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; } queue->heap = tmp; memset(queue->heap + OLD_SIZE(queue), 0, NEW_SIZE(queue) - OLD_SIZE(queue)); queue->size += GROW_SIZE; } 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) { unsigned 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+1]) < 0) { largest++; } if (queue-> compare(queue->heap[index], queue->heap[largest])<0) { tmp = queue->heap[largest]; queue->heap[largest] = queue->heap[index]; queue->heap[largest]->index = index; queue->heap[index] = tmp; queue->heap[index]->index = largest; } 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[largest]->index = index; queue->heap[index] = tmp; queue->heap[index]->index = largest; } return 1; } /*------------------------------------------------*/ void prioq_remove(struct prioq *queue, struct prioq_head *hp) { if (hp->index > queue->used) fprintf(stderr,"prioq_remove: index out of range\n"); int index = hp->index; while (index > 0){ queue->heap[index] = queue->heap[PARENT(index)]; queue->heap[index]->index = PARENT(index); index = PARENT(index); } queue->used--; int used = queue->used; queue->heap[0] = queue->heap[used]; queue->heap[0]->index = used; prioq_heapify(queue); } void prioq_free(struct prioq* queue) { if (queue == NULL) { fprintf(stderr, "prioq_free:The queue not exists\n"); } else { free(queue->heap); free(queue); fprintf(stderr,"prioq_free: the queue is free\n"); } } struct prioq_head * prioq_peek(struct prioq*queue) { struct user_data* ptr; struct prioq_head* head = queue->heap[0]; if (queue == NULL) { fprintf(stderr, "prioq_peek: Can't peek head from queue\n"); return NULL; } if (queue != NULL) { if (queue->heap == NULL) { fprintf(stderr, "prioq_peek: Can't peek head from queue\n"); return NULL; } if ((queue->heap != NULL) && (head != NULL)) { ptr = (struct user_data*)head; fprintf(stderr,"prioq_peek:head of queue\n data:%i\n index:%d\n",ptr->data,0); } else { fprintf(stderr, "prioq_peek: Can't peek head from queue\n"); return NULL; } } return head; } struct prioq_head * prioq_get(struct prioq*queue) { struct prioq_head* head = queue->heap[0]; struct user_data* ptr; unsigned int used; if (queue == NULL) { fprintf(stderr, "prioq_get: Can't extract head from queue \n"); return NULL; } if ((queue != NULL) && (head != NULL)) { ptr = (struct user_data*)head; fprintf(stderr, "prioq_get: the head of queue\n %d-data\n %d-index", ptr->data,0); used = queue->used; if (used > 1) { queue->heap[0] = queue->heap[used]; queue->heap[0]->index = used; queue->used--; free(queue->heap[used]); prioq_heapify(queue); } else if (used == 1) { free(queue->heap[0]); queue->used--; } else return NULL; } return head; } int main(void){ struct prioq *q=prioq_new(compare); struct user_data a,b; struct prioq_head *p,*s; //struct user_data* dat; a.data = 0; b.data = 5; p = &a.head; s = &b.head; prioq_put(q,p); prioq_put(q,s); prioq_peek(q); prioq_get(q); return q->used; } From lenad89 на list.ru Fri Apr 2 15:31:21 2010 From: lenad89 на list.ru (lenad89) Date: Fri, 02 Apr 2010 14:31:21 +0400 Subject: [cdev] =?koi8-r?b?+sHEwd7BXzYuIMfSIDEzNQ==?= In-Reply-To: References: Message-ID: <1270204281.8667.141.camel@jam-top> В prioq_peek и prioq_get одна и та же ошибка : ты дважды разыменовываешь указатели(сначала один потом, второй) не проверив их на NULL head = queue->heap[0];/* вдруг queue == NULL или queue->heap == NULL*/ и зачем if (queue == NULL) { ... } if (queue != NULL) { ? } тогда уж if (queue == NULL) { ... } else { ? } ??? free(queue->heap[used]); ??? free(queue->heap[0]); опять пытаешься в prioq_get освободить память которая пренадлежит пользователю(причем статическую),тут нужно скорее всего просто уменьшить used на 1 и queue->heap[used] = NULL (важен еще порядок этих операций), при следующем вызове prique_put, туда поместится новый указатель. при used == 1 тоже самое. кстати есть такой баг(может быть только у меня, но такое было на двух разных компьютерах), если добавить еще user_data и поместить его в очередь (prioq_put), то программа валится с сообщением (*** glibc detected *** ./que: double free or corruption (out): 0x09431020 *** ) ./que -имя программы. Но если увеличить INIT_SIZE , скажем на 1, то ошибки нет и программа работает нормально. Если закомментировать free(queue->heap),а INIT_SIZE оставить прежним, то тоже завершается нормально, но с утечкой памяти. Попробуй добавить еще пару записей и посмотреть как она работает. p.s. : читай сообщения Григория Александровича и программу посмотри, которую он тебе прислал. From sitkarev на komitex.ru Mon Apr 5 22:25:40 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Mon, 05 Apr 2010 21:25:40 +0400 Subject: [cdev] =?utf-8?b?0JfQsNC00LDRh9CwXzYuINCz0YAgMTM1?= In-Reply-To: References: Message-ID: <4BBA1D14.30401@komitex.ru> Лёша, в программе есть ошибки. Функция prioq_get выглядит более чем странно. 1. Пользователь передаёт нам указатель на queue. Мы решили следовать хорошему правилу - проверять указатели на NULL, чтобы отлавливать возможные ошибки пользователя при программировании (забыл что высвободил аргумент и он теперь NULL например). Нулевой указатель разыменовывать нельзя, это ошибка и программа завершится аварийно. Попробуй сделать вот так: ((struct prioq *)(NULL))->heap и немедленно прилетит сигнал SIGSEGV и программа завершится. Ты до того как проверяешь queue на NULL уже разыменовываешь этот (потенциально нулевой) указатель ещё в определении локальных переменных: struct prioq_head * prioq_get(struct prioq*queue) { struct prioq_head* head = queue->heap[0]; struct user_data* ptr; Это ошибка, так делать нельзя. Поэтому head ты можешь присваивать значение только после того как проверил queue на NULL. Далее, очень сложно сделано, Лёша, зачем? Ведь после того как ты проверил queue на NULL, дальше этого делать не надо, тебе известно точно что он уже не нулевой указатель. Поэтому такая конструкция избытона: if ((queue != NULL) && (head != NULL)) Она не нужна. 2. Ты не корректно реализовал то что было в псевдокоде, посмотри ещё раз. Обрати внимание, что прежде чем индексироваться в queue->heap мы уменьшили used на 1. У тебя декремент идёт после! Поэтому программа сваливается (в лучшем случае, потому что там в массиве указателей они NULL) а в худшем будешь искать почему "не тот" элемент получили. e = queue[0]; queue.used = queue.used - 1; queue[0] = queue[queue.used]; prioq_heapify(queue); Здесь сначала уменьшили used на 1 и потом индексируемся. Ведь последний элемент имеет индекс queue.used-1, так? queue->heap[0] = queue->heap[used]; <- лезем в чужую ячейку queue->heap[0]->index = used; queue->used--; <- и только теперь уменьшили Кроме того, зачем ты освобождаешь там указатель с польз. данными?? Этого делать не надо, потому что это пользователь только знает, надо их освобождать или нет. Твоя очередь не размещала их в памяти, не ей и их освобождать. Ещё раз пересмотри пожалуйста алгоритм извлечения элемента из очереди. Он же очень простой, но у тебя он катастрофически сложен! Что-то с оформлением у нас безобразие, всё уплывает, читать тяжеловато, если честно. Посмотри пожалуйста LKCS, внимательно прочитай и далее придерживайся этого стиля при программировании на Си таких вещей, хотя повторюсь что это не догма. И много предупреждений выдаёт gcc, надо править всё. 3. Если тебе что-то не понятно, как работает на Си, задай вопросы. Потому что просто писать что что тебя просят это копировать форму, но не содержание, т.е. тебе будет понятно КАК но ЗАЧЕМ - нет. Надо это исправить, потому что задача здесь именно понять ЗАЧЕМ. -- Г.А. Алексей Петрунёв пишет: > Написал prioq_get, посмотрите. > > > ------------------------------------------------------------------------ > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From alexeypetrunev на gmail.com Wed Apr 7 03:02:47 2010 From: alexeypetrunev на gmail.com (=?KOI8-R?B?4czFy9PFyiDwxdTS1c6j1w==?=) Date: Wed, 7 Apr 2010 02:02:47 +0400 Subject: [cdev] =?koi8-r?b?5MHKxNbF09Qg09DJ08vBINLB09PZzMvJIGNkZXY7INTP?= =?koi8-r?b?zSAzLCDX2dDV08sgNQ==?= In-Reply-To: References: Message-ID: Я просто потерял листок с распечаткой псевдокода где находилась ф-я prioq_get, так что сам немного лишнего написал. Вот, исправил: struct prioq_head * prioq_get(struct prioq*queue) { struct prioq_head* head; struct user_data* ptr; unsigned int used; if (queue->used == 0) { fprintf(stderr, "prioq_get: Can't extract head from queue \n"); return NULL; } head = queue->heap[0]; ptr = (struct user_data*)head; printf("data %d\n index %d\n",ptr->data,0); used = queue->used - 1; queue->heap[0] = queue->heap[used]; queue->heap[0]->index = used; queue->used--; prioq_heapify(queue); queue->heap[used] = NULL; return head; } А почему не обуляется (в псевдокоде) указатель queue->heap[used]?  Мы его присваиваем  queue->heap[0], а потом сортируем в prioq_heapify массив состоящий уже из used-1 элементов. Но queue->heap[used] так и висит в памяти, когда массив уже меньше на 1. 6 апреля 2010 г. 12:00 пользователь   написал: > Сообщения, предназначенные для списка рассылки cdev, необходимо > отправлять по адресу >        cdev на wiki.syktsu.ru > > Для изменения параметров подписки вы можеже использовать веб-страницу >        http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev > > Для получения информации о том, как пользовать почтовым интерфейсом, > отправьте письмо, в теле или теме которого будет слово 'help', по > адресу: >        cdev-request на wiki.syktsu.ru > > Адрес человека, ответственного за этот список рассылки: >        cdev-owner на wiki.syktsu.ru > > При ответе, пожалуйста, измение тему письма так, чтобы она была более > содержательной чем "Re: Содержание дайджеста списка рассылки cdev..." > > > В этом номере: > >   1. Re: Задача_6. гр 135 (Grigoriy A. Sitkarev) > > > ---------------------------------------------------------------------- > > Message: 1 > Date: Mon, 05 Apr 2010 21:25:40 +0400 > From: "Grigoriy A. Sitkarev" > Subject: Re: [cdev] Задача_6. гр 135 > To: Young C/UNIX developers > Message-ID: <4BBA1D14.30401 на komitex.ru> > Content-Type: text/plain; charset=UTF-8; format=flowed > > Лёша, в программе есть ошибки. > > Функция prioq_get выглядит более чем странно. > > 1. Пользователь передаёт нам указатель на queue. Мы решили следовать > хорошему правилу - проверять указатели на NULL, чтобы отлавливать > возможные ошибки пользователя при программировании (забыл что высвободил > аргумент и он теперь NULL например). Нулевой указатель разыменовывать > нельзя, это ошибка и программа завершится аварийно. > > Попробуй сделать вот так: > > ((struct prioq *)(NULL))->heap > > и немедленно прилетит сигнал SIGSEGV и программа завершится. > > Ты до того как проверяешь queue на NULL уже разыменовываешь этот > (потенциально нулевой) указатель ещё в определении локальных переменных: > > struct prioq_head * > prioq_get(struct prioq*queue) > { >        struct prioq_head* head = queue->heap[0]; >        struct user_data* ptr; > > > Это ошибка, так делать нельзя. Поэтому head ты можешь присваивать > значение только после того как проверил queue на NULL. > > Далее, очень сложно сделано, Лёша, зачем? Ведь после того как ты > проверил queue на NULL, дальше этого делать не надо, тебе известно точно > что он уже не нулевой указатель. Поэтому такая конструкция избытона: > > if ((queue != NULL) && (head != NULL)) > > Она не нужна. > > 2. Ты не корректно реализовал то что было в псевдокоде, посмотри ещё > раз. Обрати внимание, что прежде чем индексироваться в queue->heap мы > уменьшили used на 1. У тебя декремент идёт после! Поэтому программа > сваливается (в лучшем случае, потому что там в массиве указателей они > NULL) а в худшем будешь искать почему "не тот" элемент получили. > > e = queue[0]; > queue.used = queue.used - 1; > queue[0] = queue[queue.used]; > > prioq_heapify(queue); > > Здесь сначала  уменьшили used на 1 и потом индексируемся. Ведь последний > элемент имеет индекс queue.used-1, так? > > queue->heap[0] = queue->heap[used]; <- лезем в чужую ячейку > queue->heap[0]->index = used; > queue->used--;  <- и только теперь уменьшили > > Кроме того, зачем ты освобождаешь там указатель с польз. данными?? Этого > делать не надо, потому что это пользователь только знает, надо их > освобождать или нет. Твоя очередь не размещала их в памяти, не ей и их > освобождать. > > Ещё раз пересмотри пожалуйста алгоритм извлечения элемента из очереди. > Он же очень простой, но у тебя он катастрофически сложен! > > Что-то с оформлением у нас безобразие, всё уплывает, читать тяжеловато, > если честно. Посмотри пожалуйста LKCS, внимательно прочитай и далее > придерживайся этого стиля при программировании на Си таких вещей, хотя > повторюсь что это не догма. И много предупреждений выдаёт gcc, надо > править всё. > > 3. Если тебе что-то не понятно, как работает на Си, задай вопросы. > Потому что просто писать что что тебя просят это копировать форму, но не > содержание, т.е. тебе будет понятно КАК но ЗАЧЕМ - нет. Надо это > исправить, потому что задача здесь именно понять ЗАЧЕМ. > > -- > Г.А. > > Алексей Петрунёв пишет: >> Написал prioq_get, посмотрите. >> >> >> ------------------------------------------------------------------------ >> >> _______________________________________________ >> 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 > > > Конец Дайджест списка рассылки cdev; том 3, выпуск 5 > **************************************************** > From sitkarev на komitex.ru Wed Apr 7 04:35:01 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Wed, 07 Apr 2010 03:35:01 +0400 Subject: [cdev] =?utf-8?b?0JTQsNC50LTQttC10YHRgiDRgdC/0LjRgdC60LAg0YDQsNGB?= =?utf-8?b?0YHRi9C70LrQuCBjZGV2OyDRgtC+0LwgMywg0LLRi9C/0YPRgdC6IDU=?= In-Reply-To: References: Message-ID: <4BBBC525.6030502@komitex.ru> Алексей Петрунёв пишет: > Я просто потерял листок с распечаткой псевдокода где находилась ф-я > prioq_get, так что сам немного лишнего написал. Вот, исправил: Я кстати в список рассылки посылал псевдокод помоему. Если у тебя потерялась эта бумажка и ты её не откопаешь в архиве, ты мне скажи я её тебе перешлю, нет проблем. > > struct prioq_head * > prioq_get(struct prioq*queue) > { > struct prioq_head* head; > struct user_data* ptr; > unsigned int used; > > if (queue->used == 0) { > fprintf(stderr, > "prioq_get: Can't extract head from queue \n"); > return NULL; > } > head = queue->heap[0]; > ptr = (struct user_data*)head; > printf("data %d\n index %d\n",ptr->data,0); > used = queue->used - 1; > queue->heap[0] = queue->heap[used]; > queue->heap[0]->index = used; > queue->used--; > prioq_heapify(queue); > queue->heap[used] = NULL; > return head; > } Я честно говоря не совсем понимаю, разве можно быть настолько невнимательным, Лёша?? Прежде чем посылать программу, ты должен её обстоятельно проверить. Здесь у тебя ошибки, ты их не хочешь сам поискать? Я тебе советую такой подход, ты сидишь и обстоятельно размышляешь, что тебе нужно написать, чётко представляя образно действия над указателями, массивами и т.д. Можешь налить себе чай или кофе что ты любишь, чтобы в этот момент тебе было комфортно. После того как ты всё обстоятельно обдумал т.е. имеешь чёткое представление КАК ты будешь писать (можно сделать зарисовки или отметки в блокноте), ты садишься за программу. И просто переносишь то что было у тебя обдумано в голове на язык программирования. Вот смотри, даже псевдокод тебе не помог с твоим подходом (бери на вооружение мой). А ведь он верный. Это значит что имея псевдокод, вовсе не значит что не надо думать теперь. Потому что псевдокод это не конечная реализация пригодная к эксплуатации, а всего лишь средство лучше объяснить программисту как это работает. > А почему не обуляется (в псевдокоде) указатель queue->heap[used]? Мы > его присваиваем queue->heap[0], а потом сортируем в prioq_heapify > массив состоящий уже из used-1 элементов. Но queue->heap[used] так и > висит в памяти, когда массив уже меньше на 1. > Потому что если ты обратил внимание, то псевдокод вообще ничего не знает об указателях, на то он и псевдокод. Это кстати говоря и не обязательно делать, но для страховки можно бы было. В случае если алгоритмы реализованы неверно, это позволило бы поймать ошибку. У меня ощущение что ты не понимаешь как Си работает с памятью а точнее, как в Unix процесс работает и как он получает память. NULL это значение адреса, которое на самом деле определено где-то так: #define NULL (void*(0)) Когда ты чему-то присваиваешь NULL это значит что значение указателя станет нулевым, т.е. в ячейке памяти, где размещено целое значение указателя, будет записано число 0. Это дело программиста, кому и когда присваивать такое значение. К управлению памятью это никакого отношения не имеет. void *ptr; ptr = malloc(12); ptr = NULL; Здесь я теряю значение где malloc(3) разместил 12 байт, потому что записал в эту переменную, где хранился адрес, число 0. Поэтому если я сделаю после этого так: free(ptr); Это будет ошибка, потому что free(3) ждёт что я ему дам тот-же адрес, что вернул malloc(3). Зачем мы иногда записываем NULL? Часто чтобы обозначить что тот или иной указатель никуда не указывает, но это не обязательное правило. Есть случаи где это надо делать, есть где не надо (хотя и можно). Указатель это на самом деле целое число. Просто оно нас интересует не напрямую, как число, а как ссылка на ячейку памяти, где что-то нужное для нас хранится. Эта ячейка в свою очередь тоже может хранить чей-то адрес и т.д. до бесконечности (в теории). Хотя на практике указателей глубже чем char *** я никогда не встречал (это массив из массивов указателей на строки). В Си (т.е. в Unix) ты сам полностью управляешь в программе где кому и сколько памяти было выделено и сам же возвращаешь её назад, если это нужно. При завершении процесса естественно что все его ресурсы высвобождаются, но во время работы программы никто кроме тебя за ними следить не будет. Если что-то не ясно, как работает, напиши вопросы, я постараюсь ответить. >> При ответе, пожалуйста, измение тему письма так, чтобы она была более >> содержательной чем "Re: Содержание дайджеста списка рассылки cdev..." Робот дело говорит кстати! -- Г.А. From anyfrievdrus на mail.ru Wed Apr 7 22:08:06 2010 From: anyfrievdrus на mail.ru (=?koi8-r?Q?=E1=CE=C4=D2=C5=CA_=E1=CE=D5=C6=D2=C9=C5=D7?=) Date: Wed, 07 Apr 2010 21:08:06 +0400 Subject: [cdev] =?koi8-r?b?5MHKxNbF09Qg09DJ08vBINLB09PZzMvJIGNkZXY7INTP?= =?koi8-r?b?zSAzLCDX2dDV08sgNQ==?= In-Reply-To: <4BBBC525.6030502@komitex.ru> References: <4BBBC525.6030502@komitex.ru> Message-ID: Исправленный код ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: rkf45.c Type: application/octet-stream Size: 3273 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Wed Apr 7 22:53:05 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Wed, 07 Apr 2010 21:53:05 +0400 Subject: [cdev] =?utf-8?b?0JTQsNC50LTQttC10YHRgiDRgdC/0LjRgdC60LAg0YDQsNGB?= =?utf-8?b?0YHRi9C70LrQuCBjZGV2OyDRgtC+0LwgMywg0LLRi9C/0YPRgdC6IDU=?= In-Reply-To: References: <4BBBC525.6030502@komitex.ru> Message-ID: <4BBCC681.9000800@komitex.ru> Для тех кто читает список, я сообщу кое что. Андрей реализует метод Рунге-Кутты-Фельберга для численного решения дифференциальных уравнений n-го порядка в задаче при известных начальных условиях. Какие есть замечания по дизайну кода: 1. Ты правильно сделал что вынес рутину шага в отдельную функцию. Но мне кажется что можно было сделать лучше и пользоваться ей было бы удобнее. Обычно когда мы имеем дело с задачами нач. условий то мы ищём решение на известном участке t (от и до). Поэтому цикл ограничивается не количеством итераций, а конечным временем. Посмотри ещё раз портянку, (21). Там сразу разница между решениями 4-го и 5-го порядков. 2. Я понял почему мне твой алгоритм показался странным. Скорее всего он именно поэтому у нас и не работает, как надо. Потому что у тебя метод шагает дальше без повтора вычисления для того же t0 но с изменённым h. А он должен, если оказалось что h изменился, повторно для этого же t0 вычисляться заново. Смысл адаптивного метода в этом и заключается. Сделали предположение для шага, получили оценку ошибки, увеличили/уменьшили шаг в зависимости от оценки (если надо), повторили вычисления (если надо). Мне кажется тебе надо сделать редизайн step_rkf45. И ещё возьми на заметку, что у метода есть step (шаг) а есть stepper (шагальщик). Первый делает один шаг, а второй шагает от t до t_end. На мой взгляд коррекцию шага в случае если t+h > t_end должен делать stepper. Если что-то ещё вспомню, напишу. -- Г.А. Андрей Ануфриев пишет: > Исправленный код > > > ------------------------------------------------------------------------ > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From SabalovaMariya на yandex.ru Fri Apr 9 18:28:25 2010 From: SabalovaMariya на yandex.ru (=?koi8-r?B?88HCwczP18Eg7cHSydE=?=) Date: Fri, 09 Apr 2010 17:28:25 +0400 Subject: [cdev] =?koi8-r?b?1dTJzMnUwSBEYXRl?= Message-ID: <156741270819705@web106.yandex.ru> Здраствуйте возник вопрос при реализации утилиты не подскажете как можно узнать дату последнего изменения файла? ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: main.c Type: application/octet-stream Size: 1032 bytes Desc: отсутствует URL: From lenad89 на list.ru Fri Apr 9 19:23:38 2010 From: lenad89 на list.ru (=?koi8-r?Q?=EC=C5=CE=C1_=E4=CF=D7=D6=CB=CF?=) Date: Fri, 09 Apr 2010 18:23:38 +0400 Subject: [cdev] =?koi8-r?b?1dTJzMnUwSBEYXRl?= In-Reply-To: <156741270819705@web106.yandex.ru> References: <156741270819705@web106.yandex.ru> Message-ID: > не подскажете как можно узнать дату последнего изменения файла? узнать дату последнего изменения файла можно узнать из структуры stat. А именно поля: st_atime; /* время последнего доступа */ st_mtime; /* время последней модификации */ st_ctime; /* время последнего изменения */ думаю нужно последнее. чтобы получить эту структуру нужно воспользоваться системным вызовом stat(2) и передать ей адрес структуры и имя файла( или файловый дискриптор). В программах ps,find есть примеры работы с этой структурой (исходники есть в архиве рассылки). Более подробную информацию можно посмотреть в man 2 stat и на сайте opennet.ru(там выложены man-страницы). From alexeypetrunev на gmail.com Sat Apr 10 00:32:48 2010 From: alexeypetrunev на gmail.com (=?KOI8-R?B?4czFy9PFyiDwxdTS1c6j1w==?=) Date: Fri, 9 Apr 2010 23:32:48 +0400 Subject: [cdev] =?koi8-r?b?+sHEwd7BXzYuIMfSIDEzNQ==?= Message-ID: Здравствуйте. Исправил. Если есть ошибки- скажите=) Я еще подумаю. ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: MyQueue.cpp Type: application/octet-stream Size: 5861 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Sun Apr 11 20:27:12 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Sun, 11 Apr 2010 19:27:12 +0400 Subject: [cdev] =?utf-8?b?0YPRgtC40LvQuNGC0LAgRGF0ZQ==?= In-Reply-To: <156741270819705@web106.yandex.ru> References: <156741270819705@web106.yandex.ru> Message-ID: <4BC1EA50.8030607@komitex.ru> Вам уже ответил(а) условно "Лена", но замечания есть. 1. Скобки мы расставляем немного подругому, посмотрите пожалуйста LKCS и используйте этот стиль. 2. Не используйте транслитерацию с русского на латиницу. Для обозначения переменной, хранящей опцию возвращённую getopt(3), принято использовать переменную с именем opt. 3. Вам бы надо сделать то что делает date(1) когда вы указываете ему форматную строку, например: $ date "+%a %b %M:%d:%Y" Вск Апр 20:11:2010 Я вам уже говорил где можно взять дни недели и т.д. для текущей локали. Посмотрите документацию к nl_langinfo(3). Дерзайте. -- Г.А. Сабалова Мария пишет: > Здраствуйте > > возник вопрос при реализации утилиты > не подскажете как можно узнать дату последнего изменения файла? > > > ------------------------------------------------------------------------ > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From sitkarev на komitex.ru Sun Apr 11 21:43:24 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Sun, 11 Apr 2010 20:43:24 +0400 Subject: [cdev] =?utf-8?b?0JfQsNC00LDRh9CwXzYuINCz0YAgMTM1?= In-Reply-To: References: Message-ID: <4BC1FC2C.40602@komitex.ru> Лёша, у тебя пока есть ошибки. Ты их не видишь, потому что твоя система проверок не очень хороша. Попробуй сделать их похожими на реальное использование очереди. В неё будет помещаться много элементов, они будут извлекаться, некоторые будут удаляться и т.д. Тебе нужно проверить что структуры данных после извлечения, удаления и т.д. корректны. -- Г.А. Алексей Петрунёв пишет: > Здравствуйте. > Исправил. Если есть ошибки- скажите=) Я еще подумаю. > From anyfrievdrus на mail.ru Tue Apr 13 09:58:24 2010 From: anyfrievdrus на mail.ru (=?koi8-r?Q?=E1=CE=C4=D2=C5=CA_=E1=CE=D5=C6=D2=C9=C5=D7?=) Date: Tue, 13 Apr 2010 08:58:24 +0400 Subject: [cdev] =?koi8-r?b?7cXUz8QgUktGNDU=?= In-Reply-To: <4BB46EEC.9070105@komitex.ru> References: <4BB46EEC.9070105@komitex.ru> Message-ID: Здравствуйте. Я посмотрел код и нашёл у себя две ошибки, но всё равно результат вычисления не стал точным. Я вынес задачу для вычисления методом РК 4-го порядка в отдельный файл (RK.c), там вычисления идут как в простом методе РК 4-го порядка, который мы писали раньше, но результаты отличаются почти на 0,1. Так-же переделал RKF45. Можно ли в нём самим задавать максимальный или минимальный шаг,или это должен делать пользователь? ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: RK.c Type: application/octet-stream Size: 2327 bytes Desc: отсутствует URL: ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: RKF45.c Type: application/octet-stream Size: 3636 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Tue Apr 13 11:27:17 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Tue, 13 Apr 2010 10:27:17 +0400 Subject: [cdev] =?utf-8?b?0JzQtdGC0L7QtCBSS0Y0NQ==?= In-Reply-To: References: <4BB46EEC.9070105@komitex.ru> Message-ID: <4BC40EC5.5010600@komitex.ru> Здравствуй, Андрей. Размеры шагов конечно же ты можешь сам задавать, это именно то что пользователь задаёт для управления точностью метода. У тебя в исходниках заданы очень большие размеры минимального шага, это 0.1 всего и точность epsilon тоже не большая. Попробуй уменьшить минимальный шаг до 0,025 хотя бы и epsilon на несколько порядков. Это для начала. Если не пойдёт, я посмотрю ещё раз где я мог ошибиться. И перепроверю твою программу. Кстати, неплохо "выглядишь", но я потом ряд замечаний выскажу, давай доведём сначала метод до решения. Потом сделаем обвес, чтобы удобно можно было завернуть всё для решения задач на практике. -- Г.А. Андрей Ануфриев пишет: > Здравствуйте. Я посмотрел код и нашёл у себя две ошибки, но всё равно результат вычисления не стал точным. Я вынес задачу для вычисления методом РК 4-го порядка в отдельный файл (RK.c), там вычисления идут как в простом методе РК 4-го порядка, который мы писали раньше, но результаты отличаются почти на 0,1. Так-же переделал RKF45. Можно ли в нём самим задавать максимальный или минимальный шаг,или это должен делать пользователь? > > > ------------------------------------------------------------------------ > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From anyfrievdrus на mail.ru Wed Apr 14 00:10:37 2010 From: anyfrievdrus на mail.ru (=?koi8-r?Q?=E1=CE=C4=D2=C5=CA_=E1=CE=D5=C6=D2=C9=C5=D7?=) Date: Tue, 13 Apr 2010 23:10:37 +0400 Subject: [cdev] =?koi8-r?b?7cXUz8QgUktGNDU=?= In-Reply-To: <4BC40EC5.5010600@komitex.ru> References: <4BC40EC5.5010600@komitex.ru> Message-ID: Поменял начальный размер шага и исправил ещё одну свою ошибку, вроде стало точнее работать при малом размере шага. Что з ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: RKF45.c Type: application/octet-stream Size: 3685 bytes Desc: отсутствует URL: From SabalovaMariya на yandex.ru Wed Apr 14 22:03:00 2010 From: SabalovaMariya на yandex.ru (=?koi8-r?B?88HCwczP18Eg7cHSydE=?=) Date: Wed, 14 Apr 2010 21:03:00 +0400 Subject: [cdev] =?koi8-r?b?1dTJzMnUwSBEYXRl?= In-Reply-To: <4BC1EA50.8030607@komitex.ru> References: <156741270819705@web106.yandex.ru> <4BC1EA50.8030607@komitex.ru> Message-ID: <165971271264580@web93.yandex.ru> Добрый вечер подскажите пожалуйста как можно реализовать программно изменение системного времени 11.04.10, 19:27, "Grigoriy A. Sitkarev" : > Вам уже ответил(а) условно "Лена", но замечания есть. > > 1. Скобки мы расставляем немного подругому, посмотрите пожалуйста LKCS и > используйте этот стиль. > > 2. Не используйте транслитерацию с русского на латиницу. Для обозначения > переменной, хранящей опцию возвращённую getopt(3), принято использовать > переменную с именем opt. > > 3. Вам бы надо сделать то что делает date(1) когда вы указываете ему > форматную строку, например: > > $ date "+%a %b %M:%d:%Y" > Вск Апр 20:11:2010 > > Я вам уже говорил где можно взять дни недели и т.д. для текущей локали. > Посмотрите документацию к nl_langinfo(3). > > Дерзайте. > > -- > Г.А. > > Сабалова Мария пишет: > > Здраствуйте > > > > возник вопрос при реализации утилиты > > не подскажете как можно узнать дату последнего изменения файла? > > > > > > ------------------------------------------------------------------------ > > > > _______________________________________________ > > 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 > > -- Яндекс.Почта. Письма есть. Спама - нет. http://mail.yandex.ru/nospam/sign ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: main.c Type: application/octet-stream Size: 2369 bytes Desc: отсутствует URL: From SabalovaMariya на yandex.ru Thu Apr 15 19:38:22 2010 From: SabalovaMariya на yandex.ru (=?koi8-r?B?88HCwczP18Eg7cHSydE=?=) Date: Thu, 15 Apr 2010 18:38:22 +0400 Subject: [cdev] =?koi8-r?b?1dTJzMnUwSBEYXRl?= In-Reply-To: <4BC1EA50.8030607@komitex.ru> References: <156741270819705@web106.yandex.ru> <4BC1EA50.8030607@komitex.ru> Message-ID: <5481271342302@web20.yandex.ru> Здравствуйте отправляю подправленную версию Date ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: main.c Type: application/octet-stream Size: 2609 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Thu Apr 15 22:25:32 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Thu, 15 Apr 2010 21:25:32 +0400 Subject: [cdev] =?utf-8?b?0YPRgtC40LvQuNGC0LAgRGF0ZQ==?= In-Reply-To: <5481271342302@web20.yandex.ru> References: <156741270819705@web106.yandex.ru> <4BC1EA50.8030607@komitex.ru> <5481271342302@web20.yandex.ru> Message-ID: <4BC74C0C.1050403@komitex.ru> Скажите пожалуйста, вы всё проверяли, что вы написали? Очень кажется что нет. Вам надо ещё посидеть и подумать. Есть также ряд замечаний. 1. Хотя современные компиляторы Си разрешают определять переменные в любом месте блока, придерживайтесь консервативного стиля и определяйте их только в начале блока. 2. Операторы и т.д. должны идти только после определения переменных в блоке, но не до. 3. Для любого типа данных в Си можно получить размер оператором sizeof. Не желательно указывать размеры буферов константами. Удобнее это сделать sizeof (чаще всего, но не всегда). Если применить оператор sizeof к массиву, то он вернёт его размер в байтах. 4. Опция -f у вас не будет работать. 5. Оконцовка у вас очень странная, то ли не умеете пользоваться указателями и адресной арифметикой, то ли решили кого-то сразить своим неординарным подходом. Приводите в порядок. -- Г.А. Сабалова Мария пишет: > Здравствуйте > отправляю подправленную версию Date From SabalovaMariya на yandex.ru Thu Apr 15 23:07:24 2010 From: SabalovaMariya на yandex.ru (=?koi8-r?B?88HCwczP18Eg7cHSydE=?=) Date: Thu, 15 Apr 2010 22:07:24 +0400 Subject: [cdev] =?koi8-r?b?1dTJzMnUwSBEYXRl?= In-Reply-To: <4BC74C0C.1050403@komitex.ru> References: <156741270819705@web106.yandex.ru> <4BC1EA50.8030607@komitex.ru> <5481271342302@web20.yandex.ru> <4BC74C0C.1050403@komitex.ru> Message-ID: <32941271354844@web21.yandex.ru> да с -f непорядок у меня только с одной маской может работать "%Y-%m-%d %H:%M:%S", надо как-то реализовать с несколькими чтоб можно было работать , операторы подправлю можете подсказать как можно программно реализовать смену системного времени а концовка странная, потому что встала проблема обычная функция date если написать date +%r выведет отформатированную информацию без плюса чтобы избавится от этого лишнего плюса при выводе на экран, вывод происходит посимвольно, если пользователь указал маску то со второго символа, а если нет с первого символа 15.04.10, 21:25, "Grigoriy A. Sitkarev" : > Скажите пожалуйста, вы всё проверяли, что вы написали? > > Очень кажется что нет. Вам надо ещё посидеть и подумать. > > Есть также ряд замечаний. > > 1. Хотя современные компиляторы Си разрешают определять переменные в > любом месте блока, придерживайтесь консервативного стиля и определяйте > их только в начале блока. > > 2. Операторы и т.д. должны идти только после определения переменных в > блоке, но не до. > > 3. Для любого типа данных в Си можно получить размер оператором sizeof. > Не желательно указывать размеры буферов константами. Удобнее это сделать > sizeof (чаще всего, но не всегда). Если применить оператор sizeof к > массиву, то он вернёт его размер в байтах. > > 4. Опция -f у вас не будет работать. > > 5. Оконцовка у вас очень странная, то ли не умеете пользоваться > указателями и адресной арифметикой, то ли решили кого-то сразить своим > неординарным подходом. > > Приводите в порядок. > > -- > Г.А. > > Сабалова Мария пишет: > > Здравствуйте > > отправляю подправленную версию Date > > > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev > > -- Здесь спама нет http://mail.yandex.ru/nospam/sign From anyfrievdrus на mail.ru Thu Apr 15 23:10:13 2010 From: anyfrievdrus на mail.ru (=?koi8-r?Q?=E1=CE=C4=D2=C5=CA_=E1=CE=D5=C6=D2=C9=C5=D7?=) Date: Thu, 15 Apr 2010 22:10:13 +0400 Subject: [cdev] =?koi8-r?b?RndkOiBSZVsyXTogIO3F1M/EIFJLRjQ1?= Message-ID: Поменял начальный размер шага и исправил ещё одну свою ошибку, вроде стало точнее работать при малом размере шага. При малом размере шага так же стал работать метод 4-го порядка без изменения размера шага. Может ещё проверить на других моделях? ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: RKF45.c Type: application/octet-stream Size: 3685 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Thu Apr 15 23:15:29 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Thu, 15 Apr 2010 22:15:29 +0400 Subject: [cdev] =?utf-8?b?RndkOiBSZVsyXTog0JzQtdGC0L7QtCBSS0Y0NQ==?= In-Reply-To: References: Message-ID: <4BC757C1.1060407@komitex.ru> Конечно проверь! Мы же с тобой там что-то другое тоже рисовали. Надо проверить, да. Потом начнём уже марафет наводить. -- Г.А. Андрей Ануфриев пишет: > > Поменял начальный размер шага и исправил ещё одну свою ошибку, вроде стало точнее работать при малом размере шага. При малом размере шага так же стал работать метод 4-го порядка без изменения размера шага. Может ещё проверить на других моделях? From sitkarev на komitex.ru Thu Apr 15 23:26:48 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Thu, 15 Apr 2010 22:26:48 +0400 Subject: [cdev] =?utf-8?b?0YPRgtC40LvQuNGC0LAgRGF0ZQ==?= In-Reply-To: <32941271354844@web21.yandex.ru> References: <156741270819705@web106.yandex.ru> <4BC1EA50.8030607@komitex.ru> <5481271342302@web20.yandex.ru> <4BC74C0C.1050403@komitex.ru> <32941271354844@web21.yandex.ru> Message-ID: <4BC75A68.8060600@komitex.ru> 1. Есть такой системный вызов stime(2). Прочитайте man-страницу к нему. 2. Вам достаточно было там сказать: format++ = argv[optind]; Это значит что вам не понятно как Си работает с указателями и адресной арифметикой. Надо разобраться вам с этой темой иначе будете вот такие "извороты" лепить, обходя то что вам не понятно как работает. 3. Мне кажется что вам нельзя использовать optind для индексации в массив argv потому что getopt(3) не гарантирует что там будет валидный указатель (он может быть и нулевым уже). Это ошибка. Вам нужно сделать проверку что optind < argc в таком случае. -- Г.А. Сабалова Мария пишет: > да с -f непорядок > у меня только с одной маской может работать "%Y-%m-%d %H:%M:%S", надо как-то реализовать с несколькими чтоб можно было работать > > , операторы подправлю > можете подсказать как можно программно реализовать смену системного времени > > а концовка странная, потому что > встала проблема обычная функция date если написать date +%r выведет отформатированную информацию без плюса > чтобы избавится от этого лишнего плюса при выводе на экран, вывод происходит посимвольно, если пользователь указал маску то со второго символа, а если нет с первого символа From lenad89 на list.ru Fri Apr 16 00:07:51 2010 From: lenad89 на list.ru (lenad89) Date: Thu, 15 Apr 2010 23:07:51 +0400 Subject: [cdev] =?koi8-r?b?1dTJzMnUwSBEYXRl?= In-Reply-To: <4BC75A68.8060600@komitex.ru> References: <156741270819705@web106.yandex.ru> <4BC1EA50.8030607@komitex.ru> <5481271342302@web20.yandex.ru> <4BC74C0C.1050403@komitex.ru> <32941271354844@web21.yandex.ru> <4BC75A68.8060600@komitex.ru> Message-ID: <1271358471.9025.54.camel@jam-top> И использование в цикле argv[2], чтобы получить аргумент опции, тоже не правильно. Для это есть переменная optarg, которая будет указывать на аргумент опции. Посмотри man getopt и обрати внимание на то, как должна выглядеть optstring, если у некоторых опций есть аргументы. date -r/home/user == date -r /home/user (в первом случае нет пробела) или если ты передашь своей программе -R -r /home/user, то он возьмет "-r" как имя файла, а такого нет(может и есть), a optarg будет указывать на /home/user. И посмотри man страницу stat(2) возвращаемые значения. From sitkarev на komitex.ru Fri Apr 16 00:13:24 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Thu, 15 Apr 2010 23:13:24 +0400 Subject: [cdev] =?utf-8?b?0YPRgtC40LvQuNGC0LAgRGF0ZQ==?= In-Reply-To: <1271358471.9025.54.camel@jam-top> References: <156741270819705@web106.yandex.ru> <4BC1EA50.8030607@komitex.ru> <5481271342302@web20.yandex.ru> <4BC74C0C.1050403@komitex.ru> <32941271354844@web21.yandex.ru> <4BC75A68.8060600@komitex.ru> <1271358471.9025.54.camel@jam-top> Message-ID: <4BC76554.402@komitex.ru> Условно "Лена" вы когда уже подпишетесь со своего адреса? -- Г.А. lenad89 пишет: > И использование в цикле argv[2], чтобы получить аргумент опции, тоже не > правильно. > > Для это есть переменная optarg, которая будет указывать на аргумент > опции. > Посмотри man getopt и обрати внимание на то, как должна выглядеть > optstring, если у некоторых опций есть аргументы. > > date -r/home/user == date -r /home/user (в первом случае нет пробела) > или > если ты передашь своей программе -R -r /home/user, > то он возьмет "-r" как имя файла, а такого нет(может и есть), a optarg > будет указывать на /home/user. > > И посмотри man страницу stat(2) возвращаемые значения. > From anyfrievdrus на mail.ru Fri Apr 16 00:38:39 2010 From: anyfrievdrus на mail.ru (=?koi8-r?Q?=E1=CE=C4=D2=C5=CA_=E1=CE=D5=C6=D2=C9=C5=D7?=) Date: Thu, 15 Apr 2010 23:38:39 +0400 Subject: [cdev] =?koi8-r?b?RndkOiBSZVsyXTog7cXUz8QgUktGNDU=?= In-Reply-To: <4BC757C1.1060407@komitex.ru> References: <4BC757C1.1060407@komitex.ru> Message-ID: Проверил на нескольких дифурах. Результаты очень хорошие(получается точнее чем для RK4). Что дальше делать? From sitkarev на komitex.ru Fri Apr 16 00:46:44 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Thu, 15 Apr 2010 23:46:44 +0400 Subject: [cdev] =?utf-8?b?RndkOiBSZVsyXTog0JzQtdGC0L7QtCBSS0Y0NQ==?= In-Reply-To: References: <4BC757C1.1060407@komitex.ru> Message-ID: <4BC76D24.8080604@komitex.ru> Тебе надо переписать теперь метод с использованием формулы (21). Потому что сейчас ты там каждый раз вычисляешь разность между коэффициентами. Может быть компилятор там и оптимизирует константные выражения, но всё же лучше использовать формулу (21). Потом надо будет переработать API и методы выделения памяти т.д. Это нужно для того чтобы и RK4 и RKF45 с точки зрения того, кто собрался ими пользоваться, выглядели одинаково. -- Г.А. Андрей Ануфриев пишет: > Проверил на нескольких дифурах. Результаты очень хорошие(получается точнее чем для RK4). Что дальше делать? > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From anyfrievdrus на mail.ru Fri Apr 16 11:28:39 2010 From: anyfrievdrus на mail.ru (=?koi8-r?Q?=E1=CE=C4=D2=C5=CA_=E1=CE=D5=C6=D2=C9=C5=D7?=) Date: Fri, 16 Apr 2010 10:28:39 +0400 Subject: [cdev] =?koi8-r?b?7cXUz8QgUktGNDU=?= In-Reply-To: <4BC76D24.8080604@komitex.ru> References: <4BC76D24.8080604@komitex.ru> Message-ID: Здравствуйте.Переделал RKF45 по формуле 21 и упростил коэффициенты при вычислении max_delta_y, посмотрите можно ли менять q, как я его меняю, когда max_delta_y равен 0. Теперь эти коэффициенты надо занести в массив? From SabalovaMariya на yandex.ru Fri Apr 16 20:14:23 2010 From: SabalovaMariya на yandex.ru (=?koi8-r?B?88HCwczP18Eg7cHSydE=?=) Date: Fri, 16 Apr 2010 19:14:23 +0400 Subject: [cdev] =?koi8-r?b?1dTJzMnUwSBEYXRl?= In-Reply-To: <4BC75A68.8060600@komitex.ru> References: <156741270819705@web106.yandex.ru> <4BC1EA50.8030607@komitex.ru> <5481271342302@web20.yandex.ru> <4BC74C0C.1050403@komitex.ru> <32941271354844@web21.yandex.ru> <4BC75A68.8060600@komitex.ru> Message-ID: <90051271430863@web127.yandex.ru> Отправляю подправленную версию Date спасибо за подсказку теперь утилита может изменять системное время 15.04.10, 22:26, "Grigoriy A. Sitkarev" : > 1. Есть такой системный вызов stime(2). Прочитайте man-страницу к нему. > > 2. Вам достаточно было там сказать: > > format++ = argv[optind]; > > Это значит что вам не понятно как Си работает с указателями и адресной > арифметикой. Надо разобраться вам с этой темой иначе будете вот такие > "извороты" лепить, обходя то что вам не понятно как работает. > > 3. Мне кажется что вам нельзя использовать optind для индексации в > массив argv потому что getopt(3) не гарантирует что там будет валидный > указатель (он может быть и нулевым уже). Это ошибка. > > Вам нужно сделать проверку что optind < argc в таком случае. > > -- > Г.А. > > Сабалова Мария пишет: > > да с -f непорядок > > у меня только с одной маской может работать "%Y-%m-%d %H:%M:%S", надо как-то реализовать с несколькими чтоб можно было работать > > > > , операторы подправлю > > можете подсказать как можно программно реализовать смену системного времени > > > > а концовка странная, потому что > > встала проблема обычная функция date если написать date +%r выведет отформатированную информацию без плюса > > чтобы избавится от этого лишнего плюса при выводе на экран, вывод происходит посимвольно, если пользователь указал маску то со второго символа, а если нет с первого символа > > > > _______________________________________________ > 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: 3137 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Sat Apr 17 00:01:13 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Fri, 16 Apr 2010 23:01:13 +0400 Subject: [cdev] =?utf-8?b?0YPRgtC40LvQuNGC0LAgRGF0ZQ==?= In-Reply-To: <90051271430863@web127.yandex.ru> References: <156741270819705@web106.yandex.ru> <4BC1EA50.8030607@komitex.ru> <5481271342302@web20.yandex.ru> <4BC74C0C.1050403@komitex.ru> <32941271354844@web21.yandex.ru> <4BC75A68.8060600@komitex.ru> <90051271430863@web127.yandex.ru> Message-ID: <4BC8B3F9.7000001@komitex.ru> У меня такое ощущение что вы как-то очень выборочно письма из рассылки читаете. Вам подробно подсказали что вам как минимум нужно поправить. У вас неправильно обрабатываются опции. Посмотрите getopt(3) там очень хорошие примеры были внизу, сразу всё понятно. -- Г.А. Сабалова Мария пишет: > Отправляю подправленную версию Date > спасибо за подсказку теперь утилита может изменять системное время From sitkarev на komitex.ru Sat Apr 17 15:00:14 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Sat, 17 Apr 2010 14:00:14 +0400 Subject: [cdev] =?utf-8?b?0JzQtdGC0L7QtCBSS0Y0NQ==?= In-Reply-To: References: <4BC76D24.8080604@komitex.ru> Message-ID: <4BC986AE.6070809@komitex.ru> Андрей, а где файл?? Что-то не видать, ты наверное забыл прицепить. Перешли ещё раз пожалуйста, я посмотрю. Андрей Ануфриев пишет: > Здравствуйте.Переделал RKF45 по формуле 21 и упростил коэффициенты при вычислении max_delta_y, посмотрите можно ли менять q, как я его меняю, когда max_delta_y равен 0. Теперь эти коэффициенты надо занести в массив? > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From anyfrievdrus на mail.ru Sat Apr 17 15:14:29 2010 From: anyfrievdrus на mail.ru (=?koi8-r?Q?=E1=CE=C4=D2=C5=CA_=E1=CE=D5=C6=D2=C9=C5=D7?=) Date: Sat, 17 Apr 2010 14:14:29 +0400 Subject: [cdev] =?koi8-r?b?7cXUz8QgUktGNDU=?= In-Reply-To: <4BC986AE.6070809@komitex.ru> References: <4BC986AE.6070809@komitex.ru> Message-ID: Да с новым режимом дня всё забывается.) ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: RKF45.c Type: application/octet-stream Size: 3326 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Sat Apr 17 15:32:18 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Sat, 17 Apr 2010 14:32:18 +0400 Subject: [cdev] =?utf-8?b?0JzQtdGC0L7QtCBSS0Y0NQ==?= In-Reply-To: References: <4BC986AE.6070809@komitex.ru> Message-ID: <4BC98E32.1090100@komitex.ru> Слушай Андрей, не хорошо получается. У тебя там рекурсия, а её там быть не должно. Рекурсия это не хорошо. Это для начала, потом с дизайном разберёмся. -- Г.А. Андрей Ануфриев пишет: > Да с новым режимом дня всё забывается.) > > > ------------------------------------------------------------------------ > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From anyfrievdrus на mail.ru Sat Apr 17 17:04:32 2010 From: anyfrievdrus на mail.ru (=?koi8-r?Q?=E1=CE=C4=D2=C5=CA_=E1=CE=D5=C6=D2=C9=C5=D7?=) Date: Sat, 17 Apr 2010 16:04:32 +0400 Subject: [cdev] =?koi8-r?b?1dTJzMnUwSBEYXRl?= In-Reply-To: <4BC74C0C.1050403@komitex.ru> References: <4BC74C0C.1050403@komitex.ru> Message-ID: Переделал. ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: RKF45.c Type: application/octet-stream Size: 3531 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Sat Apr 17 18:29:33 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Sat, 17 Apr 2010 17:29:33 +0400 Subject: [cdev] =?utf-8?b?0YPRgtC40LvQuNGC0LAgRGF0ZQ==?= In-Reply-To: References: <4BC74C0C.1050403@komitex.ru> Message-ID: <4BC9B7BD.7080304@komitex.ru> И когда шаг растёт, тоже самое делаем. А не бежим вперёд. Вообще получается что когда надо сделать коррекцию шага, мы стоим на том же месте, на той же начальной точке. И это справедливо и в случае если мы уменьшаем шаг и в случае если мы увеличиваем шаг. Есть ещё нюанс, я его упустил. Нам минимальный шаг ещё нужен и для того чтобы контроллировать ситуацию с выходом за минимальный размер шага. Если методу нужно уменьшить шаг меньше минимального для данной точности, нужно останавливать вычисления и возвращать пользователю ошибку. -- Г.А. Андрей Ануфриев пишет: > Переделал. > > > ------------------------------------------------------------------------ > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From desal на mail.ru Sat Apr 17 21:55:07 2010 From: desal на mail.ru (=?koi8-r?Q?=E1=D2=D4=C5=CD_=E4=C1=CD=D2=C9=CE?=) Date: Sat, 17 Apr 2010 20:55:07 +0400 Subject: [cdev] =?koi8-r?b?KMLF2iDUxc3ZKQ==?= Message-ID: Добрый день! можно я буду задачу fuser писать вместе с Лодыгиным? From anyfrievdrus на mail.ru Sat Apr 17 23:00:54 2010 From: anyfrievdrus на mail.ru (=?koi8-r?Q?=E1=CE=C4=D2=C5=CA_=E1=CE=D5=C6=D2=C9=C5=D7?=) Date: Sat, 17 Apr 2010 22:00:54 +0400 Subject: [cdev] =?koi8-r?b?OiDtxdTPxCBSS0Y0NQ==?= In-Reply-To: References: Message-ID: Дописал по вашим замечаниям. Написал макрос для ошибки. Он работает. ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: RKF45.c Type: application/octet-stream Size: 4066 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Sat Apr 17 23:14:45 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Sat, 17 Apr 2010 22:14:45 +0400 Subject: [cdev] =?utf-8?b?KNCx0LXQtyDRgtC10LzRiyk=?= In-Reply-To: References: Message-ID: <4BC9FA95.3010705@komitex.ru> Артем Дамрин пишет: > Добрый день! можно я буду задачу fuser писать вместе с Лодыгиным? Пишите, только принимайте участие в работе. -- Г.А. From vitalyostap4uk на yandex.ru Mon Apr 19 22:26:53 2010 From: vitalyostap4uk на yandex.ru (vitalyostap4uk на yandex.ru) Date: Mon, 19 Apr 2010 21:26:53 +0400 Subject: [cdev] =?koi8-r?b?9dTJzMnUwSBraWxs?= Message-ID: <1271698013.4827.19.camel@jam-top> Здравствуйте. По спецификации с сайта opengroup.org сделали утилиту kill. ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: kill.c Type: text/x-csrc Size: 4776 bytes Desc: отсутствует URL: From desal на mail.ru Tue Apr 27 20:15:51 2010 From: desal на mail.ru (=?koi8-r?Q?=E1=D2=D4=C5=CD_=E4=C1=CD=D2=C9=CE?=) Date: Tue, 27 Apr 2010 19:15:51 +0400 Subject: [cdev] =?koi8-r?b?KMLF2iDUxc3ZKQ==?= Message-ID: добрый день! отправляю исходник программы ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: отсутствует Type: application/octet-stream Size: 6915 bytes Desc: отсутствует URL: