sqrt

программирование с++

Вобщем пишу програму с прыгающими шариками... среда програмирования Microsoft Visual C++ 6.0 проэкт типа Win32Application. Использую библиотеки #include "stdafx.h" #include <windows.h> В вычислениях мне нужено получать квадратный корень. Пытался подключать #include <cmath> или #include <math.h> мне выводит куча непонятных ошибок в работающем коде.

ну и сам код...
#include "stdafx.h"
#include <windows.h>
#include <cmath>
using namespace std;


const float radius = 45;
const float s = 4*radius*radius;
float sx, sy;
float x1,y1,x2,y2;
float a1, a2;
float k1, k2;
float d1, d2;

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASS wndclass;
HWND hWnd;
MSG msg;
const char asdf[] = "IA Krevetka";

wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = asdf;

RegisterClass (&wndclass) ;

hWnd = CreateWindow (asdf,
"The Hello Program",
WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow (hWnd, nCmdShow);
UpdateWindow (hWnd);

while ( !SetTimer (hWnd, 1, 40, NULL) )
if ( IDCANCEL == MessageBox ( hWnd, "fail", asdf, MB_ICONEXCLAMATION|MB_RETRYCANCEL ) )
return FALSE;

while ( GetMessage (&msg, NULL, 0, 0) )
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}

return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;

switch ( iMsg )
{
case WM_CREATE:
x1 = 50; d1 = 2; k1 = 2; a1 = 205;
x2 = 50; d2 = -2; k2 = 2; a2 = 50;
break;
case WM_TIMER:
x1 += d1;
y1 = k1*x1+a1;

if ( x1<radius )
{
d1 *= -1; k1 *= -1; a1 = y1-k1*x1;
}
if ( x1>sx )
{
d1 *= -1; k1 *= -1; a1 = y1-k1*x1;
}
if ( y1<radius )
{
k1 *= -1; a1 = y1-k1*x1;
}
if ( y1>sy )
{
k1 *= -1; a1 = y1-k1*x1;
}

x2 += d2;
y2 = k2*x2+a2;

if ( x2<radius )
{
d2 *= -1; k2 *= -1; a2 = y2-k2*x2;
}
if ( x2>sx )
{
d2 *= -1; k2 *= -1; a2 = y2-k2*x2;
}
if ( y2<radius )
{
k2 *= -1; a2 = y2-k2*x2;
}
if ( y2>sy )
{
k2 *= -1; a2 = y2-k2*x2;
}

if ( (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)<s ) //проверка на столкновение
//если это условие убрать и отключить библиотеку <math.h> то все работает.
//но прыгающие шарики будут пересекаться, а по условию нужно чтобы отталкивались
{
float k0 = (x1-x2)/(y1-y2);

float tgy1,tgy2;
tgy1 = (k1+k0)/(k1*k0-1);
tgy2 = (k2+k0)/(k2*k0-1);

float c1,c2;
c1 = d1*sqrt(k1*k1-1);

float p1,p2;
float b1,b2;

float k01,k02;
float k001,k002;

}
InvalidateRect (hwnd, NULL, TRUE);
break;
case WM_SIZE:
sx = LOWORD (lParam)-radius;
sy = HIWORD (lParam)-radius;
break;
case WM_DESTROY:
KillTimer (hwnd, 1);
PostQuitMessage (0);
break;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps);
int x = (int) x1,y = (int) y1;
Ellipse (hdc, x-radius, y-radius, x+radius, y+radius);
x = (int) x2; y = (int) y2;
Ellipse (hdc, x-radius, y-radius, x+radius, y+radius);
EndPaint (hwnd, &ps);
break;
}
return DefWindowProc (hwnd, iMsg, wParam, lParam);
}

Примечание:
если кто-то возмет - пожалуста, это я просто балуюсь для саморазвития ;-)... про ошибку - если не подключать "мат" то все работаэт кроме c1 = d1*sqrt(k1*k1-1); просто не может определить что это за функция (неизвестный прототип) при подключении ввыдает 13 ошибок...
E:\temp\123\123.cpp(9) : error C2373: 'y1' : redefinition; different type modifiers
d:\program files\microsoft visual studio\vc98\include\math.h(435) : see declaration of 'y1'
E:\temp\123\123.cpp(81) : error C2296: '-' : illegal, left operand has type 'double (__cdecl *)(double)'
E:\temp\123\123.cpp(85) : error C2296: '-' : illegal, left operand has type 'double (__cdecl *)(double)'
E:\temp\123\123.cpp(87) : error C2446: '<' : no conversion from 'const float' to 'double (__cdecl *)(double)'
There is no context in which this conversion is possible
E:\temp\123\123.cpp(87) : error C2115: '<' : incompatible types
E:\temp\123\123.cpp(89) : error C2296: '-' : illegal, left operand has type 'double (__cdecl *)(double)'
E:\temp\123\123.cpp(91) : error C2446: '>' : no conversion from 'float' to 'double (__cdecl *)(double)'
There is no context in which this conversion is possible
E:\temp\123\123.cpp(91) : error C2115: '>' : incompatible types
E:\temp\123\123.cpp(93) : error C2296: '-' : illegal, left operand has type 'double (__cdecl *)(double)'
E:\temp\123\123.cpp(116) : error C2296: '-' : illegal, left operand has type 'double (__cdecl *)(double)'
E:\temp\123\123.cpp(116) : error C2296: '-' : illegal, left operand has type 'double (__cdecl *)(double)'
E:\temp\123\123.cpp(118) : error C2296: '-' : illegal, left operand has type 'double (__cdecl *)(double)'

Примечание:
Ладно... пытаюсь подключить pow (); В справочной литературе мне пишет что необходимо подключить библиотеку "мат"... У меня проблема как раз с ней, а не с функциями. Если она имееться в какой либо другой библиотеке, пожалуста подскажите. :'-)

Примечание:
Пасиба большое, я уже догадался =) Да, действительно, проблема была имено в этом.
Ответы:
а pow не работает ?
Никто эту простыню читать не будет. Какие ошибки, в каких строках? Конкретно.
А если кто всё это наладит и выдаст за своё?
1. подключи математическую библиотеку (см. в опциях проекта).
2. Убери using namespace std; вместо неё напиши using std::<function>. Судя по первой ошибке там конфликт имен.
либо уберите using namespace std;
либо замените y1 на что-нибудь более конкретное
либо попробуйте math.h вместо cmath
либо перейдите на любой нормальный компилятор, который в стандартной библиотеке не затрагивает такие имена, как y1 (gcc, intel c++ compiler)
Попробуй начни с первой ошибки


14 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.