[RESUELTO] Macro o ???

Iniciado por Miseryk, 7 Marzo 2014, 19:44 PM

0 Miembros y 1 Visitante están viendo este tema.

Miseryk

Hola gente, estoy tratando de lograr algo pero no puedo pensarlo en la manera que lo quiero, les explico un poco.

Tengo una variable WORD/DWORD.

Esa variable puede tomar muchos números, como:
#define defvar1 1
#define defvar2 2
#define defvar3 3

entonces, yo podría hacer un switch o un if para comparar si esa variable es defvar1,2 o 3 (tengo más defines, como 35), entonces me gustaría hacer con un macro supongo, para checkear éso, sin importar cuantos defines yo tenga.

Me gustaría ver como podrían resolverlo 1) usando macro o algo para evadir un switch grande o un if grande; 2)o la manera en que lo pensarían.

Gracias (Y)
Can you see it?
The worst is over
The monsters in my head are scared of love
Fallen people listen up! It's never too late to change our luck
So, don't let them steal your light
Don't let them break your stride
There is light on the other side
And you'll see all the raindrops falling behind
Make it out tonight
it's a revolution

CL!!!

eferion

Sin saber qué uso va a tener ese valor es complicado darte una respuesta.

Miseryk

Por ejemplo, sería un switch de 300 casos, el cual habrían 3 grupos de 100 c/u.

Con lo cual si el valor que pongo es igual a uno de los grupos, retornaría algún valor específico, como por ejemplo, si se encuentra en el 1er grupo retorna -32, si está en el 2do, 0, 3ro 40, y sí o sí tiene que estar en esos 300 casos. Osea que sí o sí va a retornar algo, -32, 0 o 40. Pero no quiero una función de 300 líneas, sinó que estaría bueno simplificarlo en un define u otra cosa rara que me lo simplifique, y teniendo en cuenta que en un futuro pueda agregar más casos a cada grupo o agregar nuevos grupos.
Can you see it?
The worst is over
The monsters in my head are scared of love
Fallen people listen up! It's never too late to change our luck
So, don't let them steal your light
Don't let them break your stride
There is light on the other side
And you'll see all the raindrops falling behind
Make it out tonight
it's a revolution

CL!!!

eferion

Si no es más que hacer una conversión puedes meter todos los valores en un vector y que el índice sean los valores del "define"


int conversor[MAX_DEFVAR];
conversor[defvar1] = -32;
conversor[defvar2] = -32;
// ...

int indice = defvar2;
int valor = conversor[indice];


Si el vector lo dejas estático solo tienes que construirlo una vez.

Miseryk

Cita de: eferion en  7 Marzo 2014, 20:43 PM
Si no es más que hacer una conversión puedes meter todos los valores en un vector y que el índice sean los valores del "define"


int conversor[MAX_DEFVAR];
conversor[defvar1] = -32;
conversor[defvar2] = -32;
// ...

int indice = defvar2;
int valor = conversor[indice];


Si el vector lo dejas estático solo tienes que construirlo una vez.

Sí, pero los defvar pueden cambiar de valory tendría que ir a cada uno y poner el valor actual que correspando (raro caso pero posible), inclusive aunque no cambiaran los valores, tendría que hacer 300 líneas de éso :|
Can you see it?
The worst is over
The monsters in my head are scared of love
Fallen people listen up! It's never too late to change our luck
So, don't let them steal your light
Don't let them break your stride
There is light on the other side
And you'll see all the raindrops falling behind
Make it out tonight
it's a revolution

CL!!!

eferion

Cita de: Miseryk en  7 Marzo 2014, 20:59 PM
Sí, pero los defvar pueden cambiar de valory tendría que ir a cada uno y poner el valor actual que correspando (raro caso pero posible), inclusive aunque no cambiaran los valores, tendría que hacer 300 líneas de éso :|

si defvar1 está declarado como

#define defvar1 1

Ya te digo yo que defvar1 no va a cambiar su valor, al menos, hasta que no recompiles la aplicación.

Y tu eliges si crear un vector de 300 líneas... o un switch de 300 líneas. Si tienes 300 casos o buscas formas de optimizar ( por ejemplo agrupando por rangos de valores ) o tienes que poner todos los casos de forma explícita.

Miseryk

#6
Oh yeah, lo logré, pero, a mi manera:

Código (cpp) [Seleccionar]

#include <Windows.h>
#include <iostream>

using namespace std;

#define WFS_STAT_DEVONLINE                      (0)
#define WFS_STAT_DEVOFFLINE                     (1)
#define WFS_STAT_DEVPOWEROFF                    (2)
#define WFS_STAT_DEVNODEVICE                    (3)
#define WFS_STAT_DEVHWERROR                     (4)
#define WFS_STAT_DEVUSERERROR                   (5)
#define WFS_STAT_DEVBUSY                        (6)
#define WFS_STAT_DEVFRAUDATTEMPT                (7)
#define WFS_STAT_DEVPOTENTIALFRAUD              (8)

//0 4 8 12 16
//0 1 3 5 7
const int NUMBERS2[] = { -13, WFS_STAT_DEVOFFLINE, WFS_STAT_DEVNODEVICE, WFS_STAT_DEVUSERERROR, WFS_STAT_DEVFRAUDATTEMPT};

#define IS_INDEXABLE(arg) (sizeof(arg[0]))
#define IS_ARRAY(arg) (IS_INDEXABLE(arg) && (((void *) &arg) == ((void *) arg)))
#define ARRAYSIZE(arr) (IS_ARRAY(arr) ? (sizeof(arr) / sizeof(arr[0])) : 0)

int Calc(int Number, LPVOID x, DWORD vSize)
{
__asm
{
mov eax, Number
mov ecx, vSize
mov edi, x
cld
repne scasd ;aumenta EDI y lo compara con eax
cmp [edi-0x4], eax
jne salir
mov eax, x
mov eax, [eax]
jmp salir2
salir:
xor eax,eax
salir2:
}

return;
}

int _tmain(int argc, _TCHAR* argv[])
{
WORD fwDevice;

fwDevice = WFS_STAT_DEVNODEVICE;

cout << Calc((int)fwDevice, (LPVOID)&NUMBERS2, ARRAYSIZE(NUMBERS2)) << std::endl;

system("pause");

return 0;
}


Cambié mi define por "const int NUMBERS2[]", porque no podía obtener el address *-)

Pero, acá está la explicación:

tengo:

const int NUMBERS2[] = { -13, WFS_STAT_DEVOFFLINE, WFS_STAT_DEVNODEVICE, WFS_STAT_DEVUSERERROR, WFS_STAT_DEVFRAUDATTEMPT};

entonces, -13 va a ser el número que va a ser retornado, y los otros son los múltiples casos a comprar, lo sé, la cheatié (trucos)...
Can you see it?
The worst is over
The monsters in my head are scared of love
Fallen people listen up! It's never too late to change our luck
So, don't let them steal your light
Don't let them break your stride
There is light on the other side
And you'll see all the raindrops falling behind
Make it out tonight
it's a revolution

CL!!!