Buenas:
A la hora de programar siempre uso cantidad de macros para ahorrarme tener que teclear todo lo que pueda :D
Desde hace un tiempo he venido usando una macro tal que asi:
#define mZeroMemory(p) {ZeroMemory(p,sizeof(p));}
Todo para ahorrarme escribir el sizeof...
La verdad es que no me he preocupado de si la macro funcionaba correctamente o no, hasta que he intentado vaciar con ella una estructura tipo D3DPRESENT_PARAMETERS, usada para albergar la configuración del dispositivo D3D a crear:
typedef struct _D3DPRESENT_PARAMETERS_ {
UINT BackBufferWidth, BackBufferHeight;
D3DFORMAT BackBufferFormat;
UINT BackBufferCount;
D3DMULTISAMPLE_TYPE MultiSampleType;
DWORD MultiSampleQuality;
D3DSWAPEFFECT SwapEffect;
HWND hDeviceWindow;
BOOL Windowed;
BOOL EnableAutoDepthStencil;
D3DFORMAT AutoDepthStencilFormat;
DWORD Flags;
UINT FullScreen_RefreshRateInHz;
UINT PresentationInterval;
} D3DPRESENT_PARAMETERS;
Me di cuenta de que algo funcionaba mal, por que al hacer
ZeroMemory(&m_PresentParameters,sizeof(D3DPRESENT_PARAMETERS));
Se creaba correctamente el dispositivo. Sin enbargo haciendo uso de la macro
mZeroMemory(&m_PresentParameters);
era imposble crearlo. El motivo, segun vi al depurar el programa, es que la estructura se vaciaba mal, quedando m_PresentParameters.BackBufferCount=94284234; por ejemplo, con lo cual fallaba.
No se por que he tenido ese problema con esa estructura, y sin enbargo aparentemente las demas se vacian bien. ¿Esta mal la macro?, Si es asi, ¿Se puede hacer una macro similar que funcione?
Quiza el problema se de si la estructura a vaciar contiene punteros, o no se...
Si alguien sabe por que ocurre y si hay alguna manera de solucionarlo, le agradeceria mucho que me echara un cable :D
Gracias y un saludete!
Así es como se expandería la macro:
mZeroMemory(&m_PresentParameters);
---->
ZeroMemory(&m_PresentParameters,sizeof(&m_PresentParameters));
Obviamente , sizeof(&x) no es igual que sizeof(x)....
Claro, estaria pasando el tamaño del puntero, no de la estructura.
¿Entoces no hay forma de hacer una macro como la que propongo no?
Y no solo eso, si no que he estado usando la macro totalmente mal :D
Gracias ZaelSiuS!
Puede que esto sí funcionase ;)
#define MZeroMemory(p) (ZeroMemory(p,sizeof(*p))
Siendo p un puntero. No lo he probado, pero deberia funcionar, no? A ver si te sirve.
Y porque no haces un template?:
template < class Type >
void zeroMemory( Type *destination ) {
::ZeroMemory( destination, sizeof( Type ) );
}
Y luego para llamarla desde tu codigo simplemente es:
zeroMemory( &variable );
C++ es una maravilla; usemoslo!! ; )
MChiz: Muy bien resulto, si señor!!
No se me habia ocurrido :D
Usare sin dudarlo un template :) Pero que vago soy :P
Muchas gracias!! Y a ti tambien ZaelSiuS, por supuesto!!
: )))) Me alegro que te haya gustado esta solucion.
Deberiamos ir olvidando las macros, y del C en general ( siempre que sea posible ), e intentar pasarnos completamente a C++. Yo no hace mucho que estoy en el ajo, pero gracias a un compañero estoy aprendiendo muchisimo y es ahora cuando lo veo!!
Un saludote!