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
Citar
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.
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!¡.
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
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++??
CodeBlocks (http://www.codeblocks.org/) o Geany (http://www.geany.org/).
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
¡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!
Cita de: do-while en 26 Noviembre 2011, 11:04 AM
¡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++.
Compilalo con g++ y no con gcc y deberia funcionarte, el operador de resolucion de ambito es de C++: http://en.wikipedia.org/wiki/Scope_resolution_operator#C.2B.2B
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 ;D