Вопрос № 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().
Отвечает: 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 Комментарий оценки: Молодец спасибо, оч подробно!
Все работало пока не появилось первое условие, тогда количество элементов попадающих между девятками различно.
А мне надо чтобы числа выводились в строки приблизительно(потому что цифры разной длины, по-моему невозможно сделать одинаковые строки, не перенося часть числа на следующую строку, а это недопустимо) одинаковой ширины.
2)И еще как выводить элементы в столбик, т.е. если меньше - то первый столбик, если больше - второй. Сложность в том, что номера элементов соответствующих условию и находящихся в одной строчке отличаются.
Отвечает: 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 (статус: Студент)
Ответ отправлен: 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 Комментарий оценки: Молодец! Спасибо! все ок