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

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


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

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

Выпуск № 720
от 24.04.2007, 22:35

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


Вопрос № 83182: Здравствуйте, Эксперты! Подскажите как правильно, т.е. проще возвести выражение в квадрат? И что означает **, это тоже самое, что и pow(), или есть какая-то разница. Можно ли обойтись без pow(). Поскорее ответьте, время не ждет!...
Вопрос № 83184: уважаемые эксперты возможно ли 1) упростить выражение 1.373681 *(((521*X + 259)mod65536 + 32768 )mod65536- 32768)/ 32768 = ? 2)можно ли преобразовать его в целочисленное без потерь точности или с незначительным округлением (допустим...
Вопрос № 83203: Здрасьте всем! Я запускаю одну из своих функций в потоке AfxBeginThread(func,0); Вопрос: все работает нормально, но у меня в функции помещенной в поток происходит присвоение значений некоторым внешним переменным, если работать без потока т о ...
Вопрос № 83209: Здравствуйте, Эксперты! 1)Как вывести заначения построчно! Суть кода такова: Есть цикл(0-79): cout<<x[z]<<','<<y[z]<<'('<<l<<')'<<';'; if(l<r) if((i%9)==0&&i>1)cout<<' '; ...
Вопрос № 83222: Здравствуйте! Пишу на С++. Пусть имеется некая локальная (сетевая) база данных. В программе производятся вычисления. Допустим информация которую мне нудно передать в базу данных выглядит следующим образом: "Выключение питания произо...
Вопрос № 83335: Привет всем! У меня есть функция void CPrDialog::Funk() { /........ /........ Cstring str; AfxBeginThread(anotherfunk,0); UpdateData(0); } Получается что UpdateData срабатывает раньше чем завершается откры...

Вопрос № 83.182
Здравствуйте, Эксперты!
Подскажите как правильно, т.е. проще возвести выражение в квадрат?
И что означает **, это тоже самое, что и pow(), или есть какая-то разница.
Можно ли обойтись без pow().

Поскорее ответьте, время не ждет!
Отправлен: 18.04.2007, 23:10
Вопрос задал: Patriotix-N (статус: 3-ий класс)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Ilkras
Здравствуйте, Patriotix-N!
Здравствуйте, Patriotix-N!
Правильно - pow() и ** это одно и то же. Проще всего возвести число в квадрат умножая его на себя. Это будет наверняка эффективнее вызова функции pow(). Если число является степенью двойки, то еще быстрее будет умножать пользуясь сдвигами.
Ответ отправил: Ilkras (статус: 7-ой класс)
Ответ отправлен: 18.04.2007, 23:31
Оценка за ответ: 5
Комментарий оценки:
Большое спасибо!
Хотелось бы отметить, что я не случайно написал:"выражение", т.к. не всегда удобно дважды переписывать(копировать) одно и то же выражение. Во-первых долго, во-вторых портиться удобочитаемость кода.

Отвечает: PAN1N
Здравствуйте, Patriotix-N!

** - это двойной указатель, никакого отношения к pow не имеет. А чем pow не нравится? Подключаете math.h и пвперед
Ответ отправил: PAN1N (статус: 2-ой класс)
Ответ отправлен: 19.04.2007, 10:20
Оценка за ответ: 5
Комментарий оценки:
Спасибо за пояснение!

Отвечает: kool
Здравствуйте, Patriotix-N!
Чтобы возвести выражение в квадрат нуно
вычислить его значение и присвоить это значение
некот. переменной, а затем умножить эту переменную
на себя же родную. В C++ операция ** не то же самое,
что и функция pow().
Удачи!


---------
I am.
Ответ отправил: kool (статус: Студент)
Ответ отправлен: 19.04.2007, 12:42
Оценка за ответ: 4
Комментарий оценки:
Спасибо! Но вычислить значение, присвоить переменной, это же сколько переменных получается.

Отвечает: Mister Vova
Здравствуйте, Patriotix-N!
** это смотря где
* очини перегружена
Но точно не ** квадрат

---------
Всё про Себя Тут Www.SahajaYoga.Ru
Ответ отправил: Mister Vova (статус: 2-ой класс)
Ответ отправлен: 19.04.2007, 16:58
Оценка за ответ: 1
Комментарий оценки:
Чего-то я не пойму, про что ответ то. Я не понял абсолютно ничего.


Вопрос № 83.184
уважаемые эксперты
возможно ли
1) упростить выражение
1.373681 *(((521*X + 259)mod65536 + 32768 )mod65536- 32768)/ 32768 = ?
2)можно ли преобразовать его в целочисленное без потерь точности или с незначительным округлением (допустимо умножение на любое целое число но делить можно только на число равное степени 2)

