Declarar una funcion en c

Iniciado por fafafa01, 15 Septiembre 2017, 23:06 PM

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

fafafa01

Leyendo el libro " el lenguaje de programacion c" en el cspitulo 8 sección 7 define una funcion y adentro declara una funcion.
Algo asi:

void malloc(unsigned n){//definicion de funcion
    ...
    Tipo *morecore(unsigned);//declaracion de funcion
    ...
}


¿Es esto posible?¿cuando hay que usarlo?

AlbertoBSD


#include<stdio.h>

void f1(int a) {
printf("f1 %i\n",a);
}

void f2(int a) {
printf("f2 %i\n",a);
}


void f3(int a) {
printf("f3 %i\n",a);
}


int main() {
void (*fun_ptr)(int);
fun_ptr = &f1;
(*fun_ptr)(10);
fun_ptr = &f2;
(*fun_ptr)(100);
fun_ptr = f3;
(*fun_ptr)(1000);
}


Si es posible, es un apuntador a una funcion, y sirve para cambiar la referencua de una funcion a otra sin alterar el codigo, esto podria ser hecho dinamicamente en tiempo de ejecucion, solo he visto implementado a nivel de kernel.

Por ejemplo en lo que he visto para lo modulos de FreeBSD los archivo device

/dev/random /dev/null, /dev/zero

Son archivos que puede ser usado desde fopen para lectura y escritura.

Entonces cuando tu programas el modulo, le dices al sistema operativo cual es tu funcion de lectura, cual es la funcion de escritura. Entonces al momento  de cargarlos el sistema tiene algo como

moduloX.read = ....
moduloX.write = ....
moduloX.close = ....
moduloX.open = ....


Entonces cada que se le mande a abrir, cerrar, leer o escribir en el archivo el sistema ejecutara las funciones que tu especifiques despues del =

Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

fafafa01

Un puntero a funcion no seria esi:


Tipo (*morecore)(unsigned);

AlbertoBSD

Es lo mismo, solo depende de los parametros que recibe orginalmente la funcion.

ve los ejemplos que te agrego


#include<stdio.h>


void f1(int a,int b) {
printf("f1 %i,%i\n",a,b);
}

int main() {
void (*fun_ptr)(int,int);
fun_ptr = &f1;
(*fun_ptr)(10,100);
}


void es el tipo, podria ser algun otro tipo creo.

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

fafafa01

Creo que no es lo mismo:

Funcion que devuelve un puntero a tipo

Tipo *morecore(unsigned);


Puntero a una funcion que devulve tipo

Tipo (*morecore)(unsigned);


mi duda igual es si se puede declarar una funcion dentro de una definicon de otra funcion.

ivancea96

Si hablamos de punteros a función, sin duda puedes.
Si hablamos de declarar el prototipo de una función dentro de tora, puedes, pero no es una buena práctica. Esos prototipos es mejor moverlos a un archivo de cabecera o ponerlos globales por pura facilidad para el programador.

Pero ser, es posible.