Hola.
Cita:
Empezado por roman
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))); 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