3) коммутативны ли операции: mod , / , *
и какие есть формулы вида
(a mod b)/c = (a*c)mod b - чтобы можно было избавиться от деления

разумеется mod -это целочисленный остаток деления :-)
спасибо
Отправлен: 18.04.2007, 23:40
Вопрос задал: Texnokrat (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 7)

Отвечает: kool
Здравствуйте, Texnokrat!
1)Если скобки расставлены правильно и
подходить с позиций C++, то можно написать так:
DWORD a=
((521*X + 259)&0xFFFF+ 32768 )&0xFFFF- 32768;
float b=1.373681 *a;
float c=b/32768;
Здесь лучше выполнять деление на сопроцессоре.
Если же ты забыл поставить еще пару скобок,
(а скорее всего так и есть), т.е.
1.373681 *
((((521*X + 259)mod65536 + 32768 )mod65536- 32768)/32768),
то можно сделать так:
DWORD d=a>>15;c=1.373681*d;
2)Бинарная операция назывется коммутативной, если
ее результат не изменяется при обмене значений операндов.
Так что коммутативными из указанных будут только
умножение и mod.
3) Если выражение (a mod b)/c=x предполагает,
что все операции производятся по модулю b, тогда
все сводится к решению уравнения cx=a(mod b),
кот. не всегда имеет решения.
В другом случае никаких хитрых формул нет,
кроме как в реализации на двоичных устройствах.
Удачи!

---------
I am.
Ответ отправил: kool (статус: Студент)
Ответ отправлен: 19.04.2007, 12:42
Оценка за ответ: 4
Комментарий оценки:
результат должен быть целочисленным как и умножение
то есть представить / степень 2 но максимально приближенным к истинному выражению

я думал что если уменьшить кол-во операций то точность преобразованного выражения - увеличится то есть погрешность замены
1.373681*большое целое= целое уменьшиться
а вы просто переписали выражение в си- нотацию

по3) вопросу просто пытался избавиться от деления преобразовав к эквивалентному но как я понял это -некорректно?
и слышал еще про китайскую теорему об остатках - тут не катит?


Вопрос № 83.203
Здрасьте всем!
Я запускаю одну из своих функций в потоке AfxBeginThread(func,0);
Вопрос: все работает нормально, но у меня в функции помещенной в поток происходит присвоение значений некоторым внешним переменным, если работать без потока т о переменным рисваиваются значения , а если в потоке то почему-то нет???
Вопрос: Наверно знаете что один из параметров AfxBginThread() это указатель на функцию UINT func(LPVOID pP), т.е. в эту фунцию надо поместить ту функцию которая должна будет работать отдельном потоке....
UINT func(LPVOID pP)
{
main(int x,int y);
}

так что мне x,y глобальными делать раз у func(LPVOID pP) один параметр и тот не понятный?

Отправлен: 19.04.2007, 07:02
Вопрос задал: Tatarin (статус: 2-ой класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: kool
Здравствуйте, Tatarin!
Вот так вот
UINT func(LPVOID pP)
{
main(int x,int y);
}
делать не надо.
Вместо main назови эту ф-цию по другому.
Ну и сделай их глобальными, что сильно обламывает?


---------
I am.
Ответ отправил: kool (статус: Студент)
Ответ отправлен: 19.04.2007, 18:49
Оценка за ответ: 5
Комментарий оценки:
Вот тебе пЯтерка спасибо молодец

Отвечает: Ilkras
Здравствуйте, Tatarin!
1) проверьте, что глобальные переменные определены только в одном файле (модуле), а в остальных продекларированы как внешние.
пример:
file1.c
int var;

file2.c
extern int var;
2)
В качестве аргумента обычно передают указатель на объект, который хранит данные.
Например, вы определяете тип структуры, содержащей аргументы вашей реальной функции; аллокируете такую структуру, заполняете ее правильными значениями и передаете указательна нее в AfxBginThread; внутри вашей функции вы используете величины и освобождаете память выделенную под вышеупомянутую структуру.
Для передачи параметра вам понадобится кастировать типы:
typedef struct {int a, b;} myType;
myType * pO = (myType*) malloc(sizeof(myType)); // casting
void * pP = (void*)pO; //casting; before passing the argument to the thread
myType * pO2 = (myType *)pP;// casting inside the thread
Ответ отправил: Ilkras (статус: 7-ой класс)
Ответ отправлен: 20.04.2007, 17:15
Оценка за ответ: 5
Комментарий оценки:
Молодец спасибо, оч подробно!


Вопрос № 83.209
Здравствуйте, Эксперты!
1)Как вывести заначения построчно! Суть кода такова:
Есть цикл(0-79):
cout<<x[z]<<','<<y[z]<<'('<<l<<')'<<';';
if(l<r)
if((i%9)==0&&i>1)cout<<' ';

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

