Hack x Crack - Comunidad de Seguridad informática

Programación => C / C++ => Mensaje iniciado por: k3b en Mayo 12, 2013, 06:02:15 am

Título: [Solucionado] Error de compilacion en c
Publicado por: k3b en Mayo 12, 2013, 06:02:15 am
si alguien ha leido mi tema en la seccion source podra saber que estoy haciendo algo para convertir sistemas de numeración, pero la variable v00 dice que no esta declarada (e incluso, poco despues me hizo la desconocida de la declaracion de la constante vp)... ¿alguien sabe porque sucede?

Código: [Seleccionar]
#include <stdio.h> //para poder usar printf(""); y scanf("");
#include <stdlib.h> //para poder usar system("clear");
#define int vp; //declaracion de la variable global vp.
int main(void){ //inicio programa.
system("clear");
printf("\t###########################################################\n");
printf("\t## Convertidor sistemas de numeración                    ##\n");
printf("\t##                                                       ##\n");
printf("\t##    1. Decimal a binario.                              ##\n");
printf("\t##    2. Decimal a octal.                                ##\n");
printf("\t##    3. Decimal a hexadecimal.                          ##\n");
printf("\t##    4. Binario a decimal.                              ##\n");
printf("\t##    5. Binario a hexadecimal.                          ##\n");
printf("\t##    6. Binario a octal.                                ##\n");
printf("\t##    7. Octal a binario.                                ##\n");
printf("\t##    8. Octal a decimal.                                ##\n");
printf("\t##    9. Octal a hexadecimal.                            ##\n");
printf("\t##   10. Hexadecimal a binario.                          ##\n");
printf("\t##   11. Hexadecimal a decimal.                          ##\n");
printf("\t##   12. Hexadecimal a octal.                            ##\n");
printf("\t##                                                       ##\n");
printf("\t##  Inserte un número y presione enter.                  ##\n");
printf("\t##                                                       ##\n");
printf("\t###########################################################\n");
scanf("%d",&vp);
if (vp==1){
system("clear");
printf("Inserte su número decimal para convertir a binario. 0 para volver.\n");
int v0; //da error aun cuando le doy una utilidad con scanf.
}
if (vp==2){
system("clear");
printf("Inserte su número decimal para convertir a octal. 0 para volver.\n");
}
if (vp==3){
system("clear");
printf("Inserte su número decimal para convertir a hexadecimal. 0 para volver.\n");
}
if (vp==4){
system("clear");
printf("Inserte su número binario para convertir a decimal. 0 para volver.\n");
}
if (vp==5){
system("clear");
printf("Inserte su número binario para convertir a hexadecimal. 0 para volver.\n");
}
if (vp==6){
system("clear");
printf("Inserte su número binario para convertir a octal. 0 para volver.\n");
}
if (vp==7){
system("clear");
printf("Inserte su número octal para convertir a binario. 0 para volver.\n");
}
if (vp==8){
system("clear");
printf("Inserte su número octal para convertir a decimal. 0 para volver.\n");
}
if (vp==9){
system("clear");
printf("Inserte su número octal para convertir a hexadecimal. 0 para volver.\n");
}
if (vp==10){
system("clear");
printf("Inserte su número hexadecimal para convertir a binario. 0 para volver.\n");
}
if (vp==11){
system("clear");
printf("Inserte su número hexadecimal para convertir a decimal. 0 para volver.\n");
}
if (vp==12){
system("clear");
printf("Inserte su número hexadecimal para convertir a octal. 0 para volver.\n");
}
}
Título: Re:error de compilacion en c
Publicado por: ravenheart en Mayo 12, 2013, 12:29:20 pm
Código: [Seleccionar]
if (vp==1)
{
    system("clear");
    printf("Inserte su número decimal para convertir a binario. 0 para volver.\n");
    int v0; //da error aun cuando le doy una utilidad con scanf.
}

Lo primero que tienes que tener claro es que C se estructura en bloques y cada bloque comienza con { y termina con }

Las declaraciones de variables tienen que ir al inicio del bloque donde se declaran (esto es solo en C, en C++ no es así), y solo existen dentro del bloque donde se han declarado (esto es así también en C++).

En tu ejemplo, la declaración de v0 es incorrecta porque no está al principio. Pero además, en cuanto cierras el if con el símbolo }, v0 "desaparece". Tendrías que declararla al principio de la función.

