Recent

Author Topic: Error en declaración de conjunto de caracteres  (Read 6202 times)

Dperdi

  • New member
  • *
  • Posts: 7
Error en declaración de conjunto de caracteres
« on: March 20, 2024, 09:50:49 am »
Hola.

Tengo esta declaración

Code: Pascal  [Select][+][-]
  1. LetrasValidas: set of Char = ['A'..'Z','a'..'z','á','à','é','è','í','ó','ò','ú','Ñ','ñ','0'..'9','_','.','ä','Ä','ö','Ö','ü','Ü','Á','À','É','È','Í','Ó','Ò','Ú','ß'];

Pero me está dando error en la 'á'. El error que me arroja al compilar son dos:
xxxx.pas(81,23) Error: Incompatible types: got "WideChar" expected "Char"
xxxx.pas(81,168) Error: Illegal expression

Yo entiendo que algunos carateres puedan estar fuera del rango de 0..255 pero la 'á' no está fuera de ese rango. ¿Alguna idea de porqué pasa esto?

Desde ya gracias y saludos

440bx

  • Hero Member
  • *****
  • Posts: 4760
Re: Error en declaración de conjunto de caracteres
« Reply #1 on: March 20, 2024, 10:02:06 am »
xxxx.pas(81,23) Error: Incompatible types: got "WideChar" expected "Char"
xxxx.pas(81,168) Error: Illegal expression

Yo entiendo que algunos carateres puedan estar fuera del rango de 0..255 pero la 'á' no está fuera de ese rango. ¿Alguna idea de porqué pasa esto?
La razon es que para representar la 'á' el compilador va a usar un "widechar" que son dos (2) bitios (bytes.) Eso ocasiona el problema porque terminos en un conjunto solo pueden ser representados por un solo bitio (byte) y un "widechar" usa dos.

Una possibilidad es reemplazar la 'á' por su ordinal #160 or #225 pero como esos characteres no son ascii, su representation depende del codigo de pagina, por lo tanto no hay guarantia que usando el ordinal va a dar el caracter deseado.
(FPC v3.0.4 and Lazarus 1.8.2) or (FPC v3.2.2 and Lazarus v3.2) on Windows 7 SP1 64bit.

Edson

  • Hero Member
  • *****
  • Posts: 1314
Re: Error en declaración de conjunto de caracteres
« Reply #2 on: March 20, 2024, 03:13:11 pm »
Por defecto Free Pascal y Lazarus, trabaja en condificación UTF-8. Y en UTF-8, los caracteres como "á" o "ñ" usan dos bytes de almacenamiento.

Si lo que deseas es representar a un código del formato ASCII extendido, en donde la "é" tiene el código #130, es mejor que lo pongas con ese código. Pero, como ya te indicaron, esa codificación es relativa al código de página del ASCII extendido.

Además, dentro del mundo de Lazarus , como en el mundo de la Web, casi todo se maneja en UTF-8 que es más universal.
Lazarus 2.2.6 - FPC 3.2.2 - x86_64-win64 on Windows 10

Dperdi

  • New member
  • *
  • Posts: 7
Re: Error en declaración de conjunto de caracteres
« Reply #3 on: March 20, 2024, 09:49:55 pm »
Hola Edson y 440bx.

Gracias por sus comentarios. He probado declarar como widechar y ahora obtengo este error: "rpparser.pas(76,33) Error: illegal type declaration of set elements" y ahora si quedé perdido.

Si tienen alguna otra sugerencias por supuesto que estoy agradecido desde ya.

Saldudos!

440bx

  • Hero Member
  • *****
  • Posts: 4760
Re: Error en declaración de conjunto de caracteres
« Reply #4 on: March 20, 2024, 10:02:00 pm »
Hola Edson y 440bx.

Gracias por sus comentarios. He probado declarar como widechar y ahora obtengo este error: "rpparser.pas(76,33) Error: illegal type declaration of set elements" y ahora si quedé perdido.

Si tienen alguna otra sugerencias por supuesto que estoy agradecido desde ya.

Saldudos!
De nada.

El problema es que los elementos the un conjunto (set) tienen que ser representados por un solo byte.  Un conjunto no puede tener elementos que requieren dos bytes que es lo que require un widechar.  Por lo tanto no se puede definir un conjunto de widechar(s).

Puedes declarar widechar caracteres pero no puedes definir un conjunto que contiene o consiste de esos caracteres (porque requiren dos bytes.)
(FPC v3.0.4 and Lazarus 1.8.2) or (FPC v3.2.2 and Lazarus v3.2) on Windows 7 SP1 64bit.

Edson

  • Hero Member
  • *****
  • Posts: 1314
Re: Error en declaración de conjunto de caracteres
« Reply #5 on: March 20, 2024, 10:30:30 pm »
Gracias por sus comentarios. He probado declarar como widechar y ahora obtengo este error: "rpparser.pas(76,33) Error: illegal type declaration of set elements" y ahora si quedé perdido.

Si tienen alguna otra sugerencias por supuesto que estoy agradecido desde ya.

Saldudos!

¿Para qué deseas crear ese arreglo de caracteres? Tal vez podamos darte mejores sugerencias si nos das más información al respecto. Y mejor, si agregas más código para ver el uso de ese arreglo.
Lazarus 2.2.6 - FPC 3.2.2 - x86_64-win64 on Windows 10

Dperdi

  • New member
  • *
  • Posts: 7
Re: Error en declaración de conjunto de caracteres
« Reply #6 on: March 21, 2024, 11:46:07 pm »
Una vez más. Gracias. 440bx y a Edson.

Para contestarte Edson doy una pequeña vuelta cortita y es para contarte que soy un programador Delphi desde Turbo Pascal 4 y que he llegado hasta Delphi 2007 donde mi paciencia con (ahora) Embarcadero se a terminado (incluso tengo comprada una licencia de una 2010 que nunca usé). Tengo un software con más de 25 años de desarrollo muy robusto y con muuuuuchos reportes que en este momento están hechos con reportmanager versión 2.7e y estoy en plena etapa de estudio de Lazarus y Free Pascal.

Cuando estoy en este proceso me topo con que reportmanager no tiene una versión desarrollada para Lazarus pero que su autor ha hecho un intento y a armado el paquete y yo pensé que por lo menos iba a ahorrarme el trabajo de hacer desde cero más de 50 reportes que tiene mi software si podía invertir un tiempo en hacer que esa versión compile y sea usable en lazarus.

En definitiva estoy invirtiendo un tiempo prudencial investigando para evitarme usar un tiempo ingente en tener que hacer todo desde 0 al pasar mi código a Lazarus. Ya tengo pasada mi librería de componentes y tengo los IBX de MWA Software funcionando para no tener que migrar el acceso a datos y estaba queriendo hacer algo con el tema reportes.

Perdón por lo extenso, pero justamente hoy y después de sus respuestas ya decidí que la próxima versión de mi software va a ir directo con LazReports y listo. Por ahora termino unas cosas que me faltan en la plataforma que tengo y luego comienzo con la migración con mucha paciencia.

Gracias de nuevo y saludos cordiales. (perdón por lo extenso)

 

TinyPortal © 2005-2018