close Warning: Can't synchronize with repository "(default)" (/var/svn/tolp does not appear to be a Subversion repository.). Look in the Trac log for more information.

Opened 16 years ago

Closed 16 years ago

#714 closed defect (fixed)

Herencia. Error inesperado

Reported by: Javier Portugal Owned by: Víctor de Buen Remiro
Priority: high Milestone: OOP Implementation
Component: OOP Version: 2.0.1
Severity: critical Keywords:
Cc:

Description

El siguiente ejemplo produce un error que no consigo explicar. Lo he reproducido de otro código.

Class Variable 
{
  Text _.name
};

Class Input 
{
  Text _.name;
  Variable _.variable
};

Class ExplicativeTerm
{
  Text _.name         ;
  Text _.description  = "Sin descripción";
  Set _.parameters    = Copy(Empty)
};


Class LinearExplicativeTerm: ExplicativeTerm
{
  Input _.input
};

Class OmegaExplicativeTerm : LinearExplicativeTerm 
{
  Real _.member
};


Variable myVar = [[ Text _.name = "mi variable" ]];

Input II = [[ Text _.name = "input", Variable _.variable = myVar ]];

OmegaExplicativeTerm D1 = [[ Text _.name = "D1", Input _.input = II, Real _.member = 2.0 ]];

Change History (4)

comment:1 Changed 16 years ago by Víctor de Buen Remiro

Status: newassigned

Ya lo tengo reproducido. El error que devuelve es

ERROR: [1] No se pudo crear la instancia D1 de la clase OmegaExplicativeTerm debido a que hay miembros no implementados :
  Variable Input::_.variable

Efectivamente no tiene sentido porque, para empezar sí está definido Variable Input::_.variable y, en todo caso, de no haber existido, el error deberia haberlo dado al crear Input II

A depurar tocan.

comment:2 Changed 16 years ago by Víctor de Buen Remiro

He encontrado el error aunque no sé aún cómo arreglarlo.

El problema es que el parser se como los paréntesis cuando sólo hay un elemento dentro de una lista, como es el caso de la sentencia

  Class LinearExplicativeTerm: ExplicativeTerm
  {
    Input _.input
  };

Debido a ello interpreta la sentencia como

  Class LinearExplicativeTerm: ExplicativeTerm, Input;

y por eso dice que falta de definir el miembro _.variable. A parte de eso no sé porqué no da un error pues no debería aceptar Input seguido de _.input dentro de la sección de herencia.

De momento, mientras busco una solución decente, se puede vadear el problema añadiendo un campo ficticio

  Class LinearExplicativeTerm: ExplicativeTerm
  {
    Input _.input;
    Real unused_1_=?
  };

comment:3 Changed 16 years ago by Víctor de Buen Remiro

Mejor un miembro oculto ficticio

  Class LinearExplicativeTerm: ExplicativeTerm
  {
    Input _.input;
    Real _unused_1_=?
  };

comment:4 Changed 16 years ago by Víctor de Buen Remiro

Resolution: fixed
Status: assignedclosed

(In [1178]) Fixes #714

Note: See TracTickets for help on using tickets.