SAS9

Der mysteriöse Array-Fehler und Regel 1

Simon 12 vistas

Nichts ist frustrierender für einen SAS©-Programmierer, als stundenlang an einer kryptischen Fehlermeldung zu sitzen, nur um am Ende festzustellen, dass das Problem nicht an der komplexen Logik, sondern an einem fehlenden Zeichen lag.

Ein aufschlussreicher Austausch im Benutzerforum illustriert diesen Fall perfekt mit der Verwendung von Arrays und DO-Blöcken.

Note :
Der schuldige Code
Ein Benutzer versucht, Werte von einem Array (ais) unter Bedingung in einer Schleife in ein anderes (trhead) zu kopieren.

Hier ist der eingereichte Code:
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;

Der trügerische Fehler

SAS© gibt eine Fehlermeldung zurück, die auf ein Problem mit der Variablendefinition oder dem Typ hinzuweisen scheint:

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

Auf den ersten Blick könnte man meinen, dass das Array trhead falsch deklariert ist oder es eine Typinkompatibilität (numerisch vs. Zeichen) gibt.

Note :
Die Diagnose: Die Falle des THEN DO
Wie die Forumsexperten schnell erkannten, hat das Problem nichts mit Arrays zu tun. Es ist ein klassischer Interpunktionsfehler.

Die DO-Anweisung ist eine eigenständige Anweisung. Sie muss mit einem Semikolon enden.

Der fehlerhafte Code: if region(i)='HEAD' then do trhead(i)=ais(i); SAS© interpretiert dies als den Beginn einer iterativen Schleife (z.B. DO i = 1...) und versteht nicht, warum ein Array trhead(i) als Schleifenzähler verwendet wird.

Die Korrektur: Ein Semikolon muss direkt nach dem DO hinzugefügt werden.
1IF region(i)='HEAD' THEN DO;
2trhead(i)=ais(i);
3END;
4 
Note :
Die Goldene Regel (Regel #1)
Der Benutzer David erinnert in der Diskussion an eine grundlegende Regel, die Anfängern gelehrt, aber von Experten im Eifer des Gefechts oft vergessen wird:

„Die Regel Nr. 1 der SAS©-Programmierung lautet: Wo ist das Semikolon?“

Bevor Sie nach komplexen Logikfehlern suchen oder Ihre Array-Deklarationen umschreiben, überprüfen Sie immer, ob das, was sich zwischen zwei Semikolons befindet, eine gültige SAS©-Anweisung darstellt.

Formatierungstipp
Um diesen speziellen Fehler zu vermeiden, wird empfohlen, THEN DO und die folgende Anweisung nicht in dieselbe Zeile zu schreiben. Übernehmen Sie die folgende Einrückung, um den Fehler optisch offensichtlich zu machen:
1IF region(i)='HEAD' THEN DO;
2/* Le point-virgule est bien visible ici */
3trhead(i) = ais(i);
4 
5END;
6 

Diese Art von Syntaxfehler ("syntax error") ist diejenige, die die meiste Zeit kostet ("I waste HOURS on!"). Wenn SAS© Sie mit "Variable Type"- oder "Expecting ="-Fehlern beleidigt, atmen Sie tief durch und suchen Sie nach dem fehlenden Semikolon.