Cita:
Empezado por ecfisa
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
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.