Delphi - Arreglos Dinámicos

 
Vista:
sin imagen de perfil

Arreglos Dinámicos

Publicado por Anel (78 intervenciones) el 28/03/2005 21:24:58
Tengo un arreglo dinamigo de tipo byte llamado it. Yo le defino su longitud con setlength en determinado momento de la corrida de la aplicacion. En otro momento cuando lo voy a hacer cero con:
fillchar(it,length(it),0);
en vez de darme como resultado it:(0,0,0,0,0) me da it(), es decir me lo deja sin longitud, indefinido. El fillchar me deja mi arreglo vacio.

Que error estoy cometiendo? que me esta pasando?

Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Arreglos Dinámicos

Publicado por grita (4 intervenciones) el 15/04/2005 00:49:32
usa ZeroMemory() en vez de FillChar()
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Explicacion detallada

Publicado por SADE (76 intervenciones) el 15/04/2005 01:30:38
descubri el error de FillChar() como veras no tengo nada que hacer jeje.
en si no es un error, sino que un mal paso del parametro [ti], aqui explico:

FillChar(ti, length(ti), 0);

tuve que usar un depurador para ver que sucedia.
no pude usar el depurador que delphi trae (CPU Window) porque no servian los breakpoints, asi que no se para que diablos ponen un depurador, si no van a servir los breakpoints!!! use Delphi 2005.
codigo desensambaldo de la llamada de FillChar()

MOV EAX, DWORD PTR DS:[458B8C] ; eax = puntero de array dinamico
CALL Project1.00404D1C ; call Length()
MOV EDX, EAX ; edx = longitud del array dinamico
MOV EAX, Project1.00458B8C ; eax = puntero del puntero del array dinamico
XOR ECX, ECX ; ecx = 0 = byte a rellenar
CALL Project1.00402B28 ; call FillChar()

como ves en lso comentarios.... EAX contiene un puntero que apunta a otro puntero que a su vez apunta al array dinamico y ahi es dond esta el error.
FillChar() no pondra ceros en el array dinamico sino en el puntero.que apunta al array dinamico, osea en vez de poner a ceros al array de bytes pone a ceros al puntero del array de bytes. un puntero es 4 bytes, osea si length retorna algo mayor que 4 tambien pondra a ceros a los bytes que estan despues del puntero.

la solucion seria que EAX contenga el puntero al array dinamico y no el puntero dle puntero del array dinamico.
hace tiempo que no uso delphi pero con esto debe funcionar:
FillChar(Pointer(ti)^, length(ti), 0);

SADE


Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar