Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Macros Y Zeromemory

Iniciado por O2, 19 de Noviembre de 2003, 04:16:38 PM

« anterior - próximo »

O2

 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!

Zaelsius

 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)....

O2

 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!

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.

MChiz

 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!! ; )

O2

 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!!

MChiz

 : )))) 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!






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.