Citar
Código: [Seleccionar]
#define int vp; //declaracion de la variable global vp.
Esto no es una declaración de variable global en C. Es un comando para el preprocesador, lo que se llama una macro. Todas las instrucciones que comienzan con la almohadilla # en C y C++ son declaraciones para el preprocesador.

El preprocesador es un programa que se ejecuta antes del compilador (de ahí el nombre) y sirve para hacer sustituciones en el código fuente.
Esto es un poco confuso así que pondré algún ejemplo:

Código: [Seleccionar]
#include <stdio.h>

// Sustituímos cualquier aparición del símbolo "a" por "+"
#define a +

int main()
{
    // imprime 12
    printf("%d\n", 5 a 7);
}

Si escribes eso, lo que realmente se envía al compilador será esto:
Código: [Seleccionar]
/*#include también es una directiva del preprocesador, pero la ignoraré por ahora.*/
#include <stdio.h>

/*desaparece la instrucción #define*/

int main()
{
    /*Se sustituye a por +*/
    printf("%d\n", 5 + 7);
}

Si te paras a pensar detenidamente, quizá te parezca muy útil. Lo es, es muy potente, pero también es muy peligroso. Como lo que se hace es sustituir en tu código fuente antes de enviarlo al compilador, no hay ningún límite respecto a lo que puedes poner en un define, lo que puede hacer que tu código quede algo "raro" (y además puede dar lugar a errores confusos y difíciles de entender, porque un error en una macro realmente te aparecerá como un error en la línea que utiliza esa macro)

Código: [Seleccionar]
#include <stdio.h>

// Sustituímos cualquier aparición del símbolo "a" por "+"
#define a +
// Sustituímos "b" por "7);"
#define b 7);

int main()
{
    // imprime 12
    printf("%d\n", 5 a b
}
El código que llega al compilador es el mismo que en el ejemplo anterior.
Fíjate que la llamada a printf parece incompleta, porque el paréntesis y el punto y coma están en "b".

Citar
Código: [Seleccionar]
#define int vp; //declaracion de la variable global vp.
Imagino que ahora entiendes por qué no funciona este código. Lo único que haces es sustituir "int" por "vp;", así que al compilador realmente le llegaba esto:
Código: [Seleccionar]
vp; main(void){ //inicio programa.
(...)
if (vp==1){
system("clear");
printf("Inserte su número decimal para convertir a binario. 0 para volver.\n");
vp; v0; //da error aun cuando le doy una utilidad con scanf.
}
(...)

Lo que realmente no tiene ningún sentido. En realidad, en C y C++ las constantes se definen así:
Código: [Seleccionar]
const tipo nombre = valor;Por ejemplo:
Código: [Seleccionar]
const int vp = 5;
El problema es que las constantes se consideran datos dinámicos (es decir, que se gestionan en tiempo de ejecución) y para muchas cosas en C hacen falta datos estáticos (que se gestionan en tiempo de compilación). Por ejemplo, al declarar un array no puedes usar una constante.
Código: [Seleccionar]
const int TAM_ARRAY = 5;
int array[TAM_ARRAY];  // Error de sintaxis

Y se suele hacer lo siguiente:
Código: [Seleccionar]
#define TAM_ARRAY 5   // Ojo, sin punto y coma
int array[TAM_ARRAY];  // Así sí funciona

Que para el compilador es exactamente igual que
Código: [Seleccionar]
int array[5];
Pero permite al programador reutilizar el símbolo TAM_ARRAY como si fuera una constante.


Título: Re:error de compilacion en c
Publicado por: k3b en Mayo 12, 2013, 07:56:29 pm
gracias, vere que suced y modifico el post
Título: Re:error de compilacion en c
Publicado por: k3b en Mayo 12, 2013, 08:22:09 pm
arreglado, muchas gracias ravenheart, si necesitas algo, hazmelo saber por mp ^^
Título: Re:error de compilacion en c
Publicado por: k133 en Mayo 12, 2013, 11:22:10 pm
Muy muy buena respuesta @ravenheart ;)
Título: Re:error de compilacion en c
Publicado por: ACK en Mayo 13, 2013, 12:13:33 am
El tema fue movido a C y he colocado el codigo entre etiquetas [code*][/code*]. Intenta tener en cuenta esto para la proxima.

Saludos! ;)


Edito: Me alegro se haya solucionado, no me había dado cuenta antes jeje, paso a cerrar el tema.