SAS9

El misterioso error de Array y la Regla 1

Simon 9 Aufrufe

No hay nada más frustrante para un programador SAS© que pasar horas en un mensaje de error críptico, para finalmente darse cuenta de que el problema no provenía de la lógica compleja, sino de un simple carácter faltante.

Un intercambio instructivo en el foro de usuarios ilustra perfectamente este caso con el uso de los Arrays y los bloques DO.

Note :
El Código Culpable
Un usuario intenta copiar valores de un array (ais) a otro (trhead) bajo condición, dentro de un bucle.

Aquí está el código enviado:
1array region{22} region_1 - region_22;
2array ais{22} ais_1 - ais_22;
3array trhead{22} trhead1-trhead22;
4 
5DO i = 1 to dim(ais) ;
6 /* La ligne problématique */
7 IF region(i)='HEAD' THEN DO trhead(i)=ais(i); END;
8END;

El Error Engañoso

SAS© devuelve un error que parece indicar un problema de definición de variable o de tipo:

ERROR: The variable type of trhead is invalid in this context. ERROR: Illegal reference to the array trhead. ERROR 73-322: Expecting an =.

A primera vista, se podría creer que el array trhead está mal declarado o que hay una incompatibilidad de tipo (numérico vs carácter).

Note :
El Diagnóstico: La trampa del THEN DO
Como identificaron rápidamente los expertos del foro, el problema no tiene nada que ver con los arrays. Es un error de puntuación clásico.

La instrucción DO es una instrucción por derecho propio. Debe terminar con un punto y coma.

El código erróneo: if region(i)='HEAD' then do trhead(i)=ais(i); SAS© interpreta esto como el comienzo de un bucle iterativo (ej: DO i = 1...), y no entiende por qué se usa un array trhead(i) como contador de bucle.

La corrección: Hay que añadir un punto y coma justo después del DO.
1IF region(i)='HEAD' THEN DO;
2trhead(i)=ais(i);
3END;
4 
Note :
La Regla de Oro (Rule #1)
El usuario David recuerda en la discusión una regla fundamental enseñada a los principiantes, pero a menudo olvidada por los expertos en el fragor de la acción:

"La Regla nº1 de la programación SAS© es: ¿Dónde está el punto y coma?"

Antes de buscar errores de lógica complejos o de reescribir sus declaraciones de Array, verifique siempre que lo que se encuentra entre dos puntos y comas constituye una instrucción SAS© válida.

Consejo de formato
Para evitar este error específico, se recomienda no escribir el THEN DO y la siguiente instrucción en la misma línea. Adopte la siguiente indentación para hacer el error visualmente evidente:
1IF region(i)='HEAD' THEN DO;
2/* Le point-virgule est bien visible ici */
3trhead(i) = ais(i);
4 
5END;
6 

Este tipo de error de sintaxis ("syntax error") es el que hace perder más tiempo ("¡Pierdo HORAS en esto!"). Si SAS© te insulta con errores de "Variable Type" o "Expecting =", comienza por respirar hondo y busca el punto y coma que falta.