[Lazarus-es] uso de SetLength

Rafael Bidegain r.bidegain en gmail.com
Mie Jul 20 13:50:30 CEST 2016


El 20 de julio de 2016, 4: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 :).
>
Está claro que eso es algo que resuelve Free Pascal Compiler!
por otra parte, los array siempre son bloques de memoria contigua.
Lo que de alguna manera me llama la atención es que si cada función tiene
su pila (no sé si realmente es así, creo que hace muchos años era así) y
ese array está en la pila de la función esta en algún momento se podría
terminar y SetLength debería devolver error.

Si el array dinámico de la función no se crea en la pila de la función sino
en el lugar de las variables públicas, el problema quizás sea menor, pero
de todas maneras se debería comprobar si se pudo expandir el array.


>
> 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.
>
Es cierto no lo dice, lo interpreté del ejemplo


> 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.
>
Esto me hace ruido,
estoy pensando en que puedo liberar la memoria y después usar los datos de
esa zona de memoria que fué 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.
>
Quizás sea buena idea solicitar que se incluya en la documentación de
SetLength que pasa con los datos<


> 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.
>
si, de nuevo. de eso se tratan los array, son espacios contiguos de
memoria, por eso se los puede acceder con un índice.


>
> ¿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
>
>


-- 
Rafael Bidegain

Ya que los cuerdos no hablan, hablará el loco.
(The Fool, Padraic Pearse)

# yo quiero educación libre. ¡YA!
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus-es/attachments/20160720/085d7c51/attachment-0001.html>


More information about the Lazarus-es mailing list