• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Классы

  • Автор темы GRAMER
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

GRAMER

Здравствуйте
Простая проблемка в классах, объясню суть.
Я создал 2 класса и они между собой почему то не могут передавать значения.
(Для примера вот два класса Car и Move, у класса Car есть переменная int speed)
если я в какой ни будь функции класса Move присвою переменной speed класса Car значение, то она не присваивается, как будто этого не было.
Почему так подскажите пожалуйста
 
P

Pasha

Для: sax_ol
Да, и надо еще подправить 25-ю и 49-ю, чтобы ворнингов не было.
 
O

Over

Во-первых. Почитай умные книжки про классы.
Во-вторых. Посмотри, как у тебя задан доступ к переменным внутри класса? PUBLIC, PROTECTED или PRIVATE?
В-третьих. Происходит ли у тебя наследование, проверь правильно ли ты обращаешься к той переменной.

P.S. Обычно все переменные внутри классов делают PRIVATE, а для работы с их значениями прописывают функции GetValue и SetValue, которые, соответственно, возвращают и присваивают значение внутренней переменной.
 
G

GRAMER

Спасибо за совет попробую, в MFC почему то всё нормально работает.
Я конечно могу скинуть код, но там очень много по этому не стал.
Самое главное что я заметил если все функции классов Move и Car разложить в разные файлы (Move.cpp) (Car.cpp) тогда они не могут передавать значения а если их всех поместить в один файл там где функция WinMain, тогда они передают почему так не пойму везде вроде поставил public:
 
E

European

Для: GRAMER
Вы, конечно, меня извините, но хватит пороть ахинею. Телепатов здесь нет. Хотите помощи - покажите конкретный код. Если Ваш код слишком большой, то сделайте тестовый пример, отражающий суть проблемы. Если Вы не цените свое время, то цените время других, кто отвечает на такие пусты вопросы. А то читая такие заявления как: <!--QuoteBegin-GRAMER+18:07:2007, 12:07 -->
<span class="vbquote">(GRAMER @ 18:07:2007, 12:07 )</span><!--QuoteEBegin-->в MFC почему то всё нормально работает
[snapback]72574" rel="nofollow" target="_blank[/snapback]​
[/quote]
от человека с такой!!! специализацией начинаешь искать ближайшую стенку со странными мыслями :)
 
G

GRAMER

Я вообще раньше не когда не использовал в WinApi Классы для этого я использовал MFC,
но так как сейчас требуется на WinApi такая ху.... появилась я решил использовать классы потому что код стал очень большой.
Код немного подрезал
В общей сложности код состоит из C++, WinApi, DirectX


Это файл Dscene.h
Код:
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
#pragma comment(lib, "winmm.lib")
#pragma comment (lib, "comctl32.lib")

#include <windows.h>
#include <d3d9.h>
#include <d3dx9.h>


class Dscene
{
public:
Dscene();

D3DPRESENT_PARAMETERS d3dpp;
D3DDISPLAYMODE d3ddm;

LPDIRECT3D9 d3d;
LPDIRECT3DDEVICE9 d3dDevice;
LPDIRECT3DVERTEXBUFFER9 d3dVBuffer;
LPDIRECT3DTEXTURE9 Texture;
LPD3DXFONT Font;

RECT FontPosition;
RECT FontPosition2;

void View();
void DeviceState();
void updateViewMatrix();
void getRealTimeUserInput(int w, int h,bool keys[256],bool clip,float Move);
void invalidateDeviceObjects(RECT rc1);
void checkp(bool keys[256]);

int wor;

HRESULT InitGeometry();
HRESULT InitD3D();

char *title;
char *title2;
};

Это файл Dscene.cpp
Код:
#include "SFunction.h"
#include "Dscene.h"
#include "resource.h"

SFunction St;

#define D3DFVF_LINES (D3DFVF_XYZ | D3DFVF_DIFFUSE)

struct FLOOR
{
FLOAT x,y,z;
DWORD color;
};



Dscene::Dscene()
{
d3dDevice = NULL;
d3d = NULL;
ZeroMemory(&FontPosition,sizeof(FontPosition));
ZeroMemory(&FontPosition2,sizeof(FontPosition2));
Texture = NULL;
d3dVBuffer = NULL;
Font = NULL;
wor=0;
}



