C/Visual C - Definición de una macro en C con un conjunto de operadores.

 
Vista:

Definición de una macro en C con un conjunto de operadores.

Publicado por Dan Rodríguez (1 intervención) el 26/02/2020 16:48:34
Hola buenas tardes,
Mi pregunta es la siguiente:
Estoy intentando declarar una macro que me englobe todos los operadores que necesitaré en mi programa de la siguiente forma:
#define OPERATORS {'+', '-','*', '/', '%', '^'}
Sin embargo, esta acción me da error y me avisa que es necesario que ponga algo antes de {, lo cual no tiene mucho sentido.
Sea el error que sea, me preguntaba si una vez declarada dicha macro bien, se podría hacer una comparación directa (con ==) de una variable tipo char con la macro o si tendría que hacer algo especial para compararlos. Gracias de antemano.

Por otro lado, y más por curiosidad, tengo el siguiente código:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
#define OPERATORS '+', '-','*', '/', '%', '^'
 
int isOperator (char c) {
    if(c!=OPERATORS)
        return 0;
    return 1;
}
 
int main(){
    printf("%d", isOperator('+'));
    printf("%d", isOperator('j'));
    return 0;
}

Código que compila y se ejecuta sin problema pero que independientemente del carácter propuesto, da 0. Alguna explicación??
Muchas gracias!!
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

Definición de una macro en C con un conjunto de operadores.

Publicado por Nacho (76 intervenciones) el 26/02/2020 18:05:58
Este código
1
2
3
4
5
6
7
#define OPERATORS '+', '-','*', '/', '%', '^'
 
int isOperator (char c) {
    if(c!=OPERATORS)
        return 0;
    return 1;
}

genera este otro en ensamblador
1
2
3
4
5
6
0128147D  mov    eax,5Eh
01281482  test     eax,eax
01281484  je        isOperator+1Ah (0128148Ah)
01281486  xor      eax,eax
01281488  jmp     isOperator+1Fh (0128148Fh)
0128148A  mov    eax,1

5Eh es el ascii de '^'.
Lógicamente, si pones siempre el mismo valor en eax y haces un test eax, eax va a darte siempre 0.


Este otro código
1
2
3
4
5
6
7
#define OPERATORS ('+', '-','*', '/', '%', '^')
 
int isOperator(char c) {
	if (c != OPERATORS)
		return 0;
	return 1;
}

genera eso otro
1
2
3
4
5
6
0002147D  movsx  eax,byte ptr [c]
00021481  cmp      eax,5Eh
00021484  je          isOperator+1Ah (02148Ah)
00021486  xor        eax,eax
00021488  jmp       isOperator+1Fh (02148Fh)
0002148A  mov      eax,1

Ahora tiene mucha mejor pinta, pues en eax sí va a parar el carácter que se pasa a la función, pero siempre compara con 5Eh, que es el '^'. O sea, pasa de todos los caracteres menos del último, que es con lo que hace la sustitución. Y eso es lo que hace un #define, una sustitución en el código fuente a la hora de compilar.
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
Imágen de perfil de Rodrigo
Val: 350
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Definición de una macro en C con un conjunto de operadores.

Publicado por Rodrigo (119 intervenciones) el 11/03/2020 14:19:54
Una variacion del codigo original podria hacer lo que quieres:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <string.h>
 
#define OPERATORS "+-*/%^"
 
int isOperator (char c) {
    return strchr(OPERATORS,c) != NULL;
}
 
int main(){
    printf("%d", isOperator('+'));
    printf("%d", isOperator('j'));
    return 0;
}

y aprovechandose que los strings son arreglos unidimensionales de caracteres, este codigo se puede acercar mas al original aun, asi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <string.h>
 
#define OPERATORS { '+', '-','*', '/', '%', '^', 0 }
 
int isOperator (char c) {
    char operators[] = OPERATORS;
    return strchr(operators,c) != NULL;
}
 
int main(){
    printf("%d", isOperator('+'));
    printf("%d", isOperator('j'));
    return 0;
}

y dado que las macros son simples reemplazos, hacemos que la macro original sea exactamente la que se definio en el programa original asi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <string.h>
 
#define OPERATORS '+', '-','*', '/', '%', '^'
 
int isOperator (char c) {
    char operators[] = { OPERATORS, 0 };
    return strchr(operators,c) != NULL;
}
 
int main(){
    printf("%d", isOperator('+'));
    printf("%d", isOperator('j'));
    return 0;
}
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

Definición de una macro en C con un conjunto de operadores.

Publicado por Nacho (76 intervenciones) el 11/03/2020 23:10:09
Parece que quiere usar una macro como si fuera un conjunto,
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
Imágen de perfil de Rodrigo
Val: 350
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Definición de una macro en C con un conjunto de operadores.

Publicado por Rodrigo (119 intervenciones) el 12/03/2020 04:35:40
Por este lado, es lo mejor que pudimos hacer con lo que quiere y el lenguaje que teniamos a mano.
Mantiene la macro, mantiene su programa principal, varia la implementacion de la funcion isOperator.
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