Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 694
от 28.03.2007, 08:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 469, Экспертов: 65
В номере:Вопросов: 7, Ответов: 13


Вопрос № 79372: Здравствуйте! Подустим мне надо записать в фаил последовательности из 17, 18, 19 бит. Допустим из 17 бит я смогу записать два байта но тогда один бит неудел, а переделывать его в байт т.е. записывать как 00000001 мне нельзя. далее мне ндо буд...
Вопрос № 79377: Здравствуйте. У меня лабораторная работа по Структурам и алгоритмам обработки данных. В системе бронирования авиационных билетов имеется следующая информация: 1) перечень рейсов; 2) список пассажиров на каждый рейс; 3) очередь...
Вопрос № 79391: Добрый день. Пытаюсь программно установить, а затем через время запустить службу (см. приложение). В менеджере у службы постоянно висит статус "запуск" - дальше дело не идет. Но устанавливая вручную через консоль [FGPathName].E...
Вопрос № 79394: После того как я создал и откомпилировал программу, файлы формата exe, сразу же после открытия закрываются. Если открывать программу через VC++ 6, то она нормально открывается. Как сделать чтобы программы открывались?...
Вопрос № 79395: Здравствуйте эксперты Подскажите пожалуста, какие средства есть в Microsoft Studio 6 и 2005 для вывада следующих графических фарматов: 1 JPG 2 Gif - анимация Как записать изображение в JPG файл с заданным качаством. Зара...
Вопрос № 79396: После того как я создал и откомпилировал программу, файлы формата exe, сразу же после открытия закрываются. Если открывать программу через VC++ 6, то она нормально открывается. Как сделать чтобы программы открывались?...
Вопрос № 79406: Привет всем! Нужно объеденить два списка L1 и L2 в список L3 (см приложение.) Или просто добавить L2 к L1 без повторения элементов из L1. Все компилится, но в список L3 ничего не добавляется. Как разрулить? ..

Вопрос № 79.372
Здравствуйте!
Подустим мне надо записать в фаил последовательности из 17, 18, 19 бит.
Допустим из 17 бит я смогу записать два байта но тогда один бит неудел, а переделывать его в байт т.е. записывать как 00000001 мне нельзя. далее мне ндо будет записывать такие последовательности... помогите как мне это сделать
Отправлен: 22.03.2007, 16:15
Вопрос задал: Tatarin (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: V1s0r
Здравствуйте, Tatarin!

Байт - наименьшая единица, по крайней мере при работе с файлами.
Можешь, к примеру сделать так.

1) Создаешь объект std::bitset (на крайняк - тупо массив char, но лучше bitset)
2) записываешь в него биты, сколько хочешь
3) записываешь в файл размер объекта bitset (т.е. количество бит, находящихся там) функцией std::bitset::size()
4) записываешь в файл сам объект bitset

При чтении, ты уже догадался, что нужно делать. Сначала узнаем размер, создадим объект bitset и считаваем в него нужное кол-во битов.

Путей реализации много. Или придётся немного повозится с побитовыми операторами или воспользоватся std::bitset::to_string...

Может кто из экспертов знает лучший способ? Было бы интересно узнать.
Для меня ещё непротоптанная тропа bitset и ostream_iterator. Возможно ли это? Тогда всё упростится до безобразия.
Ответ отправил: V1s0r (статус: 3-ий класс)
Ответ отправлен: 22.03.2007, 17:29

Отвечает: Ilkras
Здравствуйте, Tatarin!
я думаю - это невозможно. API поддерживает запись целого количества байт и, если я не ошибаюсь, файловая система ориетнирована на целое количесто байт (или больших блоков). Так что в лоб эту проблему не решишь.
С другой стороны можно "помнить" последний записаный бит в последнем байте файла и добавлять. Соответственно надо считать последний байт, подвинуть указатель записи назад на один байт, модифицировать последний байт и добавить новые байты и записать это все обратно в файл.
Модифицировать последний считаный байт будет проще всего побитно в цикле (модифицируя соответственно маску) типа: while(i++) mybyte |= (1<<i) & (newValue << someShift). someShift надо вычислять отдельно, поскольку выши новые данные начнутся наверное в первого бита, а писать вы захотите не с первого, т.е. если начальный сдвиг j, то someShift = j+i
Ответ отправил: Ilkras (статус: 5-ый класс)
Ответ отправлен: 22.03.2007, 19:26

