Tema destacado: [AIO elhacker.NET] Compilación herramientas análisis y desinfección malware
Autor
|
Tema: conflictos de nombres de variables (Leído 885 veces)
|
jacy11
Desconectado
Mensajes: 4
|
Hola, soy nuevo en la comunidad, espero me puedan ayudar. Ahora ando aprendiendo a programar en C, pero me tope con este problema, ando siguiendo un libro "Piensa en C de Osvaldo Cairó" , ando en tema de funciones. Lo que pasa es que ahi se utiliza como un operador para hacer referencia a las variables globales dentro de una función teniendo ambás el mismo nombre. este es el ejemplo #include <stdio.h> /* Conflicto de variables con el mismo nombre */ void f1(void); /* Prototipo de función. */ int K = 5; /* Variable global. */
int main(void) { int I; for(I = 1 ; I <= 3; I++) f1(); }
void f1(void) { /* La función utiliza tanto la variable local I como la variable global I. */ int K = 2; K += K; printf("\n\nEl valor de la variable local es: %d", K); ::K = ::K + K; /* Uso de ambas variables. */ printf("\nEl valor de la variable global es: %d", ::K); }
y me mada este error al compilar C:\Users\martin\Desktop\programasC\p4_3.c In function `f1': 17 C:\Users\martin\Desktop\programasC\p4_3.c syntax error before ':' token 18 C:\Users\martin\Desktop\programasC\p4_3.c syntax error before ':' token
Estuvé buscando si era algún otro carácter ya que al parecer hay diferencias entre un compilador y otro, pero no encontre nada. Así que es por eso recurro a uds. ¿Cómo se puede hacer referencia a la veriable global K desde la función f1? correctamente o ¿simplemente no se puede?. Por cierto utilizo dev C++ desde windows. Espero su ayuda! gracias.
|
|
|
|
|
En línea
|
|
|
|
BlackZeroX (Astaroth)
Wiki
Desconectado
Mensajes: 2.831
I'Love...!¡.
|
Las variables locales de un proceso TIENEN MAYOR presedencia que las externas...
En pocas palabras si las variables tan locales de un proceso/funcion tienen el mismo nombre que una fuera de ella, la variable externa (por no decirle global) del proceso/funcion sera ignorada, la unica manera de hacer referencia a las variables externas es con "::" en si el codigo que has publicado aquí esta CORRECTO.
por otro lado el codigo me corrio correctamente en CodeBlocks con el compilador predeterminado (para windows)
* dev C++ esta DESCONTINUADO...
Dulces Lunas!¡.
|
|
|
|
« Última modificación: 26 Noviembre 2011, 03:09 por BlackZeroX (Astaroth) »
|
En línea
|
|
|
|
RyogiShiki
Desconectado
Mensajes: 709
げんしけん - Hikkikomori FTW!!!
|
Lo que pasa es que ha de estar compilando con compilador exclusivo de C o que hace referencia a C, los dos puntos '::' solo está permitido en C++, SIn mencionar que todo el código es puro C, al menos eso es lo que tengo entendido. No se si C99 lo permita. Que alguien me corrija si estoy mal --EDIT-- Y parece que no estoy mal, si compilo el código con gcc (Solo c) me da el error, pero si Compilo con g++ (C++) no se queja.
Si es DevCpp aunque es recomendable ya no usarlo, imagino que con renombrar el archivo y ponerle extensión .cpp funcionará Saludos
|
|
|
|
« Última modificación: 26 Noviembre 2011, 03:28 por RyogiShiki »
|
En línea
|
|
|
|
jacy11
Desconectado
Mensajes: 4
|
si efectivamente estoy compilando con gcc. Ya que mi codigo fuente queda con extensión fuente.c, probe compilando con g++ y con este si funciona. Entonces esto me confunde, pa mi que como decia programación en C los programas que trae el libro funcionarías en el compilador de C no de C++, no entiendo como esta la cosa???.  esto confirma lo que dice RyogiShiki. que me aconsejan usar en lugar de DevC++??
|
|
|
|
|
En línea
|
|
|
|
RyogiShiki
Desconectado
Mensajes: 709
げんしけん - Hikkikomori FTW!!!
|
CodeBlocks o Geany. Pues la cosa es que C++ es un superconjunto de C, por lo tanto es como tener C dentro de C++, y los compiladores de C++ todos dan soporte a C, lo que permite ese uso de expresiones en C puro, pero no es para nada recomendable y va en contra del standard. No puedo creer ni siquiera que el libro tenga eso Saludos
|
|
|
|
« Última modificación: 26 Noviembre 2011, 03:58 por RyogiShiki »
|
En línea
|
|
|
|
do-while
Desconectado
Mensajes: 604
Cuando me afeito, recuerdo porque me dejo barba.
|
¡Buenas!
Esta solucion puede ser un tanto complicada, pero ahi va, intenta cambiar el nombre de alguna de las dos variables.
¡Saludos!
PD: Y si, en C++ las variables locales hacen sombra a las variables de bloques exteriores que tengan el mismo identificador. Podras acceder a las exteriores con el operador ::, pero en C no esta permitido que dos variables en un mismo ambito tengan el mismo identificador.
¡Saludos!
|
|
|
|
« Última modificación: 26 Noviembre 2011, 11:07 por do-while »
|
En línea
|
¡¡¡Feliz año nuevo!!!
|
|
|
jacy11
Desconectado
Mensajes: 4
|
¡Buenas!
Esta solucion puede ser un tanto complicada, pero ahi va, intenta cambiar el nombre de alguna de las dos variables.
¡Saludos!
PD: Y si, en C++ las variables locales hacen sombra a las variables de bloques exteriores que tengan el mismo identificador. Podras acceder a las exteriores con el operador ::, pero en C no esta permitido que dos variables en un mismo ambito tengan el mismo identificador.
¡Saludos!
Pero el objetivo del ejemplo es de que declarando una variable con un nombre como global, y dentro de una función declare otra con el mismo nombre tenga la posibilidad de acceder a la global, por que como dices esta es ocultada, para solo poder acceder a la local. Claro que si la cambio no habría problema. Mi duda era por que no me funciona :: para acceder a la global, pero como dijeron antes, esto solo lo soporta C++.
|
|
|
|
|
En línea
|
|
|
|
|
|
jacy11
Desconectado
Mensajes: 4
|
ok gracias, ya entedí, efectivamente compiladon con g++ si compila. Solo que el libro no especifica que compilador utiliza, pero como habla sobre programación en C, pues supuse que emplea unicamente el compilador de C, gcc. Grcias por la ayuda 
|
|
|
|
|
En línea
|
|
|
|
|
|