[Lazarus-es] uso de SetLength

Rafael Bidegain r.bidegain en gmail.com
Mie Jul 20 06:14:23 CEST 2016


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

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

¿qué opinan uds?

-- 
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/ed943939/attachment.html>


More information about the Lazarus-es mailing list