[Lazarus-es] uso de SetLength

Juan M. Puertas soft.sirius en gmail.com
Mie Jul 20 12:22:15 CEST 2016


Gracias Rafael y Jesús.
Buscaré información sobre cómo cambiar esta función para que haga
correctamente el uso de SetLength.
Saludos :-)

El 20 de julio de 2016, 9:07, Jesus Reyes A. <jesusrmx en gmail.com> escribió:

> En Tue, 19 Jul 2016 23:14:23 -0500, Rafael Bidegain <r.bidegain en gmail.com>
> escribió:
>
> A propósito del tema planteado por Juan M. Puertas y el aporte realizado
> por Jesus Reyes A.
> Me ha llamado la atención el uso de la función SetLength en la función
> vbSplit.
> function vbSplit(S: string; Delimiter: char): TStrArray;
> var
>   C: integer;
> begin
>   repeat
>     SetLength(Result, Length(Result) + 1);
>     C := Pos(Delimiter, S);
>     if C = 0 then
>       C := Length(S) + 1;
>     Result[Length(Result) - 1] := Copy(S, 1, C - 1);
>     Delete(S, 1, C);
>   until Length(S) = 0;
> end;
>
> Yo creo que en esa función el programador asumió que SetLength siempre
> expandirá el array.
>
>
> Y así es, de lo contrario debería arrojar un error que en este caso
> particular no es manejado.
>
> Según mis pocos conocimientos para que eso sea posible, en tiempo de
> compilación, se debería reservar una cantidad importante de memoria
> contigua para el posible crecimiento de cada array dinamico que el
> programador declare o
> implementar en SetLength una opción para mover el array a otra zona si no
> hay espacio disponible.
> en C se resolvería llamando a realloc
>
>
> De esto se encarga FPC. Si SetLength no falla, esta garantizado que la
> memoria reservada para el array es un segmento continuo de memoria.
> Internamente FPC se encarga de que todos los detalles para que esto sea
> así. No por nada se les llama Arrays Dinámicos :).
>
>
> pero en la documentación no entiendo eso. yo entiendo que se debe llamar
> _una vez_ a SetLength con un valor mayor a cero y otra vez con valor igual
> a cero si se desea borrar los datos del array.
> http://www.freepascal.org/docs-html/rtl/system/setlength.html
>
>
> He leído el artículo enlazado y la lectura que hago no me dice nada a
> cerca de que se *deba* usa solo una vez, y si no lo dice es por que no es
> así, puedes usar SetLength las veces que sea necesario. Y si en algún punto
> quieres tener la conciencia tranquila con respecto a la memoria reservada
> dinámicamente puedes especificar 0 como número de elementos y eso
> "limpiara" el array, aquí cleared se usa para indicar que la memoria usada
> por el array será liberada.
>
> Lo que no dice es que aumentar el número de elementos del array no
> "elimina" los elementos existentes, sino que solo hace más espacio para la
> cantidad extra deseada de elementos. De nuevo internamente FPC hace todo lo
> necesario para que al final todos los elementos del array estén dentro de
> un segmento continuo de memoria.
>
>
> ¿qué opinan uds?
>
>
> Saludos.
>
> Jesus Reyes A.
> <http://www.opera.com/mail/>
>
> _______________________________________________
> Lazarus-es mailing list
> Lazarus-es en lists.lazarus-ide.org
> http://lists.lazarus-ide.org/listinfo/lazarus-es
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus-es/attachments/20160720/03fa2a23/attachment.html>


More information about the Lazarus-es mailing list