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

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


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

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

Выпуск № 563
от 25.10.2006, 10:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 405, Экспертов: 51
В номере:Вопросов: 5, Ответов: 10


Вопрос № 59441: Здравствуйте господа эксперты! Какими способами можно зделать так, чтобы окно при перетаскивании не вылезало за границы экрана? P/S: Работаю в C++Builder. Заранее благодарен....
Вопрос № 59461: Существуют ли *бесплатные* С++ компиляторы, с поддержкой ODBC или аналогичных средств абстрагирования от БД в Windows? Заранее спасибо!...
Вопрос № 59513: const int name_func(...) const Что это означает?Обьясните , пожалуйста ,этого прототипа.Обьясните , пожалуйста в примерах.Заранее Вам благодарю. ...
Вопрос № 59527: zdrastvuite,kak mne podkliucit DLL'ku ciuzoj programy k sebe v programu stob ispolzovat ejo funkcyji.Spasibo.....
Вопрос № 59559: Зравствуете уважаемы эксперты. 1)Скажите в чем разница между ссылкой и указателем? Мне нужно сложить в функции 2 массива, и вернуть результирующий массив в основную программу. Если использовать указатели у меня возникает проблема его вернуть ...

Вопрос № 59.441
Здравствуйте господа эксперты! Какими способами можно зделать так, чтобы окно при перетаскивании не вылезало за границы экрана?
P/S: Работаю в C++Builder.
Заранее благодарен.
Отправлен: 19.10.2006, 09:36
Вопрос задал: Goretsky Anton (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Tek
Здравствуйте, Goretsky Anton!
Не знаю как это событие называется в Builder'е, возможно OnMoving но Необходимо перехватывать событие WM_MOVING, одним из его параметров передется RECT структура, в которой содержатся границы окна в экранных координатах. Определить, если границы выходят за экран - перемещать окно к границе экрана за которую оно вышло.
Определить размеры экрана - GetSystemMetrics(int) с параметрами SM_CXSCREEN и
SM_CYSCREEN
Что касаемо параметров события - в билде могут быть отличия - уже не помню - см. Help
---------
WinApi - жутко неудобные костыли, MFC и VCL - немногим полезнее, но ничего лучше еще не создано
Ответ отправил: Tek (статус: 1-ый класс)
Ответ отправлен: 19.10.2006, 09:53
Оценка за ответ: 5
Комментарий оценки:
Спасибо! Буду пробовать.

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

Добавлю: размер рабочей области экрана (с учетом разных панелей, taskbar'а и пр.) можно получить функцией SystemParametersInfo с параметром SPI_GETWORKAREA.
Удачи!
Ответ отправил: Sergey A. Wedensky (статус: 6-ой класс)
Ответ отправлен: 19.10.2006, 10:10
Оценка за ответ: 5
Комментарий оценки:
Спасибо! Буду пробовать.


Вопрос № 59.461
Существуют ли *бесплатные* С++ компиляторы, с поддержкой ODBC или аналогичных средств абстрагирования от БД в Windows?
Заранее спасибо!
Отправлен: 19.10.2006, 12:30
Вопрос задал: Стас М. (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

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

*Бесплатные* С компиляторы существуют. Собственно, сами компиляторы
почти все бесплатные, в т.ч. и от Microsoft.
ODBC - это API, набор функций (начинающихся с SQL...), предоствляемый
ОС (в Odbc32.dll, Odbccr32.dll).
С помощью ODBC API Вы можете общаться с любой БД (имеющей
ODBC-драйвер) на уровне стандартных вызовов. Функции ODBC API Вы
можете вызвать, пользуясь любым компилятором.
Если Вы имели ввиду библиотеки (DAO в MFC и др.) и средства разработки
(IDE), то это другое дело.
Ответ отправил: Sergey A. Wedensky (статус: 6-ой класс)
Ответ отправлен: 19.10.2006, 12:49


Вопрос № 59.513
const int name_func(...) const
Что это означает?Обьясните , пожалуйста ,этого прототипа.Обьясните , пожалуйста в примерах.Заранее Вам благодарю.
Отправлен: 19.10.2006, 19:38
Вопрос задал: Tebriz (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

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

Обычно это объявление бывает у методов классов.

Данное объявление означает что данный метод класса возврашает целое число, которое менять нельзя, и данный метод не изменяет значения ни одного поля класса.
Ответ отправил: Melamed (статус: 7-ой класс)
Ответ отправлен: 19.10.2006, 22:03
Оценка за ответ: 4

Отвечает: Mystic
Здравствуйте, Tebriz!
Такая функция используется в классах. Чтобы случайно не изменить какие-нибудь его поля, исподьзуют 2-й const. Чаще всего используются в методах типа Get...():
class A{
int i; //Какое-нить поле
public:
const int Get_i() const { return i; }
void Set_i(int n) { i = n; }
};

Если в Get_i написать что-то типа i = 5; компилятор выдаст ошибку.
ЗЫ: Что означает первый const, думаю, понятно.
Ответ отправил: Mystic (статус: 1-ый класс)
Ответ отправлен: 20.10.2006, 19:11


Вопрос № 59.527
zdrastvuite,kak mne podkliucit DLL'ku ciuzoj programy k sebe v programu stob ispolzovat ejo funkcyji.Spasibo..
Отправлен: 19.10.2006, 20:39
Вопрос задал: Nu Ja (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Vaga
Здравствуйте, Nu Ja!

HMODULE hLib;
hLib = LoadLibrary("MyDll.dll");

вызов функций:
void (*pFunction)(int, int);
(FARPROC &)pFunction = GetProcAddress(hLib, "Function");
pFunction(0, 0);
.............................
.............................
.............................
FreeLibrary(hLib); //выгрузка библиотеки

Кроме вышеуказанного метод носит название явного подключения. Кроме того можно подключить DLL неявно и методом отложенной загрузки.
---------
Ошибка становится ошибкой, когда рождается как истина. Станислав Ежи Лец
Ответ отправил: Vaga (статус: 4-ый класс)
Ответ отправлен: 19.10.2006, 21:23
Оценка за ответ: 5

Отвечает: Melamed
Здравствуйте, Nu Ja!
Либо испльзуй функции API LoadLibrary для загрузки баблиотеки. GetProcAddress - для получения адреса функции. После того, когда надобность в библиотеки FreeLibrary, выгружает библиотеку (см приложение)

либо подключаешь библиотеку импорта твоей библиотеки. Для MSV C++

#pragma comment (lib, "MyDll.lib")

Приложение:

Ответ отправил: Melamed (статус: 7-ой класс)
Ответ отправлен: 19.10.2006, 21:32


Вопрос № 59.559
Зравствуете уважаемы эксперты.
1)Скажите в чем разница между ссылкой и указателем?
Мне нужно сложить в функции 2 массива, и вернуть результирующий массив в основную программу. Если использовать указатели у меня возникает проблема его вернуть назад. Я уже запуталась где нужно ставить знак &(взятие адреса) а где * :-( Я слышала, что мою задачу можно решить и с помощью ссылок, и что так она будет решаться проще.
2)При написании модуля, обязательно ли использовать знак #(припроцессорная операция) и вообще зачем он нужен?
3)Знает ли кто-нибудь как на С++ писать библиотеки DLL? Если это реально, самому написать библиотеку, то подкиньте пожалуйста пару ссылочек.
Отправлен: 20.10.2006, 06:53
Вопрос задала: KInika (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Vaga
Здравствуйте, KInika!

int number = 501;
int& alias_name = number; // Создать ссылку
cout << "Переменная number содержит " << number << endl;
cout << "Псевдоним для number содержит " << alias_name << endl;
alias_name = alias_name + 500;
cout << "Переменная number содержит " << number << endl;
cout << "Псевдоним для number содержит " << alias_name << endl;

пример взят здесь http://www.allk.ru/book/10/71.html
Указатель представляет собой адрес памяти, который указывает (или ссылается) на определенный участок.

можно посмотреть здесь http://www.allk.ru/book/10/77.html

Написать библиотеку самостоятельно вполне реально. Здесь хорошо все описано http://www.rsdn.ru/article/baseserv/dlluse.xml

---------
Ошибка становится ошибкой, когда рождается как истина. Станислав Ежи Лец
Ответ отправил: Vaga (статус: 4-ый класс)
Ответ отправлен: 20.10.2006, 08:22

Отвечает: Sergijj
Здравствуйте, KInika!

1) Функционально между указателем и ссылкой разницы никакой, ибо обе операции ссылаются (указывают) на ячейку памяти. Разница в интерфейсе "программист-программа" (что удобнее в данном случае: передать указатель на значение или на саму переменную; и ещё - над ссылками нельзя производить множество операций, которые возможны с указателями, поэтому иногда удобно вместо 'const *' писать '&').
Чтобы не путаться:

&myVar - получить адрес переменной myVar (ссылка);
*myVar - получить значение, которое лежит в памяти по указателю myVar (т.е. в myVar должен лежать указатель - 32-битный адрес) (указатель);

В случае с массивом всё ещё проще - в языке С/С++ имя массива и _является_указателем_, т.е. указывает на первый элемент массива:

const char string[] = {"Это массив из символов (строка)"};
char *str = (char *) string;// Это указатель на первый элемент массива символов, и, как видно из присваивания, является эквивалентом предыдущего объявления.
char *str1 = (char *) &string;// Указатель, указывающий на ячейку памяти, где лежит указатель на первый элемент массива

printf(" %s", string);// Печатаем строку
printf(" %s", str);// Печатаем ту же самую строку
printf(" %s", str1);// То же самое

char *edit1st(char *str) {// Функция, принимающая указатель на строку и возвращающая указатель на строку; меняет третий символ на прописную букву 'O'
str[2] = 'O';// Меняем третий символ (массивы нумеруются с нуля!)
*(str + 2) = 'O';// То же самое
return str;// Возвращает указатель на массив, а не сам массив (ибо последнее - жрёт много ресурсов)
};
2, 3) На остальное Вам ответил предыдущий эксперт

Успехов!
---------
Стучитесь! И Вас откопают...
Ответ отправил: Sergijj (статус: 6-ой класс)
Ответ отправлен: 20.10.2006, 10:35

Отвечает: Morgion
Здравствуйте, KInika!

1) Помимо сказанного есть ещё несколько отличий. На вскидку - указатель может указывать на людой адрес, даже на несуществующий, ссылка же является псевдонимом перемен&# 1085;ой, работая с ссылкой на переменную вы работаете с самой переменной. То есть ссылка - это второе имя.

2) Вы можете и не пользоваться директивами препроцессора, но какой в этом смысл? Дело в том, что препроцессор во время препроцессирования файла содержищего директиву in clude или define соответственно подгружает файл или делает макроподстановку, создаётся промежуточный файл (он содержит только текст для компилятора, никаких include и define там быть не может), который уже компилируется. Да - это то, как может работать любой компилятор. В частном случае немного сложнее- предкомпиляция и т.п.
Ответ отправил: Morgion (статус: Студент)
Ответ отправлен: 21.10.2006, 16:00


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

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

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

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

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала 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

В избранное