From ksun_91 на mail.ru Wed Dec 1 21:30:56 2010 From: ksun_91 на mail.ru (=?koi8-r?Q?=EB=D3=C5=CE=C9=D1_=EF=C2=CF=D4=D5=D2=CF=D7=C1?=) Date: Wed, 01 Dec 2010 20:30:56 +0300 Subject: [cdev] =?koi8-r?b?NCDawcTB3sEgLCAxMzUgx9I=?= Message-ID: Григорий Александрович, проверьте пожалуйста ----------- следущая часть ----------- Вложение в формате HTML было извлечено… URL: ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: отсутствует Type: application/octet-stream Size: 5525 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Wed Dec 1 21:57:02 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Wed, 01 Dec 2010 20:57:02 +0300 Subject: [cdev] =?utf-8?b?NCDQt9Cw0LTQsNGH0LAgLCAxMzUg0LPRgA==?= In-Reply-To: References: Message-ID: <4CF68C6E.5000305@komitex.ru> Умнички мои. Сейчас проверю. -- Г.А. Ксения Оботурова пишет: > Григорий Александрович, проверьте пожалуйста From rg-400 на list.ru Wed Dec 1 18:57:51 2010 From: rg-400 на list.ru (rg-400 на list.ru) Date: Wed, 01 Dec 2010 17:57:51 +0300 Subject: [cdev] =?koi8-r?b?NCDawcTB3sEgLCAxMzUgx9I=?= In-Reply-To: References: Message-ID: <1291215472.6971.5.camel@jam-top> Это не паскаль if tmp != 0 then return -1; From rg-400 на list.ru Wed Dec 1 19:12:07 2010 From: rg-400 на list.ru (rg-400 на list.ru) Date: Wed, 01 Dec 2010 18:12:07 +0300 Subject: [cdev] =?koi8-r?b?NCDawcTB3sEgLCAxMzUgx9I=?= In-Reply-To: References: Message-ID: <1291216327.6971.20.camel@jam-top> в parray_sort во внешнем цикле попробуй идти не от 0 до pa->nelems-1, а от pa->nelems-1 до 1, не нужно будет вычислять (pa->nelems - 1) - i и внутренний цикл будет проще и понятнее записан. From ksun_91 на mail.ru Wed Dec 1 22:45:05 2010 From: ksun_91 на mail.ru (=?koi8-r?Q?=EB=D3=C5=CE=C9=D1_=EF=C2=CF=D4=D5=D2=CF=D7=C1?=) Date: Wed, 01 Dec 2010 21:45:05 +0300 Subject: [cdev] =?koi8-r?b?2sHEwd7BIDQsIDEzNcfS?= Message-ID: Григорий Александрович, Убрала свой глупый then. ----------- следущая часть ----------- Вложение в формате HTML было извлечено… URL: ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: отсутствует Type: application/octet-stream Size: 5535 bytes Desc: отсутствует URL: From rg-400 на list.ru Wed Dec 1 19:58:07 2010 From: rg-400 на list.ru (rg-400 на list.ru) Date: Wed, 01 Dec 2010 18:58:07 +0300 Subject: [cdev] =?koi8-r?b?NCDawcTB3sEgLCAxMzUgx9I=?= In-Reply-To: <1291216327.6971.20.camel@jam-top> References: <1291216327.6971.20.camel@jam-top> Message-ID: <1291219087.6971.63.camel@jam-top> в функции parray_delete_range есть выражение pa->nelems = pa->nelems - (pa->nelems - nth); но следующее выражение истина a - (a - b) = b т.е. можно записать и pa->nelems = nth; А это выражение не вызывает доверия: pa->nelems = pa->nelems - (count - nth) - 1; пусть у нас есть 10 элементов (pa->nelems = 10) с 3 позиции (nth = 3) мы хотим удалить 4 элемента (count = 4) в итоге ожидая, что останется шесть элементов, мы же получаем 10 - (4 - 3) -1 = 8. From sitkarev на komitex.ru Wed Dec 1 23:06:40 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Wed, 01 Dec 2010 22:06:40 +0300 Subject: [cdev] =?utf-8?b?NCDQt9Cw0LTQsNGH0LAgLCAxMzUg0LPRgA==?= In-Reply-To: <1291219087.6971.63.camel@jam-top> References: <1291216327.6971.20.camel@jam-top> <1291219087.6971.63.camel@jam-top> Message-ID: <4CF69CC0.6050507@komitex.ru> Егор, у тебя чего-то с часами системными. По-моему, они отстают. -- Г.А. rg-400 на list.ru пишет: > в функции parray_delete_range есть выражение > pa->nelems = pa->nelems - (pa->nelems - nth); > но следующее выражение истина > a - (a - b) = b > т.е. можно записать и > pa->nelems = nth; > > А это выражение не вызывает доверия: > pa->nelems = pa->nelems - (count - nth) - 1; From rg-400 на list.ru Wed Dec 1 23:20:06 2010 From: rg-400 на list.ru (rg-400 на list.ru) Date: Wed, 01 Dec 2010 22:20:06 +0300 Subject: [cdev] =?koi8-r?b?NCDawcTB3sEgLCAxMzUgx9I=?= In-Reply-To: <4CF69CC0.6050507@komitex.ru> References: <1291216327.6971.20.camel@jam-top> <1291219087.6971.63.camel@jam-top> <4CF69CC0.6050507@komitex.ru> Message-ID: <1291231206.6971.66.camel@jam-top> Ага, что-то я и не заметил. From sitkarev на komitex.ru Wed Dec 1 23:30:22 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Wed, 01 Dec 2010 22:30:22 +0300 Subject: [cdev] =?utf-8?b?0LfQsNC00LDRh9CwIDQsIDEzNdCz0YA=?= In-Reply-To: References: Message-ID: <4CF6A24E.1060500@komitex.ru> Девочки, а вы вообще его проверяли? Дело в том что многовато предупреждений и довольно сомнительного кода, который кстати и не компилируется :( Вам бы надо написать проверки, где вы каждую функцию попробуете. Мы же с вами это делали в main() и она у вас была. В самой реализации её конечно быть не должно, т.к. это часть библиотеки, но себе то вы же можете её оставить или сделать в другом файле и линковать с task4.o. Если бы у вас тесты были написаны в test.c то вы бы это делали примерно так: $ gcc -c -Wall -o task4.o task.c $ gcc -Wall -o test test.c task4.o Компилировать вручную всегда довольно утомительно, я бы написал Makefile и собирал бы потом одной командой: $ cat Makefile CFLAGS = -Wall LDFLAGS = CC = gcc TARGET = test OBJS = task4.o test.o HEADERS = parray.h all: $(TARGET) $(TARGET): $(OBJS) $(HEADERS) $(CC) $(CFLAGS) -o $@ $(LDFLAGS) $(OBJS) clean: rm -rf *~ $(OBJS) $(TARGET) $ make При компиляции с -Wall я получаю предупреждения, которых быть не должно (это практически ошибка). И в 221-й линии есть ошибка. $ gcc -Wall -o task4 task4.c task4.c: In function ?parray_get_nth?: task4.c:161: warning: ?return? with no value, in function returning non-void task4.c: In function ?parray_sort?: task4.c:212: warning: ?return? with a value, in function returning void task4.c: In function ?callback?: task4.c:220: warning: format ?%f? expects type ?double?, but argument 2 has type ?int? task4.c:221: error: expected ?;? before ?return? task4.c:222: warning: control reaches end of non-void function task4.c: In function ?parray_foreach?: task4.c:231: warning: return makes pointer from integer without a cast task4.c:234: warning: control reaches end of non-void function В функциях где вы делаете memmove(3) мне кажется стоит перепроверить ещё раз пересчёт количества байтов перемещаемых, потому что они вызывают подозрения. Об этом и Егор пишет, прочтите его внимательно тоже. Осталось вам совсем чуть-чуть. Сделайте мне приятное! -- Г.А. Ксения Оботурова пишет: > Григорий Александрович, Убрала свой глупый then. > From rg-400 на list.ru Wed Dec 1 23:32:16 2010 From: rg-400 на list.ru (rg-400 на list.ru) Date: Wed, 01 Dec 2010 22:32:16 +0300 Subject: [cdev] =?koi8-r?b?2sHEwd7BIDQsIDEzNcfS?= In-Reply-To: References: Message-ID: <1291231936.6971.77.camel@jam-top> Еще в parray_delete_range memmove(pa->data + nth, pa->data + pa->nelems, ((pa->nelems - 1 - nth))*sizeof(void *)); Прочитайте еще раз, что делает memmove. pa->data + pa->nelems, адрес по которому уже нет элементов массива, там лежит что-то другое. И уж если у пользователь вашей функции попросил освободить больше чем у вас есть, то нужно освободить только то, что относиться к вашему массиву указателей.(На самом деле можно либо почистить память memset и уменьшить количество элементов до nth, либо просто уменьшить количество элементов до nth и ничего не чистить) memmove(pa->data + nth, pa->data + nth+count, (pa->nelems -(count - nth))*sizeof(void *)); тут аналогия с предыдущим замечанием возьмем такие же значения pa->nelems = 10; nth = 3; count = 4 получим pa->nelems -(count - nth) = 10 - (4 - 3) = 9 явно не то, что ожидалось. From ksun_91 на mail.ru Sat Dec 4 15:15:11 2010 From: ksun_91 на mail.ru (=?koi8-r?Q?=EB=D3=C5=CE=C9=D1_=EF=C2=CF=D4=D5=D2=CF=D7=C1?=) Date: Sat, 04 Dec 2010 14:15:11 +0300 Subject: [cdev] =?koi8-r?b?2sHEwd7BIDQsIDEzNSDH0i4=?= Message-ID: Григорий Александрович, проверьте пожалуйста ----------- следущая часть ----------- Вложение в формате HTML было извлечено… URL: ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: отсутствует Type: application/octet-stream Size: 6309 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Sun Dec 5 20:17:31 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Sun, 05 Dec 2010 19:17:31 +0300 Subject: [cdev] =?utf-8?b?0LfQsNC00LDRh9CwIDQsIDEzNSDQs9GALg==?= In-Reply-To: References: Message-ID: <4CFBBB1B.20604@komitex.ru> Добрый вечер всем. Перепроверьте вычисления в ф-ии parray_delete_nth(), там где вы подсчитываете сколько байт вам нужно переместить. Нужно помнить что в Си для арифметических операций приоритеты такие же как в алгебре, т.е. '+' и '-' имеют приоритет ниже чем у '/' и '*'. Порядок всегда можно изменить скобками круглыми (как в алгебре). В parray_delete() то же самое замечание. В parray_delete_range() проверка if (count >= pa->nelems - nth) не верна, т.к. здесь надо было проверять на строго "больше". Предположим, в массиве есть 4-е элемента, а пользователь захотел удалить начиная нулевого индекса 4-е элемента: parray_delete(pa, 0, 4); (4 >= 4 - 0) тогда будет истиной, хотя count вмещается в допустимые пределы. Код там можно было проще написать, обрезав count до допустимого количества, если оно было больше, и делать memmove() дальше одинаково для обеих случаев. Всё остальное вроде бы работает, и поиск и сортировка и обход. Вам осталось совсем чуть-чуть. -- Г.А. Ксения Оботурова пишет: > Григорий Александрович, проверьте пожалуйста > From ksun_91 на mail.ru Mon Dec 6 00:41:54 2010 From: ksun_91 на mail.ru (=?koi8-r?Q?=EB=D3=C5=CE=C9=D1_=EF=C2=CF=D4=D5=D2=CF=D7=C1?=) Date: Sun, 05 Dec 2010 23:41:54 +0300 Subject: [cdev] =?koi8-r?b?2sHEwd7BIDQsIDEzNSDH0i4=?= Message-ID: Вот Григорий Александрович, вроде все исправила) ----------- следущая часть ----------- Вложение в формате HTML было извлечено… URL: ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: отсутствует Type: application/octet-stream Size: 6183 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Mon Dec 6 00:59:03 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Sun, 05 Dec 2010 23:59:03 +0300 Subject: [cdev] =?utf-8?b?0LfQsNC00LDRh9CwIDQsIDEzNSDQs9GALg==?= In-Reply-To: References: Message-ID: <4CFBFD17.9030004@komitex.ru> По-моему ничего не исправлено, кроме модификации count в ф-ии parray_delete_range() и условия строго больше. Надо бы ещё раз внимательно перечитать что я написал, и перепроверить сколько вы там сдвигаете элементов во всех функциях которые это делают. -- Г.А. Ксения Оботурова пишет: > Вот Григорий Александрович, вроде все исправила) From ksun_91 на mail.ru Mon Dec 6 18:04:24 2010 From: ksun_91 на mail.ru (=?koi8-r?Q?=EB=D3=C5=CE=C9=D1_=EF=C2=CF=D4=D5=D2=CF=D7=C1?=) Date: Mon, 06 Dec 2010 17:04:24 +0300 Subject: [cdev] =?koi8-r?b?2sHEwd7BIDQsIDEzNSDH0i4=?= Message-ID: Здравствуйте Григорий Александрович, а в parray_delete_nth и parray_delete , там где подсчитывается количество байт, там не правильно посчитанно или приоритеты не правильно раставлены? не поняла просто вот это... ----------- следущая часть ----------- Вложение в формате HTML было извлечено… URL: From sitkarev на komitex.ru Mon Dec 6 19:27:13 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Mon, 06 Dec 2010 18:27:13 +0300 Subject: [cdev] =?utf-8?b?0LfQsNC00LDRh9CwIDQsIDEzNSDQs9GALg==?= In-Reply-To: References: Message-ID: <4CFD00D1.9080308@komitex.ru> Там неправильно подсчитано потому что неправильно расставлены приоритеты (скорее всего так). Вы хотели одно, получили другое, как будто бы в школе не учились. Проверяйте сами, что вам стоит вызвать эту функцию и посмотреть что она делает? В Си как в школьной арифметике - сложение и вычитание выполняется последовательно, слева направо. Если встретилось умножение или деление, то сначала умножается или делится. Этот порядок можно поменять скобками. Скобки раскрываются по таким же правилам, известным нам со школы (с целочисленной арифметикой это почти всегда так). Выражения: a = b + c * i; и a = (b + c) * i; имеют разный результат, это разные выражения. Выражения: a = b - c + 1; и a = b - (c + 1); тоже разные и будут давать разный результат. -- Г.А. Ксения Оботурова пишет: > Здравствуйте Григорий Александрович, а в parray_delete_nth и parray_delete , там где подсчитывается количество байт, там не правильно посчитанно или приоритеты не правильно раставлены? не поняла просто вот это... From ksun_91 на mail.ru Sat Dec 11 14:47:25 2010 From: ksun_91 на mail.ru (=?koi8-r?Q?=EB=D3=C5=CE=C9=D1_=EF=C2=CF=D4=D5=D2=CF=D7=C1?=) Date: Sat, 11 Dec 2010 13:47:25 +0300 Subject: [cdev] =?koi8-r?b?2sHEwd7BIDQsIDEzNSDH0i4=?= Message-ID: Григорий Александрович, проверьте пожалуйста!) ----------- следущая часть ----------- Вложение в формате HTML было извлечено… URL: ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: отсутствует Type: application/octet-stream Size: 4934 bytes Desc: отсутствует URL: From ksun_91 на mail.ru Sat Dec 11 19:36:39 2010 From: ksun_91 на mail.ru (=?koi8-r?Q?=EB=D3=C5=CE=C9=D1_=EF=C2=CF=D4=D5=D2=CF=D7=C1?=) Date: Sat, 11 Dec 2010 18:36:39 +0300 Subject: [cdev] =?koi8-r?b?2sHEwd7BIDQsIDEzNSDH0i4=?= Message-ID: а да... там просто она была не исправлена... до этого было верно... вот так вроде правильно, проверьте ----------- следущая часть ----------- Вложение в формате HTML было извлечено… URL: ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: отсутствует Type: application/octet-stream Size: 5081 bytes Desc: отсутствует URL: From rg-400 на list.ru Sat Dec 11 17:47:50 2010 From: rg-400 на list.ru (jam) Date: Sat, 11 Dec 2010 16:47:50 +0300 Subject: [cdev] =?koi8-r?b?2sHEwd7BIDQsIDEzNSDH0i4=?= In-Reply-To: References: Message-ID: <1292075270.2276.18.camel@jam> В parray_delete_range все еще есть ошибка, возьмите нарисуйте на бумаге массив какого-либо определенного размера и выполните с ним такие же действия, что вы написали в программе. Напоминаю, что размер массива у вас sizeof(void *) * pa->nelems(если не учитывать, что мы выделяем места для nalloc элемнтов), а адрес начала это pa->data, а запись pa->data + pa->nelems - 1 - это адрес последнего элемента и все, что после него не является элементом этого массива. А вы залезаете либо на память, которую вообще не выделяли, либо выделяли, но отношение именно к массиву из pa->nelems элементов не имеет. Это к записи : memmove(pa->data+nth, pa->data+pa->nelems-1, ((pa->nelems -1- nth))*sizeof(void *)); From rg-400 на list.ru Sat Dec 11 20:20:43 2010 From: rg-400 на list.ru (jam) Date: Sat, 11 Dec 2010 19:20:43 +0300 Subject: [cdev] =?koi8-r?b?2sHEwd7BIDQsIDEzNSDH0i4=?= In-Reply-To: References: Message-ID: <1292084443.2752.42.camel@jam> первым действием мы проверили, что позиция, с которой будет производится удаление не выходи за пределы массива, если выходит, то удалять с такой позиции не возможно. Второй шаг посчитать сколько у нас осталось элементов. Теперь мы знаем сколько осталось и знаем сколько пользователь хочет удалить и если пользователь хочет удалить больше чем есть, то мы дадим ему удалить лишь столько сколько у нас осталось. Отсюда делаем вывод, если пользователь хочет удалить все элементы с определенной позиции, то после этой позиции уже нет элементов и ничего перемещать на мне нужно. А если и надо, что-то перемещать это ко-во легко вычислить взяв кол-во элементов, которое осталось и уменьшит его на кол-во элементов которые нужно удалить. И вот этот кусок и должен быть вставлен с позиции nth. Ну теперь осталось, только посчитать сколько же элементов в массиве осталось после этих манипуляций: У нас железно остается nth элементов, еще возможно останется кусок, если пользователь удалит не все элементы с позиции nth. А у вас если пользователь захотел удалить больше элементов, чем осталось, то получается следующее: count = pa->nelems - nth; memmove(pa->data + nth, pa->data + nth + count, ((pa->nelems - count))*sizeof(void *)); -> memmove(pa->data + nth, pa->data + nth + pa->nelems - nth, (pa->nelems - (pa->nelems - nth))*sizeof(void *)); nth сокращаются и мы смело выходим за границы массива. Причем перемещаем зачем-то nth элементов, а должны перемещать другое кол-во. From ksun_91 на mail.ru Sat Dec 11 21:33:29 2010 From: ksun_91 на mail.ru (=?koi8-r?Q?=EB=D3=C5=CE=C9=D1_=EF=C2=CF=D4=D5=D2=CF=D7=C1?=) Date: Sat, 11 Dec 2010 20:33:29 +0300 Subject: [cdev] =?koi8-r?b?2sHEwd7BIDQsIDEzNSDH0i4=?= Message-ID: memmove(pa->data + nth, pa->data + nth + pa->nelems - nth, (pa->nelems - (pa->nelems - nth))*sizeof(void *)); nth сокращаются и мы смело выходим за границы массива. Причем перемещаем зачем-то nth элементов, а должны перемещать другое кол-во. это я не знаю откуда вы взяли, сейчас когда я отправила задачу последний раз, такого фрагмента кода, вообще не было!!! был лишь этот, а тут по-моему все правильно... void parray_delete_range(struct parray *pa, unsigned int nth, size_t count) { if (nth >= pa->nelems){ fprintf(stderr, "cann't delete range\n" ;-) ; return; } if (count > pa->nelems - nth) count = pa->nelems - nth; memmove(pa->data + nth, pa->data + nth + count, ((pa->nelems - count))*sizeof(void *)); pa->nelems = pa->nelems - count; } если пользователь вышел за пределы массива, то ошибка, если хочет удалить больше , то разрешаем удалять лишь то что есть, и удаляем! Григорий Александрович уже проверял даже этот кусок кода и было правильно, просто когда я сегодня отправила на проверку то случайно отправила не то что хотела... были ошибки в parrey_delete и в parray_delete_nth, а в parray_delete_range было высе правильно, и там уже, т.е в parrey_delete и в parray_delete_nth недочеты исправлены ----------- следущая часть ----------- Вложение в формате HTML было извлечено… URL: From rg-400 на list.ru Sat Dec 11 21:51:16 2010 From: rg-400 на list.ru (jam) Date: Sat, 11 Dec 2010 20:51:16 +0300 Subject: [cdev] =?koi8-r?b?2sHEwd7BIDQsIDEzNSDH0i4=?= In-Reply-To: References: Message-ID: <1292089876.2752.61.camel@jam> Это я просто показал, что будет если выполнится условие. Покажу на числах. пусть у нас есть nelems = 10; nth = 2; count = 4, pa-data = 0 - для определенности мы идем с нулевого адреса; проходим по вашему коду if (nth >= pa->nelems){ /* 2 >= 10 - верно, движемся дальше */ fprintf(stderr, "cann't delete range\n"); return; } if (count > pa->nelems - nth) /* 4 > 10 - 2 - не верно пропускам инструкции.*/ count = pa->nelems - nth; memmove(pa->data + nth, pa->data + nth + count, ((pa->nelems - count))*sizeof(void *)); /* memmove(0 + 2, 0 + 2 + 4, sizeof(void*) * (10 - 2)); вот тут ошибка: явно, что с 6 позиции у нас осталось только 4 элемента, а третий параметр равен 8 */ pa->nelems = pa->nelems - count; /*pa->nelems = 10 - 4 - тут результат правильный*/ другой случай пусть остальные такие же, а count = 15: if (nth >= pa->nelems){ /* 2 >= 10 - верно, движемся дальше */ fprintf(stderr, "cann't delete range\n"); return; } if (count > pa->nelems - nth) /* 15 > 10 - 2 - верно выполняем инструкции. */ count = pa->nelems - nth;/* count = 10 - 2, т.е. count = 8*/ memmove(pa->data + nth, pa->data + nth + count, ((pa->nelems - count))*sizeof(void *)); /* memmove(0 + 2, 0 + 2 + 8, sizeof(void*) * (10 - 8)); в этом случае мы вы получаем memmove(2, 10, sizeof(void*) * (2)); получается, что мы выходим за пределы массива и еще хотим переставить 2 элемента, а не должны ничего переставлять. */ pa->nelems = pa->nelems - count; /*pa->nelems = 10 - 8 - тут результат правильный*/ From rg-400 на list.ru Sat Dec 11 21:51:16 2010 From: rg-400 на list.ru (jam) Date: Sat, 11 Dec 2010 20:51:16 +0300 Subject: [cdev] =?koi8-r?b?2sHEwd7BIDQsIDEzNSDH0i4=?= In-Reply-To: References: Message-ID: <1292089876.2752.61.camel@jam> Это я просто показал, что будет если выполнится условие. Покажу на числах. пусть у нас есть nelems = 10; nth = 2; count = 4, pa-data = 0 - для определенности мы идем с нулевого адреса; проходим по вашему коду if (nth >= pa->nelems){ /* 2 >= 10 - верно, движемся дальше */ fprintf(stderr, "cann't delete range\n"); return; } if (count > pa->nelems - nth) /* 4 > 10 - 2 - не верно пропускам инструкции.*/ count = pa->nelems - nth; memmove(pa->data + nth, pa->data + nth + count, ((pa->nelems - count))*sizeof(void *)); /* memmove(0 + 2, 0 + 2 + 4, sizeof(void*) * (10 - 2)); вот тут ошибка: явно, что с 6 позиции у нас осталось только 4 элемента, а третий параметр равен 8 */ pa->nelems = pa->nelems - count; /*pa->nelems = 10 - 4 - тут результат правильный*/ другой случай пусть остальные такие же, а count = 15: if (nth >= pa->nelems){ /* 2 >= 10 - верно, движемся дальше */ fprintf(stderr, "cann't delete range\n"); return; } if (count > pa->nelems - nth) /* 15 > 10 - 2 - верно выполняем инструкции. */ count = pa->nelems - nth;/* count = 10 - 2, т.е. count = 8*/ memmove(pa->data + nth, pa->data + nth + count, ((pa->nelems - count))*sizeof(void *)); /* memmove(0 + 2, 0 + 2 + 8, sizeof(void*) * (10 - 8)); в этом случае мы вы получаем memmove(2, 10, sizeof(void*) * (2)); получается, что мы выходим за пределы массива и еще хотим переставить 2 элемента, а не должны ничего переставлять. */ pa->nelems = pa->nelems - count; /*pa->nelems = 10 - 8 - тут результат правильный*/ From rg-400 на list.ru Sat Dec 11 21:51:16 2010 From: rg-400 на list.ru (jam) Date: Sat, 11 Dec 2010 20:51:16 +0300 Subject: [cdev] =?koi8-r?b?2sHEwd7BIDQsIDEzNSDH0i4=?= In-Reply-To: References: Message-ID: <1292089876.2752.61.camel@jam> Это я просто показал, что будет если выполнится условие. Покажу на числах. пусть у нас есть nelems = 10; nth = 2; count = 4, pa-data = 0 - для определенности мы идем с нулевого адреса; проходим по вашему коду if (nth >= pa->nelems){ /* 2 >= 10 - верно, движемся дальше */ fprintf(stderr, "cann't delete range\n"); return; } if (count > pa->nelems - nth) /* 4 > 10 - 2 - не верно пропускам инструкции.*/ count = pa->nelems - nth; memmove(pa->data + nth, pa->data + nth + count, ((pa->nelems - count))*sizeof(void *)); /* memmove(0 + 2, 0 + 2 + 4, sizeof(void*) * (10 - 2)); вот тут ошибка: явно, что с 6 позиции у нас осталось только 4 элемента, а третий параметр равен 8 */ pa->nelems = pa->nelems - count; /*pa->nelems = 10 - 4 - тут результат правильный*/ другой случай пусть остальные такие же, а count = 15: if (nth >= pa->nelems){ /* 2 >= 10 - верно, движемся дальше */ fprintf(stderr, "cann't delete range\n"); return; } if (count > pa->nelems - nth) /* 15 > 10 - 2 - верно выполняем инструкции. */ count = pa->nelems - nth;/* count = 10 - 2, т.е. count = 8*/ memmove(pa->data + nth, pa->data + nth + count, ((pa->nelems - count))*sizeof(void *)); /* memmove(0 + 2, 0 + 2 + 8, sizeof(void*) * (10 - 8)); в этом случае мы вы получаем memmove(2, 10, sizeof(void*) * (2)); получается, что мы выходим за пределы массива и еще хотим переставить 2 элемента, а не должны ничего переставлять. */ pa->nelems = pa->nelems - count; /*pa->nelems = 10 - 8 - тут результат правильный*/ From rg-400 на list.ru Sat Dec 11 22:16:39 2010 From: rg-400 на list.ru (jam) Date: Sat, 11 Dec 2010 21:16:39 +0300 Subject: [cdev] =?koi8-r?b?2sHEwd7BIDQsIDEzNSDH0i4=?= In-Reply-To: <1292089876.2752.61.camel@jam> References: <1292089876.2752.61.camel@jam> Message-ID: <1292091399.2752.64.camel@jam> /* memmove(0 + 2, 0 + 2 + 4, sizeof(void*) * (10 - 2)); вот тут ошибка: явно, что с 6 позиции у нас осталось только 4 элемента, а третий параметр равен 8 */ - тут мой касяк memmove(0 + 2, 0 + 2 + 4, sizeof(void*) * (10 - 4)); т.е. как бы надо перемещать 6 элементов, но у нас то всего 4 осталось. From sitkarev на komitex.ru Sat Dec 11 22:52:13 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Sat, 11 Dec 2010 21:52:13 +0300 Subject: [cdev] =?utf-8?b?0LfQsNC00LDRh9CwIDQsIDEzNSDQs9GALg==?= In-Reply-To: References: Message-ID: <4D03C85D.1020901@komitex.ru> Возможно, я не всё заметил. Возможно, что-то появилось неверное и сегодня. Например, функция следующая: void parray_delete(struct parray *pa, void *ptr) { int i; for(i = 0; i < pa->nelems; ++i){ if (pa->data[i] == ptr){ break; } } if (i < pa->nelems){ if (i == pa->nelems - 1) { --pa->nelems; } if (i < pa->nelems-1){ --pa->nelems; memmove(pa->data + i, pa->data + i + 1, (pa->nelems - (i + 1))*sizeof(void *)); } } else { fprintf(stderr, "elems cann't delete\n"); } } И вроде бы всё хорошо, но вот есть два нюанса: 1. Там где шло условие if (i == pa->nelems - 1) и после опять идёт if (i < pa->nelems-1) хотя лучше бы было сделать: if (i == pa->nelems - 1) { --pa->nelems; } else { ... } И яснее и читается проще. А дальше досада - вроде бы алгоритм расчёта количества удаляемых элементов верный, но вы сначала уменьшили pa->nelems на один, а потом вычитаете из него на единицу больше чем нужно. Пусть было 4-е элемента в массиве, удаляли мы индекс 1. Если вычесть из 4-х - (1+1)=2, 4-2=2, получим сколько элементов нужно сместить в memmove(), но (!!!) у вас уже там размер-то не 4, а 3, т.к. вы уменьшили значение pa->nelems ДО этого на единицу. Поэтому надо считать как (pa->nelems-i) или же делать инкремент после memmove(). Я всё равно буду перепроверять ваш финальный исходник, просто когда я бегу глазами мне достаточно указать на одну-две ошибки, этого достаточно чтобы отправить задание на доделку. Я бы просил ещё раз проверить с карандашом ваши вычисления смещаемых элементов, везде. Потом высылайте файл, я ещё раз проверю, уже на тесте который у меня есть. -- Г.А. Ксения Оботурова пишет: > memmove(pa->data + nth, pa->data + nth + pa->nelems - nth, > (pa->nelems - (pa->nelems - nth))*sizeof(void *)); > nth сокращаются и мы смело выходим за границы массива. Причем перемещаем > зачем-то nth элементов, а должны перемещать другое кол-во. > > это я не знаю откуда вы взяли, сейчас когда я отправила задачу последний раз, такого фрагмента кода, вообще не было!!! > From ksun_91 на mail.ru Sat Dec 18 02:06:51 2010 From: ksun_91 на mail.ru (=?koi8-r?Q?=EB=D3=C5=CE=C9=D1_=EF=C2=CF=D4=D5=D2=CF=D7=C1?=) Date: Sat, 18 Dec 2010 01:06:51 +0300 Subject: [cdev] =?koi8-r?b?2sHEwd7BIDQgLCAxMzUgx9Iu?= Message-ID: Григорий Александрович, проверьте пожалуйста. ----------- следущая часть ----------- Вложение в формате HTML было извлечено… URL: ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: отсутствует Type: application/octet-stream Size: 4859 bytes Desc: отсутствует URL: From nateford на inbox.ru Mon Dec 27 09:06:35 2010 From: nateford на inbox.ru (=?koi8-r?Q?=EB=CF=CE=D3=D4=C1=CE=D4=C9=CE_=EE=C9=CB=D5=CC=CF=D7?=) Date: Mon, 27 Dec 2010 08:06:35 +0300 Subject: [cdev] sscanf In-Reply-To: <4D03C85D.1020901@komitex.ru> References: <4D03C85D.1020901@komitex.ru> Message-ID: Доброе утро. Подскажите, пожалуйста, почему выводятся нули. А то что-то не могу понять, где ошибка... #include int main(int argc, char **argv) { int res, nine = 0, ten = 0; char str[] = "I'm 10 years old. And you are 9."; sscanf(str, "%i %i", &ten, &nine); printf("%i %i %i", ten, nine, res); return 0; } From ilyin_mikhail на inbox.ru Mon Dec 27 09:26:15 2010 From: ilyin_mikhail на inbox.ru (Mikhail Ilyin) Date: Mon, 27 Dec 2010 08:26:15 +0300 Subject: [cdev] =?koi8-r?b?c3NjYW5m?= In-Reply-To: References: <4D03C85D.1020901@komitex.ru> Message-ID: А если вот так для понимания :). Последний аргумент %s можно не указывать и не вычитывать '.' из строки. int res, nine = 0, ten = 0; char str[] = "I'm 10 years old. And you are 9."; char stub[256]; sscanf(str, "%s %i %s %s %s %s %s %i %s", stub, &ten, stub, stub, stub, stub, stub, &nine, stub); printf("%i %i %i\n", ten, nine, res); Mon, 27 Dec 2010 08:06:35 +0300 письмо от Константин Никулов: > Доброе утро. Подскажите, пожалуйста, почему выводятся нули. А то что-то не > могу понять, где ошибка... > > #include > > int main(int argc, char **argv) > { > > int res, nine = 0, ten = 0; > char str[] = "I'm 10 years old. And you are 9."; > > sscanf(str, "%i %i", &ten, &nine); > printf("%i %i %i", ten, nine, res); > > return 0; > > } > > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From sitkarev на komitex.ru Mon Dec 27 10:54:09 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Mon, 27 Dec 2010 09:54:09 +0300 Subject: [cdev] sscanf In-Reply-To: References: <4D03C85D.1020901@komitex.ru> Message-ID: <4D183811.1010807@komitex.ru> Для понимания пойдёт. В практическом использовании есть нюансы. 1. Если читаем строку, обязательно нужно указывать максимальный размер буфера БЕЗ учёта последнего байта где хранится '\0'. Т.е. в случае если бы мы хотели записывать в буфер stub то надо было везде в спецификаторе преобразования писать %255s. 2. Иногда нам не нужны значения, но в форматной строке мы их должны указать sscanf() чтобы добраться до следующих. Тогда нужно добавлять звёздочку сразу после знака спецификатора преобразования '%'. sscanf(str, "%*s %i %*s %*s %*s %*s %*s %i %*s", &ten, &nine); 3. Зачем нам печатать значение res если туда ничего не попало?? Должно быть так: res = sscanf(...); Тогда есть смысл его печатать. -- Г.А. Mikhail Ilyin пишет: > А если вот так для понимания :). Последний аргумент %s можно не указывать > и не вычитывать '.' из строки. > > int res, nine = 0, ten = 0; > char str[] = "I'm 10 years old. And you are 9."; > char stub[256]; > > sscanf(str, "%s %i %s %s %s %s %s %i %s", stub, &ten, stub, stub, stub, stub, stub, &nine, stub); > printf("%i %i %i\n", ten, nine, res); > From nateford на inbox.ru Mon Dec 27 13:09:15 2010 From: nateford на inbox.ru (=?koi8-r?Q?=EB=CF=CE=D3=D4=C1=CE=D4=C9=CE_=EE=C9=CB=D5=CC=CF=D7?=) Date: Mon, 27 Dec 2010 12:09:15 +0300 Subject: [cdev] =?koi8-r?b?c3NjYW5m?= In-Reply-To: <4D183811.1010807@komitex.ru> References: <4D183811.1010807@komitex.ru> Message-ID: Ага. Т.е. получается, если мы хотим вычленить целые, надо между ними натыкать %*s, чтобы показать что там может что-то быть? Mon, 27 Dec 2010 09:54:09 +0300 письмо от "Grigoriy A. Sitkarev" : > Для понимания пойдёт. > > В практическом использовании есть нюансы. > > 1. Если читаем строку, обязательно нужно указывать максимальный размер > буфера БЕЗ учёта последнего байта где хранится '\0'. Т.е. в случае > если > бы мы хотели записывать в буфер stub то надо было везде в спецификаторе > преобразования писать %255s. > > 2. Иногда нам не нужны значения, но в форматной строке мы их должны > указать sscanf() чтобы добраться до следующих. Тогда нужно добавлять > звёздочку сразу после знака спецификатора преобразования '%'. > > sscanf(str, "%*s %i %*s %*s %*s %*s %*s %i %*s", &ten, > &nine); > > 3. Зачем нам печатать значение res если туда ничего не попало?? Должно > быть так: > > res = sscanf(...); > > Тогда есть смысл его печатать. > > -- > Г.А. > > Mikhail Ilyin пишет: > > А если вот так для понимания :). Последний аргумент %s можно не указывать > > и не вычитывать '.' из строки. > > > > int res, nine = 0, ten = 0; > > char str[] = "I'm 10 years old. And you are 9."; > > char stub[256]; > > > > sscanf(str, "%s %i %s %s %s %s %s %i %s", stub, &ten, stub, > stub, stub, stub, stub, &nine, stub); > > printf("%i %i %i\n", ten, nine, res); > > > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From nateford на inbox.ru Mon Dec 27 13:29:36 2010 From: nateford на inbox.ru (=?koi8-r?Q?=EB=CF=CE=D3=D4=C1=CE=D4=C9=CE_=EE=C9=CB=D5=CC=CF=D7?=) Date: Mon, 27 Dec 2010 12:29:36 +0300 Subject: [cdev] =?koi8-r?b?c3NjYW5m?= In-Reply-To: <4D183811.1010807@komitex.ru> References: <4D183811.1010807@komitex.ru> Message-ID: А почему вообще ничего не пишет в res следующая строчка? res = sscanf(buf, "%i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i", &resarr[0], &resarr[1], &resarr[2], &resarr[3], &resarr[4], &resarr[5], &resarr[6], &resarr[7], &resarr[8], &resarr[9], &resarr[10], &resarr[11], &resarr[12], &resarr[13], &resarr[14], &resarr[15]); Я подозреваю, что длинная слишком, но мало ли. From sitkarev на komitex.ru Mon Dec 27 14:10:56 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Mon, 27 Dec 2010 13:10:56 +0300 Subject: [cdev] sscanf In-Reply-To: References: <4D183811.1010807@komitex.ru> Message-ID: <4D186630.9070908@komitex.ru> Не совсем. Вот возьмём определение sscanf из man-страницы: int sscanf(const char *str, const char *format, ...); В str у нас исходная строка, из которой мы что-то собрались извлекать. В format у нас форматная строка, в которой описано КАК и ЧТО мы собираемся извлекать, потому что об этом sscanf сам ничего не знает. Для него str это просто байты, завершающиеся '\0'. Три точки на месте последнего аргумента указывают на то что sscanf принимает переменное число аргументов -- там мы передаём КУДА мы будем сохранять извлечённые значения (указатели). Форматная строка format представляет собой набор директив в которой указано как нужно обрабатывать входные символы из str. Если при обработке директив происходит ошибка, то дальше sscanf директивы не обрабатывает и делает возврат. - Каждый символ соответствует сам себе. - Любой пробел соответствует любому количеству пробелов (или ни одному) и может быть любым пробельным символом (см. isspace(3)). - Спецификатор преобразования начинается с символа '%'. Результат преобразования помещается в соответствующий аргумент по указателю. Если при преобразовании было обнаружено несовпадение, то преобразование терпит неудачу и sscanf делает возврат. После символа '%' может следовать: - опциональный символ '*', подавляющий запись в аргумент совпадения. - десятичное число -- максимальная ширина поля, для чисел, и для строк максимальное число символов, БЕЗ учёта завершающего '\0' который записывает sscanf. - опциональный модификатор типа, например 'l' для указания того что при преобразовании целого '%d' значение по указателю аргумента является long int а не int, при преобразовании числа с плавающей точкой '%f' значение по указателю double а не float. - спецификатор преобразования. Спецификаторы преобразования есть например такие: i - целое число, 10-тичное или 16-ичное. d - целое число, 10-тичное. f - число с плавающей точкой. s - строка завершающаяся '\0'. [ - строка включающая (или исключающая если после [ стоит ^) символы из набора, например [^[a-z] означает "всё кроме символов в нижнем регистре и скобки [". % - символ '%'. А вообще надо читать man-страницы. Эти функции одни из самых сложных для понимания новичкам, это известная педагогическая трудность. Чтобы понять как она работает, надо взять её исходный код. Стоит прочесть 9.1 Formatting Data в книге Practice of Programming, там есть один пример, очень похожий, разобранный досконально. -- Г.А. Константин Никулов пишет: > Ага. Т.е. получается, если мы хотим вычленить целые, надо между ними натыкать %*s, чтобы показать что там может что-то быть? From sitkarev на komitex.ru Mon Dec 27 14:12:27 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Mon, 27 Dec 2010 13:12:27 +0300 Subject: [cdev] sscanf In-Reply-To: References: <4D183811.1010807@komitex.ru> Message-ID: <4D18668B.8000707@komitex.ru> Никто тебе не ответит на этот вопрос, пока ты не покажешь что у тебя в buf было. -- Г.А. Константин Никулов пишет: > А почему вообще ничего не пишет в res следующая строчка? > > res = sscanf(buf, "%i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i", &resarr[0], &resarr[1], &resarr[2], &resarr[3], &resarr[4], &resarr[5], &resarr[6], &resarr[7], &resarr[8], &resarr[9], &resarr[10], &resarr[11], &resarr[12], &resarr[13], &resarr[14], &resarr[15]); > > Я подозреваю, что длинная слишком, но мало ли. > From nateford на inbox.ru Mon Dec 27 14:26:08 2010 From: nateford на inbox.ru (=?koi8-r?Q?=EB=CF=CE=D3=D4=C1=CE=D4=C9=CE_=EE=C9=CB=D5=CC=CF=D7?=) Date: Mon, 27 Dec 2010 13:26:08 +0300 Subject: [cdev] =?koi8-r?b?KMLF2iDUxc3ZKQ==?= Message-ID: ну, ман-то я читал, но видимо не понял( потом книжку прочту, надеюсь разберусь. в buf пишутся строчки vmstat'a, по одной. Как-то: procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 1 0 0 1324440 101492 237120 0 0 28 11 42 602 3 1 96 1 -- Найди все ролики Интернета в поиске по видео http://r.mail.ru/cln5070/go.mail.ru/ ----------- следущая часть ----------- Вложение в формате HTML было извлечено… URL: From nateford на inbox.ru Mon Dec 27 14:31:40 2010 From: nateford на inbox.ru (=?koi8-r?Q?=EB=CF=CE=D3=D4=C1=CE=D4=C9=CE_=EE=C9=CB=D5=CC=CF=D7?=) Date: Mon, 27 Dec 2010 13:31:40 +0300 Subject: [cdev] =?koi8-r?b?KMLF2iDUxc3ZKQ==?= In-Reply-To: References: Message-ID: причем даже EOF туда не пишет. -- Найди все ролики Интернета в поиске по видео http://r.mail.ru/cln5070/go.mail.ru/ (http://r.mail.ru/cln5070/go.mail.ru/) _______________________________________________ cdev mailing list cdev на wiki.syktsu.ru (sentmsg?compose&To=cdev на wiki.syktsu.ru) http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev (http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev) ----------- следущая часть ----------- Вложение в формате HTML было извлечено… URL: From sitkarev на komitex.ru Mon Dec 27 15:01:34 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Mon, 27 Dec 2010 14:01:34 +0300 Subject: [cdev] =?utf-8?b?KNCx0LXQtyDRgtC10LzRiyk=?= In-Reply-To: References: Message-ID: <4D18720E.80402@komitex.ru> Очевидно что если ты прочтёшь sscanf-ом первую и вторую строку он вернёт 0 потому что ни одного совпадения там не будет. Обе строки начинаются с символов которые совсем не похожи на десятичные числа. -- Г.А. Константин Никулов пишет: > ну, ман-то я читал, но видимо не понял( потом книжку прочту, надеюсь разберусь. > > в buf пишутся строчки vmstat'a, по одной. Как-то: > > procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- > > r b swpd free buff cache si so bi bo in cs us sy id wa > > 1 0 0 1324440 101492 237120 0 0 28 11 42 602 3 1 96 1 > From sitkarev на komitex.ru Mon Dec 27 15:03:49 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Mon, 27 Dec 2010 14:03:49 +0300 Subject: [cdev] =?utf-8?b?KNCx0LXQtyDRgtC10LzRiyk=?= In-Reply-To: References: Message-ID: <4D187295.2050701@komitex.ru> Какой такой EOF позвольте поинтересоваться должен туда писать sscanf? EOF может вернуть только функция которая читает из потока, а sscanf читает из буфера. -- Г.А. Константин Никулов пишет: > причем даже EOF туда не пишет. > From nateford на inbox.ru Mon Dec 27 15:07:07 2010 From: nateford на inbox.ru (=?koi8-r?Q?=EB=CF=CE=D3=D4=C1=CE=D4=C9=CE_=EE=C9=CB=D5=CC=CF=D7?=) Date: Mon, 27 Dec 2010 14:07:07 +0300 Subject: [cdev] =?koi8-r?b?KMLF2iDUxc3ZKQ==?= In-Reply-To: <4D187295.2050701@komitex.ru> References: <4D187295.2050701@komitex.ru> Message-ID: Запомню. Но даже если так, то после этого printf("%i", res) должна выводить на экран 0, разве нет? From sitkarev на komitex.ru Mon Dec 27 15:21:18 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Mon, 27 Dec 2010 14:21:18 +0300 Subject: [cdev] =?utf-8?b?KNCx0LXQtyDRgtC10LzRiyk=?= In-Reply-To: References: <4D187295.2050701@komitex.ru> Message-ID: <4D1876AE.9060807@komitex.ru> Никто не знает что ты там написал. Как тебе могут ответить? И потом ты не поставил там конец строки, а stdout по умолчанию буферизованный по линиям -- пока не увидит символ конца строки, писать на STDOUT_FILENO не будет. Ничего она тебе не выведет поэтому. -- Г.А. Константин Никулов пишет: > Запомню. Но даже если так, то после этого printf("%i", res) должна выводить на экран 0, разве нет? From nateford на inbox.ru Mon Dec 27 15:36:37 2010 From: nateford на inbox.ru (=?koi8-r?Q?=EB=CF=CE=D3=D4=C1=CE=D4=C9=CE_=EE=C9=CB=D5=CC=CF=D7?=) Date: Mon, 27 Dec 2010 14:36:37 +0300 Subject: [cdev] =?koi8-r?b?KMLF2iDUxc3ZKQ==?= In-Reply-To: <4D1876AE.9060807@komitex.ru> References: <4D1876AE.9060807@komitex.ru> Message-ID: res = sscanf(buf, "%i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i", &resarr[0], &resarr[1], &resarr[2], &resarr[3], &resarr[4], &resarr[5], &resarr[6], &resarr[7], &resarr[8], &resarr[9], &resarr[10], &resarr[11], &resarr[12], &resarr[13], &resarr[14], &resarr[15]); printf("%i", res); а вот последнее обстоятельство я как-то упустил из виду... Сейчас этот символ на выводе поставил и все заработало как надо. Спасибо большое. Mon, 27 Dec 2010 14:21:18 +0300 письмо от "Grigoriy A. Sitkarev" : > Никто не знает что ты там написал. > > Как тебе могут ответить? > > И потом ты не поставил там конец строки, а stdout по умолчанию > буферизованный по линиям -- пока не увидит символ конца строки, писать > на STDOUT_FILENO не будет. Ничего она тебе не выведет поэтому. > > -- > Г.А. > > Константин Никулов пишет: > > Запомню. Но даже если так, то после этого printf("%i", res) > должна выводить на экран 0, разве нет? From sitkarev на komitex.ru Mon Dec 27 15:59:14 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Mon, 27 Dec 2010 14:59:14 +0300 Subject: [cdev] =?utf-8?b?KNCx0LXQtyDRgtC10LzRiyk=?= In-Reply-To: References: <4D1876AE.9060807@komitex.ru> Message-ID: <4D187F92.8030506@komitex.ru> Ещё такая просьба - писать тему, и вырезать рекламу, которую вставляет почтовый клиент. -- Г.А. Константин Никулов пишет: > res = sscanf(buf, "%i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i", &resarr[0], &resarr[1], &resarr[2], &resarr[3], &resarr[4], &resarr[5], &resarr[6], &resarr[7], &resarr[8], &resarr[9], &resarr[10], &resarr[11], &resarr[12], &resarr[13], &resarr[14], &resarr[15]); > > printf("%i", res); > > а вот последнее обстоятельство я как-то упустил из виду... Сейчас этот символ на выводе поставил и все заработало как надо. Спасибо большое. > From sitkarev на komitex.ru Mon Dec 27 16:13:07 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Mon, 27 Dec 2010 15:13:07 +0300 Subject: [cdev] =?utf-8?b?0JLRgdGC0YDQtdGH0LAgMjkt0LPQviDQtNC10LrQsNCx0YA=?= =?utf-8?b?0Y8gLS0g0JjQoSwg0YDQtdGC0YDQvtGB0L/QtdC60YLQuNCy0LAsINC90Ys=?= =?utf-8?b?0L3QtSDQuCDQsiDQsdGD0LTRg9GJ0LXQvA==?= Message-ID: <4D1882D3.4030100@komitex.ru> Приветствую всех. Это сообщение я посылал только в список Lab@, и только потом додумался что стоит продублировать в CDev@, т.к. не все подписывались на лабораторскую рассылку. Ниже копия письма, отправленного в Lab на . ------------------------------------------------------------------------- Дорогие студенты и коллеги! 29-го декабря состоится встреча с интересным человеком, моим коллегой и другом. *"Информационные системы???ретроспектива, ныне и в будущем"* Встреча проводится в рамках студенческой учебно-исследовательской лаборатории прикладной математики и программирования. Приглашаются все желающие! Краткая биография докладчика */Кусакин Евгений Викторович/*, 1968 г.р. В настоящее время директор LICARD Serbia d.o.o. Beograd (Лукойл-Интер-Кард). Сфера деятельности компании???сегмент безналичных расчётов. Экс-директор консалтинговой компании, руководил проектами комплексной автоматизации предприятий нефтегазового комплекса. Окончил: * Краснодарское Высшее Военное Командно-Инженерное Училище Ракетных Войск * Курсы Военной академии РВСН им. Ф.Э.Дзержинского По окончанию доклада???свободная дискуссия. Время и место встречи 29 декабря, 11.00, 425-я аудитория. Возможны изменения???они будут объявлены в списке рассылки Lab на . -- Г.А.