void Dscene::View()
{

D3DXMATRIXA16 matProjection;
D3DXMatrixPerspectiveFovLH(&matProjection, 45.0f, (float)St.Width/(float)St.Height, 0.1f, 500000.0f ); Width и Height вообще не когда не бурут новые значения из класса SFunction

if(d3dDevice)
d3dDevice->SetTransform( D3DTS_PROJECTION, &matProjection );
}

void Dscene::DeviceState()
{
d3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
d3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);

d3dDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, NULL );

d3dDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
d3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
d3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
}

HRESULT Dscene::InitGeometry()
{

if (FAILED(d3dDevice->CreateVertexBuffer(64*sizeof(FLOOR),0,D3DFVF_LINES,
D3DPOOL_MANAGED,&d3dVBuffer,NULL)))
{
return E_FAIL;
}

VOID *verter;
if(FAILED(d3dVBuffer->Lock(0,sizeof(verter),(void**)&verter,0)))
return E_FAIL;
memcpy(verter,Lines,sizeof(Lines));
d3dVBuffer->Unlock();

return S_OK;
}

void Dscene::checkp(bool keys[256])
{
if (keys['P'] && !St.lr) -------->Здесь пришлось загонять через функцию так как он не берёт новое значение переменной keys. Вопрос почему ?
{

St.lr = true;
St.tr = true;
if(wor==3)
{
wor=0;
}
if(St.tr)
{
wor+=1;
}
St.tr = false;

}

if (!keys['P'])
{
St.lr = false;
}

}

D3DXVECTOR3	g_vEye(-80.0f, 80.0f, -80.0f);
D3DXVECTOR3	g_vLook(0.1f, -0.06f, 0.10f);
D3DXVECTOR3	g_vUp(0.0f, 1.0f, 0.0f);
D3DXVECTOR3	g_vRight(0.0f, 0.0f, 0.0f);

void Dscene::updateViewMatrix()
{
D3DXMATRIX view;
D3DXMatrixIdentity( &view );

D3DXVec3Normalize( &g_vLook, &g_vLook );
D3DXVec3Cross( &g_vRight, &g_vUp, &g_vLook );
D3DXVec3Normalize( &g_vRight, &g_vRight );
D3DXVec3Cross( &g_vUp, &g_vLook, &g_vRight );
D3DXVec3Normalize( &g_vUp, &g_vUp );

view._11 = g_vRight.x;
view._12 = g_vUp.x;
view._13 = g_vLook.x;
view._14 = 0.0f;

view._21 = g_vRight.y;
view._22 = g_vUp.y;
view._23 = g_vLook.y;
view._24 = 0.0f;

view._31 = g_vRight.z;
view._32 = g_vUp.z;
view._33 = g_vLook.z;
view._34 = 0.0f;

view._41 = -D3DXVec3Dot( &g_vEye, &g_vRight );
view._42 = -D3DXVec3Dot( &g_vEye, &g_vUp );
view._43 = -D3DXVec3Dot( &g_vEye, &g_vLook );
view._44 = 1.0f;

d3dDevice->SetTransform( D3DTS_VIEW, &view ); 
}

void Dscene::getRealTimeUserInput(int w, int h,bool keys[256],bool clip,float Move)
{
POINT mousePosit;
GetCursorPos( &mousePosit );

int yDirection = (w - mousePosit.x);		
int yRotation = (h - mousePosit.y);

D3DXMATRIX matRotation;

D3DXMatrixRotationAxis( &matRotation, &g_vRight, D3DXToRadian((float)-yRotation / 3.0f));
D3DXVec3TransformCoord( &g_vLook, &g_vLook, &matRotation );
D3DXVec3TransformCoord( &g_vUp, &g_vUp, &matRotation );

D3DXMatrixRotationAxis( &matRotation, &D3DXVECTOR3(0,1,0), D3DXToRadian((float)-yDirection / 3.0f) );
D3DXVec3TransformCoord( &g_vLook, &g_vLook, &matRotation );
D3DXVec3TransformCoord( &g_vUp, &g_vUp, &matRotation );

if( keys[VK_UP] )
g_vEye -= g_vLook*-Move;

if( keys[VK_DOWN])
g_vEye += (g_vLook*-Move);

if( keys[VK_LEFT] )
g_vEye -= (g_vRight*Move);

if( keys[VK_RIGHT] )
g_vEye += (g_vRight*Move);

if( keys[VK_HOME] )
g_vEye.y += Move; 

if( keys[VK_END] )
g_vEye.y -= Move;
if (St.clip)----- Здесь так вообще он не когда не обновляет значение хоть в класс SFunction меняй и не меняй значения.
{
SetCursorPos(w, h);
}
}


