Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Caster en 1 Octubre 2012, 19:31 pm



Título: [Solucionado] ¿Cambia el valor de una variable dentro una funcion?
Publicado por: Caster en 1 Octubre 2012, 19:31 pm
No se si se entiende la pregunta, a ver que lo explico, por ejemplo, yo tengo una variable entera int a = 2; y una funcion cualquiera que modifica su valor, entonces antes de llamar a la funcion su valor inicial es 2, al llamar la funcion este valor cambia, la pregunta es, ¿despues de que se ejecute la funcion y se vuelva a main(), el valor de a seguira siendo 2 o habra adoptado el valor que se le da en la funcion?

No se si me he explicado correctamente.

Saludos.


Título: Re: ¿Cambia el valor de una variable dentro una funcion?
Publicado por: Stakewinner00 en 1 Octubre 2012, 19:42 pm
creo k el valor se quedara cambiado.


Título: Re: ¿Cambia el valor de una variable dentro una funcion?
Publicado por: Caster en 1 Octubre 2012, 19:52 pm
Pues nada mejor que programarlo y ver que ocurre, he hecho este programa:

Código
  1. #include <stdio.h>
  2.  
  3. void modificar(int a) {
  4. a *= 3;
  5. printf("\n\na = %d (desde la funcion, modificando el valor)", a);
  6. return ;
  7. }
  8.  
  9. int main() {
  10.  
  11. int a = 2;
  12.  
  13. printf("\na = %d (desde main, antes de llamar a la funcion)", a);
  14. modificar(a);
  15. printf("\n\na = %d (desde main, despues de llamar a la funcion)", a);
  16. }
  17.  
  18.  

Y el resultado ha sido:

Citar
a = 2 (desde main, antes de llamar a la funcion)
a = 6 (desde la funcion, modificando el valor)
a = 2 (desde main, despues de llamar a la funcion)

Por los resultados puedo saber que si, que realmente el valor solo cambia dentro de la funcion, para el resto del programa seguiria teniendo el valor 2.

Saludos y gracias por responder.


Título: Re: [Solucionado] ¿Cambia el valor de una variable dentro una funcion?
Publicado por: Stakewinner00 en 1 Octubre 2012, 19:59 pm
no lo sabia.


Título: Re: [Solucionado] ¿Cambia el valor de una variable dentro una funcion?
Publicado por: Caster en 1 Octubre 2012, 20:03 pm
Pues siempre se aprende algo mas, gracias a mi duda tu tambien has aprendido algo  :D


Título: Re: [Solucionado] ¿Cambia el valor de una variable dentro una funcion?
Publicado por: overxfl0w13 en 1 Octubre 2012, 20:33 pm
Eso es básico, alcance de las variables vamos. La variable a es declarada y definida en main() por lo que es considerada como variable local si la pasas como argumento a una función, por mucho que modifiques su valor no cambiará ya que la variable que pretendes "modificar" sigue siendo local a main a pesar de tener el mismo nombre que en la otra función. Si lo que quieres es modificarla pasa la variable por referencia, ahí ya hablamos de otra cosa o si lo prefieres puedes usar punteros o los 2.

Punteros y Referencias:

Código
  1. #include <stdio.h>
  2.  
  3. void modificar(int &a) {
  4. a *= 3;
  5. printf("\n\na = %d (desde la funcion, modificando el valor)", a);
  6. return ;
  7. }
  8.  
  9. int main() {
  10.  
  11. int *a = new int(2);
  12.  
  13. printf("\na = %d (desde main, antes de llamar a la funcion)", *a);
  14. modificar(*a);
  15. printf("\n\na = %d (desde main, despues de llamar a la funcion)", *a);
  16. getchar();
  17. }
  18.  
  19.  

Punteros:

