C/Visual C - interpretar lineas con la directiva #define

 
Vista:

interpretar lineas con la directiva #define

Publicado por marcos (11 intervenciones) el 25/11/2002 18:57:03
Hola.
Necesito interpretar algunas líneas de un programa que tengo que explicar completamente y para comenzar me gustaría saber que es lo que se hace en las definiciones con la directiva #define.
Envio a continuación las líneas que contienen las instrucciones.

#define _MAXLEN (pt) (*(uchar*) (pt) )
#define _CURLEN (pt) (*( ( (uchar*) (pt) ) +1 ) )
#define _BUFADD (pt) ( ( (uchar*) (pt) ) +2 )

por otro lado están las siguientes....

#define FN _BUFADD (VA_ADDRESS (pvBfData, InParam [0].Va ) ) /*String*/
#define DA _BUFADD (VA_ADDRESS (pvBfData, InParam [1].Va ) ) /*String*/
#define OK BF_BOOL (pvBfData, OutParam -> Va) /* BOOL*/
#define DAOS _BUFADD (VA_ADDRESS (pvBfData, OutParam -> Va) ) /*String (value) */
#define DAOL _CURLEN (VA_ADDRESS (pvBfData, OutParam -> Va) ) /*String (length) */
#define DAOM _MAXLEN (VA_ADDRESS (pvBfData, OutParam -> Va) ) /*String (maxlength) */

y por ultimo la definición de VA_ADDRESS

#ifndef ITGTDEF_SEGMENT
#define VA_ADDRESS (BfData, va) ( (uchar*) (BfData) + (va) )
#else
#define VA_ADDRESS (BfData, va) ( (uchar**) (BfData) ) [ (va) >> ISA_SEGMT_MSB] \ + ( (va) & ISA_SEGMT_MSK) )
#endif
#define BF_BOOL (BfData, va) ( * (uchar*) (VA_ADDRESS ( (BfData) , (va) ) ) )
#define BF_SINT (BfData, va) ( * (char*) (VA_ADDRESS ( (BfData) , (va) ) ) )
#define B
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:interpretar lineas con la directiva #define

Publicado por chuidiang (677 intervenciones) el 26/11/2002 08:58:29
En un define puedes definir una constante sin más
#define PI 3.1416
En cualquier sitio del código que aparezca PI, se reemplazará por el valor 3.1416

Un uso más avanzado de #define es el de las macros. Es igual, pero admite parámetros. Por ejemplo

#define SUMA(a,b) (a+b)

En cualquier sitio del código que aparezca SUMA(una_cosa, otra_cosa) se reemplazará por (una_cosa+otra_cosa). Por ejemplo, SUMA(3,4) se reemplaza por (3+4), SUMA(hola, adios) se reemplaza por (hola+adios).

Es bastante habitual usar muchos paréntesis para asegurar bien la operación. Por ejemplo
#define MULTIPLICA(a,b) (a*b)
hace que MULTIPLICA (3+4,5) se reemplace por (3+4*5) que hace primero el 4*5 y luego suma 3. Probablemente no es lo que quieres y es más correcto
#define MULTIPLICA(a,b) ((a)*(b)) que daría lugar a ((3+4)*(5))

En tu código. Por ejemplo,

#define _MAXLEN(pt) (*(uchar *) (pt))

podrías poner _MAXLEN(puntero) en el código y se reemplazaría por (*(uchar *)(puntero))

Sigue...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:interpretar lineas con la directiva #define

Publicado por chuidiang (677 intervenciones) el 26/11/2002 09:05:00
El _MAXLEN, _CURLEN y _BUFADD que tienes en el código tienen pinta de que sirven para leer campos en una estructura concreta que contiene información de un buffer de datos. Dicha estructura estaría compuesta por tres uchar. El primero de ellos contiene una longitud máxima para el buffer, el segundo la longitud actual y el tercero un puntero al buffer de datos. Si p es un puntero a dicha estructura
_MAXLEN(p) te daría el tamaño máximo del buffer
_CURLEN(p) el tamaño actual de dicho buffer
_BUFADD (p) la dirección de dicho buffer (BUFfer ADDress)

Bueno, espero haberte servido de ayuda. El resto es cosa tuya.
Sé bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:interpretar lineas con la directiva #define

Publicado por marcos (11 intervenciones) el 26/11/2002 13:57:51
chuidiang.....
De verdad que muchas gracias por la ayuda me servirá de mucho.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar