Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-10-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 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
  #2  
Antiguo 16-10-2015
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por ecfisa Ver Mensaje
Con el fin de entender esto, me puse a investigar un poco. Y de lo conocido, mas lo que pude ampliar leyendo, una variable de tipo AnsiString contiene un apuntador que almacena un valor nulo si está vacía o de modo contrario apunta a la dirección del comienzo de una cadena finalizada en nulo al estilo de las cadenas C.
Cita:
Empezado por ecfisa Ver Mensaje
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...
Tu mismo te diste la respuesta. Las cadenas en delphi terminan como en C, con un nulo, es por eso la facilidad del cast PCHAR. PCHAR te devuelve una cadena estilo C, si te fijas en el ejemplo que puse en asm, termino la cedena con un nulo y la conversión a String es perfecta, si no lo haces, la cadena resultante será tan larga como la original y contiene el resto de la cadena tras retirarle los espacios múltiples:
"Hola que tal" se transforma en "Hola que tal" si metes el nulo final, en caso contrario será "Hola que tal tal". ¿Porqué? porque la cadena original terminaba en nulo.
De esta forma, el cast PCHAR(Cadena) es lo mismo que hacer @Cadena[1], que es justo el casting que realizo para tratarla desde ensamblador.

Te sorprenderías al saber la cantidad de analogías existentes entre delphi y C a bajo nivel, por ejemplo, los arrays se tratan idénticamente. Si tienes curiosidad, sigue este hilo donde hicimos una investigación sobre el tema, y este otro hilo que demuestra lo mismo.


Saludos.

Última edición por escafandra fecha: 16-10-2015 a las 01:10:40.
Responder Con Cita
  #3  
Antiguo 16-10-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 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 escafandra.

Si conocía algunas de las similitudes y el manejo de las conversiones, pero el árbol me tapó el bosque .
¡ Tenía la respuesta ahí nomas !, como dicen por aca: "Si hubiera sido una víbora me picaba"...
Cita:
Tu mismo te diste la respuesta. Las cadenas en delphi terminan como en C,...
Leer otra vez ese texto me hizo caer en el por qué del 0 en la posición Length + 1.

Declarando como AnsiString la cadena que usaste,
Código Delphi [-]
var
   s: AnsiString = 'Hola que tal';
sería almacenada así:
Código:
[1][12][Hola que tal\0]
De ese modo s[Length(s)+1], es decir 13 en este caso, apunta al nulo que finaliza la cadena y por lo mismo nunca encontré un espacio en esa posición.

Saludos y muchas gracias
__________________
Daniel Didriksen

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

Última edición por ecfisa fecha: 16-10-2015 a las 05:17:26.
Responder Con Cita
  #4  
Antiguo 16-10-2015
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por ecfisa Ver Mensaje
o Delphi está inicializando el espacio contiguo de algún modo.
Es posible que así sea. De todas formas, hay que recordar que en delphi, un tipo string, más que una cadena de texto, es una cadena de bytes y puede almacenar cualquier cosa, incluyendo el #0. Por tanto, confiar en que el #0 marca el final de un string es incorrecto.

// Saludos
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Cómo quitar espacios inicial y final en cadena bulc Varios 0 22-03-2014 18:24:33
Quitar Espacios en Sql El_Perrito Firebird e Interbase 3 25-02-2005 12:49:12
Quitar espacios al final de una cadena gescoto99 SQL 1 04-08-2004 00:02:43
Quitar espacios de campos CHAR cartmanrules Firebird e Interbase 3 22-07-2004 10:53:06
Quitar espacios en blanco Javier_A OOP 3 09-06-2004 10:29:27


La franja horaria es GMT +2. Ahora son las 00:40:18.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi