Page 1 of 1

ayuda con error !!

Posted: Tue Dec 18, 2007 12:49 am
by alex_cyr
que tal, tengo un programita que genera un archivo texto con las estructuras e indices de mis dbfs, lo extraño es ke en ocasiones me manda el siguiente mensaje, si alguien me pudiera ayudar le estaria agradecido.

UNRECOVERABLE ERROR 9009:
hb_xrealloc can't reallocate memory


alex

Posted: Tue Dec 18, 2007 1:04 am
by Antonio Linares
Alex,

En los ordenadores actuales es realmente dificil que un bloque de memoria no se pueda redimensionar (hb_xrealloc), por lo que es más fácil pensar que se trate de un puntero (a memoria) no válido.

Puedes proporcionar un ejemplo que reproduzca el error ? gracias,

Posted: Tue Dec 18, 2007 1:28 am
by alex_cyr
Antonio, esta es mi funcion, te platico rapidamente que hace, obtiene todos los dbfs de un directorio, escribe la estructura en un TXT y luego cada uno de sus indices NTX, si remuevo la parte donde escribo los indices funciona sin problema:


gracias
alex.

*CREA EL ARCHIVO TEXTO CON LAS ESTRUCTURAS DEL SISTEMA PARA LA APERTURA DE EMPRESAS
static function txtstru()
LOCAL afiles := directory(xrutemp+'*.DBF')
LOCAL astrcut:= {}
LOCAL wtexto,i,j,k := 0
LOCAL lanio,afiles2:={}
LOCAL aindices:={}
PRIVATE ldbf,lntx

wtexto := fcreate(xrutbas+'ESTRUCT.TXT',0)

k:= len(afiles)
for j = 1 to k

*LOS YY YA NO JUEGAN
if upper(substr(afiles[j,1],at('.',afiles[j,1])-2,2)) == upper('YY')
loop
endif

*DETERNIMA SI ES UN ARCHIVO ANUAL EN CUYO CASO PROCESA SOLO LOS DEL AÑO DEL XDATE
lfile := afiles[j,1]
if val(substr(afiles[j,1],at('.',afiles[j,1])-2,2)) > 0
lanio := 2000+val(substr(afiles[j,1],at('.',afiles[j,1])-2,2))
if lanio # year(xdate)
loop
endif
lfile := strtran(afiles[j,1],substr(str(year(xdate),4),3,2),'YY')
aadd(afiles2,lfile) //ARREGLO CON ARCHIVOS DE EJERCICIO
endif

*ESCRIBE EL NOMBRE DEL ARCHIVO
fwrite(wtexto,'A'+lfile+chr(13)+chr(10))
dbusearea(.t.,,xrutemp+afiles[j,1])
astruct := dbstruct()

*ESCRIBE LA ESTRUCTURA DEL ARCHIVO
for i = 1 to len(astruct)
fwrite(wtexto,'E{'+astruct[i,1]+','+astruct[i,2]+','+str(astruct[i,3],2)+','+str(astruct[i,4],1)+'}'+chr(13)+chr(10))
next i

dbclosearea()

*ESCRIBE LOS INDICES
asize(aindices,0)
aindices := directory(xrutemp+strtran(upper(afiles[j,1]),'.DBF','')+'.*')

for x := 1 to len(aindices)
lntx := aindices[x,1]
if upper(substr(lntx,at('.',lntx),4)) $ '.DBF,.BAK,.RES,.OLD,.ANT'
loop
endif

ldbf := xrutemp+afiles[j,1]
lntx := xrutemp+aindices[x,1]

USE &ldbf index &lntx NEW ALIAS ALTEMP
cnombre := substr(lntx,at('.',lntx)+1,3)
ckey := indexkey()
fwrite(wtexto,'I'+cnombre+' '+ckey+chr(13)+chr(10))
dbclosearea()
next x

fwrite(wtexto,'*'+chr(13)+chr(10))
next j

*AGREGA LOS ARCHIVOS DE APERTURA DE EJERCICIO
for j = 1 to len(afiles2)
fwrite(wtexto,'FILEC'+afiles2[j]+chr(13)+chr(10)) //FILEC = COPIAR EL FICHERO CON DATOS
//FILEZ = COPIAR SOLO ESTRUCTURA *SE DEBE PONER LA Z MANUALMENTE
next j

fclose(wtexto)
return .t.

Posted: Tue Dec 18, 2007 9:52 am
by Antonio Linares
Alex,

Comentando estas tres líneas ya no falla ?

Code: Select all

cnombre := substr(lntx,at('.',lntx)+1,3) 
ckey := indexkey() 
fwrite(wtexto,'I'+cnombre+' '+ckey+chr(13)+chr(10))
De ser asi, prueba con:

Code: Select all

cnombre := substr(lntx,at('.',lntx)+1,3) 
ckey := indexkey() 
if Empty( cnombre ) .or. Empty( ckey )
   MsgAlert( "nombre ó key no válido!" )
endif
DEFAULT cnombre := "", ckey := ""
fwrite(wtexto,'I'+cnombre+' '+ckey+chr(13)+chr(10))

Posted: Tue Dec 18, 2007 9:55 am
by Antonio Linares
Tambien puede ser que at('.',lntx) devuelva cero, por lo que le estarías pasando un valor erróneo a SubStr()

Compruébalo:

Code: Select all

if at('.',lntx) == 0
   MsgAlert( "el fichero no tiene extension!" )
endif

Posted: Tue Dec 18, 2007 5:15 pm
by alex_cyr
Antonio, gracias por tus sugerencias, las voy a aplicar en el programa para hacerlo mas robusto, encontre el problema y era que estaba tomando un archivo DBK y lo abria como un indice lo cual generaba el error...


gracias.
Alex.

Posted: Tue Dec 18, 2007 5:49 pm
by Antonio Linares
bien! :-)