[Solucionado] Pasar una función como parámetro en C.

Iniciado por NOB2014, 24 Septiembre 2016, 21:41 PM

0 Miembros y 1 Visitante están viendo este tema.

NOB2014

Hola, que tengan un muy buen día.
En mi post anterior utilice este tipo de llamada a función y todo correcto, pero ahora no logro que funcione, reconozco que si leyera en inglés tal vez podría saber el porqué del error pero recién estoy comenzando con el idioma. -

#include <stdio.h>

void uno( );
void dos( );


int main(void){

uno( dos() );

return 0;
}

void uno(  ){
printf( "\n Uno " );
}

void dos(  ){
printf( "\n dos" );
}


Saludos y desde ya muchas gracias. -
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Arturo400

En la linea 9 cuando llamas a la funcion 2 es sin parentesis
Quedaria uno(dos);
Tene en cuenta que a la funcion uno le estas pasando como parametro algo, y ese parametro va sin corchetes ni parentesis en el llamado.

NOB2014

#2
Hola, Arturo400. -
Si bien no me da error sólo imprime Uno y no Uno y dos.

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

MCKSys Argentina

Hola!

No sé mucho de C++, pero creo que estás confundiendo las cosas:

Tu primer post dice que quieres pasar una función como parámetro. Para hacerlo, debes seguir lo que te dijo Arturo400.

Ahora, tu último post dice que la función que pasas como parámetro, no se ejecuta. Lo cual es lógico pues cuando la pasas como parámetro, lo que haces es pasar la dirección de memoria de donde está dicha función, no ejecutarla.

En tu ejemplo, si quieres ejecutar la función dos (que pasas como parametro), deberás modificar el codigo de uno, para que se llame la funcion pasada.

Encontré éste post que puede ayudarte (si, está en inglés.)

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


dato000

Esta mal declarada la función uno, la cuál debe declararse con una estructura que reciba una función vacia como parametro ( dos() ) y así ejecutar ese metodo que se necesita.


#include <stdio.h>

void uno( void ()  );
void dos( );


int main(void){

uno( dos );

return 0;
}

void uno( void funcionDos() ){
printf( "\n Uno " );
}

void dos(  ){
printf( "\n dos" );
}


En lo personal este tipo de declaraciones en C son horrendas, pues al ser programación estructurada no es lo ideal en la forma de escribir código, es mejor usar funciones directas o virtuales para ejecutar este tipo de funciones, luego en C++ ya existe el encapsulamiento y declaraciones para ejecutar nuevas instancias de objetos, que facilitan mucho el desarrollo.

Supongo que será más un tema de aprendizaje, lo cuál viene bien.



MAFUS

Uno es una función sin argumentos pero cuando la llamas le pasas la función dos, lo que C no se lo espera.

Esta técnica sirve cuándo una función pide un argumento, por ejemplo un entero, ahí puedes llamar una función que devuelva un entero. Ésta última se evalúa y el valor que retorna es el que usará la primera función.

Por ejemplo
int a() {
    return 3;
}

void b(int num) {
    printf("num = %d", num);
}

// ...
// Llamada a b pasando a como argumento
b(a());

NOB2014

Hola a todos.
MCKSys Argentina, gracias por la página que me apuntaste, pero todavía no si es lo que busco. -
dato000 me resulta lo mismo que antes, compila perfecto, pero me imprime solamente Uno. -

Saludos.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

dato000

Cita de: NOB2014 en 25 Septiembre 2016, 02:41 AM
Hola a todos.
MCKSys Argentina, gracias por la página que me apuntaste, pero todavía no si es lo que busco. -
dato000 me resulta lo mismo que antes, compila perfecto, pero me imprime solamente Uno. -

Saludos.

Pues eso es exactamente lo que hace, que querias que hiciera???



NOB2014

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

dato000

Cita de: NOB2014 en 25 Septiembre 2016, 02:53 AM
Que me imprima "Uno" y en la línea siguiente "dos"

No se puede hacer de esa manera, lo mejor en ese caso seria:

#include <stdio.h>

void uno( void ()  );
void dos( void () );


int main(void){

uno( dos );
dos( uno );

return 0;
}

void uno( void funcionDos() ){
printf( "\n Uno " );
}

void dos( void funcionUno() ){
printf( "\n dos" );
}


Eso es debido a que esas funciones no retornan ni toman argumentos, por lo que deben ser invocadas linealmente una y luego la otra para que se ejecuten.

En este caso, es lo mismo llamar a void uno() que void uno( void Dos), pues son funciones que solo imprimen un texto diseñado en tiempo de compilación y se muestra directamente al usuario sin tener ninguna clase de persistencia.