#1397 closed doubt (fixed)
Error en PutDescription con una función dentro de otra función
Reported by: | imendez | Owned by: | Víctor de Buen Remiro |
---|---|---|---|
Priority: | normal | Milestone: | Mantainance |
Component: | Kernel | Version: | head |
Severity: | normal | Keywords: | |
Cc: |
Description (last modified by )
Hola, al poner descripción a una función creada dentro de otra función da error. El código es:
Real FunPrueba1(Real r) { Real funPrueba2(Real k) { 2*k }; PutDescription("Prueba", funPrueba2); r/2 }; Real AA = FunPrueba1(Pi);
Y el error:
ERROR: [2] funPrueba2 no es un objeto valido para el tipo Real. [Call stack] [1] Real FunPrueba1 (Real r) Warning: [5] La función PutDescription ha fallado en : PutDescription("Prueba", funPrueba2)
Sin entrar a ver si tiene mucho sentido hacer eso, ¿es normal que dé error?
Un saludo.
Change History (3)
comment:1 Changed 13 years ago by
Description: | modified (diff) |
---|---|
Resolution: | → fixed |
Status: | new → closed |
comment:2 Changed 13 years ago by
Gracias por la aclaración, Víctor, por eso puse el ticket como duda. No me planteaba grandes problemas, pero no sabía por qué no funcionaba.
De todas maneras, me siguen surgiendo preguntas:
- Si PutDescription está clasificada en la gramática Anything (de hecho el código del ticket funciona si lo tipas como Anything en lugar de como Code), ¿por qué no funciona sea cual sea el tipo de objeto que espera TOL?
- En el siguiente código, el último PutDescription también da error:
Real FunPrueba1(Real r) { Real funPrueba2(Real k) { 2*k }; Code PutDescription("Prueba", funPrueba2); r/2 }; Real AA = FunPrueba1(Pi); PutDescription("Prueba", FunPrueba1);
Si tipo PutDescription con Code o con Anything, no da error.
Y sin embargo este otro código, en el que no estoy tipando el PutDescription, no da error:
Real FunPrueba1(Real r) { Real funPrueba2(Real k) { 2*k }; Code PutDescription("Prueba", funPrueba2); r/2 }; PutDescription("Prueba", FunPrueba1); Real AA = FunPrueba1(Pi);
Un saludo
comment:3 Changed 13 years ago by
Ya te he contestado a todo lo que vuelves a preguntar pero veo que no me explico muy bien.
Es que Anything no es un tipo es cualquier tipo, por eso se traga cualquier cosa, pero entonces estás renunciando al control de tipos y además le estás obligando a buscar por todos los tipos lo que cual es ineficiente.
En el segundo caso, al no especificar ningún tipo se usa el tipo por defecto, que en el ámbito global es el del último objeto creado, que ha sido una función, es decir, un objeto de tipo Code.
En el ámbito global el tipo por defecto es el de la última expresión, mientras que en las funciones es el tipo de retorno de la función. Al escribir
PutDescription
sin especificar de qué tipo se utiliza el tipo por defecto que esReal
y como no hay ningún objetoReal funPrueba2
pues te da error. No veo qué problema ves ahí. Lo que hay que hacer es poner el tipo adecuado a este caso que es elCode
.