Ver Mensaje Individual
  #34  
Antiguo 15-10-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Reputación: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Cita:
Empezado por roman Ver Mensaje
Por otro lado, leer más allá de los índices posiblemente no de errores pero debe hacerse siempre y cuando sepamos qué vamos a leer. En el caso presente, debíamos saber que en Length+1 no había un espacio y eso no podíamos asegurarlo si no lo asignábamos nosotros mismos.
La lógica me indicaba (y me indica) opinar igual que vos cuando hiciste esa observación en los primeros mensajes y pensé que el código del mensaje #9, no había fallado en las pruebas por motivos de suerte (de no haber encontrado un espacio mas allá del fin de la cadena).

Para salir de toda duda hice una pequeña prueba y las sorpresas no terminaron.
Código Delphi [-]
const
  ABC = 'ABCDEFGHIJKLMNOPQRSTVUWXYZ';

procedure TForm1.Button1Click(Sender: TObject);
var
  s   : AnsiString;
  i,j : Integer;
  TS  : TStrings;
begin
  Randomize;
  TS := TStringList.Create;
  try
    TS.BeginUpdate;
    for i := 1 to 1000 do
    begin
      s:= '';
      for j := 1 to Random(Length(ABC))+1 do
        s := s + abc[Random(Length(ABC))+1];
      TS.Add(Format('%.3d: %s',[Ord(s[Length(s)+1]), s]));
    end;
    TS.SaveToFile('prueba.txt');
  finally
    TS.EndUpdate;
    TS.Free;
  end;
  ShowMessage('fin');
end;
Al revisar el archivo prueba.txt veo que en todos los casos la primera posición mas allá del último caracter de un AnsiString contiene el valor cero.

Me dije "suerte otra vez... vamos a seguir probando pero trabajando menos":
Código Delphi [-]
function HaveDistinctZero(const Laps: Integer): Integer;
const
  ABC = 'ABCDEFGHIJKLMNOPQRSTVUWXYZ';
var
  s: AnsiString;
  i, j: Integer;
begin
  Result := 0;
  for i := 1 to Laps do
  begin
    s:= '';
    for j := 1 to Random(Length(ABC))+1 do
      s := s + abc[Random(Length(ABC))+1];
    if Ord(s[Length(s)+1]) <> 0 then Inc(Result);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(HaveDistinctZero(100000000))); // resultado: 0
end;
Corrí la prueba tres veces y resultó que en los cientos de millones de casos, siempre obtuve el mismo resultado: La primera posición despues del último caracter de un AnsiString tiene el valor cero (no controlé mas allá).

O no estoy haciendo las pruebas correctas o Delphi está inicializando el espacio contiguo de algún modo.

Sigo sin encontrar la explicación...

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita