[Lazarus-es] uso de SetLength

Jesus Reyes A. jesusrmx en gmail.com
Mie Jul 20 09:07:15 CEST 2016


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 oimplementar 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.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus-es/attachments/20160720/06feeb8f/attachment.html>


More information about the Lazarus-es mailing list