void Dscene::invalidateDeviceObjects(RECT rc1)
{
if(Font!=NULL)
Font->Release();

d3dpp.BackBufferWidth = rc1.right - rc1.left;
d3dpp.BackBufferHeight = rc1.bottom - rc1.top;
d3dpp.BackBufferFormat = d3ddm.Format;
d3dpp.BackBufferCount = 1;
d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
d3dpp.Windowed = true;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;

HRESULT hr = d3dDevice->Reset( &d3dpp );
if( hr == D3DERR_INVALIDCALL )
{
MessageBox( NULL, "Невозможно обновить сцену","ERROR", MB_OK | MB_ICONEXCLAMATION );
}

View();
D3DXCreateFont(d3dDevice, 15, 0, 0, 1, 0, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH | FF_DONTCARE, "Arial", &Font);

DeviceState();
}
Это файл SFunction.h
Код:
#include <windows.h>
#include <d3d9.h>
#include <d3dx9.h>
#pragma once

class SFunction
{
public:
SFunction();
HWND hwnd;
HWND hwndp;

POINT pn;


RECT rc1;

HACCEL CreateAccelerators();

int Width;
int Height;
int w;
int h;
int xPos;
int yPos;

bool lp,la,le[20];
bool lr;
bool tr;
bool keys[256];
bool clip;
bool Fly;
bool TDest;
bool Dest;
bool Floor;

char FrPS[20];
char szBuf[20];

float Move;

short zDelta;

int CreateMenuItem(HMENU hmenu, char *str,UINT uID, UINT wID ,HMENU hSubMenu,int ms);

void FPS();
void Clean();
void MWheel(short zDelta);
void WindowRect();
void MakeWindow();
void PressButton();

};
Это файл SFunction.cpp
Код:
#include "Dscene.h"
#include "SFunction.h"
#include "3DSLoad.h"

DSLoad dsl;
Dscene Ds;

SFunction::SFunction()
{
Width = 1024;
Height = 768;
Move = 0.5f;
w = 0;
h = 0;
clip = false;
zDelta = NULL;
ZeroMemory(&keys,sizeof(keys));
Fly = NULL;
xPos = 0;
yPos = 0;
ZeroMemory(&FrPS,sizeof(FrPS));
TDest = NULL;
Dest = NULL;
Floor = true;
}

void SFunction::MWheel(short zDelta)
{
if (zDelta > 0)
{
Move += Move+Move/3;
}
else
{
if ( Move<0.00001f )
{
Move = 0.0000000001f;
}
else
{
Move -= Move/3;
}
}


}

void SFunction::PressButton()
{
RECT rc;

GetWindowRect(hwnd,&rc);
rc.top = rc.top + 50;
rc.left = rc.left + 5;
rc.right = rc.right - 15;
rc.bottom = rc.bottom - 20;


Ds.checkp(keys);

if (keys['F'] && !le[0])
{
le[0] = true;
le[1] = true;
if(le[1])
SendMessage(hwnd,WM_COMMAND,2001,0);


}

if (!keys['F'])
{
le[0] = false;
}

if (keys['Q'] && !la)
{
la=true;
le[2]=true;
if(le[2])
SendMessage(hwnd,WM_COMMAND,2005,0);

}

if (!keys['Q'])
{
la=false;
}

if (keys[VK_ESCAPE] && !lp)
{
lp=true;
Fly=!Fly;

if (!Fly)
{
clip = false;
ClipCursor(NULL);
SetCursorPos(pn.x, pn.y);
ShowCursor(true);

}
else
{
GetCursorPos(&pn);
ShowCursor(true);

w = xPos + Width / 2;
h = yPos + Height / 2;


SetCursorPos(w, h);
clip = true;
if (clip)
{
ClipCursor(&rc);
}


}

}

if (!keys[VK_ESCAPE])
{
lp=false;
}

}


void SFunction::Clean()
{
if (Ds.d3dDevice!=NULL)
{

Ds.d3dDevice->Release(); ------------------> Вот здесь не происходит очистка потому что он думает что он пустой хотя нет, он взял первые значения каторые были при создании этого класса и стех пор больше ни когда не обновляет, почему так и так везде.
}


if (Ds.d3d!=NULL)
Ds.d3d->Release(); ------> Здесь

if (Ds.d3dVBuffer!=NULL)
Ds.d3dVBuffer->Release(); ------> Здесь

if (Ds.Texture!=NULL)
Ds.Texture->Release(); ------> Здесь

if (dsl.d3dVBuffer != NULL) ------> Здесь
{
MessageBox(NULL,"OK","OK",MB_OK);
dsl.d3dVBuffer->Release();
}

if (dsl.d3dIBuffer!=NULL)
dsl.d3dIBuffer->Release(); ------> Здесь

if (Ds.Font!=NULL) ------> Здесь

Ds.Font->Release(); ------> Здесь

Ds.title = 0;
Ds.title2 = 0;
DestroyWindow(hwndp);
}

void SFunction::FPS()
{
static float FPS = 0.0f;
float nextSecond = 0.0f;
static float prevSecond = 0.0f;

FPS++;

nextSecond = GetTickCount() * 0.001f;				

if(nextSecond - prevSecond > 1.0f)
{
prevSecond = nextSecond;
wsprintf(FrPS, "FPS: %d", int(FPS));
FPS = 0;
}
}


void SFunction::WindowRect()
{
GetWindowRect(hwnd,&rc1);
if (TDest)
{
rc1.top = 0;
}
else
{
rc1.top = 31;		
}
rc1.left = 160;
rc1.right = Width;
if (!Dest)
{
rc1.bottom = Height-20;	
}
else
{
rc1.bottom = Height;
}
}

Вот почему он значения не обновляет ?
 
E

European

Да уж... Чужое время Вы точно не цените...
 
E

European

Лень детально разбираться в 10Кб кода, но с первого взгляда видно, что в разных классах идет работа с разными объектами
 
P

Pasha

Для: GRAMER
Я, конечно, гуру только в C#, но блин для "получения новых значений из класса" нужно сначала эти значения присвоить полям объекта. Где строчки вида "Width =", "Height =", "d3dDevice = new ..."?
И вообще, может это покажется странным, но в C++ классы из кода создавать нельзя. Можно создавать объекты классов. И блин передавать bool keys[256] и спрашивать "а чего оно не поменялось" ... почитайте про передачу параметров в функию по значению, по ссылке, про указатели, про ... почитайте любую книгу по C.
 
E

European

<!--QuoteBegin-Pasha+18:07:2007, 15:14 -->
<span class="vbquote">(Pasha @ 18:07:2007, 15:14 )</span><!--QuoteEBegin-->в C++ классы из кода создавать нельзя.
[snapback]72602" rel="nofollow" target="_blank[/snapback]​
[/quote]
Что-то я не понял что имелось в виду

<!--QuoteBegin-Pasha+18:07:2007, 15:14 -->
<span class="vbquote">(Pasha @ 18:07:2007, 15:14 )</span><!--QuoteEBegin-->Где строчки вида "Width =", "Height =", "d3dDevice = new ..."?
[snapback]72602" rel="nofollow" target="_blank[/snapback]​
[/quote]
Это секретный код, типа собственность автора :)<!--QuoteBegin-Pasha+18:07:2007, 15:14 -->
<span class="vbquote">(Pasha @ 18:07:2007, 15:14 )</span><!--QuoteEBegin-->почитайте любую книгу по C.
[snapback]72602" rel="nofollow" target="_blank[/snapback]​
[/quote]
Вот это точно
 
P

Pasha

<!--QuoteBegin-European+18:07:2007, 15:40 -->
<span class="vbquote">(European @ 18:07:2007, 15:40 )</span><!--QuoteEBegin-->Что-то я не понял что имелось в виду
[snapback]72606" rel="nofollow" target="_blank[/snapback]​
[/quote]Имелось в виду, что экзепляры классов и классы - это разные вещи.
 
G

GRAMER

Width , Height Это я передою размеры окна что бы вид взляда был точным.

почитайте любую книгу по C.

Уже много читал, только чего такого не находил. Ладно всё равно спасибо !
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!