[ Foro de Pascal ]
Hola.
Hoy estuve haciendo una prueba con los límites de los arrays y me he encontrado con una desagradable sorpresa. El compilador free pascal permite introducir vectores de más elementos que los definidos en "var".
Probé con este programa:
program limites_vectores;
var
datos: array[1..4] of integer;
bucle: integer;
begin
for bucle := 1 to 20 do
readln (datos[bucle]);
writeln;
for bucle := 1 to 20 do
writeln (datos[bucle]);
end.
Pues bien, al teclear los datos, pude hacerlo hasta el dato número 13, cuando el límite es 4. Luego del 13 me da un error: "Segmentation fault". Yo pensaba que era un bug del compilador pero buscando por internet resulta que no es un bug, sino que es así. Se puede exigir que el compilador no permita un vector mayor que el declarado con la directiva {$R+} o con {$RANGECHECKS ON}.
Lo probé y efectivamente no pude teclear más datos que los declarados en "var".
Ahora yo me pregunto el porqué de esto. ¿Por algún motivo especial el compilador no comprueba por defecto los límites de los arrays? ¿Y esto no va contra el espíritu de pascal de ser un lenguaje estricto?
Añado algo que he olvidado poner: el compilador es Free Pascal Compiler 2.6.2-6 para x86 64 bits.
Efectivamente. Como la comprobación estricta de rangos ralentiza el programa, muchos compiladores no la tienen activada por defecto. El algo habitual en compiladores de C, no tanto en los de Pascal, pero Turbo Pascal 7 también se comportaba así.
Mira el siguiente extracto de la ayuda en línea de TP7:
In the $R+ state,
- all array and string-indexing expressions are verified as being within
the defined bounds
- all Assignments to scalar and subrange variables are checked to be
within range
If a range-check fails, the program terminates and displays a run-time error
message.
$R+ does not apply to Inc. and Dec.
Enabling range-checking slows down your program and makes it larger.
Use this option when debugging, then turn it off once the program is
bug-free.
Es decir, recomendaban el modo R+ cuando estabas depurando tu programa, pero pasar a R- (que era el modo por defecto) cuando entregabas la versión definitiva al cliente.
Por tanto, en modo R- puedes salirte de un array hasta el punto en el que desbordes el bloque de memoria que tienes asignado. Eso sí, quizá al desbordar el array estés modificando el valor de otras variables que hayas declarado a continuación.
Gracias por la explicación. Ahora entiendo por qué. Pues voy a seguir el consejo y cuando compile pondré la directiva {R+}.
(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)