PDA

Ver la Versión Completa : Casteo y Migración


maunix
23-09-2011, 22:11:00
Buenos días, escribo el problema porque no he visto nada posteado al respecto y tampoco googleando veo alguna respuesta que cuadre en mi problema.

Tengo un código que anda de maravilas en Delphi 7 pero en Delphi Rapid XE y debuggeando paso a paso he encontrado el que parece ser mi problema.

Tengo una comunicación con un dispositivo de hardware y he usado siempre strings para enviar y leer de dicho positivo. La razon es porque la clase que lo controla usa strings; y de allí que yo también.

Ahora bien, yo creo buffers con strings, son pocos datos asi que me han funcionado siempre bien. En estos strings el 0 es un valor válido y no el fin del string; no obstante delphi nunca tuvo problemas con esto.

Si por ejemplo hago


str := chr(1) + chr(2) + chr(0) + chr(3) + chr(4);
Delphi me almacenara los 5 bytes y me dirá que el length(str) es de 5. Ahora bien los datos que van en el string pueden tomar un valor de 0 a 255; y es allí donde con el RapidXE noto un problema que me está volviendo loco.


Si hago


str := chr(127) ;


Lo hace bien

Pero si hago


str := chr(128);



Me asigna $0080 (128 en una variable de 16 bits).

Le he dado vueltas al problema y chr debiera devolver un valor de 8 bits no de 16 bits!! Este código en delphi7 lo hace perfecto.

Casteandolo como char, no ha solucionado el problema...

Lo único que me resta por probar es volver a trabajar con buffers de bytes y luego hacer la conversion (ya que como les mencionaba la clase que controla el dispositivo pide y responde con strings).

Lo que van entre parentesis son constantes, es decir que no son variables que se modifiquen en tiempo de ejecución. Casteandolas por ejeplo con byte(128) tampoco resuelve el problema..

¿Alguna idea?

Desde ya muchas gracias por anticipado.

delphi.com.ar
23-09-2011, 22:58:59
Me asigna $0080 (128 en una variable de 16 bits).

$0080 = $80 = 128

No llego a comprender el problema... ¿De qué tipo es "str"?... ¿Es un string?.. ¿No te lo estará mostrando así el Debugger pero verdaderamente estas ocupando un solo byte con $80?

Casimiro Notevi
23-09-2011, 23:01:21
Haz una búsqueda en los foros por "unicode", creo que tiene que ver con eso, pero no recuerdo en qué tema se trató.

Al González
24-09-2011, 00:27:42
Hola Maunix.

A partir de Delphi 2009 los caracteres (y por tanto las cadenas de caracteres también) usan el formato Unicode. Aún puedes seguir empleando el formato anterior, pero debes hacer cambios en los fuentes de tu aplicación / clases, para que todo funcione como en Delphi 7.

En este foro encontrarás muchos temas que hablan de ello, y este artículo puede servirte de introducción para entender el tema: http://www.drbob42.com/examines/examinA7.htm

Por otra parte, sin pretender otra cosa que contribuir a la cultura informática, quisiera decirte que los autores de libros (y un servidor también) suelen traducir el término type cast / casting como molde de tipo / moldear. Te recomiendo que hagas lo mismo, así evitarás el barbarismo de "castear".

Un abrazo en cirílico.

Al González. :)

maunix
24-09-2011, 15:10:04
$0080 = $80 = 128

No llego a comprender el problema... ¿De qué tipo es "str"?... ¿Es un string?.. ¿No te lo estará mostrando así el Debugger pero verdaderamente estas ocupando un solo byte con $80?

Ocupa 2 bytes, ese es el problema. Si hago ord(str[xx]) donde xx es la posición donde está dicho caracter me devuelve un valor de 16 bits!! 8432 por darte un ejemplo


A partir de Delphi 2009 los caracteres (y por tanto las cadenas de caracteres también) usan el formato Unicode. Aún puedes seguir empleando el formato anterior, pero debes hacer cambios en los fuentes de tu aplicación / clases, para que todo funcione como en Delphi 7.


Conozco el tema Unicode, pero como leyendo el ayuda del Delphi XE me dice que la funcion "chr" devuelve un valor de 1 byte de 0 a 255... y lo mismo para otros ejemplos, es por que me confundo. Una cosa es usar AnsiStrings y los Widestrings y otra el viejo tipo string.

No obstante hablo esto a priori antes de leer el link que me pasaste.

PD: agradezco la sugerencia por mi "spanglish" del termino cast... a veces por mi trabajo usamos muchos terminos así y la verdad que está mal pero es pegadizo.

Desde ya agradezco a todos por su tiempo y velocidad de respuesta!!

maunix
26-09-2011, 16:29:59
Finalmente (eso creo, al menos en las pruebas preliminares no he tenido inconvenientes) lo he resuelo poniendo el modo unicode en off

Tal cual como se explica en el siguiente link que lo dejo por si a algún otro le surge la misma inquietud

No me permite poner el link porque no tengo privilegios para ello, pero en la página de dr bobs está la respuesta, en donde sugirió Al González

Pero por cierto la sintaxis delphi sería


{$HIGHCHARUNICODE OFF}



Saludos

Casimiro Notevi
26-09-2011, 16:46:29
No me permite poner el link porque no tengo privilegios para ello

Puedes "engañar" al sistema quitando alguna letra, ejemplo: ttp://www.clubdelphi.com