Código
  1. #include <stdio.h>
  2.  
  3. void modificar(int *a) {
  4. *a *= 3;
  5. printf("\n\na = %d (desde la funcion, modificando el valor)", *a);
  6. return ;
  7. }
  8.  
  9. int main() {
  10.  
  11. int *a = new int(2);
  12. printf("\na = %d (desde main, antes de llamar a la funcion)", *a);
  13. modificar(a);
  14. printf("\n\na = %d (desde main, despues de llamar a la funcion)", *a);
  15. getchar();
  16. }
  17.  
  18.  

Referencia:

Código
  1. #include <stdio.h>
  2.  
  3. void modificar(int &a) {
  4. a *= 3;
  5. printf("\n\na = %d (desde la funcion, modificando el valor)", a);
  6. return ;
  7. }
  8.  
  9. int main() {
  10.  
  11. int a = 2;
  12.  
  13. printf("\na = %d (desde main, antes de llamar a la funcion)", a);
  14. modificar(a);
  15. printf("\n\na = %d (desde main, despues de llamar a la funcion)", a);
  16. getchar();
  17. }
  18.  


Título: Re: [Solucionado] ¿Cambia el valor de una variable dentro una funcion?
Publicado por: Caster en 1 Octubre 2012, 20:40 pm
Los punteros los tratan mas adelante en el libro que estoy leyendo, asi que voy a dejarlos para cuando toque, he compilado el codigo que has dejado y me da el sigueinte error:

Citar
3:20: error: expected ';' , ',' or ')' before '&' token


Título: Re: [Solucionado] ¿Cambia el valor de una variable dentro una funcion?
Publicado por: overxfl0w13 en 1 Octubre 2012, 20:53 pm
Los punteros los tratan mas adelante en el libro que estoy leyendo, asi que voy a dejarlos para cuando toque, he compilado el codigo que has dejado y me da el sigueinte error:


Pero el ámbito o alcance de las variables ya se supone que lo tendrías que haber visto. He compilado los 3 códigos y no me da ningún error en ninguno de los 3 tio, mira a ver si lo has copiado bien :)


Título: Re: [Solucionado] ¿Cambia el valor de una variable dentro una funcion?
Publicado por: Stakewinner00 en 1 Octubre 2012, 21:00 pm
como aprendo por libre de momento.

me pueden decir una rapida definición de lo que són los punteros?


Título: Re: [Solucionado] ¿Cambia el valor de una variable dentro una funcion?
Publicado por: Caster en 1 Octubre 2012, 21:36 pm
Pero el ámbito o alcance de las variables ya se supone que lo tendrías que haber visto.

Pues no te digo que no, lo de las variables hace mucho que lo vi, hace unos meses, y este verano lo deje completamente, y ahora lo retome desde donde lo deje, en las estructuras de control, asi que de algunas cosas ya no me acuerdo, pero poco a poco las ire recordando, para eso esta el libro.

He compilado los 3 códigos y no me da ningún error en ninguno de los 3 tio, mira a ver si lo has copiado bien :)

Es exactamente el mismo codigo, es un copia y pega de lo que has posteado tu y me sigue dando el fallo.

como aprendo por libre de momento.

me pueden decir una rapida definición de lo que són los punteros?

Segun mi libro:

Citar
Un puntero es una variable que representa la posicion (en vez del valor)de otro dato.

Lo que entiendo yo, es una variable pero en vez de tratar con valores se refiere a la posicion de la misma en la memoria.

Saludos


Título: Re: [Solucionado] ¿Cambia el valor de una variable dentro una funcion?
Publicado por: Stakewinner00 en 1 Octubre 2012, 22:43 pm
no entendi demasado pero me vendra bien para saber de k va


