Hola, foro.

Estoy haciendo unas pruebas con un procedimiento que quiero que me devuelva un valor *char longitud va a variar en cada llamada, con vistas a editar un valor num�rico y devolverlo como texto.

Lo que haga el programa ahora mismo da igual; el problema es que la ejecuci�n funciona bien en sucesivas llamadas pero llega un punto en que pierdo los valores de campos utilizados en el programa y que no tienen nada que ver con la llamada actual (como si solapara posiciones de memoria).

Como digo, las llamadas a pEdita funcionan bien hasta que se ejecuta la llamada que devuelve el resultado en el campo s4; en ese momento se pierdern los datos de s1, s2 y s3.

�Alguien sabe qu� estoy haciendo mal?

Me ocurre lo mismo con otro procedimiento distinto a este, en el que no se usa la API ceedod (no es por su culpa) y tambi�n tiene especificado el options(*varsize).

Gracias.



El programa es el siguiente:



     d pEdita          pr                  opdesc
     d  num                          30  5 const
     d  dec                           1  0 const
     d  string                       64    options(*varsize)

     d ceedod          pr
     d  ParmNum                      10i 0 const
     d  DescType                     10i 0
     d  DataType                     10i 0
     d  DescInfo1                    10i 0
     d  DescInfo2                    10i 0
     d  InLen                        10i 0
     d                               12a   options(*omit)
      * Parameters passed to CEEDOD
     d DescType        s             10i 0
     d DataType        s             10i 0
     d DescInfo1       s             10i 0
     d DescInfo2       s             10i 0
     d InLen           s             10i 0

     d s1              s             11
     d s2              s             12
     d s3              s             13
     d s4              s             14
     d s5              s             15
     d s6              s             16

     c                   callp     pEdita(-123456,7890:4:s1)
     c                   callp     pEdita(-123456,7890:4:s2)
     c                   callp     pEdita(-123456,7890:4:s3)
     c                   callp     pEdita(-123456,7890:4:s4)
     c                   callp     pEdita(-123456,7890:4:s5)
     c                   callp     pEdita(-123456,7890:4:s6)
     c                   eval      *inlr = *on

     p pEdita          b
     d pEdita          pi                  opdesc
     d  num                          30  5 const
     d  dec                           1  0 const
     d  string                       64    options(*varsize)

     d alfa            s             64    inz varying
     d long            s              4  0 inz

     c                   eval      alfa   = %trim(%editc(num:'P'))

     c                   eval      long   = %len(alfa)
     c                   select
     c                   when      dec = 0
     c                   eval      alfa   = %subst(alfa:1:long-6)
     c                   when      dec = 1
     c                   eval      alfa   = %subst(alfa:1:long-4)
     c                   eval      string = *blank
     c                   when      dec = 2
     c                   eval      alfa   = %subst(alfa:1:long-3)
     c                   when      dec = 3
     c                   eval      alfa   = %subst(alfa:1:long-2)
     c                   when      dec = 4
     c                   eval      alfa   = %subst(alfa:1:long-1)
     c                   endsl
     c                   eval      long   = %len(alfa)
     c                   eval      string = *blank

     c                   callp     ceedod(3         : DescType : DataType :
     c                                    DescInfo1 : DescInfo2: Inlen    :
     c                                    *OMIT)
     c                   if        Inlen >= long
     c                   eval      %subst(string:Inlen-long+1:long) = alfa
     c                   endif

     c                   return
     p pEdita          e



Responder a