@JuanCP
La pregunta que has planteado me parece muy interesante y denota interés por tu parte. Incluso verás en el foro que los propios desarrolladores del compilador a veces se hacen preguntas sobre el funcionamiento del mismo. Es algo normal. Sólo te puedo recomendar que sigas con empeño y revientes el foro a preguntas.
Sin embargo la conclusión a la que has llegado ... 'FPC complica el control de los Arrays', yo no lo veo así. Es cierto que en este caso el compilador se comporta de una forma poco convencional, pero se preserva con absoluto rigor la integridad de los datos y por supuesto puedes recorrer el contenido de cualquier Array en FPC con total seguridad. No soy un fanático ni un predicador de Pascal, pero se que los supercomputadores de cálculo del planeta (que corren sobre Linux el 99%), trabajan con C, Pascal y FORTRAN todavía por algo. Te puedo asegurar que trabajar con Arrays de forma intensiva es totalmente segura.
@Fred
Si lo haces así no obtendrás ni warnings ni errores de compilación.
Si lo haces con "FRASE : STRING[14]", tendrás warnings. Uno al inicializar la variable, donde se nos dice que estamos metiendo mas datos de los que soporta la cadena. Y por cada intento de acceso a posiciones superiores obtendremos mas warnings. No hay error de compilación pero se protege totalmente el bound, hay integridad en los datos y en el tamaño de la asignación.
¿debería fallar la compilación? Pues yo no soy quien para decirlo.
@JuanCP, @Fred
Mira este caso todavía más transgresivo ... podríamos asumir por la misma regla de 3, que no sólo hay un bug en la lectura sino que además podemos escribir por encima del bound del Array, Oh Dios mio !
PROGRAM TEST ;
{$MODE OBJFPC}
{$LONGSTRINGS OFF}
{$J-}
USES
CLASSES, SYSUTILS ;
VAR
FRASE : ARRAY[1..4] OF CHAR ;
BEGIN
FRASE := 'HOLA' ;
WRITELN(INTTOSTR(HIGH(FRASE))) ;
WRITELN(INTTOSTR(LENGTH(FRASE))) ;
FRASE[6]:='J' ;
WRITELN(FRASE[6]) ;
WRITELN(INTTOSTR(HIGH(FRASE))) ;
WRITELN(INTTOSTR(LENGTH(FRASE))) ;
END.
// OUTPUT
// 4
// 4
// J
// 4
// 4
Entonces yo lo veo así:
1. le he dado instrucciones al compilador para evitar cadenas de más 255. Un usuario no podrá crearme un overflow, y no he tenido siquiera que sanitizar mi código. Per es más, se que no podrá, ni podré superar el límite de 4 mientras no cambie su 'length'.
2. Dónde se escribió la J y por qué puedo recuperarla ?
Por qué la J se escribió allí y no en otro lugar ?
Por qué compila ?
No tengo esos conocimientos y tampoco me importa mucho, pero vuelvo a la tranquilidad de ver que mis datos siguen intactos y mi HIGH(FRASE) y mi LENGTH(FRASE) siguen intactos.
3. Lo que si que me importa es tener todo un abanico de tipos para controlar mi cadena y lo que puedo hacer y no con ella. (no fuera de ella). Por eso creo que es importante usar 'string' sólo si se le dijo al compilador antes, que hacer con este alias.