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 14-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
Cita:
Empezado por roman Ver Mensaje
No entiendo por qué dices esto. Un String no tiene una longitud predeterminada. Si accedes más allá de sus fronteras definidas en un momento dado, puedes tener problema accediendo a lugares que no corresponde.

// Saludos
Si, siempre lo entendí del mismo modo (de allí que empecé las pruebas extendiendo la cadena un espacio mas).
Pero contra toda predicción, no hubo advertencia ni errores al acceder a una posición mas allá del valor de Length, eso me dejó con dudas e hice múltiples pruebas sin lograr que se produzca advertencia o error alguno. De ahí que atribuí que obtenía ese resultado por tratar con un AnsiString.

Realmente siempre puse cuidado en no acceder a una posición mayor al largo de una cadena pensando en que generaría un error, pero todas las pruebas realizadas hasta ahora me indican que, al menos acceder (lectura) a una posición mas del valor devuelto por Length de un AnsiString no genera error.

¿ Conoces algún caso en que se produzca ?

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #2  
Antiguo 15-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
Si, siempre lo entendí del mismo modo (de allí que empecé las pruebas extendiendo la cadena un espacio mas).
Pero contra toda predicción, no hubo advertencia ni errores al acceder a una posición mas allá del valor de Length, eso me dejó con dudas e hice múltiples pruebas sin lograr que se produzca advertencia o error alguno. De ahí que atribuí que obtenía ese resultado por tratar con un AnsiString.

Realmente siempre puse cuidado en no acceder a una posición mayor al largo de una cadena pensando en que generaría un error, pero todas las pruebas realizadas hasta ahora me indican que, al menos acceder (lectura) a una posición mas del valor devuelto por Length de un AnsiString no genera error.

¿ Conoces algún caso en que se produzca ?

Saludos
En un array podemos definir por código un índice que se salga del rango:

Código Delphi [-]
var
  S: array [0..0] of char;
  i: integer;
begin
  i:= 10;
  S[i]:= #0;
end;

En ese caso, debemos velar por que no suceda o tener bien controlado lo que hacemos. La escritura fuera de los límites puede tener consecuencias y el compilador no avisa.

Saludos
Responder Con Cita
  #3  
Antiguo 15-10-2015
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.941
Poder: 27
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Ocurren el error en tiempo de ejecucion, porque hacerlo en tiempo de compilacion es un problema particularmente espinoso:

https://duckduckgo.com/?q=compile+time+bounds+checking

Luego esta el hecho que el indice es un Int(32/64) que va desde el - al + en la escala numerica, en vez desde 0-+ (osea: El tipo de datos no es el indicado para un indice de array posicional). Luego el que String/Array son dinamicos, y detectar que no se pase un indice IMPLICA detectar cuando se redimensiona el array... lo que basicamente implica tener que correr el codigo (Hay tecnicas que se pueden usar, llamadas "data-flow", pero son muy complejas de implementar si se quiere una solucion GENERICA).

La solucion? En primer lugar habria que arrancar con dejar de usar INTs y usar un tipo de datos mas adecuado. Luego, usar un sub-rango cuando el tamño maximo es conocido (ej: Si indexamos meses y sabemos que no son mas de 12). Pero cuando el tamaño es indeterminado? Igual toca comprobar en tiempo de ejecucion
__________________
El malabarista.
Responder Con Cita
  #4  
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 escafandra.

Cita:
La escritura fuera de los límites puede tener consecuencias y el compilador no avisa.
Si, comprendo la implicancia que tiene escribir fuera de los límites de un arreglo y estamos totalmente de acuerdo en ese punto, sólo que en este caso se trata de una lectura.

Por ejemplo, se puede correr este código una y otra vez sin ningún tipo de problemas ni mensajes (excepto el de finalización)
Código Delphi [-]
var
  i: Char;
  j: Integer;
  s, x: string;
begin
  ListBox1.Items.BeginUpdate;
  try
    for i := 'A' to 'Z' do
      for j:= 1 to 10000000 do
      begin
        s := s + i;
        x := s[Length(s)+1]; //  lectura en: [Length(s) + 1] 
        if x = ' ' then ListBox1.Items.Add(i);
      end;
  finally
    ListBox1.Items.EndUpdate;
  end;
  ShowMessage('fin');
end;
Siempre puse especial cuidado en no escribir en "zonas desconocidas", ya que no hay dudas sobre sus potenciales y nefastas consecuencias (reitero que mi duda no va por ese lado). Pero tenía el mismo concepto para con la lectura, por lo que nunca antes se me ocurrió probar y me resulta sorprendente el resultado de las pruebas.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 15-10-2015
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.678
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Cita:
Empezado por ecfisa Ver Mensaje
me resulta sorprendente el resultado de las pruebas.
Realmente curioso. Creía que con delphi se estaba "protegido" ante esas problemáticas.
Responder Con Cita
  #6  
Antiguo 15-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
Si, comprendo la implicancia que tiene escribir fuera de los límites de un arreglo y estamos totalmente de acuerdo en ese punto, sólo que en este caso se trata de una lectura.
En realidad puedes leer o escribir dependiendo del tipo de protección de memoria establecido.

Cita:
Empezado por Casimiro Notevi Ver Mensaje
Realmente curioso. Creía que con delphi se estaba "protegido" ante esas problemáticas.
Delphi no puede estar protegido contra esto pues muchas estructuras de windows definen un elemento de un array de dimensión desconocida y dada por el tamaño de la estructura, conocido más tarde.


Saludos.
Responder Con Cita
  #7  
Antiguo 15-10-2015
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.678
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Cita:
Empezado por escafandra Ver Mensaje
Delphi no puede estar protegido contra esto pues muchas estructuras de windows definen un elemento de un array de dimensión desconocida y dada por el tamaño de la estructura, conocido más tarde.
Saludos.
Pero mientras no se sepa qué dimensión tiene, debería ser null y no dejar acceder.
Responder Con Cita
  #8  
Antiguo 15-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 Casimiro Notevi Ver Mensaje
Pero mientras no se sepa qué dimensión tiene, debería ser null y no dejar acceder.

Te pongo un ejemplo típico:

La estructura WLAN_AVAILABLE_NETWORK_LIST es usada para obtener una lista de redes wifi disponiobles, la API WlanGetAvailableNetworkList recibe por referencia un puntero a un elemento WLAN_AVAILABLE_NETWORK_LIST y devuelve la lista deseada en un bloque de memoria a la que apunta el puntero pasado.
Esta es la definición:
Código Delphi [-]
TWLAN_AVAILABLE_NETWORK_LIST = record
    dwNumberOfItems: DWORD;
    dwIndex: DWORD;
    Network: array[0..0] of TWLAN_AVAILABLE_NETWORK;
end;
Observa que el array Network definido en la estructura solo contiene un elemento, sin embargo puede tener muchos mas. Cuando WlanGetAvailableNetworkList nos devuelva el puntero a la lista de redes (WLAN_AVAILABLE_NETWORK_LIST), Windows informa del número de elementos que tiene en dwNumberOfItems. Nosotros navegaremos por el array Network donde están las redes, el límite lo controlaremos nosotros pero no delphi.

Casos como el que expongo son habituales cuando se trabaja a nivel de API. Un compilador que limite los índices no sería operativo a bajo nivel y delphi lo es.


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 02:54:13.


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