Programación General > C/C++
funcion recursiva
morfus_bedxhed:
¡Hola a todos!
A míme corrio con unos cambios, uso geany y no me reconoció la librería conio.h, ni tampoco la función getche sino getchar.
#include <stdio.h>
#include <stdlib.h>
void inversa (char car);
main()
{
char car;
printf("nPalabra regresada al revés: ");
inversa (car);
printf("nn");
/*system("pause");*/
}
void inversa (char car)
{
car=getchar();
if (car != '.')
inversa (car);
printf("%c",car);
}
solo una duda, si char solo tiene límite de un 1byte, ¿por qué me recibe una cadena larga de hasta 20 caracteres? y por cierto el system("pause") tampoco me jaló, para que la pusiste cuate?
saludos al foro!
morfus_bedxhed:
¡Hola a todos!
A míme corrio con unos cambios, uso geany y no me reconoció la librería conio.h, ni tampoco la función getche sino getchar.
#include <stdio.h>
#include <stdlib.h>
void inversa (char car);
main()
{
char car;
printf("nPalabra regresada al revés: ");
inversa (car);
printf("nn");
/*system("pause");*/
}
void inversa (char car)
{
car=getchar();
if (car != '.')
inversa (car);
printf("%c",car);
}
solo una duda, si char solo tiene límite de un 1byte, ¿por qué me recibe una cadena larga de hasta 20 caracteres? y por cierto el system("pause") tampoco me jaló, para que la pusiste cuate?
saludos al foro!
m0skit0:
--- Cita de: "morfus_bedxhed" ---no me reconoció la librería conio.h, ni tampoco la función getche sino getchar
--- Fin de la cita ---
--- Cita de: "morfus_bedxhed" ---por cierto el system("pause") tampoco me jaló
--- Fin de la cita ---
--- Cita de: "morfus_bedxhed" ---solo una duda, si char solo tiene límite de un 1byte, ¿por qué me recibe una cadena larga de hasta 20 caracteres?
--- Fin de la cita ---
Él usa Windows y tú al parecer no. Esas funciones no son estándar, de ahí mi comentario anterior:
--- Cita de: "m0skit0" ---Personalmente, no usaría conio.h, pero eso ya es decisión de cada uno.
--- Fin de la cita ---
--- Cita de: "morfus_bedxhed" ---solo una duda, si char solo tiene límite de un 1byte, ¿por qué me recibe una cadena larga de hasta 20 caracteres?
--- Fin de la cita ---
Es un char local a cada llamda de función. Mientras la función no retorne, ese valor sigue almacenado en la pila temporal de la función. Si quieres entenderlo más en profundidad, tendría que explicarte cómo se implementan las funciones C en ensamblador, pero para ello tienes que saber un poco de arquitectura de computadores. Si te interesa me dices y te lo cuento.
morfus_bedxhed:
--- Cita de: "m0skit0" ---[Es un char local a cada llamda de función. Mientras la función no retorne, ese valor sigue almacenado en la pila temporal de la función. Si quieres entenderlo más en profundidad, tendría que explicarte cómo se implementan las funciones C en ensamblador, pero para ello tienes que saber un poco de arquitectura de computadores. Si te interesa me dices y te lo cuento.
--- Fin de la cita ---
¿Lo que te refieres es qué el valor se guarda en el espacio almacenado para la función? ¿ ese espacio tiene límite?, por que está definido como void (sin retorno) y no como un tipo de dato del C?
Claro que también aceptaría unas clasesitas de como se implementan las funciones C en padre ensamblador..
¡saludos!
m0skit0:
--- Cita de: "morfus_bedxhed" ---¿Lo que te refieres es qué el valor se guarda en el espacio almacenado para la función?
--- Fin de la cita ---
Algo parecido. En realidad es un espacio que comparten la función que llama y la función llamada.
--- Cita de: "morfus_bedxhed" ---¿ ese espacio tiene límite?
--- Fin de la cita ---
Por supuesto, la memoria no es infinita.
--- Cita de: "morfus_bedxhed" ---por que está definido como void (sin retorno) y no como un tipo de dato del C?
--- Fin de la cita ---
No está definido como void
--- Cita de: "morfus_bedxhed" ---void inversa (char car)
--- Fin de la cita ---
--- Cita de: "morfus_bedxhed" ---Claro que también aceptaría unas clasesitas de como se implementan las funciones C en padre ensamblador..
--- Fin de la cita ---
En IA32 (comúnmente llamada x86), el paso de argumentos a funciones se realiza a través de la pila. Esto es, se ponen en la pila los argumentos de la función en orden inverso a los declarados en C, usando la instrucción PUSH. En este caso, se pasa el char en la pila a inversa(). La función lo recupera con la instrucción POP. Acto seguido, inversa se llama a sí misma, con lo que inserta otro char en la pila usando igualmente PUSH, y la segunda llamada lo recupera igualmente con POP (ya que es el mismo código). Así se van acumulando los caracteres en la pila. Al volver, se leen los caracteres en orden inverso, y se libera el espacio en la pila al finalizar las funciones. Algunas veces el compilador también usa el registro EBP para indicar el comienzo de los argumentos para la función, evitando así acceder usando ESP (el puntero de pila). Las instrucciones PUSH y POP modifican ESP automáticamente.
Para más detalles, mira el fichero ensamblador que genera el compilador para este ejemplo, así lo verás más claro. Cualquier duda te la intento aclarar.
Saludos.
Navegación
[#] Página Siguiente
[*] Página Anterior
Ir a la versión completa