[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