![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
Hola.
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. Pero no termina allí, el formato en que se almacena este tipo es: Código:
[contador de referencias] [longitud de cadena] [cadena + nulo] El contador de referencias se incrementa cada vez que una cadena es asignada a una variable y se decrementa cuando deja de hacerlo. De este modo cuando el contador llega a cero la memoria previamente reservada es liberada de forma automática; del mismo modo es liberada cuando sale de su ámbito (al estilo de C++). Las variables de este tipo también se inicializan como cadenas vacías de forma automática. Por último cuando se concatena carácter a carácter, es posible que se libere y reasigne memoria en cada asignación. De lo que resulta, por ejemplo, que es mas eficiente hacer: que:
Haciendo unas pruebas pude pude lograr que se produzca error que buscaba: y como se puede ver, sucede cuando el argumento no fue previamente inicializado. Por último, la función del mensaje #9, resistió todas mis pruebas sin generar ningún error. En definitiva, no encontré la alusión concreta que buscaba, pero sé un poco mas al respecto .Saludos ![]()
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... Última edición por ecfisa fecha: 15-10-2015 a las 20:03:29. |
|
#2
|
||||
|
||||
|
Estoy confundido con sus confusiones
![]() ¿Cómo está eso de que "Creía que con delphi se estaba "protegido" ante esas problemáticas."? Por un lado, como ya comentó escafandra, delphi permite el acceso fuera del rango especificado por un arreglo para datos a los que se quiere acceder de esa forma pero que no se conocen sino hasta la ejecución. Pero, por otro lado, ¿les suena conocido eso de {$R+}? Esa directiva al compilador impide tal acceso, así que sí: delphi nos protege hasta de eso y poder acceder fuera de rango hay que avisarle {$R-} que no queremos que nos proteja .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. Finalmente, ya había mencionado porqué cambia el comportamiento cuando se asigna un valor a Memo1.Text caracter a caracter o de un sólo golpe. La asignación a la propiedad Text implica el envio del mensaje WM_TEXT al control, que eventualmente manejará la API de Windows. Si bien el string de delphi no tiene problemas para manejar #0's, la API de Windows cortará cualquier cadena que se envie en el primero #0 que vea. Pero cuando lo hacemos caracter por caracter, si llegaos a un #0, ése no aparecerá en el memo, pero como seguimos avanzando, sí aparecerá cualquier otro caracter que no sea #0. // Saludos |
|
#3
|
||||
|
||||
|
Puede que esté confundido por el cambio de lenguaje
![]()
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
|
#4
|
||||
|
||||
|
Roman, Daniel y Casimiro confundidos? Mejor mantener las narices lejos
![]() |
|
#5
|
||||
|
||||
|
Los años no perdonan
![]() ![]()
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
|
#6
|
||||
|
||||
|
Hola.
Cita:
Para salir de toda duda hice una pequeña prueba y las sorpresas no terminaron. 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": 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 .... |
|
#7
|
||||
|
||||
|
Cita:
Cita:
"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. |
|
#8
|
||||
|
||||
|
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 |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
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 |
|