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.

