Gracias Javier y Gustavo , así de  mucho su ayudad .

De: [email protected] 
[mailto:[email protected]] En nombre de Departamento de 
Sistemas
Enviado el: viernes, 04 de julio de 2014 06:15 a.m.
Para: forum.help400
Asunto: Re: error de puntero

Buenas.
Con tu permiso voy a extender un poco tu explicación.
Tu creas la estructura Ent1 y le dices que se almacena en la posición de 
memoria que guarda la variable Pun_Ent_Salb. Pero, como te indica Javier, no 
inicializas la variable Pun_Ent_Salb, así que no guarda ninguna ubicación de 
memoria y Ent1 en realidad no se está almacenando en ningún lugar, por lo que 
al hacer Ent1.Vimcaj= '118T001' es donde te esta dando el error de puntero.
Para solucionarlo tienes dos opciones. Una es la que te ofrece Javier, que es 
hacerlo al revés. Tener Ent1 como estructura de datos normal (quitar el BASED) 
y tomar la dirección de memoria con la función %ADDR con lo que ya no necesitas 
la variable Pun_Ent_Salb porque hacer la llamada a tu procedimiento pasando 
%Addr(Ent1) directamente.
Para el ejemplo básico que has pasado, esta solución funciona, pero puede que 
para un caso más complejo se te quede corto. Así que te ofrezco la otra 
solución que es terminar lo que habías empezado para que funcione. Javier te 
indica que te falta inicializar la variable Pun_Ent_Salb. Esto se puede hacer 
en general con Pun_Ent_Salb=%Addr(Ent1), pero como en tu caso has puesto que 
Ent1 es Based(Pun_Ent_Salb), aquella asignación no va a hacer nada en el mejor 
de los casos o te dará un error de puntero en el peor (no lo sé, habría que 
probarlo). La otra forma de inicializar una variable de puntero, que es la que 
necesitas, es con ALLOC (%ALLOC en free - 
https://publib.boulder.ibm.com/iseries/v5r2/ic2924/books/c092508429.htm#HDRBBALLOC).
 %ALLOC acepta un parámetro que es cuanta memoria se va a reservar para ese 
puntero, que en tu caso tiene que ser el tamaño de la estructura Ent1. El 
tamaño de memoria de cualquier variable o estructura de datos se puede obtener 
con la función %SIZE 
(https://publib.boulder.ibm.com/iseries/v5r2/ic2924/books/c092508429.htm#HDRBBSIZE).
 La instrucción para inicializar tu puntero tiene que ser 
Pun_Ent_Salb=%ALLOC(%SIZE(Ent1)). La complicación de esto es que cada vez que 
haces un %ALLOC ocupas memoria y cuando terminas de utilizarla tienes que 
liberarla o terminaras ocupándola toda. Esto se hace con DEALLOC 
(https://publib.boulder.ibm.com/iseries/v5r2/ic2924/books/c092508430.htm#HDRZZDEALL).
 Tu procedimiento debe quedar así:

Pun_Ent_Salb=%ALLOC(%SIZE(Ent1));
Ent1.Vimcaj= '118T001';
Ent1.VimCfl= 'ZP';
Ent1.VimCla= '00000';
Transaccion(Pun_Ent_Salb);
DEALLOC(n) Pun_Ent_Salb;

Para terminar con los punteros debes saber que también existe REALLOC (%REALLOC 
 en free - 
https://publib.boulder.ibm.com/iseries/v5r2/ic2924/books/c092508429.htm#HDRBBREALL)
 que se utiliza para cambiar el tamaño del espacio reservado por un %ALLOC 
anterior.

Saludos.

Gustavo Adolfo Márquez Álvarez.
Departamento de Sistemas.
[email protected]<mailto:[email protected]>
inforZitro, S. L.
Carretera de Níjar, nº 404.
04007 Almería (España).
Teléfono: 950 226 658.
Extensión: 148.
Fax: 950 223 620.


From: Javier Mora<mailto:[email protected]>
Sent: Friday, July 04, 2014 9:26 AM
To: forum.help400<mailto:[email protected]>
Subject: RE: error de puntero

Bueno, de momento veo dos cosas:

1. El prototipo de 'Transaccion()' tiene como parámetros dos punteros, cuando 
en la llamada utilizas sólo uno.

2. El puntero 'Pun_Ent_Salb' no lo inicializas, debería ser algo como:

Pun_Ent_Salb = %Addr( Ent1 );

Salvo que el puntero lo utilices para 'mover' la estructura por la memoria, 
podrías hacerlo de otra forma:

D  Ent1           Ds                  Qualified
d                                     Based(Pun_Ent_Salb)   <-- Eliminar
d  Vimcaj                        7A
d  VimCfl                        2A
d  VimCla                        5A

// ...

Transaccion( %Addr( Ent1 ) );

________________________________
De: [email protected] 
[mailto:[email protected]] En nombre de Oqueller Petrocini
Enviado el: jueves, 03 de julio de 2014 19:21
Para: forum.help400
Asunto: RE: error de puntero
ME COMPILA  CUANDO CORRE ME DA ERROR DE PUNTO EN Ent1.Vimcaj= '118T001'
______________________________________________
dTransaccion      Pr                  ExtPgm('T475022PD')
d                                 *
d                                 *
D  Ent1           Ds                  Qualified
d                                     Based(Pun_Ent_Salb)
d  Vimcaj                        7A
d  VimCfl                        2A
d  VimCla                        5A
DPun_Ent_Salb     S               *
   Ent1.Vimcaj= '118T001';
   Ent1.VimCfl= 'ZP';
   Ent1.VimCla= '00000';
   Transaccion(Pun_Ent_Salb);
Gracias

De: [email protected] 
[mailto:[email protected]] En nombre de Javier Mora
Enviado el: jueves, 03 de julio de 2014 12:39 p.m.
Para: forum.help400
Asunto: RE: error de puntero
Falta que nos enseñes el prototipo de 'Transaccion()'
Javier Mora
________________________________
De: [email protected] 
[mailto:[email protected]] En nombre de Oqueller Petrocini
Enviado el: jueves, 03 de julio de 2014 16:33
Para: forum.help400
Asunto: error de puntero
Bueno días

Estoy tratando de pasar puntero por un parámetro y me da un error de puntero
D  Ent1           Ds                  Qualified
d                                     Based(Pun_Ent_Salb)
d  Vimcaj                        7A
d  VimCfl                        2A
d  VimCla                        5A
DPun_Ent_Salb     S               *
Ent1.Vimcaj= '118T001';
Ent1.VimCfl= 'ZP';
Ent1.VimCla= '00000';
Transaccion(Pun_Ent_Salb);
Gracias
________________________________
____________________________________________________
Únete a Recursos AS400, nuestra Comunidad ( http://bit.ly/db68dd )
Forum.Help400 © Publicaciones Help400, S.L.
____________________________________________________
Únete a Recursos AS400, nuestra Comunidad ( http://bit.ly/db68dd )
Forum.Help400 © Publicaciones Help400, S.L.

Responder a