Mostrando entradas con la etiqueta strings. Mostrar todas las entradas
Mostrando entradas con la etiqueta strings. Mostrar todas las entradas

sábado, 8 de junio de 2019

Mezclar un string.

Es decir, un random de una cadena de caracteres. Lo publico porque luego de hacer esta función se me ocurrió buscar en Internet cómo lo habían resuelto otros colegas o sí ya existía una función para tal fin. Pues resulta que no, sí lo hay para stringlist, pero eso es otra cosa. Si bien podría optimizarse un poco más, por tratarse de una función chica, creo que así está bien. Podría evitarse la variable q por ejemplo y el SetLength del array hacerlo en base Length(cl).
En definitiva esta función recibe un string y devuelve un string con los mismos caracteres pero cambiados de lugar, por ejemplo puede recibir "casa" y retornar "aacs".

function Mezclar(const cl: string): String;
var
  i,j,rand,indarray,q:Integer;
  res:String;
  aInd:array of Integer;
  yaesta:Boolean;
begin
  q:=Length(cl);
  yaesta:=False;
  SetLength(aInd,q);
  res:='';
  i:=Length(cl);
  indarray:=0;
  repeat
    rand:=Random(q)+1;
    for j:=Low(aInd) to High(aInd) do
      if aInd[j]=rand then yaesta:=True;
    if not(yaesta) then
      begin
        res:=res+cl[rand];
        aInd[indarray]:=rand;
        Inc(indarray);
        Dec(i);
      end;
    yaesta:=False;
  until i=0;
  Result:=res;
end;


Para los novatos o quienes están medios oxidados o retornando a la programación, puede ser un interesante ejercicio.

¿Qué me llevó a hacer esta función? Un programa de generación de contraseñas, del tipo que le permite al usuario especificar la cantidad de mayúsculas, minúsculas, números y caracteres especiales (símbolos), en una parte tenía los randoms de esta forma "GYEBkfuenlow4982($*!" entonces eso se lo paso a esta función y listo, me altera las posiciones, sería un random de un random "ordenado" o algo así.

Aclaración: Randomize lo llamo en el Form.Create por eso no está en la función. Se recomienda utilizar Randomize solo una vez.

viernes, 18 de agosto de 2017

Qué significa {$mode objfpc}{$H+}

Cada vez que creamos una unidad en Lazarus, vemos esto:

unit Unit1;

{$mode objfpc}{$H+}       

Son interruptores (switch) que indican al compilador como debe compilar. En el caso de {$H+} se le está indicando que cuando se defina un string deberá el compilador asumir que es un AnsiString, es decir, que el string no tendrá una limitación en cuanto al tamaño, a no ser que se especifique un tamaño, en tal caso, será tratado como un ShortSting cuyo tamaño máximo es de 255 caracteres. Si necesitamos que en una unidad de nuestro proyecto todo lo que definamos como string sea tratado como ShortString, podemos utilizar el switch $H- de la siguiente forma:

unit Unit1;

{$mode objfpc}{$H-}     

Lo habitual (y por eso viene así por default) es {$H+}.

{$mode objfpc} le indica al compilador el modo de compilación Object Free Pascal Compiler, lo que implica por ejemplo que se pueden utilizar comentarios anidados, se permite la sobrecarga (overloading) de funciones, los PChar son convertidos en Strings automáticamente y otras cosas más que pueden leerse aquí en inglés.