2)И еще как выводить элементы в столбик, т.е. если меньше - то первый столбик, если больше - второй. Сложность в том, что номера элементов соответствующих условию и находящихся в одной строчке отличаются.

Ответьте хоть на один вопрос!
Отправлен: 19.04.2007, 08:10
Вопрос задал: Patriotix-N (статус: 3-ий класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 12)

Отвечает: Mister Vova
Здравствуйте, Patriotix-N!
1) если я правильно понял
То printf( “ %5d %5d %5d”,x[z],y[z],l ) ; поможет
2)
Воспользуйся дополнительной памятью ( 2 массивами )
// пример
int MinArr[100], MaxArr[100], NMin,NMax;

For (int i=0;i<100;i++ )
{ //
if ( i<=NMin ) cout<< MinArr[i];
else cout<<” ”;
if ( i<=NMax ) cout<< MaxArr[i];
}

---------
Всё про Себя Тут Www.SahajaYoga.Ru
Ответ отправил: Mister Vova (статус: 2-ой класс)
Ответ отправлен: 19.04.2007, 17:39

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

= = =
Ответ перенесен в мини-форум вопроса
= = =
[Климова М.]
---------
I am.
Ответ отправил: kool (статус: Студент)
Ответ отправлен: 19.04.2007, 18:49


Вопрос № 83.222
Здравствуйте!
Пишу на С++.
Пусть имеется некая локальная (сетевая) база данных. В программе производятся вычисления. Допустим информация которую мне нудно передать в базу данных выглядит следующим образом:
"Выключение питания произошло в 10:12:34 04.04.04"
1. Как передать это сообщение в БД целиком.
2 Как передать сообщение в БД допустим в 3 разные столбца:
Выключение питания произошло в 10:12:34 04.04.04

Как реализовать это с помощью компонент Билдера и как реализовать без компонент,если приложение будет консольным?

В конкретном случае имею дело с БД Oracle. Жду Ваших советов
Отправлен: 19.04.2007, 09:39
Вопрос задал: Holyman (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: kool
Здравствуйте, Holyman!
*****
Ответ удален и перемещен в ветку форума «О деятельности экспертов и работе портала» - «Удаленные ответы для обсуждения»
*****
[Климова М.]
= = =
Ответ не является ответом на поставленный вопрос.


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


Вопрос № 83.335
Привет всем!
У меня есть функция
void CPrDialog::Funk()
{
/........
/........
Cstring str;
AfxBeginThread(anotherfunk,0);
UpdateData(0);
}

Получается что UpdateData срабатывает раньше чем завершается открытый рабочий поток, что влияет на str потому что именно в потоке str присваевается значение. Что делать, если функция в новом потоке не может вызвать UpdateData(0) т.к. не является методом CPrDialog?
Отправлен: 19.04.2007, 20:29
Вопрос задал: Tatarin (статус: 2-ой класс)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 4)

Отвечает: Jadd
Здравствуйте, Tatarin!
Ну правильно у Вас работает. Процедура что делает? Запускает поток на выполнение.Т.е. все условия в этой процедуре выполнены.Потому у Вас переменная и не заполняется. Еще и память течет наверное. Надо после AfxBeginThread поставить WaitForSingleObjectEx и передать туда хэндл потока. Тогда Вы получите то, чего хотели.

Успехов.
---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Профессионал)
Адрес: Санкт-Петербург
WWW: http://www.sport-diary.ru
----
Ответ отправлен: 19.04.2007, 20:48
Оценка за ответ: 3
Комментарий оценки:
пишите подробнее Не помогло!

Отвечает: kool
Здравствуйте, Tatarin!
Нужно использовать
синхронизацию потоков.
Например, с помощью ф-ции
WaitForSingleObject и объектов
синхронизации такими как мьютексы,
события, семафоры или критические секции.
Быстрее будет работать с критическими секциями.
Удачи!

---------
I am.
Ответ отправил: kool (статус: Студент)
Ответ отправлен: 19.04.2007, 21:01
Оценка за ответ: 5
Комментарий оценки:
Спасибо иду читать литру

Отвечает: Ilkras
Здравствуйте, Tatarin!
Можно подождать окончания потока:
CWinThread* pObj = AfxBeginThread();
...
WaitForSingleObject(pObj->m_hThread );
UpdateData(0);
Ответ отправил: Ilkras (статус: 7-ой класс)
Ответ отправлен: 19.04.2007, 21:28
Оценка за ответ: 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
Авторские права | Реклама на портале
Версия системы: 4.50 (beta) от 15.04.2007
Яндекс Rambler's Top100

В избранное