<div dir="ltr"><div class="gmail_default" style="font-family:verdana,sans-serif">Gracias Rafael y Jesús.<br></div><div class="gmail_default" style="font-family:verdana,sans-serif">Buscaré información sobre cómo cambiar esta función para que haga correctamente el uso de SetLength.<br></div><div class="gmail_default" style="font-family:verdana,sans-serif">Saludos :-)<br></div></div><div class="gmail_extra"><br><div class="gmail_quote">El 20 de julio de 2016, 9:07, Jesus Reyes A. <span dir="ltr"><<a href="mailto:jesusrmx@gmail.com" target="_blank">jesusrmx@gmail.com</a>></span> escribió:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><u></u>


<div><span class=""><font face="'Courier New',monospace">En Tue, 19 Jul 2016 23:14:23 -0500, Rafael Bidegain <<a href="mailto:r.bidegain@gmail.com" target="_blank">r.bidegain@gmail.com</a>> escribió:</font><font face="'Courier New',monospace"><br></font><font face="'Courier New',monospace"><br></font><blockquote style="margin:0 0 0.80ex;border-left:#0000ff 2px solid;padding-left:1ex"><div dir="ltr"><div><font face="'Courier New',monospace">A propósito del tema planteado por Juan M. Puertas y el aporte realizado por Jesus Reyes A.</font></div><div><font face="'Courier New',monospace">Me ha llamado la atención el uso de la función SetLength en la función vbSplit.</font></div><div><div><font face="'Courier New',monospace">function vbSplit(S: string; Delimiter: char): TStrArray;</font></div><div><font face="'Courier New',monospace">var</font></div><div><font face="'Courier New',monospace">  C: integer;</font></div><div><font face="'Courier New',monospace">begin</font></div><div><font face="'Courier New',monospace">  repeat</font></div><div><font face="'Courier New',monospace">    SetLength(Result, Length(Result) + 1);</font></div><div><font face="'Courier New',monospace">    C := Pos(Delimiter, S);</font></div><div><font face="'Courier New',monospace">    if C = 0 then</font></div><div><font face="'Courier New',monospace">      C := Length(S) + 1;</font></div><div><font face="'Courier New',monospace">    Result[Length(Result) - 1] := Copy(S, 1, C - 1);</font></div><div><font face="'Courier New',monospace">    Delete(S, 1, C);</font></div><div><font face="'Courier New',monospace">  until Length(S) = 0;</font></div><div><font face="'Courier New',monospace">end;</font></div></div><div><font face="'Courier New',monospace"><br></font></div><div><font face="'Courier New',monospace">Yo creo que en esa función el programador asumió que SetLength siempre expandirá el array.</font></div></div></blockquote><div><font face="'Courier New',monospace"><br></font></div></span><div><font face="'Courier New',monospace">Y así es, de lo contrario debería arrojar un error que en este caso particular no es manejado.</font></div><span class=""><div><font face="'Courier New',monospace"><br></font></div><blockquote style="margin:0 0 0.80ex;border-left:#0000ff 2px solid;padding-left:1ex"><div dir="ltr"><div><font face="'Courier New',monospace">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 </font></div><div><font face="'Courier New',monospace">implementar en SetLength una opción para mover el array a otra zona si no hay espacio disponible.</font></div><div><font face="'Courier New',monospace">en C se resolvería llamando a realloc</font></div></div></blockquote><div><font face="'Courier New',monospace"><br></font></div></span><div><font face="'Courier New',monospace">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 :).</font></div><span class=""><div><font face="'Courier New',monospace"><br></font></div><blockquote style="margin:0 0 0.80ex;border-left:#0000ff 2px solid;padding-left:1ex"><div dir="ltr"><div><font face="'Courier New',monospace"><br></font></div><div><font face="'Courier New',monospace">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.</font></div><div><a href="http://www.freepascal.org/docs-html/rtl/system/setlength.html" target="_blank"><font face="'Courier New',monospace">http://www.freepascal.org/docs-html/rtl/system/setlength.html</font></a></div></div></blockquote><div><font face="'Courier New',monospace"><br></font></div></span><div><font face="'Courier New',monospace">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.</font></div><div><font face="'Courier New',monospace"><br></font></div><div><font face="'Courier New',monospace">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.</font><font face="'Courier New',monospace"></font></div><div><font face="'Courier New',monospace"><br></font></div><blockquote style="margin:0 0 0.80ex;border-left:#0000ff 2px solid;padding-left:1ex"><div dir="ltr"><div><font face="'Courier New',monospace"><br></font></div><div><font face="'Courier New',monospace">¿qué opinan uds?</font></div><div><font face="'Courier New',monospace"><br></font></div><font face="'Courier New',monospace">
</font></div><font face="'Courier New',monospace">
</font></blockquote><div><font face="'Courier New',monospace"><br></font></div><div><font face="'Courier New',monospace">Saludos.<span class="HOEnZb"><font color="#888888"><br></font></span></font></div><span class="HOEnZb"><font color="#888888"><div><font face="'Courier New',monospace"><br></font></div><div><font face="'Courier New',monospace">Jesus Reyes A.<br></font></div><a href="http://www.opera.com/mail/" target="_blank"></a></font></span></div><br>_______________________________________________<br>
Lazarus-es mailing list<br>
<a href="mailto:Lazarus-es@lists.lazarus-ide.org">Lazarus-es@lists.lazarus-ide.org</a><br>
<a href="http://lists.lazarus-ide.org/listinfo/lazarus-es" rel="noreferrer" target="_blank">http://lists.lazarus-ide.org/listinfo/lazarus-es</a><br>
<br></blockquote></div><br></div>