Отвечает: kool
Здравствуйте, Tatarin!
В файл нуно записывать только те байты которые
уже ПОЛНОСТЬЮ заполнены необходимыми битами.
Тот байт, кот. еще не заполнен нуно оставлять в
какой-нибудь переменной и когда будет получена
следующая порция данных - заполнить этот байт
необходимыми битами и записать его в файл.
Последний неполный байт в потоке - просто записать в файл.
Удачи!

---------
I am.
Ответ отправил: kool (статус: Студент)
Ответ отправлен: 22.03.2007, 20:42


Вопрос № 79.377
Здравствуйте. У меня лабораторная работа по Структурам и алгоритмам обработки данных.

В системе бронирования авиационных билетов имеется следующая информация:
1) перечень рейсов;
2) список пассажиров на каждый рейс;
3) очередь пассажиров в случае, когда число заявок на билеты превышает количество мест. при бронировании имя пассажира вносится в список соответствующего рейса либо включается в очередь на данный рейс. Организовать в основной памяти указанную информацию. Перед включением в любой список провести проверку на отсутствие пассажира в данном списке. Обеспечить бинарный поиск нужного рейса и хеширование очередей пассажиров при выполнении запроса на бронирование. Ограничить величину каждой очереди количеством мест на соответствующем рейсе.
Не пойму, для чего здесь хэширование и если оно здесь действительно нужно, то как его организовать(точнее какой вид хэширования). Спасибо.
Отправлен: 22.03.2007, 16:52
Вопрос задал: Басёнов Е.С. (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: ramok
Здравствуйте, Басёнов Е.С.!

Хеширование вам тут может понадобится при поиске (хотя подозреваю что с вашими объемами данных можно было бы и не парится Ж:-), но это лабораторная значит надо).
Оно нужно для того что бы при поиске не сравнивать с все строки подрят с образцом снова и снова.
Вид хеширования можно выбрать(как я подозреваю) самый примитивный. Например каждой строке можно сопоставить чисто которое получается путем суммирования всех элементов строки.
Конечно хеши некоторыйх строк в таком случае могут совпадать. Например строки "abc" и "bca" и "cba" и так далее будут иметь одинаковую хеш фунцию. Это называется коллизии.

И теперь вместо того что бы при поиске просто сравнивать строку поиска и строку с текущим пассажиром, сначала сравниваются хеши строк. И только после того если хеши совпадают, сравниваются сами строки, что бы быть избежать коллизий. Что при больших объемах данных должно дать прирост производительности.

Ответ отправил: ramok (статус: Практикант)
Ответ отправлен: 23.03.2007, 16:04


Вопрос № 79.391
Добрый день.

Пытаюсь программно установить, а затем через время запустить службу (см. приложение). В менеджере у службы постоянно висит статус "запуск" - дальше дело не идет.
Но устанавливая вручную через консоль [FGPathName].EXE /install , а затем запуская в менеджере - всё работает.

Как правильно программно запустить службу?

Приложение:

Отправлен: 22.03.2007, 18:19
Вопрос задал: Dadrum (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: ramok
Здравствуйте, Dadrum!

Пример запуска сервиса в MSDN
http://msdn2.microsoft.com/en-us/library/ms686315.aspx

от себя добавлю что было бы неплохо посмотреть что у вас возвращает StartService() как минимум, что бы понять чего не хватало.
Ответ отправил: ramok (статус: Практикант)
Ответ отправлен: 23.03.2007, 15:43
Оценка за ответ: 4
Комментарий оценки:
StartService возвращает не 0 - всё ок (пишется лог)


Вопрос № 79.394
После того как я создал и откомпилировал программу, файлы формата exe, сразу же после открытия закрываются. Если открывать программу через VC++ 6, то она нормально открывается. Как сделать чтобы программы открывались?
Отправлен: 22.03.2007, 18:46
Вопрос задал: Baltazar (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: kool
Здравствуйте, Baltazar!
Либо запускай свою прогу в Far-е (просмотр вывода CTRL+O),
либо напиши перед закрывающейся скобкой ф-ции main так
getch();
А там где записаны
#include <- что-то -.h>
напиши
#include
Удачи!
---------
I am.
Ответ отправил: kool (статус: Студент)
Ответ отправлен: 22.03.2007, 20:42

Отвечает: Ilkras
Здравствуйте, Baltazar!
Поскольку вы не написали что ваша программа делает трудно предположить сколько времени она должна жить. Предположу что вы пишете о консольной аппликации. Может быть она выполняет себя и выгружается из памяти. В среде разработки программа запускается в консоли, которая не будет закрываться пока вы не нажмете клавишу. Можно добавить в конец вашей программы вызов функции getch() и тогда выполнив себя программа будет ждать ввода одного символа. Соответсвенно консоль останется открытой пока вы не введете этот символ.
Надеюсь, что ответил на ваш вопрос. Если нет - пишите.
Ответ отправил: Ilkras (статус: 5-ый класс)
Ответ отправлен: 23.03.2007, 11:05


Вопрос № 79.395
Здравствуйте эксперты
Подскажите пожалуста, какие средства есть в Microsoft Studio 6 и 2005 для вывада следующих графических фарматов:
1 JPG
2 Gif - анимация

Как записать изображение в JPG файл с заданным качаством.

Заранее благожарен
Отправлен: 22.03.2007, 18:48
Вопрос задал: Melamed (статус: 10-ый класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: ramok
Здравствуйте, Melamed!

Нужно использовать какую нибуть библиотеку для работы с изображениями. Самая популярная открытая библиотека например ImageMagick.

http://www.imagemagick.org/script/binary-releases.php#windows
вот ссылка на то как скачать.

http://www.imagemagick.org/script/api.php
различные интерфейсы библиотеки где можно выбрать пример
Ответ отправил: ramok (статус: Практикант)
Ответ отправлен: 23.03.2007, 00:39
Оценка за ответ: 5
Комментарий оценки:
Спасибо.
Вроде то, что мне нужно. Буду разбираться.

Отвечает: estiGi
Здравствуйте, Melamed!
И еще посомтрите такую либу , как gdiplus
Ответ отправил: estiGi (статус: Студент)
Ответ отправлен: 23.03.2007, 01:42
Оценка за ответ: 5
Комментарий оценки:
Спасибо. Буду разбираться.
Я в ее сторону уже присматриваюсь


Вопрос № 79.396
После того как я создал и откомпилировал программу, файлы формата exe, сразу же после открытия закрываются. Если открывать программу через VC++ 6, то она нормально открывается. Как сделать чтобы программы открывались?

Приложение:

Отправлен: 22.03.2007, 18:49
Вопрос задал: Baltazar (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: ramok
Здравствуйте, Baltazar!

на выбор:
1. запускайте ваше приложение из консоли (из cmd.exe)
2. запускайте ваше приложение из консольного файлового мененжрера (например FAR)
3. сделайте ярлык на вашу программу и в свойствах ярлыка укажите свойство не закрывать консоль после окончания программы
Ответ отправил: ramok (статус: Практикант)
Ответ отправлен: 22.03.2007, 19:18

Отвечает: Shkiperr
Здравствуйте, Baltazar!
Существует команда System("Pause");
Просто в конце каждого текста программ добавляйте строчку, закрываться не будет(не для всех компиляторов подходит).
Ответ отправил: Shkiperr (статус: 3-ий класс)
Ответ отправлен: 23.03.2007, 00:14

Отвечает: estiGi
Здравствуйте, Baltazar!
перед закрытием можно прописать функцию ожидания getch () (она требует подключения conio.h)
Напрмиер:

void main ()
{
... bla-bla

printf ("Press any key to continue... ");
getch ();
}

А вообще эта функция ждет нажатия любой клавиши в консоли и возвращает ее код.
Ответ отправил: estiGi (статус: Студент)
Ответ отправлен: 23.03.2007, 01:46


Вопрос № 79.406
Привет всем!
Нужно объеденить два списка L1 и L2 в список L3 (см приложение.)
Или просто добавить L2 к L1 без повторения элементов из L1.
Все компилится, но в список L3 ничего не добавляется.
Как разрулить?

Приложение:

Отправлен: 22.03.2007, 19:20
Вопрос задал: kool (статус: Студент)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: ramok
Здравствуйте, kool!

если при вызове set_union() L3 будет расширятся, то тогда такое не сработает.

необходимо использовать.
set_union(L1.begin(),L1.end(),L2.begin(),L2.end(), inserter(L3, L3.begin()));

http://core.org.ua/tmp/set_union.C.html
исходный код
http://core.org.ua/tmp/set_union.C

PS
если вы в будущем предоставлять готовый пример, а не сляпаный на коленке или взятый кусочно из другой программы, было бы очень любезно с вашей стороны. это бы явно повысило интерес отвечающих найти решение вашего вопроса Ж:-)
Ответ отправил: ramok (статус: Практикант)
Ответ отправлен: 22.03.2007, 23:45
Оценка за ответ: 5
Комментарий оценки:
Спасибо за ответ!


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: support@rusfaq.ru, Тел.: +7 (926) 535-23-31
ООО "Мастер-Эксперт Про", Москва, 2007
Авторские права | Реклама на портале
Версия системы: 4.46 от 18.03.2007
Яндекс Rambler's Top100

В избранное