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

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


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

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

Выпуск № 550
от 12.10.2006, 03:35

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


Вопрос № 57890: Здравствуйте уважаемые эксперты! У меня такой вопрос. Есть программы которые работают без установки и с установкой. Чем обусловлена такая разница. Как правило именно большие программы устанавливаются. Какие привелегии дает программисту именно...
Вопрос № 57892: Здравстуйте господа эксперты! У меня такие вопросы: 1.Как в builder-е можно сделать, чтобы перетаскивать форму не только за заголовок, а удержывая мышью в любом месте на форме. 2. Как можно избваться от окна - то есть у меня на окне находять...
Вопрос № 57894: Есть программа, работающая с COM-портом. Периодически (по таймеру) она : 1. Открывает порт 2. Производит обмен данными по COM-порту (запись - чтение) 3. Закрывает порт. Как бы сделать так, чтобы две копии программы могли одновременно ...
Вопрос № 57944: Здравствуйте, уважаемые эксперты. Вопрос следующий: есть указатель на блок памяти Buffer типа void*. В этом блоке уже содержатся некоторые данные, однако занята не вся память. Надо дописать в этот же блок что-то ещё, не затирая при этом старые данные...
Вопрос № 57957: Здравствуйте уважаемые эксперты. Считается, что С++ язык программирования для UNIX(а Линукс это Юникс подобная ОС). Вопрос в следующем - любая ли программа(win32 console application), написанная на С++ пойдет на Линуксе. Заранее спасибо. ...
Вопрос № 57986: Здравствуйте, Уважаемые. Надо мне решить задачу: редактор mp3-тэгов. Значит, всю информацию хочу сначала записать в структуру, сохранить там и выдать на экран. По заданию надо ещё добавить возможность изменять инфу о тэге, но это потом....

Вопрос № 57.890
Здравствуйте уважаемые эксперты!
У меня такой вопрос.
Есть программы которые работают без установки и с установкой. Чем обусловлена такая разница. Как правило именно большие программы устанавливаются. Какие привелегии дает программисту именно такой тип программ.
2. У меня есть программа - база данных о клиентах. Она представляет собой установочную версию. У меня возникла необходимость всегда иметь базу при себе, и я решил проверить работу программы просто скопировав ее папку на флешку. Все работает. Зачем тогда была нужна установочная версия?
Отправлен: 06.10.2006, 11:39
Вопрос задал: Valeraorg (статус: 3-ий класс)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: dentist
Здравствуйте, Valeraorg1!
моё скромное имхо:
вопрос в удобстве и прихоти программиста.
для меня лично, установка ПО, это ни больше ни меньше, регистрация в системе.
а зачем мне нужна регистрация в системе? разве что для возможности глупым юзверем "корректного" удаления программы (лишь в том случае, если вы активно юзали реестр).
не судите строго, это всего лишь имхо ;)
---------
"Software is like sex, it's better then it's free" (c) Linus Torvalds
Ответ отправил: dentist (статус: 5-ый класс)
Ответ отправлен: 06.10.2006, 11:52
Оценка за ответ: 5
Комментарий оценки:
Спасибо за мнение!

Отвечает: NextStep / www2
Здравствуйте, Valeraorg1!

Если программа использует только стандартные динамические библиотеки или носит их с собой, то установка не обязательна. Кроме того, если используется реестр - программа может вносить настройки в него по мере надобности, в таком случае установка ей тоже не нужна.

Если же предусматривается копирование динамических библиотек в системные папки, прописывание настроек в реестре сразу, а не по мере необходимости, то программе нужен инсталлятор в том или ином виде (это может быть даже bat-файл).

Инсталлятор удобен с точки зрения пользователя - удобно устанавливать, удобно сносить, в любой момент можно легко узнать установлена программа или нет.
---------
Нет правил без исключений, правило без исключения - это исключение из правил.
Ответ отправил: NextStep / www2 (статус: Студент)
Ответ отправлен: 06.10.2006, 12:28
Оценка за ответ: 5
Комментарий оценки:
Спасибо!
за проффесиональный ответ

Отвечает: Иванов Игорь Михайлович
Здравствуйте, Valeraorg1!всё это для защиты от копирования
Ответ отправил: Иванов Игорь Михайлович (статус: 2-ой класс)
Ответ отправлен: 10.10.2006, 20:52
Оценка за ответ: 1
Комментарий оценки:
И это в том числе. Но не только из-за этого. Ради этого в меньшей степени. Даже я это знаю.


Вопрос № 57.892
Здравстуйте господа эксперты! У меня такие вопросы:
1.Как в builder-е можно сделать, чтобы перетаскивать форму не только за заголовок, а удержывая мышью в любом месте на форме.
2. Как можно избваться от окна - то есть у меня на окне находяться предположим цифровые часы, а мне нужно чтобы они сущесвавали на экране сами по себе, без окна.
Заранее благодарен.
Отправлен: 06.10.2006, 11:50
Вопрос задал: Goretsky Anton (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Sergey A. Wedensky
Здравствуйте, Goretsky Anton!

1) Таскать окно за любое место можно, например, так: см. приложение.
В идеале, хорошо бы еще обрабатывать WM_CAPTURECHANGED (другое окно перехватило мышь) и завершать при этом перетаскивание.

2) "Избавиться" от окна нельзя. Что-либо отображать Вы можете только на контексте окна (DC).
Есть варианты:
а) рисовать на DC рабочего стола. Не очень хорошо, т.к. он ведь и сам себя перерисовывает, да и придется стирать (принудительно его заставлять себя перерисовывать и т.д.)
б) Есть такая функция, SetWindowRgn(). Она позволяет сделать Ваше окно любой формы (в том числе и несвязной). Т.е. отображаться будут только те пикселы, который входят в установленный Вами регион, а остальные будут "прозрачными". Для Ваших целей это, наверное, лучший вариант. Создать произвольный регион из, например, bitmap'а, можно, поигравшись функциями CreateRectRgn() и CombineRgn() или же ExtCreateRegion(). Подробнее см. MSDN (или обращайтесь, если будут затруднения).

Удачи!

Приложение:

Ответ отправил: Sergey A. Wedensky (статус: 4-ый класс)
Ответ отправлен: 06.10.2006, 12:26
Оценка за ответ: 5
Комментарий оценки:
Спасибо за помощь, то что нужно!


Вопрос № 57.894
Есть программа, работающая с COM-портом. Периодически (по таймеру) она :
1. Открывает порт
2. Производит обмен данными по COM-порту (запись - чтение)
3. Закрывает порт.
Как бы сделать так, чтобы две копии программы могли одновременно работать с одним портом?
Пытался сам разобраться с мьютексами - не получилось
Отправлен: 06.10.2006, 11:54
Вопрос задал: Алексей В. (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Sergey A. Wedensky
Здравствуйте, Алексей В.!

Два процесса открыть один порт конечно не могут, действительно нужно использовать механизмы синхронизации.

Использовать mutexы довольно легко:
В начале работы создаем mutex:

HANDLE _mutex = CreateMutex(0, FALSE, "некое имя");
Какой процесс первым вызовет, тот создаст, остальные откроют имеющийся.

Далее перед открытием порта вызываете
WaitForSingleObject(_mutex, INFINIT);

Эта функция не вернет управления потоку, пока _mutex не освободится, а тогда заберет его себе.
После закрытия порта вызываете
ReleaseMutex(_mutex);

Вот, вроде и все...
Ответ отправил: Sergey A. Wedensky (статус: 4-ый класс)
Ответ отправлен: 06.10.2006, 12:16


Вопрос № 57.944
Здравствуйте, уважаемые эксперты. Вопрос следующий: есть указатель на блок памяти Buffer типа void*. В этом блоке уже содержатся некоторые данные, однако занята не вся память. Надо дописать в этот же блок что-то ещё, не затирая при этом старые данные. Можно ли использовать в этом случае memcpy или CopyMemory? Если да, то что передавать в 1ом параметре?
Отправлен: 06.10.2006, 18:21
Вопрос задал: Mech@nic (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Melamed
Здравствуйте, Mech@nic!
Использовать функции memcpy или CopyMemory можно. В вашем случае в первом параметре должен передоваться указатель на начало записи, то указателю должно прибавлятся смещение пер 74;ого байта, куда вы хотите копировать данные.

void *p;

...
memcpy((char*)p+offset_write ...);
Ответ отправил: Melamed (статус: 5-ый класс)
Ответ отправлен: 06.10.2006, 18:34
Оценка за ответ: 5
Комментарий оценки:
Спасибо, вроде разобрался.


Вопрос № 57.957
Здравствуйте уважаемые эксперты.
Считается, что С++ язык программирования для UNIX(а Линукс это Юникс подобная ОС). Вопрос в следующем - любая ли программа(win32 console application), написанная на С++ пойдет на Линуксе.
Заранее спасибо.
С уважением, ENS.
Отправлен: 06.10.2006, 20:03
Вопрос задал: Николай Орлов (статус: 6-ой класс)
Всего ответов: 6
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: n0name
Здравствуйте, ENS!
Нет далеко не любая.
Чтобы программа компилировалась в Linux нужно не использовать WinAPI, а использовать только стандартные библиотечные функции.
Вместо CreateFile, fopen, WriteFile -> fwrite, etc...
Ответ отправил: n0name (статус: 6-ой класс)
Ответ отправлен: 06.10.2006, 20:22

Отвечает: Morgion
Здравствуйте, ENS!
А на чём по Вашему Windows написан? На Java?
С++(С) - это универсальный язык. Реализации языка С есть начиная от микроконтроллеров (где по суть нет ОС) кончая суперкомпьютерами.
Для того, что бы программа работала (точнее компилировалась и работала) под Windows и Unix, она не должна использовать специфичные функции для какой-либо ОС. То есть она использу& #1077;т ф-и, которые одинаково реализованы в разных ОС и неиспользует непортабельный код - то всё будет работать . Да - она не обязательно должна быть консольной! Пример - библиотека QT. Вообще - можно много примеров найти.
Ответ отправил: Morgion (статус: Студент)
Ответ отправлен: 06.10.2006, 20:26

Отвечает: Алексеев В.В.
Здравствуйте, ENS!
Формально существует стандарт ANSI на языкы С/С++ который гарантирует, что код, написанный в соответствии со стандартом будет скомпилирован на любом компиляторе, соответствующем стандарту. На деле выходит иначе: 1) Функции начинающиеся с символа _ (Например _kbhit()) выпущены Microsoft, в стандарт не входят и на *nix системах естественно не скомпилируются
2) Одни и те же функции в разных ОС могут быть расположены в разных заголовках и иметь разные прототипы (функции по работе с сокетами в *nix лежат в хидере sys/socket.h а в Win: winsock.h
Поэтому чтобы сделать код переносимым приходиться писать множество макросов для условной компиляции и использовать только стандартные функции. Кроме того есть еще другие нюансы.
Ответ отправил: Алексеев В.В. (статус: 1-ый класс)
Ответ отправлен: 06.10.2006, 23:11

Отвечает: dentist
Здравствуйте, ENS!
1. никогда он таковым не считался! С++ кросплатформенный язык, т.е. программы на нём могут быть написаны для большинства известных ОС.
2. нет не любая. это зависит от того как она написана. если в коде, программистом, предусмотрена компиляция под различными ОС и различными компиляторами то да.
---------
"Software is like sex, it's better then it's free" (c) Linus Torvalds
Ответ отправил: dentist (статус: 5-ый класс)
Ответ отправлен: 09.10.2006, 09:14

Отвечает: Delph
Здравствуйте, ENS!
Теоретически стандард ANSI C/C++ предполагает переносимость программ с одной реализации языка на любую другую. Однако на практике это выполняется лишь для достаточно простых учебных программ, поскольку любое коммерческое приложение очень сильно опирается на функции операционной системы и весьма активно использует сильные стороны своего "родного" компилятора. В принципе можно написать программу, которая будет одинаково успешно компилироваться разными компиляторами и даже под разными ОС - но задача весьма нетривиальная: придётся внести немало кода условной компиляции. К тому же нужно одинаково хорошо знать все версии компиляторов, под которые Вы хотите заточить свою программу.
Между прочим, весьма похожая ситуация сложилась и с SQL: вроде бы существует единый стандарт, но любая попытка оптимизации базы данных жёстко привязывает её к конкретному серверу.
Ответ отправил: Delph (статус: 2-ой класс)
Ответ отправлен: 09.10.2006, 09:18

Отвечает: Иванов Игорь Михайлович
Здравствуйте, ENS!спешу заметить что не только для Юникса и Линукса, нпример Windows написан полностью на С++, а что бы ваша программа работала на любой платформе включите компилятор Сlx,
Ответ отправил: Иванов Игорь Михайлович (статус: 2-ой класс)
Ответ отправлен: 10.10.2006, 20:33


Вопрос № 57.986
Здравствуйте, Уважаемые.

Надо мне решить задачу: редактор mp3-тэгов.
Значит, всю информацию хочу сначала записать в структуру, сохранить там и выдать на экран. По заданию надо ещё добавить возможность изменять инфу о тэге, но это потом.
Вот, собственно, вопросы:
1)Дебагер выдаёт ошибку, хотя вчера в институте всё в порядке было.
Посмотрите, пожалуйста, где ошибка.
2)Ваши советы-предложения.

Спасибо и Успехов.

Приложение:

Отправлен: 07.10.2006, 00:54
Вопрос задал: Евсеев В. Н. (статус: 3-ий класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 5)

Отвечает: Хватов Сергей
Здравствуйте, Евсеев В. Н.!

Ну, во-первых, если не предпринять дополнительных мер, компилятор выравнивает поля структур по границам слов (даже если они char[]). Я не знаю, так ли поступает ваш компилятор, но GNU C поступает именно так. Метод борьбы зависит от компилятора, но вероятно поможет директива #pragma pack(1) перед описанием структуры (и обязательно восстановите режим выравнивания после, а то может быть еще хуже :-) )

Во-вторых, id3-теги бывают двух совсем разных версий. Вы используете устаревшую и весьма ограниченную v1, да ещё и не проверяете есть ли эта запись вообще. Работать с v2 куда сложнее (а у нее еще и подверсии есть). Так что найдите какую-нибудь библиотеку для работы с тегами. Для linux есть taglib, возможно, что существует ее порт под windows

Ответ отправил: Хватов Сергей (статус: 6-ой класс)
Ответ отправлен: 08.10.2006, 13:51
Оценка за ответ: 5


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

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

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

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

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


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


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

В избранное