Título: Re: [Solucionado] ¿Cambia el valor de una variable dentro una funcion?
Publicado por: rir3760 en 2 Octubre 2012, 15:55 pm
Es exactamente el mismo codigo, es un copia y pega de lo que has posteado tu y me sigue dando el fallo.
Eso es debido a que la declaración de una referencia:
Código
  1. void modificar(int &a) {
Y la reserva de memoria mediante "new":
Código
  1. int *a = new int(2);
Son parte del lenguaje C++ (pero no de C).

Un saludo


Título: Re: [Solucionado] ¿Cambia el valor de una variable dentro una funcion?
Publicado por: overxfl0w13 en 2 Octubre 2012, 18:54 pm
Eso es debido a que la declaración de una referencia:
Código
  1. void modificar(int &a) {
Y la reserva de memoria mediante "new":
Código
  1. int *a = new int(2);
Son parte del lenguaje C++ (pero no de C).

Un saludo

De todas formas el uso de punteros, las referencias y la reserva mediante new ha dicho que son puntos a tratar en próximos temas del libro que está siguiendo, nunca viene mal conocerlo :)


Título: Re: [Solucionado] ¿Cambia el valor de una variable dentro una funcion?
Publicado por: leosansan en 2 Octubre 2012, 19:48 pm
Los punteros los tratan mas adelante en el libro que estoy leyendo, asi que voy a dejarlos para cuando toque, he compilado el codigo que has dejado
Sólo necesitas saber ahora que puedes pasar a una función un parámetro o variable  por valor -que es lo que has visto hasta ahora- y por referencia -que hace uso de punteros y es lo que te queda por ver-. La diferencia fundamental es que en el paso por valor, en la función donde está declarada la variable, su valor no cambia aún después de "pasar" por la función, mientras que en el paso por referencia sí puede cambiar el valor de la variable.
Te dejo el código funcionando para los dos métodos:
Código
  1. #include <stdio.h>
  2.  
  3. void modificar(int a)
  4. {
  5. a *= 3;
  6. printf("\n\na = %d (desde la funcion, modificando el valor)", a);
  7. return ;
  8. }
  9. void modificar1(int *a)
  10. {
  11. *a *= 3;
  12. printf("\n\na = %d (desde la funcion, modificando el valor)", *a);
  13. return ;
  14. }
  15. int main()
  16. {
  17.  
  18. int *a = 2;
  19.    printf("\n\nPaso por valor\n");
  20. printf("\na = %d (desde main, antes de llamar a la funcion)", a);
  21. modificar(a);
  22. printf("\n\na = %d (desde main, despues de llamar a la funcion por valor)", a);
  23. printf("\n\nPaso por referencia con puntero\n");
  24. printf("\na = %d (desde main, antes de llamar a la funcion)", a);
  25. modificar1(&a);
  26. printf("\n\na = %d (desde main, despues de llamar a la funcion por referencia)", a);
  27.  
  28. printf("\n\na = %d (desde main, OTRA VEZ antes de llamar a la funcion)", a);
  29. modificar1(&a);
  30. printf("\n\na = %d (desde main, despues de llamar a la funcionpor referencia )", a);
  31.        return 0;
  32. }
Por si te animas a empezar  a leer sobre punteros, aquí va un ejemplo:
Código
  1. #include <stdio.h>
  2. int main() {
  3.    int i=0,*puntero,*pmat;
  4.    int valor = 52;
  5.    int mat [10];
  6.    mat[0]=10, mat[1]=30,mat[2]=50,mat[3]=60;
  7.    puntero = &valor;
  8.    printf("puntero apunta a %p\n", puntero);
  9.    printf("la direccion de memoria de &valor es %p\n", &valor);
  10.    printf("el valor de 'valor' es %d\n", valor);
  11.    printf("el valor de aquello a lo que apunta *puntero es %d\n", *puntero);
  12.    *puntero += 25;
  13.    printf("el valor de aquello a lo que apunta *puntero += 25 es %d\n\n\n", *puntero);
  14.  
  15.    pmat=&mat[0] ;//<=== pmat "apunta=da" a la direccion de mat[0]
  16.    printf("pmat apunta a la direccion %p\n\n", pmat);
  17.    printf("el valor de aquello a lo que apunta *pmat=mat[0] es %d\n\n", *pmat);//10
  18.  
  19.    i=*++pmat;//<=== pmat "apunta" a la direccion de mat[1]
  20.    printf("el valor de aquello a lo que apunta *++pmat=mat[1] es %d\n\n", i);//30
  21.  
  22.    i=*pmat+1;
  23.    printf("el valor de aquello a lo que apunta *pmat+1=30+1 es %d\n\n", i);//31
  24.  
  25.    i=*(pmat+1);//<=== pmat "apunta" a la direccion de mat[2]
  26.    printf("el valor de aquello a lo que apunta *(pmat+1)=mat[2] es %d\n\n", i);//50
  27.  
  28.    i=*++pmat;//<=== pmat "apunta" a la direccion de mat[2];
  29.    printf("el valor de aquello a lo que apunta *++pmat=mat[2] es %d\n\n", i);//50
  30.  
  31.    i=*++pmat;//<=== pmat "apunta" a la direccion de mat[3]
  32.    printf("el valor de aquello a lo que apunta *++pmat=mat[3] es %d\n\n", i);//60
  33.  
  34.    i=*pmat+5;//<=== pmat "apunta" a la direccion de mat[3]+5
  35.    printf("el valor de aquello a lo que apunta *pmat+5=mat[3]+5 es %d\n\n", i);//65
  36.  
  37.    return 0;
  38. }
  39.  
Saludos!


Título: Re: [Solucionado] ¿Cambia el valor de una variable dentro una funcion?
Publicado por: Caster en 3 Octubre 2012, 07:05 am
Lo de paso por valor es de lo ultimo que he visto, ahora estoy con la recursividad, y ya he visto que el valor de variable solo cambia en la propia funcion, fuera no, lo de los punteros y esas cosas vienen explicadas mas adelante, asi que las vere cuando toque, muchas gracias a todos.

Saludos


Título: Re: [Solucionado] ¿Cambia el valor de una variable dentro una funcion?
Publicado por: leosansan en 3 Octubre 2012, 11:53 am
lo de los punteros y esas cosas vienen explicadas mas adelante, asi que las vere cuando toque
Aunque te toque más adelante procura guardar los ejemplos que te postee, son clarificadores e incluyen aritmética de punteros. Por cierto, ¿Qué libro estas siguiendo para el estudio del C?.
Gracias y un saludo.


Título: Re: [Solucionado] ¿Cambia el valor de una variable dentro una funcion?
Publicado por: anonimo12121 en 3 Octubre 2012, 14:10 pm
es así para cambiar el valor de una variable puesta en el argumento.
Código
  1. tipo name(tipo &);
  2.  



Título: Re: [Solucionado] ¿Cambia el valor de una variable dentro una funcion?
Publicado por: 0xDani en 3 Octubre 2012, 15:51 pm
es así para cambiar el valor de una variable puesta en el argumento.
Código
  1. tipo name(tipo &);
  2.  



Estan hablando de C, no de C++.


Título: Re: [Solucionado] ¿Cambia el valor de una variable dentro una funcion?
Publicado por: Caster en 3 Octubre 2012, 17:58 pm
Pues el libro es Programacion en C de Byron Gottfried de la edicion Mc Graw Hill.

overfl0w13, por si lees esto, lo del alcance de las variables, varibles locales, globales, estaticas y eso que creo que es de lo que hablas es justo el tema siguiente en mi libro al de las funciones que estoy viendo ahora.

Saludos


Título: Re: [Solucionado] ¿Cambia el valor de una variable dentro una funcion?
Publicado por: overxfl0w13 en 3 Octubre 2012, 19:26 pm
Pues el libro es Programacion en C de Byron Gottfried de la edicion Mc Graw Hill.

overfl0w13, por si lees esto, lo del alcance de las variables, varibles locales, globales, estaticas y eso que creo que es de lo que hablas es justo el tema siguiente en mi libro al de las funciones que estoy viendo ahora.

Saludos

Pues píllalo con ganas la cosa se pone interesante :)


Título: Re: [Solucionado] ¿Cambia el valor de una variable dentro una funcion?
Publicado por: Caster en 3 Octubre 2012, 19:27 pm
Ahora mismo estoy atascado, porque habla de la recursividad, y no entiendo una *****  :xD