Sie sind auf Seite 1von 238

Forschungszentrum Jlich GmbH Institut fr Chemie und Dynamik der Geosphre (ICG-I) Zentralinstitut fr Angewandte Mathematik (ZAM) Zentrallabor

fr Elektronik (ZEL)

Praxisbezogene IDL Programmierung

Marlene Busch, Reimar Bauer, Heinz Heer, Michael Wagener

Schriften des Forschungszentrums Jlich Reihe Informationstechnik / Information Technology Band 2 ISSN 1433-5514 ISBN 3-89336-308-4

Herausgeber und Vertrieb:

Forschungszentrum Jlich GmbH Zentralbibliothek, Verlag D-52425 Jlich Telefon (02461) 615368 - Telefax (02461) 61-6103 e-mail: zb-publikation@fz-juelich.de Internet: http://www.fz-juelich.de/zb/verlag/ Forschungszentrum Jlich 2008

Copyright:

Schriften des Forschungszentrums Jlich Reihe Informationstechnik / Information Technology, Band / Volume 2 ISSN 1433-5514 ISBN 3-89336-308-4 Vollstndig verffentlicht im Internet Persistent Identifier: urn:nbn:de:0001-00430 Resolving URL: http://nbn-resolving.de/urn/resolver.pl?urn=urn:nbn:de:0001-00430 Alle Rechte vorbehalten. Kein Teil des Werks darf in irgendeiner Form ohne schriftliche Genehmigung des Verlags reproduziert oder unter Verwendung elektronischer Systeme verarbeitet, vervielfltigt oder verbreitet werden.

Abstract This book contains an introduction to the programming language IDL, version 5.5. The IDL scripting language itself, working within the IDL development environment, and important visualisation routines are introduced. The book addresses novices to programming as well as experienced IDL programmers. The focus of this book is on nuts and bolts problems arising in the natural sciences, and their solutions. The special characteristics and possibilities of array-oriented programming are pointed out. Important language elements and hints are highlighted. More than a hundred complete programming examples, of which several are described in the book, are accessible at the URL http://www.fz-juelich.de/vislab/idl-beispiele. These examples encourage use as a playground for autodidactical IDL studies. A clear organisation and the use of up-to-date, structured language elements render this book suitable as a course companion as well as a reference in everyday work with IDL.

Vorwort
Im Jahre 1994 wurde seitens einiger Institute des Forschungszentrums J lich, darunter u ZEL, IME, ICG, IPP, der Wunsch ge uert, die Software IDL zentral bereitzustellen. a Das ZAM (Zentralinstitut f r Angewandte Mathematik) f hrte dann die Verhandlungen u u mit der Firma CREASO, dem Verteiber der Software in Deutschland. Ende 1994 konnten dann einige Floating-Lizenzen installiert werden. Die Software-Pege wurde uber einen Wartungsvertrag mit der Firma CREASO gesichert. Die Betreuung der Software einschlielich Installation wurde von Frau Busch im ZAM ubernommen. Auf Initiative von Heinz Heer und Michael Wagener aus dem ZEL wurde der erste IDL Kurs geplant. Frau Busch verfate ein Kurs-Script. Im Mai 1995 wurde der erste 3-t gige a IDL Kurs von Frau Marlene Busch, Herrn Heinz Heer und Herrn Michael Wagener gehalten. Die Herren Heer und Wagener aus dem ZEL waren bei uns die Pioniere der IDL Programmierung und konnten ihre praktische Erfahrung in der Programmierung mit IDL nutzen, um diese als Referenten an interessierte Mitarbeiter des Forschungszentrums weiterzugeben. Wegen der starken Nachfrage fanden 1995 zwei IDL Kurse statt. Ab 1996 wurde dieser Kurs j hrlich gehalten. Das Kurs-Script wurde von Frau Busch gepegt a und im Laufe der Jahre der sich entwickelnden IDL-Sprache angepat. Die vorliegende Dokumentation basiert auf IDL 5.5. In der Dokumentation werden IDL spezische Befehle und Keywords in Grobuchstaben geschrieben, um diese hervorzuheben. Herr Bauer aus dem ICG I ist seit dem Jahr 2000 an der Weiterentwicklung des KursScripts beteiligt und seit 2001 als Referent beim IDL Kurs des Forschungszentrums t tig. a Durch die bisher abgehaltenen Kurse haben etwa 120 Mitarbeiter diese plattformunabh ngige interaktive Programmiersprache kennen und sch tzen gelernt. a a Ein Dank von uns geb hrt der Firma CREASO, die uns Testlizenzen f r den Kurs u u bereitstellen. Damit ist gew hrleistet, das w hrend der Kurszeit keine IDL-Lizenzen f r a a u den laufenden Betrieb verloren gehen. Das Kursmaterial hat nun einen Umfang erreicht, den wir in dieser Form einem gr eren o Kreis als Nachschlagewerk zur Verf gung stellen wollen. Daher wurde es von Frau u Marlene Busch und Herrn Reimar Bauer uberarbeitet, damit es als Buch erscheinen konnte. Die erarbeiteten Beispiele, die Sie unter der URL http://www.fz-juelich.de/vislab/idl-beispiele nden, stammen aus verschiedenen Kursen des Forschungszentrums (ICG, ZAM, ZEL) und der Firma CREASO. Marlene Busch (ZAM) Reimar Bauer (ICG I) Heinz Heer, Michael Wagener (ZEL) Juni 2002 Version 1

ii

Inhaltsverzeichnis
1 Einleitung 2 Konguration 2.1 Start-Up Datei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1 Beispiel: Start-Up Datei . . . . . . . . . . . . . . . . . . . . . . 2.1.2 Automatisches Starten eines Programms . . . . . . . . . . . . . . 3 Beschreibung der Applikationen 3.1 idlde (Unix, Windows) . . . . . . . . . . . . . . . . . . . 3.1.1 Preferences . . . . . . . . . . . . . . . . . . . . . . . . 3.1.2 Editieren, Kompilieren und Fehlersuche in Programmen 3.2 IDL (Unix) . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.1 Ausf hrbare Kommandos, Kompilieren und Fehlersuche u 3.3 Runtime (Unix, Windows) . . . . . . . . . . . . . . . . . 3.4 IDLHELP (Unix, Windows) . . . . . . . . . . . . . . . . 3.4.1 Arbeiten mit der IDL Online Hilfe . . . . . . . . . . . . 4 Grundlagen 4.1 Aufnden von Programmen . . . . . . . . 4.2 Syntax der Aufrufe von IDL Programmen 4.2.1 Positionale Parameter . . . . . . . . . . 4.2.2 Keyword Parameter . . . . . . . . . . . 4.3 Zeichen mit spezieller Bedeutung . . . . . 4.4 System-Variablen . . . . . . . . . . . . . 4.4.1 Ubersicht . . . . . . . . . . . . . . . . 4.4.2 Informationen uber Systemvariablen . . 5 Datenstrukturen 5.1 Datentypen . . . . . . . . . . . . . . 5.1.1 Konversionsroutinen . . . . . . . . 5.2 Skalar . . . . . . . . . . . . . . . . . 5.2.1 Information uber Skalare mit SIZE . 5.3 Array . . . . . . . . . . . . . . . . . iii 1 3 3 4 5 7 7 9 10 11 13 14 15 15 17 17 18 19 19 20 20 21 21 23 24 25 25 25 26

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

iv 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.3.8

INHALTSVERZEICHNIS Anlegen von Vektoren und Arrays . . . . . . . . . . Information uber Felder mit SIZE . . . . . . . . . . Generierung von Arrays mit REPLICATE . . . . . . Arrayindizierung mit [ ] . . . . . . . . . . . . . . . Arbeiten mit Feldern - REFORM Befehl . . . . . . . Arbeiten mit Feldern - TRANSPOSE Befehl . . . . Verkn pfung von Feldern . . . . . . . . . . . . . . u Beispiele zum Arbeiten mit Feldern . . . . . . . . . 5.4 Zeichenketten (Strings) . . . . . . . . . . . . . . . . . 5.4.1 Operationen auf Zeichenketten . . . . . . . . . . . . 5.4.2 Konversion von Strings in Zahlen . . . . . . . . . . 5.4.3 Zeichenkette mit Leerzeichen anlegen . . . . . . . . 5.5 Strukturen . . . . . . . . . . . . . . . . . . . . . . . . 5.5.1 Denition einer unbenannten (anonymen) Struktur . 5.5.2 Denition einer benannten Struktur . . . . . . . . . 5.5.3 REPLICATE bei Strukturen . . . . . . . . . . . . . 5.5.4 Informationen zum Strukturaufbau . . . . . . . . . . 5.6 Pointer . . . . . . . . . . . . . . . . . . . . . . . . . . 5.6.1 Anwendungen von Pointern . . . . . . . . . . . . . 5.6.2 Funktionen zur Bearbeitung von Pointern . . . . . . 5.6.3 Beispiele mit Pointern . . . . . . . . . . . . . . . . 5.6.4 Empty Pointer . . . . . . . . . . . . . . . . . . . . 5.6.5 G ltige Pointer . . . . . . . . . . . . . . . . . . . . u 5.6.6 Datenbereich mit Pointer belegen . . . . . . . . . . 5.6.7 Pointer auf eine Struktur . . . . . . . . . . . . . . . 5.6.8 Pointer in einer Struktur . . . . . . . . . . . . . . . 5.6.9 Pointer auf eine Struktur und Pointer in der Struktur 5.6.10 Pointer freigeben . . . . . . . . . . . . . . . . . . . 5.6.11 HEAP GC Heap garbage collection . . . . . . . . . 5.6.12 Beispiel mit Pointern . . . . . . . . . . . . . . . . . 5.6.13 Ubungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 28 28 28 29 29 29 30 31 31 32 32 33 34 36 37 37 38 38 39 40 40 41 41 42 42 43 44 44 45 47 49 49 50 50 51 51 52 53 53

6 Arbeiten mit Datenstrukturen 6.1 IDL Operatoren . . . . . . . . . . . . . . . . . . 6.2 Wertzuweisung bei Variablen . . . . . . . . . . . 6.2.1 Wertzuweisung bei mehrdimensionalen Feldern 6.3 Warnung vor Integer-Overow . . . . . . . . . . 6.4 Speicherplatzverwaltung . . . . . . . . . . . . . 6.5 L schen von Variablen . . . . . . . . . . . . . . o 6.6 Efzientes Arbeiten mit Feldern . . . . . . . . . 6.6.1 Vorteil von Feld-Operationen . . . . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

INHALTSVERZEICHNIS Geschickte Klammerung . . . . . . . . . . . . . . . . . . . 6.7 Einstellung von Compiler Optionen . . . . . . . . . . . . . . 6.8 Filtern von Daten . . . . . . . . . . . . . . . . . . . . . . . . 6.8.1 WHERE-Funktion . . . . . . . . . . . . . . . . . . . . . . 6.8.2 Verwendung der Funktionen MIN, MAX, SORT und UNIQ 6.8.2.1 SORT . . . . . . . . . . . . . . . . . . . . . . . 6.8.2.2 MIN und MAX . . . . . . . . . . . . . . . . . . 6.8.2.3 UNIQ . . . . . . . . . . . . . . . . . . . . . . . 6.9 Ubungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.6.2 . . . . . . . . . . . . . . . . . . . . . . . . . . .

v 54 54 55 55 55 55 56 56 57 59 59 59 60 61 61 62 65 65 66 67 68 68 69 70 70 71 71 72 73 74 75 76 77 79 81 81 82 83

7 Einbettung ins Betriebssytem 7.1 Umgebungs-Variablen . . . . . . . . . . . . . . . . . . . . . . . . . 7.1.1 Umgebungs-Variablen des Betriebssystems . . . . . . . . . . . . 7.2 Wechsel zum Betriebssystem (Unix, Windows) . . . . . . . . . . . 8 Hilfe, Sicherung 8.1 Die Hilfe-Routine von IDL . . . . . . . . . . . . . . . . . . . . . . 8.2 Save und Restore einer IDL-Sitzung, IDL- Binary . . . . . . . . . . 9 Denitionen zur Datenausgabe 9.1 Koordinatensysteme . . . . . . . . . . . . . . . . . . . . . . . . . . 9.2 Zeichens tze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a 9.2.1 Auswahl eines Fonts . . . . . . . . . . . . . . . . . . . . . . . . 9.3 Farbtabellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.3.1 Laden von Farbtabellen . . . . . . . . . . . . . . . . . . . . . . . 9.3.2 Arbeiten mit Farben . . . . . . . . . . . . . . . . . . . . . . . . 9.4 Steuerung der Ausgabe und Ausgabeger te . . . . . . . . . . . . . . a 9.4.1 Ausgabe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.4.2 Ausgabe mehrerer Bilder . . . . . . . . . . . . . . . . . . . . . . 9.4.3 Positionieren von Bildern . . . . . . . . . . . . . . . . . . . . . 9.4.3.1 Aufteilung der Zeichen che in gleich groe Teile . . . a 9.4.3.2 Keyword POSITION und System-Variable !P.POSITION 9.4.4 Bildschirm Ausgabe . . . . . . . . . . . . . . . . . . . . . . . . 9.4.5 Benutzung des Z-Buffers . . . . . . . . . . . . . . . . . . . . . . 9.4.6 Beispiel: Z-Buffer, SURFACE und CONTOUR . . . . . . . . . . 9.4.7 PostScript Ausgabe - Drucken . . . . . . . . . . . . . . . . . . . 9.4.8 Ubungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Programme zur Anwendungs-Darstellung 10.1 Uberblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.1.1 Achsen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.1.2 Steuerungen zur Zeichen che . . . . . . . . . . . . . . . . . . . a

vi

INHALTSVERZEICHNIS 10.1.3 Routinen zum Beschriften oder Markieren . . . . . . . . . . . . . 10.2 XY-Darstellungen mit PLOT . . . . . . . . . . . . . . . . . . . . . 10.2.1 Ausgabe von Daten als Linien-Plots . . . . . . . . . . . . . . . . 10.2.2 Plot bei einem Argument . . . . . . . . . . . . . . . . . . . . . . 10.2.3 Plot mit zweitem Argument (dependent data) . . . . . . . . . . . 10.2.4 Plot von Datenreihen . . . . . . . . . . . . . . . . . . . . . . . . 10.2.5 Beispiele mit PLOT . . . . . . . . . . . . . . . . . . . . . . . . 10.2.6 Plot mit logarithmischer Achseneinteilung . . . . . . . . . . . . . 10.2.7 Balkendiagramme . . . . . . . . . . . . . . . . . . . . . . . . . 10.2.8 Fehlerbalken . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.2.9 Polarplot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.2.10 Scatter-Plot mit Zufallszahlen . . . . . . . . . . . . . . . . . . . 10.2.11 Plot mit Text in unterschiedlichen Farben . . . . . . . . . . . . . 10.3 Fl chen- und H henlinien- Darstellungen . . . . . . . . . . . . . . a o 10.3.1 Netzlinien mit SURFACE . . . . . . . . . . . . . . . . . . . . . 10.3.2 H henlinien mit CONTOUR . . . . . . . . . . . . . . . . . . . . o 10.3.3 Schattierte Ober chendarstellung . . . . . . . . . . . . . . . . . a 10.3.4 Ober che mit beliebigem Datensatz uberlagern . . . . . . . . . a 10.3.5 H henlinien-Plot im 3D-Raum . . . . . . . . . . . . . . . . . . . o 10.4 3D Transformationen . . . . . . . . . . . . . . . . . . . . . . . . . 10.4.1 3D Transformationsmatrix mit SURFACE . . . . . . . . . . . . . 10.4.2 3D Transformationsmatrix mit SURFR . . . . . . . . . . . . . . 10.4.3 3D Transformationsmatrix mit SCALE3 und T3D . . . . . . . . . 10.5 Karten-Projektionen . . . . . . . . . . . . . . . . . . . . . . . . . . 10.5.1 MAP SET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.5.2 Kombination von Karte mit Bilddatei . . . . . . . . . . . . . . . 10.5.3 Kombination von Karte und H henlinienplot . . . . . . . . . . . o 10.5.4 Beschriftung der Karte mit Text und Symbolen . . . . . . . . . . 10.6 10.7 Gl tten von zuf lligen oder irregul ren Daten . . . . . . . . . . . . a a a ISO Ober chen . . . . . . . . . . . . . . . . . . . . . . . . . . . . a 83 84 84 84 84 85 86 90 90 91 91 92 93 94 94 97 98 99 100 101 101 102 103 104 104 105 106 106 107 108 109 111 112 113 113 113 113 114 115

10.7.1 Das SLICER3 Tool . . . . . . . . . . . . . . . . . . . . . . . . . 10.8 Animation von Daten . . . . . . . . . . . . . . . . . . . . . . . . . 10.9 Arbeiten mit dem Cursor . . . . . . . . . . . . . . . . . . . . . . . 10.10 Zusammenfassung der Darstellungs-Routinen . . . . . . . . . . . . 10.10.1 allgemeine Routinen . . . . . . . . . . . . . . . . . . . . . . . . 10.10.2 eindimensionale Plotroutinen . . . . . . . . . . . . . . . . . . . 10.10.3 mehrdimensionale Plotroutinen . . . . . . . . . . . . . . . . . . 10.11 IDL-Anwendungen . . . . . . . . . . . . . . . . . . . . . . . . . . 10.11.1 Ubungen: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

INHALTSVERZEICHNIS 11 Bildverarbeitung 11.1 Lesen eines Bildes . . . . . . . . . . . . . . 11.2 Kontrastversch rfung . . . . . . . . . . . . a 11.3 Ver ndern der Bildgr e . . . . . . . . . . a o 11.4 Darstellung eines Bildes . . . . . . . . . . 11.5 Positionieren des Bildes . . . . . . . . . . . 11.6 Bildanalyse . . . . . . . . . . . . . . . . . 11.6.1 Arbeiten mit Basisltern . . . . . . . . . 11.6.2 Ausw hlen und Verarbeiten einer Region a

vii 117 117 118 118 119 120 121 121 123 127 127 128 129 130 131 132 132 133 134 135 136 137 139 140 140 140 141 141 142 143 144 144 145 145 146 147 149 152

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

12 Lesen und Schreiben von Daten 12.1 Offnen von Dateien . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2 Beispiele f r das Offnen und Schlieen von Dateien . . . . . . . . . u 12.3 Lesen und Schreiben von Daten . . . . . . . . . . . . . . . . . . . 12.3.1 Formale Vorschriften beim Lesen . . . . . . . . . . . . . . . . . 12.3.2 Lesen (explizit) formatierter Daten . . . . . . . . . . . . . . . . . 12.3.3 Lesen und Schreiben unformatierter Daten . . . . . . . . . . . . 12.3.4 Lesen von unformatierten Daten mit assozierten Variablen . . . . 12.4 Arbeiten mit Dateien . . . . . . . . . . . . . . . . . . . . . . . . . 12.5 Operationen auf Dateien/Verzeichnissen ohne Wechsel zum Betriebssytem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.6 Automatisierte Eingabe eines ASCII-Datensatzes . . . . . . . . . . 12.6.1 Zusammenfassung gebr uchlicher Lese- uns Schreibroutinen . . . a 12.7 Beispiel: Lesen und Schreiben . . . . . . . . . . . . . . . . . . . . 13 Programmierung und Kompilation 13.1 Batchverarbeitung . . . . . . . . . . . . . . . . . . . . . . 13.2 Formales zu IDL-Programmen . . . . . . . . . . . . . . . 13.3 Denition einer Prozedur oder Funktion . . . . . . . . . . 13.4 Aufruf einer Prozedur oder Funktion . . . . . . . . . . . . 13.5 Regeln f r die Namensgebung von IDL Programmen . . . u 13.6 Kompilieren/Ausf hren einer Prozedur/Funktion . . . . . u 13.7 Beispiele f r IDL Programme . . . . . . . . . . . . . . . . u 13.8 Speicherverwaltung von Daten . . . . . . . . . . . . . . . 13.8.1 Ubergabe von Parametern an Prozeduren und Funktionen 13.8.2 Lokale Variable . . . . . . . . . . . . . . . . . . . . . . 13.8.3 Regeln f r Parameter . . . . . . . . . . . . . . . . . . . u 13.9 Beispiele: Aufruf von Funktionen und Prozeduren . . . . . 13.10 FORWARD FUNCTION Funktion . . . . . . . . . . . . . 13.11 Kontroll-Statements . . . . . . . . . . . . . . . . . . . . . 13.12 Uberpr fung der Argumente und Keywords . . . . . . . . u

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

viii 13.13 13.14 13.15 13.16 13.17 Beispiel . . . . . . . . . . . . . . . . . . . Durchschleusen zus tzlicher Argumente . . a COMMON Bl cke . . . . . . . . . . . . . o Dynamische Erweiterung von Programmen Ubungen . . . . . . . . . . . . . . . . . . . . . . . .

INHALTSVERZEICHNIS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 154 155 156 157 161 163 165 166 167 168 169 171 171 172 172 173 175 175 176 177 177 178 179 179 180 181 182 183 184 185 186 187 191 191 192 193

14 Fehlersuche 15 Programmanalyse 16 Error Handling 16.1 Abfrage des Fehlerzustandes . 16.2 Umleiten von Fehlern . . . . . 16.3 Beispiel zu CATCH . . . . . . 16.4 Ausgabe von Fehlernachrichten

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

17 Widgets 17.1 GUI Builder . . . . . . . . . . . . . . . . . . . . . . 17.2 Typen von Widgets . . . . . . . . . . . . . . . . . . 17.3 Erstellung von Men Widgets . . . . . . . . . . . . . u 17.4 Gestaltung des Layouts eines Widgets . . . . . . . . 17.5 Wie funktioniert eine Ober che? . . . . . . . . . . a 17.6 Kontrolle uber die Widgets . . . . . . . . . . . . . . 17.7 Registrierung der Widgets mit dem XMANAGER . . 17.8 Schreiben eines kleinen Widget Programms . . . . . 17.8.1 Initialisierung der Event-Loop . . . . . . . . . . . 17.8.2 Ubergabe der Event Struktur an den Event-Handler 17.8.3 Aufbau der Event Struktur f r WIDGET BUTTON u 17.9 Ubergabe von Informationen zwischen Widgets . . . 17.10 Widgetprogrammierung im Wandel von IDL . . . . . 17.10.1 Beispiel: Widget 1 . . . . . . . . . . . . . . . . . 17.10.2 Beispiel: Widget 2 . . . . . . . . . . . . . . . . . 17.10.3 Beispiel: Widget 3 . . . . . . . . . . . . . . . . . 17.10.4 Beispiel: Widget 4 . . . . . . . . . . . . . . . . . 17.10.5 Beispiel: Widget 5 . . . . . . . . . . . . . . . . . 17.11 Widget Programme f r Runtime-L ufe . . . . . . . . u a 17.12 Compound Widgets . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

18 Verknupfung mit anderer Software 18.1 SPAWN Kommando . . . . . . . . . . . . . . . . . . . . . . . . . 18.2 SPAWN Kommando bei einem C Programm . . . . . . . . . . . . . 18.3 Aufruf von Fortran aus IDL: CALL EXTERNAL . . . . . . . . . .

INHALTSVERZEICHNIS A Informationen A.1 Informationen zu IDL . . . . . . . . . . . . . A.2 Publikationen und Aktivit ten zu IDL im FZJ a A.3 Wichtige URLs zu IDL . . . . . . . . . . . . A.4 Literatur . . . . . . . . . . . . . . . . . . . . B L sungen o B.1 B.2 B.3 B.4 B.5

ix 195 195 197 198 199 201 201 203 205 206 208

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

L sungen zu Kapitel: Datenstrukturen . . . . . . . . . . . . . . o L sungen zu Kapitel: Arbeiten mit Datenstrukturen . . . . . . . o L sungen zu Kapitel: Denitionen zur Datenausgabe . . . . . . o L sungen zu Kapitel: Programme zur Anwendungs-Darstellung o L sungen zu Kapitel: Programmierung und Kompio lation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . .

. . . .

. .

INHALTSVERZEICHNIS

Verzeichnis der Abbildungen


3.1 3.2 3.3 9.1 9.2 9.3 9.4 9.5 10.1 10.2 10.3 10.4 10.5 10.6 10.7 10.8 10.9 10.10 10.11 10.12 10.13 10.14 10.15 10.16 10.17 10.18 10.19 10.20 10.21 10.22 10.23 idlde: Aufbau der Ober che . . . . . . . . . . . . . . . . . . . . . a IDL Programm: Einfacher XY-Plot . . . . . . . . . . . . . . . . . . IDL Programm: einfacher XY-Plot mit Text . . . . . . . . . . . . . Denitionen zur Darstellung: Beispiel mit TEK COLOR Denitionen zur Datenausgabe: !P.MULTI . . . . . . . . Denitionen zur Datenanalyse: Keyword POSITION . . Denitionen zur Datenausgabe: Z-Buffer . . . . . . . . . Denitionen zur Datenausgabe: Beispiel mit Legende . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 11 12 68 72 73 76 79 86 87 89 89 90 91 91 92 93 94 96 97 98 99 100 100 101 102 103 105 106 107 108

Programme zur Darstellung: XY Plot . . . . . . . . . . . . . . . . . Programme zur Darstellung: mehrere Y-Achsen . . . . . . . . . . . Programme zur Darstellung: PLOT und zus tzlicher Text . . . . . . a Programme zur Darstellung: Beschriftung in der Mitte des Bildes . . Programme zur Darstellung: Logarithmischer PLOT . . . . . . . . . Programme zur Darstellung: Fehlerbalken . . . . . . . . . . . . . . Programme zur Darstellung: Polarplot . . . . . . . . . . . . . . . . Programme zur Darstellung: Scatter-Plot mit Zufallszahlen . . . . . Programme zur Darstellung: XYOUTS in unterschiedlichen Farben Programme zur Darstellung: SURFACE . . . . . . . . . . . . . . . Programme zur Darstellung: Behandlung von missing value . . . . Programme zur Darstellung: CONTOUR . . . . . . . . . . . . . . . Programme zur Darstellung: C Keywords bei CONTOUR . . . . . Programme zur Darstellung: SHADE SURF . . . . . . . . . . . . . Programme zur Darstellung: CONTOUR im 3D Raum . . . . . . . Programme zur Darstellung: Probleme ohne Z-Buffer . . . . . . . . Programme zur Darstellung: SURFACE 3D Transformationen . . . Programme zur darstellung: SURFR 3D Transformationen . . . . . Programme zur Darstellung: SCALE3 3D Transformationen . . . . Programme zur Darstellung: MAP SET . . . . . . . . . . . . . . . Programme zur Darstellung: CONTOUR und MAP SET . . . . . . Programme zur Darstellung: TRIGRID . . . . . . . . . . . . . . . . Programme zur Darstellung: ISO Ober chen . . . . . . . . . . . . a xi

xii 10.24 10.25 10.26 11.1 11.2 11.3 11.4 11.5 16.1 17.1

VERZEICHNIS DER ABBILDUNGEN Programme zur Darstellung: SLICER3-Tool im SLICE-Modus . . . Programme zur Darstellung: SLICER3-Tool im Surface-Modus . . . Programme zur Darstellung: SHOW3 . . . . . . . . . . . . . . . . Bildverarbeitung: TVSCL . . . . . . . Bildverarbeitung: TV . . . . . . . . . Bildverarbeitung: Basislter . . . . . Bildanalyse: Ausw hlen einer Region a Bildanalyse: Ausw hlen einer Region a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 110 114 119 120 122 123 125 168 187

Error Handling: CATCH . . . . . . . . . . . . . . . . . . . . . . . Widgets: Compound Widgets, cw switch . . . . . . . . . . . . . . .

Verzeichnis der Tabellen


4.1 5.1 5.2 9.1 9.2 10.1 10.2 10.3 10.4 10.5 Zeichen mit spezieller Bedeutung . . . . . . . . . . . . . . . . . . . . . Datenstrukturen: Datentypen . . . . . . . . . . . . . . . . . . . . . . . . Datenstrukturen: Operationen auf Zeichenketten . . . . . . . . . . . . . . Denitionen zur Datenausgabe: Auswahl eines Fonts . . . . . . . . . . . Denitionen zur Datenausgabe: Positionieren von Zeichen . . . . . . . . Programme zur Darstellung: Keywords zur Achsneanpaung . . . . . . . Programme zur Darstellung: Steuerungen zur Zeichen che . . . . . . . a Programme zur Darstellung: Routinen zum Beschriften oder Markieren . Programme zur Darstellung: Zusammenfassung allgemeiner Routinen . . Programme zur Darstellung: Zusammenfassung mehrdimensionaler Plotroutinen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 24 31 66 66 82 83 83 113 113 127 129 136

12.1 Lesen und Schreiben von Daten: Offnen . . . . . . . . . . . . . . . . . . 12.2 Lesen und Schreiben von Daten: Lesen und Schreiben von Daten . . . . . 12.3 Lesen und Schreiben von Daten: Zusammenfassung von Lese- und Schreibroutinen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

xiii

xiv

VERZEICHNIS DER TABELLEN

Verzeichnis der Beispiele


2.1 Konguration: Start-Up Datei . . . . . . . . . . . . . . . . . . . . 3.1 Beschreibung der Applikationen: Runtime . . . . . . . . . . . . . . 6.1 Datenstrukturen: Vorteil von Feld-Operationen . . . . . . . . . . . 9.1 Denitionen zur Datenausgabe: Z-Buffer . . . . . . . . . . . . . . . 9.2 Denitionen zur Datenausgabe: PostScript-Ausgabe . . . . . . . . . 9.3 Denitionen zur Darstellung: optionale Postscriptdatei . . . . . . . 10.1 Programme zur Darstellung: Plot von Datenreihen . . . . . . . . . . 10.2 Programme zur Darstellung: XYOUTS in unterschiedlichen Farben 11.1 Bildanalyse: Verarbeiten einer Region . . . . . . . . . . . . . . . . 12.1 Arbeiten mit Dateien: READ ASCII Template . . . . . . . . . . . . 12.2 Lesen und Schreiben: Programm zum Lesen und Schreiben . . . . . 13.1 Programmierung und Kompilation: ohne FORWARD FUNCTION . 13.2 Programmierung und Kompilation: mit FORWARD FUNCTION . . 13.3 Programmierung und Kompilation: Uberpr fung der Parameter . . . u 13.4 Programmierung und Kompilation: COMMON-Bl cke . . . . . . . o 16.1 Error Handling: CATCH . . . . . . . . . . . . . . . . . . . . . . . 17.1 Widgets: Layout eines Widgets . . . . . . . . . . . . . . . . . . . . 17.2 widgets: kleines widget Programm . . . . . . . . . . . . . . . . . . 17.3 widgets: Event Handler . . . . . . . . . . . . . . . . . . . . . . . . 17.4 Widgets: Dieses Widget wird in Beispiel 1 bis 5 bearbeitet . . . . . 17.5 Widgets: wid1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.6 Widgets: wid2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.7 Widgets: wid3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.8 Widgets: wid4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.9 Widgets: wid5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.10Widgets: Compound Widgets, test cw . . . . . . . . . . . . . . . . 17.11Widgets: Compound Widgets, cw switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 14 53 76 77 78 85 93 124 136 137 147 147 153 155 168 174 177 178 180 181 182 183 184 185 187 188

xv

xvi

VERZEICHNIS DER BEISPIELE

Kapitel 1 Einleitung
IDL (Interactive Data Language) ist ein Lizenzprogramm der Firma RSI, Research Systems Inc., Boulder, Colorado. In den folgenden Kapiteln werden wichtige Merkmale der Datenverarbeitungs-Sprache IDL aufgezeigt.

Strukturierte Sprache Interaktives, interpretatives Arbeiten Applikationen: Programme mit Funktionen, Prozeduren Plattformunabh ngig a IDL ist portabel: UNIX, VMS, Windows, LINUX, Macintosh Arrayorientierte Sprache Pointer Flexible Input/Output M glichkeiten o XY Plotting, 2D Plotting, mehrdimensionales Plotting, Volumen Visualisierung, Bildverarbeitung und Bildanalyse, Animation IDL Widgets, Erstellung von Benutzerober chen a Dynamisches Linken von FORTRAN mit CALL EXTERNAL.

Nachfolgende Themen werden in diesem Buch nicht behandelt. SQL Datenbankanbindung Wavelets Numerical Recipes Objekte und Objekt-orientierte Graphik Dynamische Link-Module mit FORTRAN oder C.

KAPITEL 1. EINLEITUNG

Kapitel 2 Konguration
Die Einstellungen zur IDL Arbeitsumgebung k nnen konguriert werden. Gemeint sind o Denitionen, die beim Starten von IDL durchgef hrt werden. u Einige Beispiele sind: (Fettgedrucktes sehr wichtig!): Der Suchpfad (!PATH), ein Beispiel zur Denition von !PATH folgt auf Seite 4. Backingstore von IDL behandeln (DEVICE,RETAIN=2) True Color in Direct Color (256 Farben) (DEVICE,DECOMPOSED=0) IDL-Systemvariablen oder eigene Systemvariablen Windowgr e o Diese Denitionen sind uber eine Start-Up Datei m glich. IDL sieht zwei M glichkeiten o o vor, eine Start-Up Datei zu denieren. Man kann zum einen in der Entwicklungsumgebung idlde in dem daf r vorgesehenen u Men Preferences Einstellungen vornehmen. Zum anderen werden Einstellungen automau tisiert durchgef hrt, wenn eine Start-Up Datei mittels einer Environment-Variablen angeu boten wird. Diese Technik wird im nachfolgenden beschrieben. Ein Vorteil einer Start-Up Datei ist, da man diese auch zentral f r eine Arbeitsgruppe denieren kann. u

2.1 Start-Up Datei


Die Datei, die als Start-Up Datei genommen werden soll, wird uber die Environment Variable IDL STARTUP deniert. Dabei ist eine volle Pfad-Angabe mit Angabe des File-Namens der Start-Up Datei notwendig. Korn Shell: export IDL_STARTUP=$HOME/idldir/setup_file Windows: set IDL_STARTUP=C:\idldir\setup_file F r das Arbeiten unter einem Unix-Betriebssystem gilt folgendes. u Wenn man mit dem Command Line Interface arbeitet, setzt man die Environment-Variable IDL STARTUP im .profile. Wenn man mit idlde arbeitet, setzt man den Bezug zu der Startup-Datei uber den Men punkt Preferences oder uber die Environment Variable IDL STARTUP im u .profile. 3

KAPITEL 2. KONFIGURATION

Unter einem Windows-System setzt man Environment-Variablen z.B. in der Datei autoexec.bat oder uber das Men Systemeigenschaften. u

2.1.1 Beispiel: Start-Up Datei


Das Beispiel gibt einen Uberblick uber m gliche Denitionen in einer Start-Up Datei. o Unterschiedliche Plattformen k nnen dabei ber cksichtigt werden. Die Pfadsetzung erfolgt o u in Unix mit dem Separator : und unter Windows mit dem Separator ;. Das Zeichen ; bedeutet in IDL, da nachfolgende Zeichen als Kommentar behandelt werden.
; eigener Prompt !PROMPT = myIDL> DEVICE,PSEUDO_COLOR=8 DEVICE,DECOMPOSED=0 ; bits per pixel

; Backingstore von IDL behandeln lassen DEVICE, RETAIN=2; ; Hintergrund weiss, Vordergrund schwarz !P.BACKGROUND=!D.TABLE_SIZE-1 !P.COLOR=0 IF !VERSION.OS_FAMILY EQ unix THEN sep=: ELSE sep=; ; Pfad erweitern, damit Routinen von Ray Sterner verfuegbar !PATH=/usr/local/idl/JHUapl/idlusr+sep + !PATH !PATH=/usr/local/idl/JHUapl/idlusr2+sep + !PATH !PATH=/usr/local/idl/JHUapl/idldoc+sep + !PATH ; Pfad fuer eigene Library erweitern !PATH=/home/zam/zdvnnn/ownlib+sep + !PATH ; Systemvariablen fuer Umlaute (readonly) ; klein !ae,!oe,!ue ; gross (upper) !up_ae,!up_oe,!up_ue DEFSYSV,!ae,STRING(228b),1 DEFSYSV,!oe,STRING(246b),1 DEFSYSV,!ue,STRING(252b),1 DEFSYSV,!up_ae,STRING(196b),1 DEFSYSV,!up_oe,STRING(214b),1 DEFSYSV,!up_ue,STRING(220b),1 ; Voraussetung Umlaute: DEVICE,/ISOLATIN1 & xyouts,xp,yp,!ae DELVAR,sep Beispiel 2.1: Konguration: Start-Up Datei

2.1. START-UP DATEI

2.1.2 Automatisches Starten eines Programms


Je nach Bedarf kann es erforderlich sein, ein vorkompiliertes Programm beim Starten von IDL direkt auszuf hren. Die Vorgehensweise wird im folgenden erkl rt. u a Das fertige Programm sollte in einer gerade neu gestarteten IDL-Sitzung komplett durchlaufen, so da alle Module kompiliert sind. Dann sichert man dieses Programm mit SAVE. Das kompilierte IDL-Programm hat z.B. den Datei-Namen my application.sav. SAVE,/ROUTINES,FILENAME=my_application.sav Die nachfolgenden Zeilen f gt man in die Start-Up Datei ein. u CD, directory_name RESTORE, FILENAME=my_application.sav my_plot ; Hauptprogramm der Applikation starten Mit dem Starten von IDL wird durch die Initialisierung uber die Start-Up Datei das Pro gramm my plot ausgef hrt. Weitere Informationen zur Ausf hrung kompilierter Prou u gramme als Runtime Version, siehe Seite 14.

KAPITEL 2. KONFIGURATION

Kapitel 3 Beschreibung der Applikationen


3.1 idlde (Unix, Windows)
idlde startet das IDL Developement Environment, das Graphische Benutzerinterface von IDL. In einem Unix-System mu man diese Umgebung explizit mit idlde aufrufen, in einem Windows-System wird diese graphische Benutzerober che automatisch gestara tet. idlde ist eine Programmierumgebung zum Erstellen und Debuggen von IDL Programmen, siehe Seite 161. In dieser Umgebung braucht man keinen weiteren Editor. Im Document-Panel kann ein IDL Programm geladen und editiert werden. Das kann entweder ein Hauptprogramm, eine Subroutine oder eine Funktion sein. N heres zur Programa mierung folgt ab Seite 139. Wichtig ist, da mit idlde der IDL Prompt zu jeder Zeit vorhanden ist. Damit hat man die M glichkeit, IDL Befehle zu testen. o

8
Menu Bar Tool Bars Project Window

KAPITEL 3. BESCHREIBUNG DER APPLIKATIONEN


Control Panel Buttons

Multiple Document Window

Output Log

Variable Watch Window

Command Input Line Status Bar

Abbildung 3.1: idlde: Aufbau der Ober che a

Auisten der letzten Befehle Mit der Richtungstaste -Taste kann man die Befehle zur ckholen. u Die letzten 20 Befehle kann man mit folgenden Kommando listen. HELP,/RECALL COMMANDS. Es gibt einen Unterschied zwischen der Unix und Windows Version: Unter Windows werden Syntax-Elemente in IDL-Programmen farbig hervorgehoben. Unter Unix erfolgt keine farbliche Hervorhebung. Daher empehlt es sich, unter Unix den emacs als Editor mit der Erweiterung IDL-Mode zu benutzen. Dieser Modus unterst tzt u eine farbige Hervorhebung der IDL Programme. Dazu mu ein emacs.template f r IDL als .emacs unter $HOME abgelegt werden. u

3.1. IDLDE (UNIX, WINDOWS)

3.1.1 Preferences
Zur Grundeinstellung von IDL sollten folgende Anderungen vorgenommen werden. Men : File u Preferences General Men punkt: change directory on open u (Interessant f r Windows Benutzer) u Wenn eine IDL-Bibliotheksroutine in den Editor geladen wird, zeigt der aktuelle Pfad auf den Pfad dieser Routine. Wird die IDL-Routine mean.pro geladen, verzweigt IDL automatisch in den Pfad /usr/local/idl/idl/lib Der Unix Benutzer wird vor Aufruf von IDL generell in das Verzeichnis verzweigen, in dem seine IDL Routinen liegen. Layout z.B. kann man das Projekt Window ausblenden, damit mehr Platz im Document Window ist. Edit Compiling: Men punkt: automatically save changes before compiling u Startup Unter dem Men kann der Name der Start-Up Datei angegeben werden. u

10

KAPITEL 3. BESCHREIBUNG DER APPLIKATIONEN

3.1.2 Editieren, Kompilieren und Fehlersuche in Programmen


File Men , Search Men und Edit Men sind selbsterkl rend. u u u a Im File Men ist unter Preferences eine Voreinstellung m glich (Startup File, u o Path,...). Uber das Search Men hat man Editierm glichkeiten (Find, Replace), aber u o auch eine Debughilfe (Go To Line). Run Men u Die Befehle des Run Men s, die im folgenden erkl rt werden, sind auch uber ein u a Icon der Ober che idlde ansprechbar. a Compile kompiliert das Programm, das unter dem Namen gespeichert ist. Compile from Memory kompiliert immer das, was im Fenster steht, also auch nicht abgespeicherte Anderungen. Run ausf hren u Resolve Dependencies alle Abh ngigkeiten werden aufgel st, wichtig f r .sav Files bei Runtime. a o u Debugging: Set Breakpoint Man mu zuvor den Cursor an die Stelle positionieren, wo der Breakpoint sein soll. Mit Set Breakpoint wird der Breakpoint gesetzt. Das Programm h lt a bei Ausf hrung an dieser Stelle an! u Edit Breakpoints Editieren der Breakpoints Disable Breakpoint Deaktivieren des Breakpoints. Dieser Breakpoint kann wieder aktiviert werden. Step Over f hrt eine Zeile aus. Falls diese einen Programmaufruf enth lt, wird dieser ohne u a Interaktion ausgef hrt. u Step Out Das Programm wird bis Ende ausgef hrt. u Run to Cursor Das Programm l uft bis zu der Stelle, wo der Cursor steht. a Run to Return Das aktuelle Programm wird bis zum Ende durchlaufen. Reset macht Verschiedenes: RETALL Befehl, alle Dateien schliessen, L schen von o Breakpoints, Variablen, Pointer... Hinweis: Vor dem Setzen von Breakpoints mu kompiliert werden! Macro Men u Eine Variable, die mit dem Cursor markiert ist, wird mit Print Var gedruckt. Die Help-Funktion wird mit Help on Var aufgerufen, wenn die Variable mit dem Cursor markiert ist. .edit idl programm von der Kommandozeile l dt diese Routine in das Docua ment Panel, falls diese noch nicht geladen ist.

3.2. IDL (UNIX)

11

3.2 IDL (Unix)


Mit dem Befehl idl wird das traditionelle Command Line Interface gestartet. Die Command Line Umgebung wird mit exit beendet. Direkte Ausfuhrung interaktiver Kommandos! Vektor als Beispieldatensatz x=INDGEN(200,/FLOAT) Deklaration HELP,x Information uber Variable x PRINT,x Inhalt von Variable x drucken PLOT,x Vektor x wird als Ordinate gezeichnet y=SIN(x/20)2 Beim Rechnen mit Vektoren und Feldern sollen keine Schleifen programmiert werden! PLOT,x,y Befehl (plot), Argumente (x,y)

Abbildung 3.2: IDL Programm: Einfacher XY-Plot

12 Beispiel:

KAPITEL 3. BESCHREIBUNG DER APPLIKATIONEN

Das Beispiel zeigt die interaktive interpretative Ausf hrung von einem Befehl. XYOUTS u gibt einen Textstring an die Koordinaten x,y aus. x und y sind Vektoren. x=INDGEN(200,/FLOAT) y=SIN(x/20)2 PLOT,x,y XYOUTS,x,y,sin(x),CHARS=0.5

Abbildung 3.3: IDL Programm: einfacher XY-Plot mit Text

3.2. IDL (UNIX)

13

3.2.1 Ausfuhrbare Kommandos, Kompilieren und Fehlersuche


Ausf hrbare Kommandos k nnen nur interaktiv als Kommando verwendet werden und u o nicht in Programmen. Diese Befehle beginnen alle mit einem Punkt (.) und sind abk rzbar. u Anweisungen: .COMPILE .CONTINUE .GO .RNEW .RUN .SKIP .STEP .TRACE

kompilieren setzt Programm fort f hrt zuvor ubersetztes Hauptprogramm aus u L schen von Hauptprogramm Variablen auer Common Block und .RUN o kompilieren n Kommandos uberpringen n Kommandos schrittweise wie .CONT, zeigt aber jede Zeile vor Ausf hrung an u

Setzen von Breakpoints: Breakpoints werden f r die Suche nach Fehlern verwenu det, siehe Seite 161. BREAKPOINT,file.pro, 23,/SET Breakpoint bei Zeile 23 im Programm file.pro Informationen mit HELP,/BREAKPOINT Hinweis: Die Fehlersuche ist uber das Command Line Interface zu IDL m glich, aber mit idlde o wesentlich einfacher.

14

KAPITEL 3. BESCHREIBUNG DER APPLIKATIONEN

3.3 Runtime (Unix, Windows)


Eine fertige Applikation kann als Runtime Version ablaufen. Bei einer Runtime Version sind alle Programme komplett kompiliert und liegen als Binary vor. Dieses vorkompilierte Programm kann ohne IDL-Entwicklungsumgebung ablaufen. Man ben tigt lediglich eine o Runtime-Lizenz. Ein Vorteil einer Runtime Version ist der schnelle Zugriff auf die bereits in bin rer Form vorliegenden Programme. Ein weiterer Vorteil ist, da ein Endanwender, a ohne selbst IDL-Kenntnisse zu haben, mit einer Runtime Applikation arbeiten kann. Der Nachteil einer Runtime Version ist die Abh ngigkeit von einer IDL-Version. Das Binary a kann nur unter der IDL-Version ablaufen, mit der es erstellt wurde. Der Quelltext des nachfolgenden Programms liegt als runtime.pro vor. Das WAITKommando hat den Zweck, die Ausf hrung des Programms um 3 Sekunden zu verz gern. u o Diese kleine Anwendung w rde sonst so schell ablaufen, da man das dargestellte Bild u nicht wahrnimmt, siehe Seite 139.

;Polar Plots PRO runtime r=FINDGEN(100) theta=r/5. PLOT, r, theta, SUBTITLE=Polar Plot, XSTYLE=4, YSTYLE=4, /POLAR AXIS, XAX=0,0,0 AXIS, YAX=0,0,0 WAIT,3 END Beispiel 3.1: Beschreibung der Applikationen: Runtime

Vorgehen: Erstellung einer Runtime Version Alle Programme, die verwendet werden, m ssen kompiliert werden. Das RESOLVE ALL u dient dazu, alle offenen Referenzen aufzul sen. Mit dem SAVE-Befehl speichert man die o Applikation als Binary ab. IDL starten .COMPILE runtime RESOLVE_ALL SAVE,/ROUTINES,FILENAME=runtime.sav IDL verlassen Aufruf der Runtime Lizenz unter Unix idl -rt=./runtime.sav In dem Beispiel liegt die Datei runtime.sav im aktuellen Verzeichnis. Ansonsten mu statt des Punktes die volle Pfadangabe stehen. Aufruf der Runtime Lizenz unter Windows erfolgt mittels eines Doppelklicks auf die kompilierte Datei.

3.4. IDLHELP (UNIX, WINDOWS)

15

Hinweis: Es kann nichts nachkompiliert werden. Die IDL Start-Up Datei wird nicht durchlaufen. .sav-Files sind unabh ngig von der Plattform. Egal wo erstellt, sind diese uberall a nutzbar (siehe Demo). Die !PATH Variable gibt es in der Runtime Umgebung nicht. .sav-Files sind abh ngig von der IDL-Version und laufen jeweils nur unter der a IDL-Version, mit der sie erstellt wurden. Das hat zur Folge, das bei einem VersionsUpgrade, Runtime Programme neu ubersetzt werden m ssen. u

3.4 IDLHELP (Unix, Windows)


Zu IDL geh rt eine sehr gut organisierte Hypertext basierte Online Hilfe. Die gesamte o IDL-Literatur steht online zur Verf gung. u Diese wird unter UNIX mit ? und unter Windows mit F1 aufgerufen. Unter einem Unix-Betriebsystem k nnen einzelne Befehle auch direkt hinter dem ? angegeben werden, o wie im nachfolgenden Beispiel aufgezeigt wird. Unter Windows kann man entsprechend den Befehl mit dem Cursor markieren und dann die Taste F1 dr cken. u IDL ? bzw. IDL ? plot Im idlde gibt es ein Men Help und ein Icon in der Tool Area. u Ein kapitelweises Ausdrucken ist uber die Online Hilfe m glich. IDL-Anwender, o die lieber mit einem Handbuch arbeiten, sollten mit dem IDL Dokumentationssatz arbeiten. Die gesamte Literatur bendet sich als PDF-Datei im docs-Verzeichnis von IDL und kann gedruckt werden.

3.4.1 Arbeiten mit der IDL Online Hilfe


Die Online Hilfe ist ein Hypertext Dokument mit den ublichen Abfragen und Steue rungsm glichkeiten. o Mit dem Aufruf der Online Hilfe ist folgendes direkt verf gbar: u Alle Befehle alphabetisch geordnet. Einen Uberblick uber die neuen Funktionen der aktuellen Version. Eine funktionale Liste aller Funktionen.

16

KAPITEL 3. BESCHREIBUNG DER APPLIKATIONEN

Uber folgende Men -Kn pfe erh lt man weitere Informationen. u o a File Men u Ein kapitelweises Ausdrucken ist m glich. Bei Printer Setup Auswahl von o Generic (File Only). Mit Print wird die Erstellung eines PostScript Files veranlat. Edit Men u Mit Copy selektierten Text aufs Clipboard (Ablage) legen. Diese kann dann mit Paste in idlde bzw. emacs kopiert werden. Sinnvoll f r Online dokumentierte u Beispiele. Bookmark Men u Mit Define Denition von Bookmarks zum schnelleren Aufnden bestimmter Topics. Mit dem Online Help Button Index werden folgende Help Topics gelistet.

Contents Men u IDL B cher, Whats new in IDL 5.x, Release Notes,... u Index Men u Suche nach Keywords. Nur die ersten Buchstaben des gesuchten Begriffs sind notwendig. Find Men u Suche nach beliebigem Text. Full text search, daher beim ersten Aufruf langsam. Wie bei Index nur die ersten Buchstaben des gesuchten Begriffs tippen.

Kapitel 4 Grundlagen
Mit der Distribution zu IDL stehen die Routinen der Sprache in zwei verschiedenen Arten zur Verf gung. Viele Programme liegen in Bin rcode, z.B. PLOT, oder in der Scriptu a Sprache (Quelltext) z.B. MEAN vor.

4.1 Aufnden von Programmen


Programme werden zuerst in dem aktuellen Arbeitsverzeichnis gesucht und dann entlang des Suchpfades, der in der Environment Variablen IDL DIR bzw. der IDLSystemvariablen !PATH deniert ist. F r das praktische Arbeiten ist es sinnvoll, von dem Verzeichnis die IDL Arbeitsumgebung u aufzurufen, in dem die Programme liegen. Nach dem Verlassen von IDL ist man in dem Verzeichnis, von dem man IDL gestartet hat. Hinweis: Man h lt m glichst alle Programme in einem Verzeichnis, um ein schnelles Aufna o den der IDL-Routinen zu erreichen. Unix: Liegen Programme in anderen Verzeichnissen, kann man Links anlegen. Windows: Bei einer Verkn pfung wird der Name der Datei umbenannt und ist damit u nicht aufndbar. In Dateinamen f r IDL-Programme sollten nur Kleinbuchstaben verwendet werden. u Unter dem Betriebssytem Unix werden keine Programme identiziert, die im Dateinamen Grobuchstaben enthalten. Wechseln des Arbeitsverzeichnisses IDL Befehl: CD CD,/home/idldir,CURRENT=olddir CD, CURRENT=olddir Wechsel zu $HOME/idldir und optionales Sichern des aktuellen Verzeichnisses mit dem Keyword CURRENT. Unter einem Unix-Betriebssystem kann man mit CD, in das Heimatverzeichnis ver zweigen. Dieser Befehl bewirkt unter Windows keine Anderung des Pfades.

17

18

KAPITEL 4. GRUNDLAGEN

4.2 Syntax der Aufrufe von IDL Programmen


Am Beispiel einer Prozedur werden die verschiedenen M glichkeiten der Parameter bero u gabe aufgezeigt.

IDLprogramm, [positionale Parameter], Keyword=value,... Beispiel: siehe Online Help zu PLOT PLOT, [X,] Y [, MAX_VALUE=value] [, MIN_VALUE=value] [,NSUM=value] [, /POLAR] [, THICK=value] [, /XLOG] [, /YLOG] [, /YNOZERO]

$ $ $

Die Parameter, die in [ ] (eckige Klammern) gesetzt sind, sind nicht erforderlich.

Positionale

Keyword

Parameter sind X und Y. Positionale Parameter sind nicht alle erforderlich. Deren Reihenfolge ist wichtig! Parameter sind die benannten Parameter z.B. MAX VALUE= bzw. /XLOG Diese Keyword-Parameter sind nicht erforderlich.

Das Komma ist das Trennzeichen zwischen den Parametern. Hinweis: Gro- /Kleinschreibung f r Variablen bzw. Befehle irrelevant u

4.2. SYNTAX DER AUFRUFE VON IDL PROGRAMMEN

19

4.2.1 Positionale Parameter


Dabei handelt es sich um Parameter, die in einer vorgegebenen Reihenfolge deniert und verwendet werden. Bezugnehmend auf das Beispiel Seite 18 sind die Variablen X und Y positionale Parameter.

4.2.2 Keyword Parameter


Keyword Parameter werden auch als benannte Parameter bezeichnet. Die Reihenfolge ist beliebig und ein Ausschreiben dieser Parameter ist oft nicht n tig. o Es sind nicht immer alle Parameter erforderlich. Bezugnehmend auf das Beispiel Seite 18, sind z.B. die Variablen MAX VALUE=value und MIN VALUE=value Keyword Parameter. Schreibweisen mit gleicher Bedeutung f r das Keyword COLOR: u COLOR=1 /COLOR /COL COL=1 oder falls man dem Keyword einen bestimmten Wert zuweisen will: COLOR=5 COL=5 Keywords beeinussen den Ablauf eines IDL-Programms. F r einen denierten Ablauf u gibt es ein bestimmtes Keyword. F r die Anderung einer Farbe gibt es das COLOR Keyu word. Dieses Keyword COLOR wird in den Programmen PLOT, XYOUTS, POLYFILL usw. verwendet. IDL-Routinen haben gemeinsame Keywords.

Hinweis: Informationen und Erkl rungen zu den Routinen und deren Keywords ndet man in der a Online Hilfe bzw. im Reference Guide.

20

KAPITEL 4. GRUNDLAGEN

4.3 Zeichen mit spezieller Bedeutung


Einige Zeichen sind reserviert. [] () ! ; $ Array Funktionen, Strukturtags Strukturen System- Variable Kommentar folgt Fortsetzung des Kommandos in n chster Zeile a oder Betriebssystemkommando, Beispiel: $ ls Start Ausf hrungskommando u .run kompiliert eine Funktion mehrere Befehle in einer Zeile werden durch & getrennt A=1 & B=10 Subscript bei Arrays oder Dereferenzierung Ausf hrung eines IDL Batch- Files, mit Namen datei enth lt u a eine Folge von IDL Befehlen. Beispiel: Journal Datei @datei online help oder als Operator c = ( a EQ b ) ? a : 0.0 Wenn die Bedingung (a EQ b) erf llt ist, gilt c=a, wenn nicht u gilt c=0.0 deniert Label oder Subscript bei Array-Bereich

. & * @

Tabelle 4.1: Zeichen mit spezieller Bedeutung

4.4 System-Variablen
System-Variablen dienen dem Zweck, Statusinformationen aufzuzeichnen oder bestimmte Prozesse zu steuern. Zur Steuerung von Prozessen gibt es z.B. !QUIET=1 (Unterdr cken u der MESSAGE,/INFO). Alle System-Variablen beginnen mit !. Hinweis: Systemvariablen k nnen sich von Version zu Version andern. Das bedeutet, da sich der o Informationsgehalt andern kann. Vorsicht ist daher bei Systemvariablen geboten, die geschrieben werden! IDL Systemvariable sind als globale Variablen in allen Programmeinheiten bekannt!

4.4. SYSTEM-VARIABLEN

21

4.4.1 Ubersicht
H ug benutzte Konstanten, Einstellungen f r die Grak, das Environment und Errora u Handling k nnen uber Systemvariablen gesetzt werden. o Konstante !DPI, !PI, !RADEG, !DTOR, !VALUES Graphik !D current device !ORDER !ORDER=0 (Image bottom-up), !ORDER=1 (Image top-down) !X, !Y, !Z Achsenstruktur !P Plot- Prozedur Environment !DIR, !PATH, !VERSION PRINT, !DIR Hauptdirectory von IDL PRINT, !PATH Suchpfad f r Routinen u Pfaderweiterung unter Unix !PATH=/home/privat/ + : + !PATH Pfaderweiterung unter Windows !PATH=c:\home\privat\ + ; + !PATH Bei der Pfadsetzung verwendet man unter Unix den Doppelpunkt und unter Windows das Semikolon PRINT, !VERSION Architektur, Betriebssystem und Versionsnummer von IDL Plattformabh ngiges Programmieren! a PRINT, !VERSION.OS liefert z.B. AIX PRINT, !VERSION.OS FAMILY liefert z.B. unix Die Beschreibung von !ERR STATE folgt auf Seite 166.

Error Handling

4.4.2 Informationen uber Systemvariablen


Welche Systemvariable gibt es? HELP,/SYSTEM_VARIABLES liefert u.a. folgende Ausgabe: !DPI = 3.1415927 HELP,!D <Expression> STRUCT = -> !DEVICE Array[1] !DPI ist die Konstante PI mit dem Typ DOUBLE. Die Information der HELP-Funktion gibt Auskunft dar ber, da !D eine Struktur ist, u d.h. !D ist eine Systemvariable mit verschiedenen Informationen. Info uber die Struktur der Systemvariablen !D (Device) HELP,/STRUCTURES,!D liefert u.a. folgende Ausgabe (Unix):

22 NAME X_SIZE Y_SIZE

KAPITEL 4. GRUNDLAGEN STRING LONG LONG X 640 512

Nur Ausdruck der Werte! PRINT,!D PRINT,!P.T !P.T ist eine 4x4 Transformationsmatrix. Einige Systemvariablen sind readonly: Konstanten, !D.TABLE SIZE,... Denition eigener Systemvariablen. Enth lt die DEFSYSV-Anweisung als dritten a Parameter die Option 1 ist die Systemvariable nur Readonly. DEFSYSV,!OWN,4711 DEFSYSV,!OWN,123,1

Kapitel 5 Datenstrukturen
Eine Variable im IDL-Sinn hat einen Typ (Byte, Integer, Float,...) und besitzt eine Spezikation. In IDL stehen, wie auch in anderen Programmiersprachen, Skalare (einzelner Wert), Felder (1 bis 8 Dimensionen) und Strukturen (Zusammenfassung von beliebigen Variablen, Felder und/oder Strukturen) zur Verf gung. u F r die Namenskonvention der Variablen gilt: u L nge max. 255 Zeichen a 1. Zeichen mu Buchstabe sein (Ausnahme: Systemvariable f ngt mit ! an) a erlaubt sind Buchstaben, Ziffern, $ und Underscore Nicht erlaubt sind reservierte W rter o z.B. AND, DO, FOR, FUNCTION, PRO, COMMON,...

Hinweis: IDL unterscheidet bei Variablen keine Gro-/Kleinschreibung! Beispiele: A, A6, My variable, INIT STATE, ABC$def (=abc$def) Der Variablen-Typ wird durch die Initialisierung festgelegt! Es gibt keine Typendeklaration, wie z.B in FORTRAN mit INTEGER, REAL,. . .

23

24

KAPITEL 5. DATENSTRUKTUREN

5.1 Datentypen
Die Datentypen unterscheiden sich in der Art der Zahl (Integer, Float, Complex,...) und in dem darstellbaren Zahlenraum. Strings stellen einen besonderen Datentyp dar. Bei der Indizierung einer Zahl mu man gem der Tabelle aufpassen, da man durch eine Zua weisung auch den richtigen Typ initialisiert. Je nach Typ, kostet es mehr oder weniger Speicherplatz. Da Speicherplatz aber heute nicht mehr eine so groe Rolle spielt, sollte man z.B. bei Integer Zahlen grunds tzlich mit LONG arbeiten, da standardm ig bei INT a a der Wertebereich nur 16 Bit umfat. Das bedeutet, da die Initialisierung einer Variablen a mit dem Wert 5 folgendermaen erfolgt: a = 5L Typ Bedeutung (Absoluter Wertebereich) 8-bit unsigned integer, 0 bis 255 f r pixel u images 16-bit signed integer, -32767 bis 32767 16-bit unsigned integer, 0 bis 65535 32-bit signed integer, -2 31 bis 2 31- 1 32-bit unsigned integer, 0 bis 2 32 - 1 64-bit signed integer, -2 63 bis 2 63 - 1 64-bit unsigned integer, 0 bis 2 64 - 1 32-bit single precision, oating point 64-bit double precision, oating point real and imaginary in single precision oat real and imaginary in double precision oat 64-bit, L nge 0 bis a 2147483647 (2.1 GB)

Initialisierung

Byte

var=0B

BYTE

BYTE

Integer Unsigned Integer Long Unsigned Long 64-bit Long 64-bit unsigned Long Floatingpoint Doubleprecision Complex Double Complex String

var=0 var=0U var=0L var=0UL var=0LL var=0ULL

FIX UINT LONG ULONG LONG64 ULONG64

INT UINT LONG ULONG L64 UL64

var=0.0 var=0.0D

FLOAT DOUBLE

FLOAT DOUBLE COMPLEX DCOMPLEX STRING

var=Complex(0,0) COMPLEX var=Dcomplex (0.0D,0.0D) var=


DCOMPLEX STRING

zu 1) Keywords f r die Funktionen INDGEN und MAKE ARRAY u


Tabelle 5.1: Datenstrukturen: Datentypen

TypKonvertierung

Keywords fur

5.2. SKALAR

25

5.1.1 Konversionsroutinen
Es gibt Funktionen zur Konversion des Typs z.B.: BYTE, DOUBLE, FLOAT, LONG, STRING, siehe auch Tabelle auf Seite 24. Beispiel: a=15.3 b=FLOAT(a) c=FIX(b) d=STRING(c) HELP,a,b,c,d A B C D

STRING FLOAT INT STRING

= 15.3 = 15.3000 = 15 = 15

Hinweis: Zu jeder Zeit kann man den Typ andern, was in Sprachen wie C nicht so einfach ist. Das vorherige Beispiel zeigt, wie einfach eine Konversion m glich ist. o

5.2 Skalar
Ein Skalar ist ein einzelner Wert ohne Dimension. Beispiele zur Initialisierung von Skalaren Die HELP Anweisung zeigt die Denition der Variablen auf. Das Zeichen & trennt die Befehle, die in einer Zeile stehen. byte_var=64b & HELP,byte_var long_int_var=5L & HELP,long_int_var float_var=50.5E10 & HELP,float_var dfloat_var=50.5D200 & HELP,dfloat_var str=Dies ist ein String & HELP,str

5.2.1 Information uber Skalare mit SIZE


Mit SIZE kann man uberpr fen, ob ein Wert ein Skalar ist. u skalar=1 INFO=SIZE(skalar,/DIMENSION) PRINT,INFO Der SIZE-Befehl mit Denition des Keywords DIMENSION ermittelt die Dimension eines Wertes. INFO hat den Wert 0, wenn ein Skalar mit dem Keyword DIMENSION getestet wird. Ein Skalar hat keine Dimension. Auf diese Weise sind Vektoren mit einem Element von Skalaren zu unterscheiden.

26

KAPITEL 5. DATENSTRUKTUREN

5.3 Array
Ein Array hat ein bis acht Dimensionen. Die Feldindizierung wird ab Index 0 gez hlt. a Da IDL eine lebendige Sprache ist, nden laufend Erg nzungen statt. In alteren a IDL Versionen hat es weniger Datentypen gegeben als heute. Aus heutiger Sicht gibt es in alteren Versionen Programme, die mit den heute zur Verf gung stehenden IDL-Routinen u redundant sind. Als Beispiel sei hier das Programm zur Generierung von Speicherplatz genannt. In alten Versionen mute man jeweils den Typ fest verdrahtet im Aufruf angeben (INTARR, FLTARR,.. usw.). Mit der Routine MAKE ARRAY hat man ein IDL Programm, das man generell bei der Generierung von Speicherplatz aufrufen kann. Die Typ-Spezikation wird jeweils mit einem Keyword gesteuert.

5.3.1 Anlegen von Vektoren und Arrays


In diesem Abschnitt werden die alte und die aktuelle Methode zum Anlegen von Feldern beschrieben. Die alte Methode wird beschrieben, weil bereits existierende IDL Programme diese Notation verwenden. Diese Methode ist recht unkomfortabel, da f r u jeden Datentyp eine eigene Funktion aufgerufen werden mu. Die aktuelle Methode ist einfacher und exibler aufzurufen und sollte m glichst in neuen IDL-Entwicklungen o verwendet werden. Vorgehen nach der alten Methode: Es gibt zwei Methoden, Felder anzulegen, zum einen werden die Werte zu Null gesetzt und zum anderen erhalten sie den Wert des Indices des Feldes. Die folgenden Befehle legen jeweils einen Bereich an und f hren eine Zu Null Setzung u aller Elemente durch. Die Befehle enden alle mit ARR und man mu im Aufruf explizit den Typ (BYTARR, INTARR, LONARR,.....) nennen. Generierung eines Short Integer Vektors mit Nullsetzung: a=INTARR(10) Generierung eines Long Integer Vektors mit Nullsetzung: b=LONGARR(10) Die folgenden Befehle dienen dem Anlegen von Feldern nach der alten Methode und f hren eine Indexgenerierung durch: u Jedes Element bekommt den Wert seines Indices, beginnend mit 0. Die Befehle enden alle mit INDGEN und hier ist ebenso wie bei oben erkl rten Befehlen im Aufruf explizit der a Typ (INDGEN, BINDGEN, L64INDGEN, LINDGEN,...) erforderlich. Diese Befehle legen jeweils einen Bereich an und f hren eine Indexgenerierung durch. u Beispiel: Generierung von Variablen mit Indexgenerierung. Generierung eines Vektors vom Typ FLOAT mit Indexgenerierung a=FINDGEN(10) Generierung eines Vektors vom Typ LONG mit Indexgenerierung b=LINDGEN(10)

5.3. ARRAY Vorgehen nach der aktuellen Methode:

27

Die aktuelle Methode sollte m glichst in neuen IDL-Entwicklungen verwendet o werden. Mit der aktuellen Methode kann die Generierung von Feldern mit dem Befehl MAKE ARRAY bzw. INDGEN vereinheitlicht werden. Mit MAKE ARRAY kann man sowohl alle Werte eines Feldes mit 0 besetzen als auch mit einem beliebigen Wert initialisieren. Die zus tzliche Typangabe ist mit einem Keyword z.B. L64, UL64, a LONG, FLOAT,. . . m glich. F r die Indexgenierung wurde der bisherige Befehl der alten o u Methode zur Indexgenerierung von Integer Feldern INDGEN erweitert. Diese Funktion kann durch Verwendung von Keywords zur Typangabe zum Anlegen von Feldern mit Indexgenerierung aller beliebigen Datentypen verwendet werden. Die Indexgenerierung ist auch mit MAKE ARRAY mit dem Keyword INDEX m glich. o Beispiel: Generierung von Feldern vom Typ FLOAT

Generierung eines Feldes mit Wert- und Typangabe: a=MAKE ARRAY(10,/FLOAT,VALUE=5.) Generierung eines Feldes mit Indexgenerierung und Typangabe ( quivalente Schreibweisen): a a=INDGEN(10,/FLOAT) a=MAKE ARRAY(10,/FLOAT,/INDEX)

Folgende Schreibweisen sind aquivalent zum Anlegen eines Bereiches mit einem Typ und einem Wert. FLTARR ist eine Funktion der alten Methode und sollte durch die aquivalente Schreibweise mit MAKE ARRAY ersetzt werden. a=FLTARR(10,10) & a=MAKE_ARRAY(10,10,/FLOAT) Der Vorteil von MAKE ARRAY liegt in der exiblen Typ- und Wertangabe. array=MAKE_ARRAY(3,4,/INT,VALUE=5) Folgende Schreibweisen sind aquivalent zum Anlegen eines indizierten Feldes. FINDGEN und SINDGEN sind Funktionen der alten Methode und sollten durch die aquivalente Schreibweise mit INDGEN ersetzt werden. a=FINDGEN(40) & a=INDGEN(40,/FLOAT) str=SINDGEN(10) & str=INDGEN(10,/STRING)

Hinweis: Die Funktionen MAKE ARRAY bzw. INDGEN sind exibler als FLTARR, FINDGEN, ... Bei MAKE ARRAY bzw. INDGEN mu man nur die Keywords f r den Datentyp kenu nen, w hrend bei den Funktionen, die auf . . . ARR und . . . INDGEN enden, entsprea chend des Datentyps je eine andere Funktion gew hlt werden mu. a Bei MAKE ARRAY gibt es eine exible Indizierung (Wert, Typ und Indexgenerierung,...).

28

KAPITEL 5. DATENSTRUKTUREN

5.3.2 Information uber Felder mit SIZE


Mit SIZE kann man uberpr fen, ob eine Variable ein Array ist. u ARR=MAKE_ARRAY(50,60,/FLOAT) INFO=SIZE(ARR) PRINT,INFO 2 50 60 4 3000 Anzahl Dimensionen (2), deklarierte L ngen (50, 60), 4 ist der Typ (siehe Refea rence Guide), 3000 (50*60) ist die Gesamtzahl der Feldelemente.

5.3.3 Generierung von Arrays mit REPLICATE


Im folgenden Beispiel wird die Zahl 5.0 mit der Funktion REPLICATE in einem Array der Gr e [10,10] angeordnet. Jedes Element des Arrays hat den Wert 5.0. o a=5.0 array=REPLICATE(a,10,10) Aquivalent dazu ist der folgende Befehl. a=5.0 array=MAKE_ARRAY(10,10,/FLOAT,VALUE=a) REPLICATE wird auch f r die Erzeugung von Arrays von Strukturen verwendet, siehe u Seite 37.

5.3.4 Arrayindizierung mit [ ]


Seit der Version IDL 5.0 gibt es eine Syntax nderung bei der Arrayindizierung. Arrays a sollten mit eckigen Klammern indiziert werden. In alten IDL Versionen wurden Arrays mit runden Klammern indiziert. Die alte Schreibweise mit runden Klammern ist weiterhin erlaubt, sollte aber in neuen Programmen durch eckige Klammern ersetzt werden. Bei der Zuweisung wert=array[5] ist klar, da es sich um das sechste Feldelement handelt, w hrend wert=array(5) auch ein Funktionsaufruf sein k nnte. a o Mit dem Zeichen * werden alle Elemente der angegebenen Dimension angesprochen. Das Zeichen : wird verwendet, um Teilbereiche einer Dimension anzusprechen.

5.3. ARRAY

29

5.3.5 Arbeiten mit Feldern - REFORM Befehl


REFORM andert nur die Dimensionierung, alle Dimensionen der L nge 1 werden entfernt. a a=INDGEN(10,10,10,/LONG) b=a[5,*,*] HELP,b,REFORM(b) B LONG <Expression> LONG

= Array[1, 10, 10] = Array[10, 10]

REFORM beh lt die Reihenfolge der Indizierung bei. a

5.3.6 Arbeiten mit Feldern - TRANSPOSE Befehl


Der Befehl TRANSPOSE bildet die Transponierte einer Matrix. Im Gegensatz zu dem REFORM-Befehl werden die Werte der Matrix neu angeordnet.

5.3.7 Verknupfung von Feldern


Felder k nnen erweitert werden, wenn deren Dimension ubereinstimmt. o Ein Array mit zehn Elementen wird um ein Element erweitert und hat dann elf Elemente. A=FINDGEN(10) A=[A,5] Vektoren verknupfen v1=[2,3,1] v2=[2,1,4] v3=[v1,v2] PRINT,v3 ergibt: 2 3 1 2 1 4 Im Gegensatz dazu ist v4 = [ [v1],[v2 ]] ein zweidimensionales Feld PRINT,v4 2 2 3 1 1 4

30

KAPITEL 5. DATENSTRUKTUREN

5.3.8 Beispiele zum Arbeiten mit Feldern


arr=[2,4,6,8] arr=INDGEN(256,500,/FLOAT) PRINT,arr[24,2] PRINT,arr[536] PRINT,arr[2,*] HELP,arr[2,*] temp=arr[0:9,*] HELP,temp arr[80:220,200:300]=0.0 arr[0]=2, Vektor mit 4 Elementen 256*500 Floating Elemente, durchnummeriert mit 0.,1.,2.,.. das 537. Element (2*256+25=537). 1. Index schneller,eindimensionaler Index m glich o 3. Spalte, 500 Elemente arr[2,*] hat die Dimension (1,500) die ersten 10 Spalten uber alle Zeilen zeigt Denition des Feldes Subarray mit Doppelpunkt setzen, nie eine Schleife programmieren!

A=[1,2,1] ARRAY=[[A],[2*A],[3*A]]

5.4. ZEICHENKETTEN (STRINGS)

31

5.4 Zeichenketten (Strings)


Eine Zeichenkette besteht aus ein oder mehreren ASCII-Zeichen, die in Hochkommata eingeschlossen sind. Man nimmt dazu die einfachen Hochkommata. Die L nge einer a Zeichenkette kann maximal 2 GByte betragen. Wenn innerhalb einer Zeichenkette ein Hochkomma dargestellt werden soll, mu man zwei Hochkommata kodieren. PRINT, ABCDEF ABCDEF PRINT, "ABCDEF" ABCDEF Bei Zeichenketten kann auch das doppelte Hochkomma verwendet werden. Bei Zahlen werden durch Voranstellen des doppelten Hochkommas oktale Zahlen deniert. PRINT, "10 8

5.4.1 Operationen auf Zeichenketten


Die Zeichenkettenvariablen werden h ug verwendet. F r ihre Bearbeitung gibt es eine a u Anzahl wichtiger Befehle. + STRLEN STRCOMPRESS,STRTRIM STRPOS STRJOIN STRPUT STRMID STRSPLIT STRLOWCASE STRUPCASE STRING READS Beispiele: str=IDL is fun PRINT,STRMID(str,7,3) fun str = Wort1,Wort2,Wort3 teilstring = STRSPLIT(str,,,/EXTRACT) HELP, teilstring TEILSTRING STRING = Array[3] Operator zum Verkn pfen von Strings u Ermittelt die L nge eines Strings a Entfernen von Leerzeichen und Tabulatoren Lokalisieren, Einf gen und Extrahieren von u Teilstrings

Teilt einen String in einzelne Strings auf Konvertieren von Strings in Klein- bzw. Grobuchstaben Konvertiert numerische Daten zum Typ String Liest Werte aus einem String in eine IDL-Variable

Tabelle 5.2: Datenstrukturen: Operationen auf Zeichenketten

32 PRINT, teilstring[1] Wort2

KAPITEL 5. DATENSTRUKTUREN

5.4.2 Konversion von Strings in Zahlen


Von einem String k nnen Zahlen gelesen werden, z.B. in ein FLOAT-Array, wie das folo gende Beispiel zeigt. str=1 2 3 val=FLTARR(3) READS,str,val PRINT,val 1.00000

2.00000

3.00000

5.4.3 Zeichenkette mit Leerzeichen anlegen


F r die formatierte Ausgabe kann es erforderlich sein, Daten mit einer denierten u Anzahl von Leerzeichen voneinander zu trennen. Eine einfache M glichkeit bildet das o nachfolgende Beispiel mit REPLICATE oder MAKE ARRRAY. my_string= bzw. my_string1=STRING(REPLICATE(32b,11)) my_string2=STRING(MAKE_ARRAY(11,VALUE=32b)) Leerzeichen werden als Byte (ASCII Nummer 32) generiert.

REPLICATE vervielfacht den BYTE-Wert 32b elf mal. Das Ergebnis ist ein Vektor der L nge elf und dem Typ BYTE. Mit MAKE ARRAY wird ein Vektor der L nge elf a a und dem Initialisierungswert 32b angelegt. Mit der Funktion STRING wird jeweils eine Konvertierung in einen String durchgef hrt. u

5.5. STRUKTUREN

33

5.5 Strukturen
Eine Struktur ist eine Zusammenfassung verschiedener Daten unterschiedlicher Denitionen (Skalare oder Arrays von allen IDL Datentypen). Strukturen sind n tzlich, um Daten u zu einer anderen Programmeinheit zu transferieren. Die Daten innerhalb der Struktur werden uber Tags deniert. Die Tags entsprechen den Variablen Namen, daher gelten f r sie auch die gleichen Regeln zur Denition. u Das Zeichen . dient dazu, eine einzelne Variable der Struktur anzusprechen. Man unterscheidet zwei Typen von Strukturen: Named Wird uber einen Namen deniert. Bei der ersten Referenz liegt die Struktur bez glich u Typ und Dimension fest und kann nicht ge ndert werden. Die benannte Struktur kann a benannte Strukturen enthalten. Anonymous Es gibt keinen Namen und es wird keine permanente Denition innerhalb IDL gespeichert. Die anonyme Struktur kann andere benannte und anonyme Strukturen enthalten. Hinweis: Grunds tzlicher Unterschied der beiden Strukturtypen: a Bei einer anonymen Struktur ist der Typ und die Dimensionierung der Struktur-Elemente gesch tzt. Die Anzahl der Struktur-Elemente kann erweitert werden. Die Reihenfolge u der Elemente ist nicht festgelegt. Dagegen ist bei einer benannten Struktur der Typ, die Dimensionierung und die Reihenfolge festgelegt. Die Anzahl der Struktur-Elemente kann nicht erweitert werden. Damit ist der Strukturaufbau duplizierbar.

Information uber Struktur Variable mit dem Keyword STRUCTURE. HELP,!D,/STRUCTURE HELP,!D.NAME

34

KAPITEL 5. DATENSTRUKTUREN

5.5.1 Denition einer unbenannten (anonymen) Struktur


Die Denition ist entweder mit geschweiften Klammern oder mit CREATE STRUCT m glich. o var={Tag1:Value1,Tag2:Value2,...,Tagn:Valuen} var=CREATE_STRUCT(Tag1,Value1,Tag2,Value2,...,Tagn,Valuen) Beispiel: Denition einer anonymen Struktur V = [Vname, Name, Alter] person=CREATE_STRUCT(V[0],Emil,V[1],Graf,V[2],20) HELP,person PERSON

STRUCT

= -> <Anonymous> Array[1]

HELP,person,/STRUCT ** Structure <3007e210>, 3 tags, length=20, refs=1: VNAME STRING Emil NAME STRING Graf ALTER INT 20 Erweiterung der anonymen Struktur um einen Tag person=CREATE_STRUCT(person,Gehalt, 3100.50) HELP,person PERSON

STRUCT

= -> <Anonymous> Array[1]

HELP,person,/STRUCT ** Structure <3007ef90>, 4 tags, length=24, refs=1: VNAME STRING Emil NAME STRING Graf ALTER INT 20 GEHALT FLOAT 3100.50 Zusammenfassung anonymer Strukturen zu einer neuen anonymen Struktur neu=CREATE_STRUCT(p1,person,p2,person) HELP,neu,/STR P1 P2 HELP,neu.p1,/STR ** Structure <3007ef90>, 4 tags, length=24, refs=5: VNAME STRING Emil NAME STRING Graf ALTER INT 20 GEHALT FLOAT 3100.50

STRUCT STRUCT

-> <Anonymous> Array[1] -> <Anonymous> Array[1]

5.5. STRUKTUREN Auf die Tags der Struktur zugreifen neu.p2.vname=Hugo HELP,neu.p2.vname,/STR <Expression> STRING

35

= Hugo

Hinweis: Datentyp und Dimension der Tags nicht mehr anderbar!

Die Tags kann man auch uber deren Index ansprechen HELP,neu.(0),/STR ** Structure <3007f020>, 4 tags, length=24, refs=4: VNAME STRING Emil NAME STRING Graf ALTER INT 20 GEHALT FLOAT 3100.50 HELP,neu.(1),/STR ** Structure <304839e0>, 4 tags, length=24, refs=4: VNAME STRING Hugo NAME STRING Graf ALTER INT 20 GEHALT FLOAT 3100.50 HELP,neu.(0) Dabei ist (0) die Tag Position, und zwar von 0 gerechnet die 1. Position HELP,neu.(1) (1) ist die 2.Tag Position Beispiel f r die Tag-Angabe bei tiefer geschachtelten Strukturen: u HELP,neu.(1).(0)

36

KAPITEL 5. DATENSTRUKTUREN

5.5.2 Denition einer benannten Struktur


Die Denition ist entweder mit geschweiften Klammern m glich und enth lt die Angabe eines Namens. o a

oder mit CREATE STRUCT

var={struc_name,Tag1:Value1,Tag2:Value2,...,Tagn:Valuen} var=CREATE_STRUCT(NAME=struc_name,Tag1,Value1,...,Tagn,Valuen) Beispiel: Denition einer benannten Struktur var1={data,date:,para1:0.0,pic:BYTARR(10,10)} HELP,var1 VAR1

STRUCT

= -> DATA Array[1]

HELP,var1,/STR ** Structure DATA, DATE PARA1 PIC

3 tags, length=112: STRING FLOAT 0.00000 BYTE Array[10, 10]

Der Strukturname ist data. Achtung: Die Initialisierung bei date sind zwei einzelne Hochkommata. Zugriff auf Tags var1.date=29.05.95 var1.para1=5.0

Andere Schreibweise der Denition var3=CREATE_STRUCT( $ name=neu,date,, para,0.0,pic,BYTARR(10,10))

Erweiterung einer zuvor benannten Struktur neu ergibt einen Fehler var4=CREATE_STRUCT(name=neu, $ date,, para,0.0,pic,BYTARR(10,10),a,0.) % Wrong number of tags defined for structure: NEU.

5.5. STRUKTUREN

37

5.5.3 REPLICATE bei Strukturen


Mit REPLICATE k nnen auch Strukturen als Array generiert werden. var1 ist eine beo nannte Struktur, die mit REPLICATE vervielfacht wird. var1={data,date:,para1:0.0,pic:BYTARR(10,10)} var1=REPLICATE(var1,5) HELP,var1 VAR1

STRUCT

= -> DATA Array[5]

HELP,var1[0].date <Expression> STRING

= 29.05.95

Duplizieren des Strukturaufbaus var2={data}

Verknupfen von Strukturen analog zu Feldern mit [] var2=[var2, {data}] Statt einer IDL Variablen, kann bei REPLICATE ein Strukturname stehen. var2=REPLICATE( {data} , 3)

5.5.4 Informationen zum Strukturaufbau


Es gibt Routinen, um den Aufbau einer Struktur auszugeben. n=N TAGS(var1) Anzahl Tag-Namen (nur von der obersten Ebene) PRINT,n 3 tags=TAG NAMES(var1) Tag-Namen R ckgabe der Tag-Namen erfolgt in Grou buchstaben DATE PARA1 PIC

PRINT,tags

38

KAPITEL 5. DATENSTRUKTUREN

5.6 Pointer
Pointer in IDL und Sprachen wie C/C++ sind nicht dasselbe. Ein Pointer in C zeigt auf einen bestimmten Bereich im Speicher. Ein Pointer in IDL zeigt dagegen auf eine spezielle IDL Heap Variable. IDL stellt den Bereich f r die Pointer Daten bereit. u Der IDL Programmierer braucht sich keine Gedanken uber Speichermanagement zu ma chen. Man verwaltet selbst keine absoluten Speicheradressen. Der Heap-Speicher wird von IDL verwaltet. Es ist daher unm glich, Speicherbereich im Heap zu uberschreiben. Man o kann lediglich die Referenz auf diese Variable verlieren. Pointer werden in dem Heap-Speicher angelegt. Damit sind die Datenbereiche, die uber Pointer angesprochen werden, global und damit in jeder Programmeinheit verf gbar. u Es gibt Funktionen zum Anlegen von Pointern, (PTR NEW und PTRARR), eine Funktion zur Pointer-Freigabe (PTR FREE) und eine Funktion zur G ltigkeitsabfrage des Pointers u (PTR VALID). Diese Funktionen werden auf Seite 39 n her beschrieben. Die Funktionen a SAVE und RESTORE werden bei Pointern voll unterst tzt. Wenn man die Referenz sichert, u sichert man damit auch den Zugriff auf den Heap-Bereich. Ein Pointer selbst ist eine einfache IDL Variable. Pointer sind uber den Dereferenzierungs operator * ansprechbar. Ein Beispiel steht auf Seite 39.

5.6.1 Anwendungen von Pointern


Der Datentyp Pointer kann in statischen Datenelementen, wie Strukturen, als ein Platzhalter f r einen dynamisch angelegten Speicherbereich verwendet werden. u Der Datentyp Pointer ist f r die objektorientierte Programmierung, die Widget u Programmierung und die Programmierung mit Strukturen wichtig. Groe Datenmengen k nnen uber Pointer-Variablen deniert werden. Da Pointer o global bekannt sind, kann man uber Pointer-Variablen denierte Datenbereiche ansprechen. Ein Beispiel dazu steht auf Seite 109, wo nur die Pointer-Variable an das SLICER3Tool ubergeben wird. Verkettete Listen (Trees)

Hinweis: In der Widget Programmierung, siehe Seite 171, ist WIDGET CONTROL mit SET UVAULE mit groen Datenmengen sehr langsam. Deniert man den Datenbereich uber eine Pointer-Variable, l uft die Anwendung viel schneller. a Nullpointer: Der Nullpointer hat keinen bestimmten bekannten Wert und zeigt auf keine Heap Variable. Der Nullpointer hat eine Bedeutung als Abschlu bei Datenstrukturen.

5.6. POINTER

39

5.6.2 Funktionen zur Bearbeitung von Pointern


Die Befehle zum Arbeiten mit Pointern beginnen alle mit PTR. Die wichtigsten Befehle zum Arbeiten mit Pointern werden beschrieben. Pointer anlegen pVar=PTR NEW([InitExpr]) legt einen neuen IDL Pointer an ohne Argument: Nullpointer ( p=PTR NEW() ) InitExpr wird benutzt, um Heap Variable zu initialisieren Keyword: ALLOCATE HEAP undenierte Heap Variable, aber kein Nullpointer. ( p=PTR NEW(/ALLOC) ) Pointer Array mit Nullpointern (nur Dimensionierung!) anlegen pArr=PTRARR(D1,...,Dn) Di sind die Dimensionen des Ergebnisses und k nnen skalare Ausdr cke sein. o u Es sind bis zu 8 Dimensionen m glich. o Keyword: ALLOCATE HEAP undenierte Heap Variable, aber kein Nullpointer. Pointer freigeben PTR FREE,P1,...,Pn

o PTR FREE zerst rt die Heap Variablen, auf die die Pointer Argumente zeigen. Wenn der Pointer zerst rt ist, dann ist die Pointer Variable eine dangling refeo rence. a=PTR NEW(23) PRINT,a,*a <PtrHeapVar1> 23 PTR_FREE,a PRINT,a,*a Invalid pointer: A Gultigkeit von Pointer Argumenten Result=PTR VALID(Arg) Falls True, dann g ltig. u Dereferenzierungsoperator * Anzeigen des Inhalts einer Heap Variablen, die von einer Pointer Variablen referenziert wird Der * Operator mu der Variablen, die dereferenziert werden soll, vorangestellt werden. Erlaubte Operationen: Zuweisung, Dereferenzierung, Vergleich mit EQ oder NE

40

KAPITEL 5. DATENSTRUKTUREN

5.6.3 Beispiele mit Pointern


Pointer auf Wert pvar1=PTR_NEW(5) HELP,pvar1 PVAR1 POINTER = <PtrHeapVar1> PRINT,*pvar1 5 Nullpointer - es wird keine Heap-Variable angelegt, kann nicht dereferenziert werden. nptr=PTR_NEW() HELP,nptr NPTR POINTER = <NullPointer> Pointer auf Arrays vec=FINDGEN(10) pa=PTR_NEW(vec) ; erstelle eine Pointer-Array PRINT,*pa 0 1 2 3 ; Ausgabe des Feldes 6 7 8 9

PRINT,TOTAL(*pa),(*pa)[3] 45.0000 3.0000 pb=pa HELP,pa,pb PA POINTER = <PtrHeapVar6> PB POINTER = <PtrHeapVar6>

5.6.4 Empty Pointer


Empty Pointer sind keine Nullpointer. Man kann ein Pointer-Array bzw. eine PointerVariable im Heap anlegen, ohne da diese einen Wert hat. Die Zuweisung von Werten kann sp ter erfolgen. a pa=PTR_NEW(/ALLOCATE_HEAP) pc=PTRARR(3,/ALLOCATE_HEAP) Hier erfolgt die Zuweisung von Werten. *pa=TEST FOR i=0,N_ELEMENTS(pc)-1 DO *pc[i]=i FOR i=0,N_ELEMENTS(pc)-1 DO PRINT,*pc[i]

Hinweis: Mit ALLOCATE HEAP besteht die M glichkeit, die entstehenden Pointer mit Werten zu o versehen. Ohne die Angabe ALLOCATE HEAP entstehen Nullpointer.

5.6. POINTER

41

5.6.5 Gultige Pointer


Falls der Pointer existiert, gibt die Funktion PTR VALID den Wert 1 zur ck, sonst 0 (Nullu pointer). a=PTR_NEW(5) b=PTR_NEW() c=PTR_NEW(/ALLOCATE_HEAP) PRINT,PTR_VALID(a) 1 PRINT,PTR_VALID(b) 0 PRINT,PTR_VALID(c) 1

5.6.6 Datenbereich mit Pointer belegen


In dem Beispiel wird ein Bereich von 32 MB angelegt. bigarray=MAKE_ARRAY(2000,2000,/DOUBLE) Jeder denierten Variablen kann man einem Pointer zuweisen. ptrval=PTR_NEW(bigarray) Bei der Zuweisung wird eine Kopie des Bereiches angelegt und damit doppelt belegt, die Variable bigarray und die Heap Variable, auf die der Pointer zeigt. Das Keyword NO COPY verhindert das. Nach dem Anlegen des Pointers ist die Variable bigarray undeniert, so da man den Speicherbereich nur einmal belegt hat. ptrval=PTR_NEW(bigarray,/NO_COPY) HELP,bigarray BIGARRAY UNDEFINED = <Undefined> HELP,ptrval PTRVAL POINTER = <PtrHeapVar1> Mehrfache Pointer Referenz Eine weitere Variable zeigt auf das Array. ptrval2=ptrval HELP,ptrval2 PTRVAL2 POINTER = <PtrHeapVar1> HELP,/MEMORY Mit dem Befehl HELP,/MEMORY kann man uberpr fen, wieviel Speicherplatz belegt ist. u Es sind nur 32 MB belegt. Zum Test kann kann man zuvor ein .RESET oder Reset uber Men ausf hren. u u

42

KAPITEL 5. DATENSTRUKTUREN

5.6.7 Pointer auf eine Struktur


Wird ein Pointer auf eine Struktur gelegt, mu man bei der Dereferenzierung darauf achten, das man nur die Struktur-Variable dereferenziert, wenn man den Wert eines Tags benutzen m chte. o s={name:Joe,age:40,height:177} sptr=PTR_NEW(s) PRINT,(*sptr).age 40

5.6.8 Pointer in einer Struktur


Wenn man in einer benannten oder anonymen Struktur dynamisch Speicherplatz anlegen will, mu man statt der Werte Pointer denieren. Das Beispiel zeigt diese M glichkeit mit einer benannten Struktur. o ud=UNDEFINED data=CREATE_STRUCT(NAME=S, $ p1,PTR_NEW(ud),p2,PTR_NEW(ud),p3,PTR_NEW(ud)) HELP,data,/STR ** Structure S, 3 tags, length=12: P1 POINTER <PtrHeapVar26> P2 POINTER <PtrHeapVar27> P3 POINTER <PtrHeapVar28> Die Strukturvariable data enth lt drei Tags, deren Werte als Pointer deniert sind. Bei der a Dereferenzierung der Pointer-Variablen eines Tags, steht das Dereferenzierungs-Zeichen vor dem Variablen Namen der Struktur. *data.p1=MAKE_ARRAY(100,100,/FLOAT) HELP,*data.p1 <PtrHeapVar26>

FLOAT

= Array[100, 100]

*data.p1=INDGEN(100,/FLOAT) HELP,*data.p1 <PtrHeapVar26>

FLOAT

= Array[100]

Solange ein Tag nicht mit einem anderem Wert belegt ist, enth lt der Pointer den String a UNDEFINED. So kann man leicht herausnden, ob ein Pointer mit einem anderem Wert belegt ist oder nicht. Hinweis: Der Pointer in der Struktur ist ein Platzhalter, um dynamisch Speicherbereiche anzulegen!

5.6. POINTER

43

5.6.9 Pointer auf eine Struktur und Pointer in der Struktur


Eine Struktur kann Pointer enthalten und die Struktur selbst kann auch ein Pointer sein. ud=UNDEFINED data=PTR_NEW(CREATE_STRUCT(NAME=S, $ p1,PTR_NEW(ud),p2,PTR_NEW(ud),p3,PTR_NEW(ud)))

HELP, data DATA HELP, *data PtrHeapVar4>

POINTER

= <PtrHeapVar8>

STRUCT

= -> S Array[1]

HELP, *data, /STR ** Structure S, 3 tags, length=12, data length=12: P1 POINTER <PtrHeapVar1> P2 POINTER <PtrHeapVar2> P3 POINTER <PtrHeapVar3> Mit der Dereferenzierung der Variablen data sieht man, da diese Variable eine Struktur enth lt. Mit der zus tzlichen Angabe des Keywords /STR werden die Tags der Struktur a a gelistet. Die Werte der Tags liegen als Pointer vor. HELP,*(*data).p1 <PtrHeapVar1> STRING = UNDEFINED HELP,(*(*data).p2) <PtrHeapVar2> STRING = UNDEFINED Die Dereferenzierung auf der Tag-Ebene mu durch zweifache Anwendung des Dereferenzierungs-Operators geschehen. Eine Unterscheidung auf die verschiedenen Pointer erreicht man durch die Klammerung der verschiedenen Variablen. Die beiden oben stehenden Schreibweisen sind aquivalent. Die zweite Schreibweise ist eine deutlichere Ver anschaulichung dieser Abh ngigkeiten. a

44

KAPITEL 5. DATENSTRUKTUREN

5.6.10 Pointer freigeben


Pointer freigeben und Heap Bereich l schen o a=PTR_NEW(5) PTR_FREE,a HELP,a A POINTER = <PtrHeapVar7> PRINT,PTR_VALID(a) 0 Der Heap-Bereich wird gel scht. Um das zu pr fen, benutzt man die Funktion o u PTR VALID. Der freigegebene Pointer wird zum Nullpointer. Hinweis: PTR VALID() listet alle Pointer Ein PTR FREE, PTR VALID() l scht dann alle Pointer in einem Befehl. o

5.6.11 HEAP GC Heap garbage collection


Der Zugriff auf einen Pointer kann schnell verloren sein. Wenn z.B. ein Pointer in einem Unterprogramm angelegt, aber nicht an das aufrufende Programm weitergegeben wird oder wenn eine Pointer-Variable auf einen anderen Wert gesetzt wird. Eine Variable k nnte mit o DELVAR bzw. TEMPORARY gel scht werden. o a=PTR_NEW(5) & a=0 Der Zugriff auf den Heap-Bereich ist dann nur noch durch garbage collection oder durch Verlassen von IDL m glich. o

HEAP GC ist der Befehl f r Heap garbage collection. u Freigeben von Heap Memory, der nicht mehr ansprechbar ist. HEAP GC durchsucht alle IDL Variablen nach Pointer und Objekt Referenzen und zerst rt die Heap Variablen, die nicht mehr ansprechbar sind. Die Pointer Heap o Variable (bzw. Objekt Heap Variable) wird zerst rt und der Speicherplatz, den sie o belegt, wird freigegeben.

Hinweis: Man sollte Anwendungen so schreiben, da man zuvor uberpr ft, ob man einen g ltigen u u Pointer bearbeitet (PTR VALID). Am Ende der Anwendungen sollte der Speicher mit den normalen Speicherfreigabe Routinen (PTR FREE) aufger umt werden. a

5.6. POINTER

45

5.6.12 Beispiel mit Pointern


Vorgegeben sind einige Datasets in Form von Strukturen Diese und einige Datasets, die dynamisch zur Laufzeit erstellt werden, sollen zusammengef gt werden in ein u Pointer Array eine verkettete Pointer Liste (indem man einen Pointer Tag auf den n chsten Datena satz in der Struktur zuf gt) u dataset1 =

dataset2 =

dataset3 =

dataset4 = dataset3

time data attr

: INDGEN(100,/FLOAT), $ : TAN(INDGEN(100,/FLOAT)/20.0) , $ : tangens

time data attr

: INDGEN(100,/FLOAT), $ : SIN(INDGEN(100,/FLOAT)/20.0) , $ : 1000L

time data attr

: INDGEN(150,/FLOAT), $ : COS(INDGEN(150,/FLOAT)/10.0) , $ : cosinus

46

KAPITEL 5. DATENSTRUKTUREN

Es gibt zwei L sungen Die L sungen werden exemplarisch skizziert. o o Pointer Array Pointer auf Strukturen zuweisen IDL nahe L sung siehe ptrvec.pro o

arr_ptr= PTRARR(3, /ALLOCATE_HEAP) *arr_ptr[0] = dataset1 *arr_ptr[1] = dataset2 *arr_ptr[2] = dataset3 data_ptr = PTR_NEW(dataset4) arr_ptr = [arr_ptr, data_ptr] ; Verketten ; Pointer Array erweitern Link List Verkn pfen, indem man einen Pointer in die Struktur schreibt. Dieser zeigt auf den u n chsten usw. a Man braucht sich nur den ersten Pointer zu merken. C nahe L sung siehe ptrlink.pro o dataset1 = time : INDGEN(150,/FLOAT), $ data : COS(INDGEN(150,/FLOAT)/10), $ attr : cosinus, $ data_ptr: PTR_NEW() ptr1 = PTR_NEW(dataset1) dataset2 = ... ptr2 = PTR_NEW(dataset2) ; Defreferenzieren bei (*ptr1).data_ptr=ptr2 ; Strukturen mit * .... actualptr = ptr1

5.6. POINTER

47

5.6.13 Ubungen
Die L sungen zu den Ubungen ndet man im Anhang auf Seite 201. o 1. Erstelle eine Struktur mit einer Farbzuordnung der ersten 9 Farben von TEK COLOR, siehe Online Hilfe. Diese Struktur soll mit der Start-Up-Datei initialisiert werden. Optional soll sie auf der System Variablen F deniert werden. 2. Vorgegeben sind: data=[[0.000000,0.841471,0.909297,0.141120,$ -0.756802,-0.958924,-0.279415,0.656987,$ 0.989358,0.412118],$ [0.000000,1.00000,2.00000,3.00000,$ 4.00000,6.00000,5.00000,7.00000,$ 8.00000,9.00000]] Aus dem String-Array sollen zwei Vektoren gebildet werden. Die erste Datenzeile soll als Float, die zweite Datenzeile soll als Integer wiedergegeben werden. 3. Zwei Datenfelder sollen verkn pft werden u a=MAKE_ARRAY(10,/INDEX,/FLOAT) b=MAKE_ARRAY(2,value=-40.0)

Verkn pfung in der Reihenfolge a,b u Nach dem f nften Element von a soll der Vektor b eingef gt werden. u u

4. Bilde einen Vektor von Jahreszahlen von 1990 bis 2010, ohne arithmetische Operationen zu verwenden. 5. Speichere mindestens 3 Systemvariablen in einer Struktur. 6. Erstelle ein Pointer-Array mit den Variablen: a=Dies ist ein Beispiel b=SYSTIME(1) c={Farbe:rot} 7. Gegeben sind: a=MAKE_ARRAY(20,2) b=MAKE_ARRAY(/INDEX,20,2) Verkn pfe a und b, so da ein Feld der Gr e [40,2] entsteht. u o Verkn pfe a und b, so da ein Feld der Gr e [20,4] entsteht. u o

8. Bilde die nachfolgenden Felder 1-dimensional ab. a=MAKE_ARRAY(10,10,3) b=MAKE_ARRAY(1,10) 9. Bei dem vorgegebenen Feld sollen die Daten transponiert werden (Spiegelung entlang der Diagonalen). a=MAKE_ARRAY(/INDEX,10,2)

48

KAPITEL 5. DATENSTRUKTUREN

Kapitel 6 Arbeiten mit Datenstrukturen


6.1 IDL Operatoren
Daten werden durch Operatoren verkn pft. u

Klammern (): bei Funktionsargumentlisten, Spezizierung der Ordnung bei Ausf hrung u Alle IDL Operatoren k nnen auf mehrdimensionale Felder angewendet werden: o arr=arr-100 arr=arr+(2*!PI) Boolsche Ausdr cke u AND, OR, NOT, XOR Vergleichsoperatoren EQ, NE, LE, LT, GE, GT Beispiel: A=7 PRINT, A GT 3, A EQ 7 1 1 Mathematische Operatoren =, +, - , *, /, (caret, Exponentiation), MOD (Divisionsrest) Matrixmultiplikation # (Spalte der ersten Matrix mit Zeile der zweiten Matrix) ## (echte Matrixmultiplikation! Zeilen der ersten Matrix mit Spalten der zweiten Matrix) Minimum und Maximum Operator: Verwendung bei Bildern, Kontrast! Beispiel: x=[5,10,20] > [6,9,30] & PRINT,x ergibt: 6 10 30

49

50

KAPITEL 6. ARBEITEN MIT DATENSTRUKTUREN

6.2 Wertzuweisung bei Variablen


Wertzuweisungen werden mit dem mathematischen Operator = vorgenommen. value=16/5 value=16/5. vektor=[1,3,5] array=INTARR(100,100) array=array+1 array=1. Integer-Division, value=3 3.2 Vektor mit drei Elementen Integer-Feld mit 100*100 Werten mit dem Wert 0. Jedes Element wird um 1 erh ht. o Achtung: Integer Feld der vorigen Anweisung bzgl. Typ und Bedeutung dynamisch ver ndert! array ist a ein Skalar mit dem Typ FLOAT.

6.2.1 Wertzuweisung bei mehrdimensionalen Feldern


Bei der Zuweisung mehrdimensionaler Felder wird die letzte Dimension entfernt, wenn diese 1 ist. Beispiel: a=INDGEN(10,10,10,/LONG) b=a[*,*,5] HELP,b B

LONG

= Array[10, 10]

c=REFORM(b,10,10,1) HELP,c C LONG d=c HELP,d D

= Array[10, 10, 1]

LONG

= Array[10, 10]

Hinweis: Mit REFORM kann man die letzte Dimension mit 1 erzwingen. Jedoch wird diese bei einer weiteren Wertzuweisung gel scht. o

a=INDGEN(10,10,10,/LONG) b=REFORM(a,1000) HELP,b B

LONG

= Array[1000]

Hinweis: Mit REFORM kann man mehrdimensionalen Arrays in einen Vektor andern.

6.3. WARNUNG VOR INTEGER-OVERFLOW

51

6.3 Warnung vor Integer-Overow


Beim Arbeiten mit Variablen mu man den Wertebereich der Zahlen ber cksichtigen. Ein u Problem wird im nachfolgendem Beispiel beschrieben. b=5000 PRINT,10*b Das Ergebnis ist eine negative Zahl! b=5000L PRINT, 10*b Wenn b als Long Integer deniert wird, ist das Ergebnis richtig. Hinweis: Prozessor f ngt Integer-Overow nicht ab (liegt nicht an IDL!) a

6.4 Speicherplatzverwaltung
Bei der Arbeit mit groen Datenmengen, die gerade noch in das RAM des Rechners passen, werden in IDL die Operationen langsam. Bez glich des Speicherplatzes ist folgendes zu u beachten: A=A+1 Speicherplatz doppelt notwendig, weil ein neues Feld f r u das Ergebnis der Addition angelegt wird. Wenn man statt A=A+1 im obigen Beispiel die TEMPORARY-Funktion verwendet, erfordert dies keinen zus tzlichen Speicherplatz. Man arbeitet mit einer a tempor ren Kopie, w hrend die Variable selbst undened a a gesetzt wird.

A=TEMPORARY(A)+1

52

KAPITEL 6. ARBEITEN MIT DATENSTRUKTUREN

6.5 L schen von Variablen o


Eine Variable bleibt solange g ltig, bis sie neu deniert oder mit DELVAR oder u TEMPORARY gel scht wird. o Hinweis: Einschr nkung: DELVAR funktioniert nur im MAIN! Die Erkl rung zu MAINa a Programmen folgt auf Seite 139. Eine allgemeine L sung l t sich mit der TEMPORARY-Funktion oder einer Wertzuweio a sung realisieren. Beispiel: a=MAKE_ARRAY(2000,/LONG) dummy=TEMPORARY(a) dummy=0 HELP,dummy DUMMY INT = 0 HELP,a A UNDEFINED = <Undefined> a ist undened und dummy enth lt alle Werte von a. Wenn dummy dann auf den Wert 0 a gesetzt wird, hat dummy nur noch diesen einen Wert.

6.6. EFFIZIENTES ARBEITEN MIT FELDERN

53

6.6 Efzientes Arbeiten mit Feldern


6.6.1 Vorteil von Feld-Operationen
IDL ist eine Array-orientierte Sprache. Operationen auf Felder sind erheblich schneller als Index-orientiertes Arbeiten. Daher sollte man die Programmierung von Schleifen vermeiden. FOR j=0,n-1 DO $ IF b[j] GT 0

THEN a[j]=a[j] + b[j]

schneller: a = a + ( b GT 0 ) *b noch schneller: a = a + ( b 0)

negative Werte maskieren! GT Operator, weniger Feld-Operationen

Zum Vergleich der Laufzeiten wurden die oben stehenden Beispiele in IDL-Code umgesetzt. Mit der IDL-Routine SYSTIME wird die Laufzeit gemessen.
PRO feld_op n = 100000L a = FLTARR(n) b = FLTARR(n) - n/2.0 t1 = SYSTIME(1) FOR j=0L, n-1 DO $ IF b[j] GT 0 THEN a[j] = a[j] + b[j] t1 = SYSTIME(1)-t1 PRINT, for=, t1, FORMAT=(a,f10.8) t2 = SYSTIME(1) a = a + ( b GT 0 ) * b t2 = SYSTIME(1)-t2 PRINT, gt =, t2, FORMAT=(a,f10.8) t1 = SYSTIME(1) a = a + ( b > 0 ) t1 = SYSTIME(1)-t1 PRINT, > =, t1, FORMAT=(a,f10.8) END Beispiel 6.1: Datenstrukturen: Vorteil von Feld-Operationen

; 0.325 sec

; 0.045 sec

; 0.023 sec

54

KAPITEL 6. ARBEITEN MIT DATENSTRUKTUREN

6.6.2 Geschickte Klammerung


data=MAKE_ARRAY(50,20,/FLOAT) data ist ein Array

new = data * SIN(1.12) / COS(3.0) Schlecht, da f r jedes Element von data der Quotient gebildet werden mu. u

new = data * (SIN(1.12) / COS(3.0)) Gut, da nur einmal der Quotient gebildet werden mu. Der Quotient wird mit jedem Element von data multipliziert.

6.7 Einstellung von Compiler Optionen


Durch Compiler Optionen werden Voreinstellungen f r den Compiler getroffen. u COMPILE_OPT STRICTARR, DEFINT32

STRICTARR erlaubt nur eckige Klammern bei Arrays. DEFINT32 nimmt Integer Konstanten defaultm ig als 32 Bit statt als 16 Bit. IDL a hat als Default 16 Bit.

6.8. FILTERN VON DATEN

55

6.8 Filtern von Daten


Zum Filtern von Daten gibt es eine Vielzahl von Funktionen. Alle diese Funktionen geben ein Feld mit Indices zur ck. u

6.8.1 WHERE-Funktion
Mit WHERE werden Daten in Abh ngigkeit einer Bedingung geltert. Als Ergebnis erh lt a a man die Indices der Daten, die die Bedingung erf llen. u arr=INDGEN(15,/BYTE) ind = WHERE( arr LE 10b AND arr GE 5b ) arr[ind] =255b PRINT,arr 0 1 oder k rzer! u

4 255 255 255 255 255 255

11

12

13

14

arr[WHERE( arr LE 10b AND arr GE 5b)] = 255b PRINT,arr 0 1

4 255 255 255 255 255 255

11

12

13

14

Hinweis: WHERE ist eine sehr m chtige Funktion, die auch bei der Bildverarbeitung wichtig ist! a Wichtig ist das Argument COUNT, womit man pr fen kann, ob Indices gefunden wurden, u siehe Beispiel bei Bildverarbeitung, Seite 118.

6.8.2 Verwendung der Funktionen MIN, MAX, SORT und UNIQ


Die Funktionen MIN, MAX, SORT und UNIQ sind weitere Funktionen, um Daten zu ltern.

6.8.2.1 SORT
Die SORT-Funktion gibt einen Vektor mit Indices zur ck. Diesen Vektor kann man dazu u verwenden, um ein Feld in aufsteigender Reihenfolge zu sortieren. vec=[9,7,1,10,0] idx=SORT(vec) PRINT,idx 4 2 1 0 3 PRINT,vec[idx] 0 1 7 9 10

56

KAPITEL 6. ARBEITEN MIT DATENSTRUKTUREN

Jeder Typ von Daten kann sortiert werden, z.B auch Strings. vec=[b,ab,abc,ba,aaa] idx=SORT(vec) PRINT,vec[idx] aaa ab abc b ba

6.8.2.2 MIN und MAX


Die MIN-Funktion ermittelt den kleinsten Wert eines Feldes. Entsprechend ermittelt die MAX Funktion den gr ten Wert. o Mittels der benannten Variablen der MIN- und MAX-Funktion MIN SUBSCRIPT und MAX SUBSCRIPT kann man die Indices des Minimums oder Maximums eines Feldes bestimmen. vec=[9,7,1,10,0] mi=MIN(vec,MIN_SUBSCRIPT) PRINT, mi 0 PRINT,MIN_SUBSCRIPT 4 Das Minimum hat den Wert 0 und den Index 4. vec=[9,7,1,10,0] ma=MAX(vec,MAX_SUBSCRIPT) PRINT, ma 10 PRINT,MAX_SUBSCRIPT 3 Das Maximum hat den Wert 10 und den Index 3.

6.8.2.3 UNIQ
Die UNIQ-Funktion ermittelt die Indices von Werten eines Feldes. Mehrfach vorkommende Werte werden nur einmal ber cksichtigt. Dies kann an einem Beispiel einfach erkl rt u a werden. vec=[Jan,Feb,Feb,Mar] idx=UNIQ(vec) PRINT,idx 0 2 PRINT,vec[idx] Jan Feb Mar

6.9. UBUNGEN

57

6.9 Ubungen
Die L sungen zu den Ubungen ndet man im Anhang auf Seite 203. o 1. Erstelle einen Vektor mit Integer-Zahlen von 2000 bis 2010 2. Feld als Index f r andere Felder u a = [ 7 , 8 , 1 , 2 , 5 , 5 ] b = [ 0 , 5 , 3 , 4 ] was ergibt: PRINT, a[b] 3. Addiere folgende Strings zu einem neuen String str str1=Idl ist str2= eine starke Sprache 4. Bilde alle alphabetischen Zeichen in einem STRING-Vektor ab. Das Ergebnis soll ein String-Vektor der L nge 26 mit der Anordnung: Aa Bb bis Zz sein. a 5. Gegeben sind zwei Vektoren. a=[-1,-1,-1,-999,-999,-1,-1,-999,-1] b=[-999,-999,-999,-999,-1] Bestimme die Indices der Werte -999 bei den beiden Vektoren und ersetze diese durch den Wert +999. 6. Nachfolgendes Feld soll sortiert werden. Danach sollen alle doppelt vorkommenden Werte durch einen Wert ersetzt werden. a=[1,1,1,2,1,2] 7. Ein Array der Dimension [10,2] soll in ein Struktur-Array gespeichert werden. Die Struktur hat 2 Tags: x und y mit dem Typ FLOAT. Das Struktur-Array hat die Dimension 10. x soll den ersten Vektor enthalten und y den zweiten Vektor. Danach sollen alle Werte bei y kleiner 5 in eine andere Struktur umgespeichert werden. data=[[0.000000,0.841471,0.909297,0.141120,$ -0.756802,-0.958924,-0.279415,0.656987,$ 0.989358,0.412118],$ [0.000000,1.00000,2.00000,3.00000,$ 4.00000,6.00000,5.00000,7.00000,$ 8.00000,9.00000]]

58

KAPITEL 6. ARBEITEN MIT DATENSTRUKTUREN

Kapitel 7 Einbettung ins Betriebssytem


7.1 Umgebungs-Variablen
Um beim Start von IDL bestimmte Einstellungen zu denieren, verwendet man die vom Betriebssytem zur Verf gung gestellten Umgebungs-Variablen. Mit GETENV liest man u Umgebungs-Variablen und mit SETENV schreibt man in Umgebungs-Variablen.

7.1.1 Umgebungs-Variablen des Betriebssystems


IDL PATH IDL DIR LM LICENSE FILE IDL STARTUP aquivalent zu !PATH (IDL Libraries) aquivalent zu !DIR (IDL Directory) Pfad f r Lizenzle u Startup File = Batch-Datei, wird beim Aufruf von IDL durchlaufen Username unter Unix Username unter Windows

USER USERNAME

Hinweis: Die Abfrage des Usernamens kann dazu verwendet werden, um Daten in Benutzer spezische Verzeichnisse zu speichern.

59

60

KAPITEL 7. EINBETTUNG INS BETRIEBSSYTEM

7.2 Wechsel zum Betriebssystem (Unix, Windows)


Mit den im folgenden beschriebenen Befehlen kann man von IDL aus zum Betriebssystem wechseln oder Informationen abfragen. Mit vorangestelltem $ kann man ein Unix Kommando von der IDL-Command-Line ausf hren. u $ ls oder $ pwd Im Command-Line Interface zu IDL kann man den SPAWN Befehl verwenden, um in das Betriebssystem zu wechseln. Eine Shell wird als child process gestartet. Es k nnen o dann Befehle abgesetzt werden. Mit dem Befehl EXIT gelangt man zur ck zu IDL. u Der SPAWN Befehl kann auch in einem IDL Programm aufgerufen werden. Bei dieser Art der Anwendung gibt man das auszuf hrende Kommando und eine Variable als Argument u an die SPAWN Funktion weiter. Das Ergebnis wird in dieser Variable zur ckgegeben. u Beispiel: SPAWN ,command[,result] SPAWN,ls,result PRINT,result

Kapitel 8 Hilfe, Sicherung


8.1 Die Hilfe-Routine von IDL
Um Variablen oder Eigenschaften der IDL Sitzung abfragen zu k nnen, verwendet man o das HELP Kommando. HELP HELP, data HELP, NAMES=A* HELP, /ROUTINES HELP, /FILES HELP, /DEVICE HELP, /RECALL COMMANDS HELP, /SYSTEM VARIABLES HELP, OUTPUT=result Info uber Variablen und kompilierte Funktionen Info uber Variable mit Namen data Info uber Variablen, die mit A anfangen Liste der kompilierten Funktionen Info uber Dateien Info uber das aktuelle graphische Device letzte 20 Kommandos (oder Taste) Info uber Systemvariable liefert String-Array result, mit allen bis zu dem Zeitpunkt gesetzten Variablen. Information kann weiter verarbeitet werden! genutzter Hauptspeicher bereits kompilierte Routinen werden gelistet

HELP, /MEMORY HELP, /SOURCE

61

62

KAPITEL 8. HILFE, SICHERUNG

8.2 Save und Restore einer IDL-Sitzung, IDL- Binary


Mit SAVE kann man Daten in IDL Sitzungen sichern. Das Datenformat ist unabh ngig von a Plattform und Version. SAVE [,var1,var2,...varn] ;Variablen sind optional Keywords: FILENAME=savename.dat Speichern oder Lesen unter dem angegebenem Namen ALL alle lokalen Variablen, System-Variablen, Common Bl cke o Achtung: Versions Probleme System-Variable andern sich schon mal von Version zu Version. VARIABLES Sinnvoller als das Keyword ALL ist es, alle Variablen zu sichern. ROUTINES alle ubersetzten Programme der aktuellen IDL-Sitzung in Bin rform. Die a Ausf hrung bin rer Programme ist schneller! Die Nutzung von Runtime Lizenzen u a ist auf Seite 14 beschrieben. SYSTEM VARIABLES Vorsicht: Bei Versions-Wechsel kann sich Struktur andern XDR (entspricht Standard: Unix + Windows) wichtig f r plattformunabh ngiges Programmieren u a COMPRESS ZLIB Kompression Hinweis: Gibt man keinen File-Namen an, lautet der Default Save- bzw. Restore-Name: idlsave.dat.

8.2. SAVE UND RESTORE EINER IDL-SITZUNG, IDL- BINARY Beispiel: Alle Variablen sichern SAVE,/VARIABLES,FILENAME=daten.dat ; reset IDL .RESET_SESSION ; Restore der gesicherten Daten RESTORE, FILENAME=daten.dat Beispiel: zwei Variablen sichern a=1 b=10.0 SAVE,a,b,FILENAME=daten.dat .RESET_SESSION ; Restore der gesicherten Sitzung RESTORE, FILENAME=daten.dat

63

64

KAPITEL 8. HILFE, SICHERUNG

Kapitel 9 Denitionen zur Datenausgabe


9.1 Koordinatensysteme
Es gibt drei denierte Koordinatensysteme (Normal-, Daten- und Device-Koordinaten). Diese sind mit den Keywords: /NORMAL, /DATA und /DEVICE, zuordbar. DATA Die Datenkoordinaten sind die Default-Koordinaten. Die Benutzerdaten werden als Datenwerte interpretiert. Im normalisierten Koordinatensystem k nnen Werte zwischen (0,0) o und (1,1) angegeben werden. Die Verwendung von normalisierten Koordinaten wird f r die relative u Positionierung ben tigt. o Beim DEVICE-Koordinatensystem handelt es sich um die physikalische Koordinaten des graphischen Ger tes. Diese werden graphisch orientiert a in Pixeln angegeben. Das Minimum ist (0,0) und das Maximum ist begrenzt durch die maximale Anzahl Pixel des graphischen Ausgabeger tes. Die System-Variablen: !D.X SIZE, !D.Y SIZE enthalten die a jeweils maximale Anzahl Pixel. Abh ngigkeit: Bildschirm bzw. Drucker a

NORMAL

DEVICE

Hinweis: Alle Koordinatensysteme sind gleichzeitig vorhanden.

65

66

KAPITEL 9. DEFINITIONEN ZUR DATENAUSGABE

9.2 Zeichens tze a


F r die Ausgabe von Zeichenketten gibt es Steuerzeichen, mit denen die Darstellung u z.B. mathematischer Zeichen erfolgt. Ein anderer Typ von Steuerzeichen gestattet die Positionierung nachfolgender Zeichen (Subscripts, Superscripts). Die Steuerzeichen werden in den Text eingef gt und beginnen mit !. Zur Darstellung des u ! als Textzeichen wird !! im Text eingef gt. u Auswahl eines Fonts Weitere Informationen hierzu im Users Guide: Tabellen aller Fonts Steuerzeichen !3 !4 !12 !9 oder !M !X Bechreibung Simplex Roman (Default) Griechisch Simplex Script Mathematisch Kehre zum urspr nglichen Font zur ck u u

Tabelle 9.1: Denitionen zur Datenausgabe: Auswahl eines Fonts

Positionieren von Zeichen Steuerzeichen !C !E !I !N !D !U !! !A !B Beschreibung F gt einen Zeilenumbruch ein. u Die folgenden Zeichen werden auf Exponentenh he geschrieben und o um den Faktor 0.44 verkleinert. Die folgenden Zeichen werden auf Indexh he geschrieben und um o den Faktor 0.44 verkleinert. Auf Normalh he und urspr ngliche Zeichengr e zur ckstellen. o u o u Die folgenden Zeichen werden tiefgestellt und um den Faktor 0.62 verkleinert. Die folgenden Zeichen werden hochgestellt und um den Faktor 0.62 verkleinert Darstellen des Symbols ! Die folgenden Zeichen werden oberhalb des Bruchstrichs plaziert Die folgenden Zeichen werden unterhalb des Bruchstrichs plaziert

Tabelle 9.2: Denitionen zur Datenausgabe: Positionieren von Zeichen

9.2. ZEICHENSATZE

67

9.2.1 Auswahl eines Fonts


IDL kennt drei Typen von Fonts: Vektor-, Truetype- und Hardware-Fonts. Vektor-Fonts (Hershey) XYOUTS,400,300,!12Simplex !4 Greek!X,/DEVICE Mit !Fontindex bekommt man die Hershey-Fonts. Mit einem erneuten !Fontin dex mit einer anderen Fontnummer bewirkt man einen Fontwechsel. !X nimmt den Font zur ck. Einige Formatierungsangaben wie Indices oder Subscripts sind u m glich, siehe vorstehende Tabelle. o Hardware Fonts Keyword Font=0 oder System-Variable!P.Font=0 Auswahl auch uber Keywords bei DEVICE m glich o z.B. DEVICE,/TIMES result=XFONT() Ober che, mit der man interaktiv alle X-Fonts ansehen und ausprobieren kann. a PS SHOW FONTS Eine PostScript Datei idl.ps wird erstellt. Dabei wird jeder Font auf einer Seite gelistet. Zus tzlich werden die Namen aller PostScript-Fonts, die IDL kennt, gelistet. a Beispiele: str1=Zeile1!CZeile2 XYOUTS, 0.1, 0.2,str1, /NORMAL, CHARSIZE=2.5 Resultat:

str2=A!EB !N* C!ID XYOUTS, 0.1, 0.4, str2, /NORMAL, CHARSIZE=2.5 Resultat:

str3=!4abcde !9abcde !Xabcde XYOUTS, 0.1, 0.2, str3, /NORMAL, CHARSIZE=2.5 Resultat:

Griechische, mathematische und normale Schrift

68

KAPITEL 9. DEFINITIONEN ZUR DATENAUSGABE

9.3 Farbtabellen
Zur Ausgabe farbiger Bilder werden Farbtabellen ben tigt. Es gibt eine Reihe vordeniero ter Farbtabellen, die auf dem RGB-Modell basieren. Die Generierung eigener Farbtabellen ist m glich. o

9.3.1 Laden von Farbtabellen


DEVICE,DECOMPOSED=0 LOADCT,5 XLOADCT XPALETTE TEK COLOR Um True Color Darstellungen in Direct Color umzudenieren Laden einer vordenierten Farbtabelle mit Index 5 (STD GAMMA II) Widget, das alle vordenierten Farbtabellen anzeigt Widget, das die Farb-Palette darstellt. Die Farb-Palette ist modizierbar. Die ersten 32 Farben der angezeigten Farbpalette sind in jedem Falle f r das Auge unterschiedlich und damit als u Index f r unterschiedliche Farben f r verschiedene Plotu u kurven zu gebrauchen. Lesen einer Farbtabelle. liefert die Vektoren r,g,b der L nge 256 (bei 8 Bit Fara ben und DEVICE, DECOMPOSED=0) mit den aktuellen Werten der geladenden Farbtabelle. Schreiben einer Farbtabelle Die Vektoren r,g,b, die je 256 Byte-Werte enthalten, repr sentieren die neue Farbtabelle a Speichern der Farbtabelle colors.tbl ($HOME) Die Standardtabelle liegt unter: /usr/local/idl/idl/resources/colors

TVLCT,r,g,b,/GET

TVLCT,r,g,b

MODIFYCT

Beispiel mit TEK COLOR TEK_COLOR c = INDGEN(256,/BYTE) d = BYTARR(20)+1b TV, c#d

Abbildung 9.1: Denitionen zur Darstellung: Beispiel mit TEK COLOR

Die Verkn pfung c#d generiert ein Array der Gr e [256, 20], welches in der eru o sten Spalte die Zahl 0, in der zweiten Spalte 1 usw. bis 255 enth lt. Da die Funktion a TEK COLOR aufgerufen wurde, sind die ersten 32 Farben in jedem Falle unterschiedlich.

9.3. FARBTABELLEN

69

9.3.2 Arbeiten mit Farben


Folgende Hinweise sind zum Arbeiten mit Farben wichtig.

RGB bezeichnet die Rot-Gr n-Blau Farbtabelle. Jeder Anteil einer Farbe liegt u zwischen 0 und 255. z.B. Farbe Rot = 255, 0, 0 True Color Display DEVICE,DECOMPOSED=0 Begrenzung der Anzahl von Farben PRINT, !D.TABLE SIZE HELP, /DEVICE funktioniert nur in Start-Up Datei WINDOW, COLORS = 128 WINDOW, COLORS = -8 nutze alle Farben - davon 8 f r Shared Color Map u

70

KAPITEL 9. DEFINITIONEN ZUR DATENAUSGABE

9.4 Steuerung der Ausgabe und Ausgabeger te a


Es werden verschiedene Ausgabeger te zum Darstellen von Bildern unterst tzt. Die a u Bildschirmausgabe erfolgt unter einem Unix-System im X-Device, unter Windows im WIN-Device. Eine vollst ndige Liste aller Devices ndet man in der Online-Hilfe unter a dem Stichwort Supported Devices. Eine druckbare Ausgabe kann als PostScript-Datei angelegt werden. Zu dem Zweck w hlt a man das Device PostScript. Alle genannten Devices (X, WIN, PS) werden mit dem Befehl SET PLOT angesteuert. Normalerweise wird ein Bild pro Seite dargestellt und zwar unabh ngig von der Art a des gew hlten Devices. Zur Darstellung mehrerer Bilder auf einer Seite gibt es mehrere a M glichkeiten, die im folgenden Kapitel, siehe Seite 71, beschrieben werden. o

9.4.1 Ausgabe

SET PLOT, Optionen: Mit SET PLOT wird das Ausgabeger t festgelegt. a CGM Computer Graphic Metale HP HP- GL LJ IDL unter VMS LJ250, LJ252 DEC Drucker PCL HP-PCL PS Postscript Sun Sun Console Tek Tektronix Terminal X X Window System Win PC Mac Mac DEVICE, Optionen: Nach der Auswahl des Ausgabeger tes mit dem SET PLOT kann man mit dem a DEVICE-Befehl weitere Einstellungen vornehmen. FILENAME LANDSCAPE oder PORTRAIT XOFFSET, YOFFSET, XSIZE, YSIZE FONTS COLOR ENCAPSULATED Die Option sollte verwendet werden, wenn die PostScript-Datei in ein Dokument eingebunden werden soll. CLOSE Die Ausgabe auf das Ausgabeger t wird beendet. Bei Ausgabe in eine a PostScript-Datei wird diese abgespeichert. Information uber die Eigenschaften des Devices HELP, /DEVICE

9.4. STEUERUNG DER AUSGABE UND AUSGABEGERATE

71

9.4.2 Ausgabe mehrerer Bilder


Bei Bildschirmausgabe (X, WIN) wird mit dem ERASE-Befehl die Ausgabe des aktuellen Fensters gel scht. Bei Postscript (PS) bedeutet der ERASE-Befehl einen Seiten Vorschub o (einf gen eines showage). u Die Bildschirmausgabe kann in mehreren Fenstern erfolgen, siehe Seite 74.

9.4.3 Positionieren von Bildern


F r die Positionierung von Bildern gibt es mehrere M glichkeiten: u o Die Zeichen che wird in gleichgroe Teile aufgeteilt (!P.MULTI) a Eine Positionsangabe selektiv beim jeweiligen Ausgabebefehl (PLOT, CONTOUR, SURFACE,...). Die Positionsangabe gilt dann nur f r diesen einen Befehl. u global durch eine Systemvariable !P.POSITION Die Positionsangabe gilt dann f r jede Ausgabe. u Images werden mit dem TV-Befehl dargestellt, siehe Seite 119. Beim TV-Befehl gibt es einen Index, der fortlaufend von 0,1,2.. hochgez hlt wird. Die Bilder werden a dann von links nach rechts und von oben nach unten in den denierten Ausgabebereich geschrieben. Zus tzlich gibt es eine Positionsangabe mit zwei Parametern, die die Position f r a u den Startpunkt des Bildes angeben. Die Positionierung von Bildern ist auf Seite 120 beschrieben.

72

KAPITEL 9. DEFINITIONEN ZUR DATENAUSGABE

9.4.3.1 Aufteilung der Zeichen che in gleich groe Teile a


Durch Denition der Systemvariablen !P.MULTI ist es m glich, eine Bild che in gleich o a groe Abschnitte aufzuteilen.

!P.MULTI[0] 0=n chster Plot beginnt auf neuer Seite a !P.MULTI[1] Anzahl Plots nebeneinander (Spalten) !P.MULTI[2] Anzahl Plots untereinander (Zeilen)

!P.MULTI=[0,2,2] Vier Plots auf einer Seite. Reset auf Default: !P.MULTI=0

Abbildung 9.2: Denitionen zur Datenausgabe: !P.MULTI

Hinweis: bei PLOT, CONTOUR, SURFACE,.... Jeder dieser Befehle l scht die Zeichen che vor der Ausgabe und geht damit automatisch o a in das n chste Plotfeld. a

9.4. STEUERUNG DER AUSGABE UND AUSGABEGERATE

73

9.4.3.2 Keyword POSITION und System-Variable !P.POSITION


Eine beliebige Aufteilung der Zeichen che deniert man entweder mit der Systemvariaa blen !P.POSITION oder uber das POSITION Keyword. Ein Setzen der System-Variablen !P.POSITION bleibt bis zu einer erneuten Denition bzw. Reset g ltig! u !P.POSITION=[0.1,0.1,0.5,0.5] ; normalisierte Koordinaten ; Bereich im linken unteren Viertel PLOT,x,y !P.POSITION=0 ; reset

PLOT,x,y,POSITION=[0.1,0.1,0.5,0.5] Hinweis: POSITION als Keyword-Variable gilt nur f r den Befehl! u

Abbildung 9.3: Denitionen zur Datenanalyse: Keyword POSITION

Hinweis: Mehrere Bilder pro Seite (PLOT, CONTOUR, SURFACE) durch Ausschalten des L schens o der Zeichen che mit dem Keyword /NOERASE. a Weitere Informationen zum Positionieren von Bildern siehe Seite 120

74

KAPITEL 9. DEFINITIONEN ZUR DATENAUSGABE

9.4.4 Bildschirm Ausgabe


Die Bildschirm Ausgabe erfolgt in Fenstern. Die Gr e eines Fensters (window) und die o Position wird in DEVICE Koordinaten angegeben. Hinweis: Bei einer Bildschirmau sung von 1280x1024 Punkten ist (0,0) links unten und o (1279,1023) rechts oben. Ein Ausgabe-Fenster wird mit der WINDOW-Routine erstellt. Die Standardgr e eines o Ausgabe-Fensters betr gt 640x512 Pixel. a WINDOW, 3 Ein Window bekommt die Nummer 3; maximal 128 graphische Windows mit den Nummern (0 .. 127) sind m glich. Die Nummern 0-31 sind anw hlbar. Die Numo a mern ab 32 sind f r WIDGET DRAW reserviert. u Window mit der n chsten freien Nummer a WINDOW, /FREE Mit Keyword FREE bekommt man die n chste unbenutzte Windownummer ab 32. a Gr e und Position des Windows o WINDOW, 0, XSIZE= 300, YSIZE = 400 WINDOW, 0, XPOS = 200, YPOS = 300 Spezizieren einer Uberschrift f r das Fenster u WINDOW, 0, TITLE = Surface

Erstellen eines Windows im Speicher (nicht sichtbar) WINDOW, 0, /PIXMAP, XSIZE = 500, YSIZE = 500 Das Window wird wie jedes andere Window behandelt. PIXMAP bezeichnet einen Zwischenspeicher, der vom Display Manager verwaltet wird. Reparieren von Window-Uberlagerungen Der Backing store kann im Startup-File gesetzt werden, siehe Seite 14 DEVICE, RETAIN = 2 Verwaltung von Windows Setzen des aktuellen graphischen Windows WSET, 4 Window mit der Nummer 4 aktivieren. Es kann jeweils nur ein Window aktiv sein. IF !D.WINDOW NE 4 THEN WSET, 4 !D.WINDOW: Index des aktuellen Windows Window mit der Nummer 5 in den Vordergrund bzw. in den Hintergrund stellen WSHOW, 5 ; Vordergrund WSHOW, 5, 0 ; Hintergrund WSHOW, 5, /ICONIC ; iconify L schen des Windows mit der Nummer 5. o WDELETE, 5 L schen aller Windows o WHILE (!D.WINDOW GE 0) WDELETE,!D.WINDOW

9.4. STEUERUNG DER AUSGABE UND AUSGABEGERATE

75

9.4.5 Benutzung des Z-Buffers


Durch Verwendung des Z-Buffers k nnen komplexe 3D Darstellungen deniert werden. o Verdeckte Linien und Fl chen werden nicht angezeigt. Der Z-Buffer ist in IDL als Graphia sches Device implementiert. Man benutzt den SET PLOT Befehl, um das graphische Device auf den Z-Buffer zu wechseln. SET_PLOT,z SET_PLOT,x Mit SET PLOT,z wird der Z-Buffer eingeschaltet, mit SET PLOT,x schaltet man auf die Bildschirm-Darstellung um (Unix: X-Display, Windows: win, Mac: mac) Die Eigenschaften des Z-Buffers werden mit dem DEVICE-Befehl gesteuert.

Setzen der Au sung mit SET RESOLUTION o DEVICE, SET_RESOLUTION=[500,300] Setzen der Farbe mit SET COLORS col = !D.TABLE_SIZE SET_PLOT,z DEVICE, SET_COLORS=col Schlieen des Devices mit CLOSE DEVICE, /CLOSE

76

KAPITEL 9. DEFINITIONEN ZUR DATENAUSGABE

9.4.6 Beispiel: Z-Buffer, SURFACE und CONTOUR


Mit der Routine SHADE SURF wird ein 2D Datensatz (peak) als schattierte Ober che a dargestellt. Das Keyword /SAVE stellt sicher, da die 3D Transformationsmatrix gespeichert wird. Die Ober che kann dann mit CONTOUR unter Verwendung der 3D Transfora mationsmatrix (/T3D) gezeichnet werden. Mit dem TVRD()-Kommando wird das Bild aus dem Z-Buffer in die Variable new kopiert. Nachdem das Ausgabeger t mit SET PLOT a auf den Bildschirm gewechselt wurde, kann das kopierte Bild mit dem TV Kommando dargestellt werden.
PRO z buf peak = EXP(-(SHIFT(DIST(40), 25, 15)/15)2) olddev=!D.NAME SET_PLOT, z DEVICE, SET_RESOLUTION=[400,400],SET_COLORS=!D.TABLE_SIZE !P.BACKGROUND=255B !P.COLOR=0B SHADE_SURF, peak, /SAVE CONTOUR, peak, /T3D, ZVALUE=0.66, NLEVELS=10, /NOERASE new = TVRD() SET_PLOT,olddev WINDOW, XSIZE=400, YSIZE=400, /FREE TV, new END Beispiel 9.1: Denitionen zur Datenausgabe: Z-Buffer

Abbildung 9.4: Denitionen zur Datenausgabe: Z-Buffer

9.4. STEUERUNG DER AUSGABE UND AUSGABEGERATE

77

9.4.7 PostScript Ausgabe - Drucken


IDL Kommandos werden f r das jeweilige mit SET PLOT aktivierte Ausgabeger t abgeu a arbeitet. Standardm ig ist dies die Ausgabe im Fenster. a Ist das Ausgabeger t auf PS gesetzt, werden alle IDL Kommandos f r dieses Ausgabeger t a u a abgearbeitet. In dem Beispiel wird eine PostScript-Datei erstellt.
old_device = !D.NAME SET_PLOT,ps ; Hardcopy auf PS setzen DEVICE, FILENAME=new_plot.ps ; Optionen als Kommentarzeilen ; XOFFSET=2, ; YOFFSET=1.5, ; XSIZE=18, ; YSIZE=29, ; /COLOR DEVICE,/ISOLATIN1 ; Umlaute my_data = SIN(MAKE_ARRAY(10,/INDEX)) plot, my_data, TITLE=Test-Ausgabe XYOUTS,0.1,0.1,Umlaute: ae,oe,ue + $ STRING(228b)+STRING(246b)+STRING(252b),/DEVICE DEVICE, /CLOSE ; close PostScript-Ausgabe SET_PLOT, old_device ; Ausgabe wird auf old_device gesetzt Beispiel 9.2: Denitionen zur Datenausgabe: PostScript-Ausgabe

Drucken Die PostScript-Datei kann auf einem PostScript-Drucker gedruckt werden, z.B. mit lpr lpr -Ptia00c4 new plot.ps Hinweis: Wird im DEVICE kein FILENAME angegeben, lautet der Ausgabe Dateiname idl.ps.

Man kann Programme so schreiben, da mittels eines Keywords gesteuert wird, ob die Ausgabe auf dem Bildschirm oder in eine Datei geschrieben werden soll. Im nachfolgenden Beispiel wird dies durch das Keyword /PSFLAG erreicht. Die PostScript-Datei wird mit dem Keyword ENCAPSULATED=1 erstellt und ist eine EPS-Datei mit Bounding Box. Diese ist in ein Dokument einbettbar (ohne showpage).

78

KAPITEL 9. DEFINITIONEN ZUR DATENAUSGABE

Beispiel: testct2.pro (verwendet legendfr.pro,ct fr.pro)


PRO testct2,psflag=psflag ;psflag=0 : Bildschirmausgabe ;psflag=1 : Ausgabe auf PostScript-File idl.eps olddevice=!D.NAME ;************************************************************** !P.FONT=-1 & !P.CHARSIZE=1 IF KEYWORD_SET(psflag) THEN BEGIN SET_PLOT, ps & !P.FONT=0 & !P.CHARSIZE=2 psfile=idl.eps DEVICE,FILENAME=psfile,ENCAPSULATED=1, PREVIEW=0,$ /COLOR, YOFFSET=27, YSIZE=16,XOFFSET=2,XSIZE=25,$ /LANDSCAPE ENDIF ;*****************Setzen der Farbpalette************************ ct_fr & !P.BACKGROUND=0 & !P.COLOR=!D.TABLE_SIZE-1 ;*****************Erzeugung eines Datenfeldes******************* n=100. f=DOUBLE(100./(n-1.)*100./(n-1.)) x=FLTARR(n,n) FOR i=0,n-1 DO FOR j=0,n-1 DO x[i,j]=DOUBLE(i)*DOUBLE(j)*f ;*********************************Konturplot durchfuehren******* lev=[0,10,50,100,500,1000,2000,5000] colors =INDGEN(/FLOAT,N_ELEMENTS(lev))/ $ FIX(N_ELEMENTS(lev)-1)*(!D.TABLE_SIZE-2) CONTOUR,x,LEVEL=lev,C_COLORS=colors,$ POSITION=[0.15,0.2,0.8,0.9],/FILL legendfr,lev,/fill,colors=colors ;************************************************************** IF KEYWORD_SET(psflag) THEN BEGIN whoami,dir,filename XYOUTS,0.9, 0.00,SYSTIME(0),CHARSIZE=0.5,/NORMAL XYOUTS,0.9,-0.02,filename,CHARSIZE=0.5,/NORMAL XYOUTS,0.9,-0.04,psfile,CHARSIZE=0.5,/NORMAL DEVICE,/CLOSE ENDIF SET_PLOT,olddevice !P.FONT=-1 & !P.CHARSIZE=1 !P.BACKGROUND=!D.TABLE_SIZE & !P.COLOR=0 IF KEYWORD_SET(psflag) THEN PRINT,$ Ende - PostScript idl.eps erstellt END Beispiel 9.3: Denitionen zur Darstellung: optionale Postscriptdatei

9.4. STEUERUNG DER AUSGABE UND AUSGABEGERATE Aufruf: testct2,[/psag] (optional PostScript)

79

100 80 60 40 20 0 0 0 10 50 100 500 1000 2000 5000

20

40

60

80

100
Thu Sep 4 16:30:27 1997 testct2.pro idl.eps

Abbildung 9.5: Denitionen zur Datenausgabe: Beispiel mit Legende

Das Beispiel enth lt folgendes: a Eigene Farbtabelle (mit TVLCT) Bild auf weiem Hintergrund Legende mit Namen des Programms, des PostScript Files und Datum wird erstellt

9.4.8 Ubungen
Die L sungen zu den Ubungen ndet man im Anhang auf Seite 205. o 1. Schreibe die Denition einer Farbtabelle als RGB Werte. Weise diese Farbtabelle dem Grakdevice zu. Es sollen die Farben Rot, Gr n und Blau angelegt werden. u Uberpr fe die Farbdenition mit einem Farbbalken. Ein einzelner Farbton soll 15 u Pixel breit sein. 2. IDL hat vordenierte Farbtabellen. W hle die Farbtabelle 6 aus. An deren Ende (256. a Farbe) soll denitiv die Farbe Wei sein. Andere die Farbdenition nach dem Laden so ab, da der letzte Wert Wei ist. Uberp fe das Ergebnis mit einem Farbbalken. u 3. Gib den Satz: Heute lernen wir IDL! auf dem Drucker aus!

80

KAPITEL 9. DEFINITIONEN ZUR DATENAUSGABE

Kapitel 10 Programme zur Anwendungs-Darstellung


10.1 Uberblick
In den folgenden Kapiteln werden die Routinen zu unterschiedlichen Darstellungsarten beschrieben. Es gibt Routinen zur Darstellung von XY Plots, Ober chen, H henlinien, a o Bildverarbeitung, Kartenprojektion usw. Keyword-Parameter und System-Variablen erm glichen dem Benutzer, durch bestimmte o Spezikationen das Aussehen der Graphik zu kontrollieren, wie z.B. Skalierung, Farbe, Beschriftung, Achseneinteilung und vieles mehr. Falls keine Angaben erfolgen, verwendet IDL eine Standardeinstellung. Die optionalen Keyword-Parameter, siehe Seite 82, werden von allen Darstellungs-Routinen benutzt. Beispielsweise wird mit dem XRANGE-Keyword der Wertebereich f r die X-Achse festgelegt, z.B. XRANGE=[5,101]. u Im nachfolgenden Abschnitt wird eine Auswahl dieser Parameter vorgestellt. In den Aufz hlungen wird auf eine Verwendung in den nachfolgenden Beispielen hingewiesen. a Dort ndet man weitere Hinweise.

81

82

KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

10.1.1 Achsen
Das Layout von Achsen l t sich mit nachfolgenden Keyword-Parametern steuern. Die a Spezikationen k nnen f r jede Achse gew hlt werden. Die Notation [XYZ]RANGE beo u a deutet, da die Option RANGE f r die X-, Y- und Z-Achse verf gbar ist und mit den u u jeweiligen Keywords XRANGE, YRANGE und ZRANGE angesprochen wird. Anzahl Major-Tick-Intervalle Anzahl Minor Tick Intervalle Tickl nge a Label eines Ticks Format der Beschriftung Werte f r Ticks u Bereich der Werte Aussehen Achsen Titel der Achsen Schriftgr e der Beschriftung o Logarithmische Achsen Denition von Achsen beliebige neue Achse mit Beschriftung und Skalierung [XYZ]TICKS [XYZ]MINOR [XYZ]TICKLEN [XYZ]TICKNAME [XYZ]TICKFORMAT [XYZ]TICKV [XYZ]RANGE [XYZ]STYLE [XYZ]TITLE [XYZ]CHARSIZE [XYZ]LOG [XYZ]AXIS AXIS Beispiel auf Seite 95

Beispiel auf Seite 85 Beispiel auf Seite 87 Beispiel auf Seite 92 Beispiel auf Seite 90 Beispiel auf Seite 87 Beispiel auf Seite 87

Tabelle 10.1: Programme zur Darstellung: Keywords zur Achsneanpaung

10.1. UBERBLICK

83

10.1.2 Steuerungen zur Zeichen che a


Generell mu man wissen, da bei Aufruf bestimmter Routinen, wie PLOT, CONTOUR oder SURFACE, das Bild im Fenster gel scht wird und ein neues Bild gezeichnet wird. o Will man aber in das gleiche Bild noch etwas zeichnen, mu man das bei dem nachfolgendem Kommando, siehe Tabelle, ber cksichtigen. u Bei den Bild-Darstellungs-Routinen TV und TVSCL wird das Bild vor dem Zeichnen nicht gel scht. Um die Zeichen che zu l schen, wendet man vor dem TV bzw. TVSCL das o a o ERASE Kommando an. NODATA Keine Daten zeichnen. Das Koordinatensystem wird angelegt und die Achsen werden gezeichnet. Das vorherige Bild wird nicht gel scht. o Uberzeichnen Bewirkt, ahnlich wie NOERASE, da das vorherige Bild nicht gel scht wird. o Beispiel auf Seite 85, 88, 101

NOERASE OVERPLOT

Beispiel auf Seite 100, 105, 106, 101, 103 Beispiel auf Seite 100, 106

Tabelle 10.2: Programme zur Darstellung: Steuerungen zur Zeichen che a

Mit dem Keyword TITLE erh lt man eine Beschriftung des Gesamtbildes, siehe Seite 95. a

10.1.3 Routinen zum Beschriften oder Markieren


H ug verwendet man noch eine Beschriftung im Bild oder farbige Linien oder Fl chen, a a um auf besonders wichtige Details hinzuweisen. Daf r stehen die Befehle XYOUTS, u PLOTS und POLYFILL zur Verf gung. Diese Befehle sind in allen Darstellungs-Routinen u verwendbar. XYOUTS PLOTS POLYFILL stellt Text an eine Position zum Zeichnen einer Linie zum Zeichnen einer gef llten Fl che u a Beispiel auf Seite 89,89,95 Beispiel auf Seite 88, 107 Beispiel auf Seite 88

Tabelle 10.3: Programme zur Darstellung: Routinen zum Beschriften oder Markieren

84

KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

10.2 XY-Darstellungen mit PLOT


10.2.1 Ausgabe von Daten als Linien-Plots
Erst durch die Ausgabe werden Daten lesbar. Die Darstellung mittels Linien-Plot ist die gebr uchlichste f r Vektoren. a u

10.2.2 Plot bei einem Argument


x=FINDGEN(37)*10 y=SIN(x*!DTOR) PLOT,y Die X-Achse erh lt die Werte 0 bis 360. Als Ordinatenwerte wird Y aufgetragen. a 0 bis 360 in 10er Schritten Systemvariable !DTOR=Konversionsfaktor (Grad- in Bogenma)

10.2.3 Plot mit zweitem Argument (dependent data)


PLOT,x,y X-Achse jetzt 0 bis 360.

IDL legt die X-Achse von 0 bis 400 an. Eine exakte Begrenzung ist m glich, siehe Seite o 87. Hinweis: PLOT l scht Zeichen che vor der Ausgabe! o a Das heit, da jeder PLOT-Befehl in ein neues Fenster zeichnet. Verwendet man das Keyword /NOERASE in Verbindung mit PLOT (auch AXIS, CONTOUR, SURFACE) wird das Bild bei Ausf hrung des PLOT nicht gel scht. u o

10.2. XY-DARSTELLUNGEN MIT PLOT

85

10.2.4 Plot von Datenreihen


In dem Beispiel sollen die Achsen des Plots in der Farbe Schwarz und die Daten in anderen Farben und Linientypen dargestellt werden. Das Vorgehen ist dann wie folgt. Verwendet man PLOT mit dem Keyword /NODATA werden keine Daten geplottet, es wird lediglich das Koordinatensystem des Plotfensters mit Beschriftung angelegt. Mit OPLOT k nnen dann alle Kurven in das denierte Fenster gezeichnet werden. o Variation der Linienart, Linienfarbe etc., ohne die Farbe der Achsen zu andern.
TEK_COLOR kurve1 = FINDGEN(10) kurve2 = FINDGEN(10)+5 kurve3 = kurve1 * 3 kurve4 = kurve2 * 3 allpts = [[kurve1],[kurve2],[kurve3],[kurve4]] N = SIZE(allpts,/DIM) ; Dimesnionierung der Elemente x=INDGEN(10,/FLOAT) PLOT,allpts,YRANGE=[MIN(allpts),MAX(allpts)], $ XRANGE=[MIN(x),MAX(x)],/NODATA OPLOT,x,kurve1,LINE=0,COLOR=0 OPLOT,x,kurve2,LINE=1,COLOR=4 OPLOT,x,kurve3,LINE=2,COLOR=2 OPLOT,x,kurve4,LINE=3,COLOR=3 Beispiel 10.1: Programme zur Darstellung: Plot von Datenreihen

86

KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

10.2.5 Beispiele mit PLOT


PLOT hat uber 50 Keywordparameter, einige sind im nachfolgendem mit Beispielen auf gef hrt. Viele der Keywords gelten auch f r alle anderen Darstellungs-Routinen. u u LOADCT,5 Mit LOADCT kann eine vordenierten Farbtabelle geladen werden. Stattdessen kann auch TEK COLOR aufgerufen werden, siehe Seite 68. Linienarten und Symbole mit PSYM PLOT,x,y,LINESTYLE=3,PSYM=-1

1,...7 0 -1,-2,... 8 -8 10

nur Symbole nur Linie, Default! Symbole mit Linien Benutzer- denierte Symbole m glich mit USERSYM o Benutzer- denierte Symbole mit Linie Histogramm Modus

Abbildung 10.1: Programme zur Darstellung: XY Plot

Farbe mit COLOR PLOT,x,y,COLOR=45,BACKGROUND=100 Weitere Kurven in einem Bild mit OPLOT y1=y/EXP(x/60.) OPLOT,x,y1,THICK=2 Kurvendicke mit dem Keyword THICK (zweifacher Default-Wert) Layout: [XYZ]TICKS: (Anzahl Major- Tick- Intervalle) [XYZ]MINOR: (Anzahl Minor- Tick- Intervalle) [XYZ]TICKLEN (Gitter!) Die Notation [XYZ]TICKS bedeutet, da die Keywords XTICKS, YTICKS, ZTICKS verwendet werden k nnen. o

10.2. XY-DARSTELLUNGEN MIT PLOT


87

Arbeiten mit Achsen Die Notation [XYZ]STYLE bedeutet, da die Keywords XSTYLE, YSTYLE und ZSTYLE verwendet werden k nnen. o Die STYLE-Option ist bitweise kodiert PLOT,x,y,XSTYLE=(1+8) Exakte Begrenzung (=1) und keine X-Box Achsen (=8) PLOT,X,Y,YSTYLE=8 rechts keine Y-Box Achse Mehrfache Achsen AXIS,/YAXIS,YRANGE=[0,5],/SAVE,COLOR=180 Y-Achse rechts bzw. links /YAXIS aquivalent zu YAXIS=1 (rechts), YAXIS=0 (links) Y-Achse mit neuem Koordinatensystem mit YRANGE Neue Denition eines Koordinatensystems, d.h. Anderung des mit PLOT aufgestellten Koordinatensystems /SAVE Achse an eine beliebige Position Die Y- Achse kann an beliebige Position geschrieben werden Folgende Schreibweisen sind aquivalent: AXIS,100,0,/YAXIS oder AXIS,100,0,YAXIS=1 OPLOT im neuen Koordinatensystem OPLOT,x,8*y1,LINESTYLE=2,COLOR=160

Beispiel: mehrfache Achsen

Abbildung 10.2: Programme zur Darstellung: mehrere Y-Achsen

88

KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG Linien oder Punkte mit PLOTS PLOT,INDGEN(200,/FLOAT),YRANGE=[0.,1.],/NODATA xvec=[60,140,140,60,60] yvec=[0.35,0.35,0.5,0.5,0.35] PLOTS,xvec,yvec,COLOR=100 PLOTS zeichnet eine Box Fullen mit Farbe POLYFILL,xvec,yvec,COLOR=100 Keywords zur Beschriftung TITLE, [XYZ]TITLE, CHARSIZE, [XYZ]CHARSIZE Beschriftung des Plots bzw. der verschiedenen Achsen und entsprechender Fontgr e o Explizite Labels f r Tickmarks u [XYZ]TICKNAME Feld mit Zeichen [XYZ]TICKFORMAT Format der Beschriftung der Ticks Keywords f r logarithmische Achsen u [XYZ]LOG Keyword: CLIPPING CLIP =[X0,Y0,X1,Y1] Das Keyword CLIPPING bewirkt ein Abschneiden an den Werten mit Minmum (x0,y0) und dem Maximum (x1,y1).

10.2. XY-DARSTELLUNGEN MIT PLOT


89

Zus tzlichen Text an XY Plot mit XYOUTS a XYOUTS,150.,0.7,Text,CHARS=3

Abbildung 10.3: Programme zur Darstellung: PLOT und zus tzlicher Text a

Default: als Datenkoordinaten PLOT,x,y XYOUTS mit normalisierten Koordinaten [0,1] XYOUTS,0.5,0.5,Mitte des Bildes,/NORM,ALIGN=0.5 Das Standard X-Window ist 640x512 Pixel gro. Die Ausgabe erfolgt in DeviceKoordinaten. XYOUTS,10,10,links unten,/DEVICE

Abbildung 10.4: Programme zur Darstellung: Beschriftung in der Mitte des Bildes

90

KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

10.2.6 Plot mit logarithmischer Achseneinteilung


Eine logarithmische Einteilung der Achsen bei der PLOT-Funktion erh lt man mit dem a Keyword XLOG f r die X-Achse und mit dem Keyword YLOG f r die Y-Achse. Das Beiu u spiel zeigt linear-logarithmische Achsen. x=INDGEN(200,/FLOAT) y=SIN(x/20)2 PLOT,x,x/5,YRANGE=[0.01,200],/YLOG

Abbildung 10.5: Programme zur Darstellung: Logarithmischer PLOT

10.2.7 Balkendiagramme
Das BAR PLOT-Programm zeichnet einfache Balken in den angegebenen H hen. o BAR PLOT, [ 2, 5, 1, 3, 6, 4 ]

10.2. XY-DARSTELLUNGEN MIT PLOT

91

10.2.8 Fehlerbalken
F r das Beispiel werden 10 Zufallszahlen generiert. u data=RANDOMU(SEED,10) x=INDGEN(10,/FLOAT)+0.5 PLOTERR,x,data,data-0.2 Die Daten werden mit Fehlerbalken dargestellt. Die Fehlerbalken zeigen einen symmetrischen Fehler.

Abbildung 10.6: Programme zur Darstellung: Fehlerbalken

10.2.9 Polarplot
r=INDGEN(100,/FLOAT) theta=r/5. PLOT, r, theta, SUBTITLE=Polar Plot, XSTYLE=4, YSTYLE=4, /POLAR AXIS, XAX=0,0 AXIS, YAX=0,0

Abbildung 10.7: Programme zur Darstellung: Polarplot

92

KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

10.2.10 Scatter-Plot mit Zufallszahlen


Die Daten f r die PLOT-Funktion m ssen nicht streng aufsteigend sortiert sein, sie k nnen u u o auch willk rlich verteilt vorliegen. Als weiteres Beispiele wird ein Scatter-Plot vorgestellt. u Damit man sieht, da die Punkte willk rlich verteilt vorliegen, wurden die Symbole mit u Zahlen markiert. x=RANDOMU(SEED,10) y=RANDOMU(SEED,10) yrange=[MIN(y,MAX=mx),mx+0.1] xrange=[MIN(x,MAX=mx)-0.1,mx+0.1] PLOT,x,y,PSYM=2,YRANGE=yrange,XRANGE=xrange,$ XTITLE=random x,YTITLE=random y,TITLE=Scattered Data XYOUTS,x,y+0.03,STRTRIM(INDGEN(10),2),ALIGN=0.5

Abbildung 10.8: Programme zur Darstellung: Scatter-Plot mit Zufallszahlen

10.2. XY-DARSTELLUNGEN MIT PLOT

93

10.2.11 Plot mit Text in unterschiedlichen Farben


Das Programm zeichnet einen Text, der aus vier Worten besteht, in jeweils unterschiedlichen Farben. Der Text wird auf dem Vektor text abgelegt. Damit die Worte des Textes bei dem XYOUTS-Kommandos nicht alle ab der Startpostion ubereinander gezeichnet werden, mu man ab dem zweiten Wort f r alle Worte des Textes soviele Leerzeichen erzeugen, u wie der bereits vorstehende Text lang ist. Die Leerzeichen werden mit MAKE ARRAY angelegt. Das Beispiel setzt voraus, da ein monospaced-Font verwendet wird. Wenn man beim Aufruf des Programms das Keyword PS angibt, wird eine PostScriptDatei erstellt. TEK COLOR l dt eine Farbtabelle, siehe Beispiel auf Seite 68. a
PRO colored_text,ps=ps !P.COLOR=0 !P.BACKGROUND=!D.TABLE_SIZE-1 IF KEYWORD_SET(ps) THEN BEGIN old_name=!D.NAME SET_PLOT,PS DEVICE,FILE=colored_text.ps, /COLOR, BITS=8, /ISOLATIN1 !P.FONT=-1 ENDIF TEK_COLOR text=[Dies,ist,ein,Test] length=STRLEN(text) FOR i=1,3 DO BEGIN blanks=STRING(MAKE_ARRAY(TOTAL(length[0:(i-1)])+1, $ VALUE=32b)) text[i]=blanks+text[i] ENDFOR ERASE XYOUTS,0.5,0.5,text,COLOR=[0,5,2,3,4],CHARSIZE=3, /NORM,ALIGN=0.,CHARTHICK=10 IF KEYWORD_SET(PS) THEN BEGIN DEVICE,/CLOSE SET_PLOT,old_name ENDIF END Beispiel 10.2: Programme zur Darstellung: XYOUTS in unterschiedlichen Farben

Abbildung 10.9: Programme zur Darstellung: XYOUTS in unterschiedlichen Farben

94

KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

10.3 Fl chen- und H henlinien- Darstellungen a o


Mehrdimensionale Datens tze enthalten mehr Informationen als Vektoren. Die Daten a liegen auf einem regul ren oder irregul ren Gitter vor. Zu jedem Punkt ist dann noch a a eine dritte Information, die H he bekannt, die auf der Z-Achse dargestellt werden kann. o Daten, k nnen z.B. als Netzlinien mit SURFACE oder als H henlinienplot mit CONTOUR o o dargestellt werden, wenn sie auf einem regul ren Gitter vorliegen. a Wenn die Daten auf einem irregul ren Gitter vorliegen, k nnen sie auf ein regul res Gitter a o a umgerechnet werden. Dazu ndet man im Kapitel Gl tten von zuf lligen oder irregul ren a a a Daten auf Seite 107 ein Beispiel. Eine vierte Dimension, eine weitere Information zu den vorliegenden Daten, kann z.B. bei Netzlinien als Farbe dargestellt werden.

10.3.1 Netzlinien mit SURFACE


SURFACE hat uber 70 Keywordparameter unter anderem: UPPER ONLY, LOWER ONLY, BOTTOM (Farbe Unterseite), COLOR (Farbe Oberseite), BACKGROUND, SKIRT, ZAXIS. Hinweis: Keywords oft analog zu PLOT Beispieldatensatz: a=f(x,y):

Abbildung 10.10: Programme zur Darstellung: SURFACE


a=DIST(20) 2D-Float-Feld mit 20x20 Werten dient als Testdatensatz. SURFACE,a

10.3. FLACHEN- UND HOHENLINIEN- DARSTELLUNGEN

95

Werte von a als Gitter SURFACE,a,/HORIZONTAL Mit dem Keyword /HORIZONTAL nur horizontale Gitterlinien xgrid=INDGEN(20,/FLOAT)/10 ygrid=INDGEN(20,/FLOAT)+20 SURFACE,a,xgrid,ygrid X-Gitter von 0 bis 1.9, Y-Gitter von 20 bis 39 durch die Angabe der Parameter xgrid und ygrid. SURFACE,a,AZ=10,AX=60,$ ZTICKS=2,TITLE=Titel liegt in X-Z Ebene AX und AY sind Drehwinkel, (Default 30 ) Zus tzliche Ausgabe von Text mit XYOUTS. a XYOUTS,0.3,0.9, $ Parallel zu Schirm,/NORM,CHARS=2. SURFACE,a,/LEGO 3D- Balkengramm, Balken als Quader mit dem Keyword /LEGO. SURFACE,a,SHADES=BYTSCL(a) Farben: mit COLOR=... bzw. BOTTOM=... erh lt man jeweils ein einfarbiges a Bild. Mit dem SHADES=Farbraster wird ein selbst deniertes Farbraster als vierte Dimension auf die Netzlinien gelegt. BYTSCL transformiert Felder beliebigen Typs auf den Typ BYTE mit einem Wertebereich 0B bis 255B. PRINT, BYTSCL(a) BYTSCL: Streckung auf Wertebereich 0B bis 255B Besser: BYTSCL(a,TOP=!D.TABLE SIZE-1) skaliert bis zur max. Anzahl verf gbarer Farben. u

96

KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

Behandlung von missing values mit IDL Zur Veranschaulichung der Behandlung von missing values wird ein Beispieldatensatz konstruiert. Die Ausreierwerte -999 und 500 werden k nstlich erzeugt. u a=DIST(40) Denition a[8:15,3:5]=-999 Ausreierwerte erzeugen! Mit : auf Teilbereich zugreifen. Feldbereich auf -999 setzen a[4:6,8:10]=500 Ausreierwerte erzeugen! Feldbereich auf 500 setzen SURFACE,a sinnvolle Werte sind durch missing values nicht unter scheidbar. SURFACE,a,MAX VALUE=100,MIN VALUE=-100 Mit der Angabe von MAX VALUE und MIN VALUE sind die missing values verschwunden.

Abbildung 10.11: Programme zur Darstellung: Behandlung von missing value

Hinweis: Keywords MAX VALUE und MIN VALUE sind erlaubt bei: PLOT, CONTOUR, SHADE SURF, SURFACE

Gleicher Effekt mit !VALUES.F NAN Linie wird unterbrochen y = FINDGEN(100) idx = [ 10,11,12,13 ] y[idx] = !VALUES.F_NAN PLOT,y,PSYM=0

10.3. FLACHEN- UND HOHENLINIEN- DARSTELLUNGEN

97

10.3.2 H henlinien mit CONTOUR o


H ug wird diese Darstellungsform bei Landkarten, Wetterkarten usw. verwendet. a a = DIST(40) CONTOUR,a CONTOUR,a,NLEVELS=10,/FOLLOW,C CHARSIZE=2,/DOWNHILL Man beachte den Unterschied zu CHARSIZE=2.

Abbildung 10.12: Programme zur Darstellung: CONTOUR

Spezische Keywords fur CONTOUR FOLLOW=1 H henlinien-Verfahren mit Beschriftung o NLEVELS Anzahl H henlinien o LEVELS=[c1,c2,...] H henlinien bei c1,c2,... (NLEVELS=0) o /DOWNHILL Richtung durch Ticks ausgeben /OVERPLOT H henlinien ohne neuen Rahmen o /FILL gef llte Fl che, nicht bei Karten u a /CELL FILL Bei den Anwendungen missing data oder bei Kartenprojektionen ist dieses Keyword oft besser.

98

KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

C Keywords fur CONTOUR sind oft Vektoren. Die Vektoren werden zyklisch wiederholt, wenn die Anzahl der H henlinien gr er sind o o als die Anzahl der Vektorelemente. C LINESTYLE=INDGEN(4,/BYTE) Vier verschiedene Linientypen C THICK=[1,3] Zwei verschiedene Liniendicken C ANNOTATION=[low,medium,high],NLEVEL=3 Beschriftung der Label mit Text C COLOR=INDGEN(4,/BYTE)*50 Vier verschiedene Farben

Abbildung 10.13: Programme zur Darstellung: C Keywords bei CONTOUR

10.3.3 Schattierte Ober chendarstellung a


a=DIST(40) SHADE_SURF,a SHADE SURF,a,SHADES=BYTSCL(a) Statt einer Lichtquelle wird Feld BYTSCL(a) als Farbraster auf die Ober che a gelegt.

10.3. FLACHEN- UND HOHENLINIEN- DARSTELLUNGEN

99

10.3.4 Ober che mit beliebigem Datensatz uberlagern a

Abbildung 10.14: Programme zur Darstellung: SHADE SURF


a=DIST(40) b=RANDOMU (SEED , 40, 40) F r das Beispiel wird ein Testdatensatz konstruiert. RANDOMU generiert Zufallszahu len zwischen 0 und 1. SHADE_SURF,a,SHADES=BYTSCL(b,TOP=!D.TABLE_SIZE-1) Die Zufallszahlen werden als Farbmuster mit dem Keyword SHADES auf die Ober che gelegt. Dabei bedeutet BYTSCL, da die Zufallszahlen auf den Bereich des a Zahlentyps BYTE, also 0B bis 255B bzw. bis zur maximal darstellbaren Zahl verteilt werden. Die Darstellung bis zur maximal darstellbaren Zahl erfolgt dann, wenn wie im Beispiel das Keyword TOP mit der maximal darstellbaren Zahl verwendet wird.

Hinweis: SURFACE und SHADE SURF sind Routinen zur automatischen Generierung einer 3D Transformationsmatrix.

100

KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

10.3.5 H henlinien-Plot im 3D-Raum o

a=DIST(40) SHADE SURF,a,/SAVE /SAVE speichert die 3D Transformationsmatrix CONTOUR, a, NLEVELS=10, /T3D, ZVALUE=1.0, /NOERASE Das Keyword /T3D bedeutet, da die gespeicherte Transformationsmatrix f r plau naren CONTOUR-Plot bei ZVALUE=1.0 benutzt wird.

Abbildung 10.15: Programme zur Darstellung: CONTOUR im 3D Raum

oder

Abbildung 10.16: Programme zur Darstellung: Probleme ohne Z-Buffer

SHADE SURF,a,/SAVE Das Ergebnis ist nicht zufriedenstellend! Man sollte besser mit dem Z-Buffer, siehe Seite 75, arbeiten. CONTOUR,a,NLEVELS=10,THICK=2,/T3D,/OVERPLOT

10.4. 3D TRANSFORMATIONEN

101

10.4 3D Transformationen
Es gibt mehrere IDL Funktionen, die lediglich eine Transformationsmatrix aufbauen, ohne etwas zu zeichnen. Dazu geh ren: SURFACE, SURFR, SCALE3, T3D, SCALE3D, jeweils o mit dem Keyword /NODATA. Mit Hilfe der Transformationsmatrix kann man alle IDL Darstellungs-Funktionen im Raum benutzen.

10.4.1 3D Transformationsmatrix mit SURFACE


Mit Hilfe des SURFACE Kommandos wird eine 3D Transformationsmatrix erstellt. Diese wird verwendet, um einen zwei dimensionalen XY Plot in einem 3D Koordinatensystem zu plazieren. X=INDGEN(200,/FLOAT) Y=SIN(x/20)2 SURFACE,DIST(40),/NODATA,/SAVE SURFACE erstellt automatisch eine Transformationsmatrix, die durch /SAVE abgespeichert wird, siehe System-Variable !P. Mit HELP,!P,/STR bekommt man Informationen zur System-Variablen !P, die den Plot beschreibt. !P.T ist ein 4x4 Array, welches die Transformationsmatrix enth lt. a /NODATA zeichnet keine Daten PLOT,x,y,/T3D,ZVALUE=1.0,/NOERASE /T3D Anwendung der Transformationsmatrix !P.T planarer Plot bei Z=1.0 in normalisierten Koordinaten

Abbildung 10.17: Programme zur Darstellung: SURFACE 3D Transformationen

102

KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

10.4.2 3D Transformationsmatrix mit SURFR


Mit Hilfe des SURFR Kommandos wird eine 3D Transformationsmatrix erstellt. Diese wird verwendet, um einen zwei dimensionalen XY Plot in einem 3D Koordinatensystem zu plazieren. X=INDGEN(200,/FLOAT) Y=SIN(x/20)2 SURFR,AX=45 PLOT,x,y,/T3D,CHARSIZE=1.0 Der Befehl SURFR erstellt eine 3D Transformationsmatrix und speichert diese in !P.T. Die Ausgabe bei ZVALUE=0.0 ist der Default.

Abbildung 10.18: Programme zur darstellung: SURFR 3D Transformationen

10.4. 3D TRANSFORMATIONEN

103

10.4.3 3D Transformationsmatrix mit SCALE3 und T3D


Mit Hilfe des SCALE3 Kommandos wird eine 3D Transformationsmatrix erstellt. Diese Matrix wird verwendet, um einen zwei dimensionalen XY Plot in einem 3D Koordinatensystem zu plazieren. X=INDGEN(200,/FLOAT) Y=SIN(x/20)2 Y1=y/EXP(x/60.) SCALE3,XRANGE=[0,200],ZRANGE=[0,1],YRANGE=[0,1] Das SCALE3 arbeitet ahnlich SURFR, auer da eine Achsenbegrenzung festgelegt werden mu. Die Transformationsmatrix !P.T wird gesetzt. Eine Skalierung des Bildes wird durch Drehungen nicht ver ndert. Das kann man sich bei einer Serie von a Bildern (Film) zunutze machen. Es entsteht kein Ruckeln. PLOT,x,y,/T3D Das 3D- Koordinatensystem kann auch mit der Routine T3D ge ndert werden. a Mit Hilfe des T3D Kommandos wird eine 3D Transformationsmatrix erstellt. Diese 3D Matrix wird verwendet, um einen zwei dimensionalen XY Plot in einem 3D Koordinatensystem zu plazieren. T3D, /YZEXCH ; -> !P.T Vertauschen der Y- und Z- Achse PLOT,x,y1,/T3D,/NOERASE,ZVALUE=1 (Keywords: /XYEXCH, /XZEXCH)

Abbildung 10.19: Programme zur Darstellung: SCALE3 3D Transformationen

Hinweis: POLYFILL und PLOTS kann auch im 3D verwendet werden, jeweils mit dem Keyword /T3D.

104

KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

10.5 Karten-Projektionen
Sowohl niedrig als auch hoch aufgel ste Karten-Projektionen sind m glich. Die hoch aufo o gel sten Karten stammen aus dem CIA-World-Datensatz. Man kann die Karten sowohl o alleine darstellen als auch mit anderen Darstellungen (z.B. Text zur Beschriftung von St dten, CONTOUR f r Wetterkarte, Bev lkerungsdichte usw.) kombinieren. Hierbei wird a u o die Transformationsmatrix der entsprechenden Karten-Projektion verwendet.

10.5.1 MAP SET


Mehr als 10 verschiedene Karten-Projektionen sind mit MAP SET verf gbar, darunter u folgende: zylindrische, Mercator, Molweide, Lambert, stereographische, Satelliten Projektionen MAP_SET,/MERCATOR ; erstelle Mercator Projektion MAP_GRID ; Gitter dazu MAP_CONTINENTS ; Kontinente dazu Eine k rzere Schreibweise ist m glich: u o MAP SET,/ORTHOGRAPHIC,/GRID,/LABEL,/CONT Das Zentrum ist bei 50 Breite und 10 L nge darstellbar. a MAP_SET,50,10,/ORTHO,/GRID,/LABEL,/CONT Ausschnitt bei [min[lat]],min[long],max[..],max[..]] MAP_SET,50,10,LIMIT=[30,-20,70,40],$ /ORTHO,/GRID,/LABEL,/CONT High Resolution Continent Outlines mit Keyword /HIRES CIA World Map Database MAP SET, /CONT, /HIRES MAP CONTINENTS, /HIRES Folgende Keywords sind m glich: o /COASTS /COUNTRIES /FILL CONTINENTS /RIVERS Hinweis: IDL Demo: Mapping Demo

10.5. KARTEN-PROJEKTIONEN

105

10.5.2 Kombination von Karte mit Bilddatei


Das Beispiel zeigt eine Uberlagerung einer Karte mit einer Bilddatei.

Einlesen der Daten: worldelv.dat OPENR,lun,FILEPATH(examples/data/worldelv.dat),$ /GET_LUN im=BYTARR(360,360) READU,lun,im FREE_LUN,lun Wichtig: Mitte der Daten mu auf Mitte der dargestellten Karte liegen TV,im im=SHIFT(im,180) ; SHIFT notwendig TV,im Uberlagern des Bildes auf die Karte mit MAP IMAGE MAP_SET,/ORTHO,/GRID,/LABEL,/CONT im=MAP_IMAGE(im,px,py,/BILIN,COMPRESS=1) Man trifft die Annahme, da Anfang des Bildes (Spalte 0) auf 180 zeigt. px, py sind Ausgabewerte und dienen zur Positionierung von im in der Karte. Eine bilineare Interpolation wird durchgef hrt, um Kanten zu gl tten. u a Das COMPRESS-Flag dient zur Kontrolle der Genauigkeit. TV,im,px,py MAP_SET,/ORTHO,/GRID,/LABEL,/CONT,/NOERASE XLOADCT Das Bild wird mit einem erneutem MAP SET uberlagert (/NOERASE), damit die Kontourlinien sichtbar werden.

Abbildung 10.20: Programme zur Darstellung: MAP SET

106

KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

10.5.3 Kombination von Karte und H henlinienplot o


Das Beispiel zeigt, wie man einen H henlinienplot auf eine Karte projiziert. o Denition von Vektoren f r L ngen- und Breitengraden u a

lons=(FINDGEN(180)*2) - 180.0 lats=FINDGEN(180) -90.0 im1=REBIN(im,180,180) ; verkleinern MAP_SET,50,10,/ORTHO,/CONT,/GRID CONTOUR,im1,lons,lats,NLEVELS=16,$ C_COLOR=BINDGEN(16)*15,/OVERPLOT MAP_SET,50,10,/ORTHO,/CONT,/GRID,/NOERASE

Abbildung 10.21: Programme zur Darstellung: CONTOUR und MAP SET

10.5.4 Beschriftung der Karte mit Text und Symbolen


Symbol mit PLOTS f r Breiten- und L ngengrade und Text mit XYOUTS u a Damit kann man eine Stadt oder ein Land markieren. Interaktives Lesen von Breiten- und L ngengraden a CURSOR,x,y

10.6. GLATTEN VON ZUFALLIGEN ODER IRREGULAREN DATEN

107

10.6 Gl tten von zuf lligen oder irregul ren Daten a a a


Irregul re Daten sind darstellbar, aber diese Darstellung sagt nichts aus. Daher verwendet a man eine Triangulation, um irregul re Daten auf ein regul res Gitter abzubilden. a a

Ein Testdatensatz mit 200 Zufallszahlen in der XY-Ebene wird erstellt. X=RANDOMU(SEED,200) Y=RANDOMU(SEED,200) z=EXP(-3*((x-0.5)2+(y-0.5)2)) Zeichnen der Punkte in der XY-Ebene (ungeordnet) PLOT,x,y,PSYM=1,SYMSIZE=2.0 Triangulation (Delauny) TRIANGULATE,x,y,tr HELP,tr Irregul re Daten werden trianguliert. Es werden Dreiecke berechnet, die f r eine a u Interpolation g nstig sind, (m glichst klein, nicht uberlappend). Siehe Online Help u o zu Triangulate. Dreiecke mit PLOTS (in der X-Y Ebene) darstellen. PLOT,X,Y,PSYM=1,SYMSIZE=2 FOR i=0,381 DO BEGIN index=[tr[*,i],tr[0,i]] PLOTS,x[index],y[index] ENDFOR Erstellung des regul ren Gitters (Interpolation) mit Gl ttung a a (interpolierte Z-Werte) grid=TRIGRID(x,y,z,tr,/QUINTIC) HELP,grid Standardm ig werden 51 Intervalle generiert. a SURFACE,grid

Abbildung 10.22: Programme zur Darstellung: TRIGRID

108

KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG Regul res Gitter mit feinerem Intervall a (optionales Argument zu TRIGRID) spacing=[0.01,0.01] grid=TRIGRID(x,y,z,tr,spacing) SHADE_SURF,grid

10.7 ISO Ober chen a


Es wird eine Fl che gezeichnet, in der alle Punkte den gleichen Wert haben. a Einfaches Beispiel generieren: vol_data=MAKE_ARRAY(50,50,50,VALUE=0B,/BYTE) vol_data[10:30,5:25,10:30]=100 vol_data[15:45,30:45,25:40]=200 3D Ober che f r einen bestimmten Wert, hier 80 a u Das Programm sucht Uberg nge von 0 auf 100 und von 0 auf 200. a /LOW ist die untere Seite der H henlinien. o SHADE VOLUME,vol data,80,v,p,/LOW Koordinatensystem aufspannen mit vom Benutzer denierten Daten (Dimension des Volumens), 3D Transformation wird erstellt SCALE3,XRANGE=[0,50],YRANGE=[0,50],ZRANGE=[0,50] Schattierte Darstellung der Ober che a WINDOW TV,POLYSHADE(v,p,/T3D) Render und Display der Polygone

Abbildung 10.23: Programme zur Darstellung: ISO Ober chen a

Hinweis: IDL Tool SLICER3 f r ISO-Ober chen u a

10.7. ISO OBERFLACHEN

109

10.7.1 Das SLICER3 Tool


Das SLICER3 Tool ist ein Werkzeug zum graphischen Bearbeiten eines Volumen Datensatzes. Beispiel: siehe Getting started with IDL aus der Online Help. CD,/usr/local/idl/idl/examples/data,CURRENT=olddir bindata=READ_BINARY(head.dat,data_dims=[80,100,57]) data=PTR_NEW(bindata,/NO_COPY) SLICER3,data PTR_FREE,data CD,olddir Der gelesene 3D-Datensatz besteht aus 57 Schnitten (Scans) der Gr e 80x100 Pixel. o Hinweis: Daten werden mit Pointer-Argument bekannt gemacht! Mit dem SLICER3-Tool kann man u.a. Schnitte durch die Ober che legen, wie das erste a Beispiel zeigt.

Abbildung 10.24: Programme zur Darstellung: SLICER3-Tool im SLICE-Modus

110

KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

Ein zweites Beispiel zeigt die gerenderte Ober che. Zu dieser Darstellung wurde ein a Threshold-Value eingegeben und die Ober che gerendert. a

Abbildung 10.25: Programme zur Darstellung: SLICER3-Tool im Surface-Modus

Hinweis: Das SLICER3-Programm kann auch in eigene Programme eingebaut werden. Informationen zur Benutzung des SLICER3-Programms erh lt man mit dem Abouta Icon im SLICER3-Men . u

10.8. ANIMATION VON DATEN

111

10.8 Animation von Daten


Anderungen an Daten k nnen mit einer Animation wie ein ablaufender Film dargestellt o werden. Animation durch erneutes Zeichnen zu jeder Zeit wird die Information nachgezeichnet IDL> demo unter: Visualization - Surface Objects - Style (Wire) - View (Animate) Benutzung der TV Prozedur Benutzung einer Pixmap IDL> demo unter: Medical - Beating Heart or Image Animation Earth Science - Flythroug Animation unter Benuztung eines Tools Das Programm XINTERANIMATE erlaubt die Darstellung von Bildern als Animation o durch die Verwendung des Compound Widgets CW ANIMATE. Damit ist es m glich, die Funktion von XINTERANIMATE in eigenen Programmen zu verwenden. XINTERANIMATE Aufruf von XINTERANIMATE mit unterschiedlichen Parametern zur Initialisierung, Laden und Ausf hrung. u XINTERANIMATE, SET=[ sizex, sizey, nframes ] XINTERANIMATE, FRAME=i, IMAGE=data XINTERANIMATE, 5

CW ANIMATE Aufruf von unterschiedlichen Routinen zur Initialisierung, Laden und Ausf hrung u cwbase = CW_ANIMATE( parent, sizex, sizey, nframe ) CW_ANIMATE_LOD, cwbase, FRAM=i, IMAGE=data CW_ANIMATE_RUN, cwbase, 5 Weitere Informationen zu Compound Widgets, siehe Seite 187.

112

KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

10.9 Arbeiten mit dem Cursor


Datenwerte k nnen mit dem Cursor aus einer Darstellung ausgelesen werden. o Nachfolgende Befehle sollten nur mit Fenstern (WINDOW) benutzt werden. Im Zusammhang mit Widgets sollte das nachfolgende nicht benutzt werden!

Einschalten des Crosshair Cursor TVCRS, 1 TVCRS, 0 Mit TVCRS,1 bekommt man einen Crosshair-Cursor, mit TVCRS,0 bekommt man einen Arrow-Cursor. Positionieren des Cursors TVCRS, 0.8, 0.5, /NORMAL Verstecken des Cursors TVCRS, /HIDE CURSOR Position des Cursors lesen CURSOR, x, y, /NORMAL PRINT, x, y Das Keyword /NORMAL bewirkt, da die Koordinaten im normalisierten Koordiatensystem zur ckgegeben werden. u Button Events abwarten CURSOR, x, y, /DEVICE, /DOWN /CHANGE /DOWN /UP /WAIT /NOWAIT Hinweis: Nicht in Zusammenhang mit dem XMANAGER benutzen. Besser ist es, das Keyword BUTTON EVENTS bei der WIDGET DRAW() Funktion und in einer Event-Handler Routine zu benutzen. Feststellen, welcher Knopf gedr ckt wurde u CURSOR, x, y, /NORMAL, /DOWN System-Variable !ERR !ERR = 0 kein Button !ERR = 1 linker Button !ERR = 2 mittlerer Button !ERR = 4 rechter Button System-Variable !MOUSE HELP,!MOUSE,/STR ** Structure !MOUSE, 4 tags, length=16: X LONG 0 Y LONG 0 BUTTON LONG 0 TIME LONG 0

10.10. ZUSAMMENFASSUNG DER DARSTELLUNGS-ROUTINEN

113

10.10 Zusammenfassung der Darstellungs-Routinen


10.10.1 allgemeine Routinen
ERASE PLOTS POLYFILL USERSYM XYOUTS AXIS L schen der Bild che o a Zeichnen von Linien und Punkten F llen beliebiger 2D bzw. 3D Polygone (Farbe, Muster) u Denition eines Symbols Text an bestimmte Stelle beliebige neue Achse mit Beschriftung und Skalierung

Tabelle 10.4: Programme zur Darstellung: Zusammenfassung allgemeiner Routinen

10.10.2 eindimensionale Plotroutinen


Plot Routine PLOT Beschreibung Neues Bild Plot mit neuer Achse Setzen der Skalierung (linear, logarithmisch) Mit den Keywords /XLOG und /YLOG sind lin./log. bzw. log./log. Achsen m glich o XY Plot, ohne Vorschub ohne Achse benutzt Skalierung von PLOT oder AXIS

OPLOT

10.10.3 mehrdimensionale Plotroutinen


CONTOUR SHADE SURF SURFACE H henlinen (2D) o Schattierter Surface Plot (3D und 4D) Gitterlinien Ober che (3D und 4D) a

Tabelle 10.5: Programme zur Darstellung: Zusammenfassung mehrdimensionaler Plotroutinen

114

KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

10.11 IDL-Anwendungen
Im folgenden werden IDL Anwendungen vorgestellt. Diese IDL-Programme k nnen f r eigene Applikationen benutzt und ver ndert wero u a den. SHOW3,DIST(40) SHOW3 macht eine kombinierte Darstellung 2D Array wird als Kombination von Image-, Surface- und Contour-Bild dargestellt

Abbildung 10.26: Programme zur Darstellung: SHOW3

XLOADCT XPALETTE DEMO XFONT

Widget zum Laden einer vordenierten Farbtabelle Widget zum Laden, Andern und Erstellen einer Farbtabelle IDL Demo Funktionen zum Ausw hlen eines Fonts, z.B. mit tmp= a XFONT() Beschriftung eines Bildes Widget f r SURFACE u Uberlagerung eines Image-Bildes mit einem Contour-Bild Vergr ern und Verkleinern o Widget zur Darstellung eines 3D-Datensatzes (Schnitte, Iso Ober chen). Das SLICER3-Tool wird auf Seite 109 vorgestellt. a Windows: Polygonales Mesh Clipping

ANNOTATE XSURFACE IMAGE CONT ZOOM SLICER3

DECIMATE

10.11. IDL-ANWENDUNGEN XVOLUME

115

Anzeige und intervakive Manipulation von 3D-Datens tzen und a ISO-Surfaces. XVAREDIT startet ein Widget zur Anzeige einer Variablen. Diese Variable kann z.B. ein Vektor, ein Array oder eine Struktur sein. Die Werte der Variablen k nnen in dem Widget editiert werden. o

XVAREDIT

10.11.1 Ubungen:
Die L sungen zu den Ubungen ndet man im Anhang auf Seite 206. o 1. Die Daten x,y sollen geplottet werden. ang = 2*!PI*INDGEN(360,/FLOAT)/359. x = COS(ang) y = SIN(ang) (a) (b) (c) (d) (e) ohne Achsen Achsen in Schwarz, Daten in Blau mit dem Kreuz als Symbol. Nur die positiven Y-Daten in Rot und die negativen in Blau zeichnen. Der Achsenursprung soll bei (0,0) liegen. Der Kreis soll als Kreis dargestellt werden. Der Durchmesser soll z.B. 10 cm betragen.

2.

(a) Zeichne gef llte H henlinien! Wie heit das Keyword? u o (b) Zeichne auf gef llte Fl chen H henlinien. u a o (c) Zeichne H henlinien f r die Werte 6,12.5, 18.7,24 mit jeweils einer andeo u reren Farbe.

3. Die Daten x,y und ang sollen dargestellt werden. (a) Werte sichtar. (b) mit CONTOUR (c) mit CONTOUR aber nur 10 Level gef llt. u (d) die Randlinie soll in verschiedenen Farben f r 10 gleichm ig verteilte Level u a gezeichnet werden. ang = 2*!PI*INDGEN(360,/FLOAT)/359. x = COS(ang) y = SIN(ang)

116

KAPITEL 10. PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG

Kapitel 11 Bildverarbeitung
Bilddaten k nnen mit IDL gelesen, analysiert und weiterverarbeitet werden. o

11.1 Lesen eines Bildes


Ein Bild wird in einer Matrix, einem 2D Feld, mit Datentyp BYTE abgespeichert, d.h jeder Pixelwert liegt zwischen 0 und 255.

Lesen der Datei galaxy.dat OPENR,lun,FILEPATH(examples/data/galaxy.dat),/GET_LUN im=MAKE_ARRAY(256,256,/BYTE) READU,lun,im FREE_LUN,lun

Das Kapitel Lesen und Schreiben von Dateien folgt auf Seite 127.

117

118

KAPITEL 11. BILDVERARBEITUNG

11.2 Kontrastversch rfung a


Die Operatoren und und die WHERE Funktion sind Hilfsmittel zur Kontrastversch rfung. a und Operator zur Kontrastverst rkung a ERASE TV,im > 40B ; 40B ist das neue Minimum TVSCL,im > 40B ; TVSCL benutzt gesamten Farbbereich TVSCL,im > 40B < 200B ; Bereich von Werten Anwendung der WHERE Funktion a=[2B,4B,6B] tmp=a < 0B idx=WHERE (a < 0B, COUNT) PRINT, idx Der Vektor tmp hat nach der Zuweisung tmp=a<0B die Werte tmp=[0B,0B,0B]. Wenn das Keyword COUNT den Wert 0 hat, wurden keine Elemente gefunden, die der Bedingung entsprechen. Wenn dies der Fall ist, hat idx den Wert -1. Daher sollte man den Wert COUNT pr fen, wie im u nachfolgenden Beispiel gezeigt wird, ehe man den Vektor idx als Index f r ein u Feld verwendet. idx=WHERE ( (im GE 200B) OR (im LE 100B),COUNT) IF COUNT GT 0 THEN im[idx]=0B TVSCL,im idx ist ein Vektor. Falls COUNT GT 0 kann man den Vektor idx als Index f r ein u Feld nutzen.

11.3 Ver ndern der Bildgr e a o


Zur Skalierung von Bildern stehen die Funktionen CONGRID und REBIN mit zwei unterschiedlichen Algorithmen zur Verf gung. Das Beispiel im ist ein Bild der Gr e 256x256 u o new=REBIN(im,128,512) & TV,new Halbieren in Breite und Verdoppeln in H he. Die Bildgr e kann nur mit ganzahlio o gen Faktoren ver ndert werden. Diese Funktion ist schneller als CONGRID. a new=CONGRID(im,640,421,/INTER) & TV,new Mit CONGRID ist eine beliebige Vergr erung oder Verkleinerung m glich. o o Die Default-Einstellung f r die Interpolation ist die nearest-neighbor Methode. Eine u bilineare Interpolation kann man mit dem Keyword INTER erreichen.

11.4. DARSTELLUNG EINES BILDES

119

11.4 Darstellung eines Bildes


Bilder werden mit dem Befehl TV oder TVSCL dargestellt.

TV,im Das Bild wird mit TV angezeigt. Die Defaultposition ist die linke untere Ecke des graphischen Ausgabeger tes, a das Bild wird von unten nach oben dargestellt. TV,im,/ORDER Ver ndern der Zeilenordnung, Bild von oben nach unten a /ORDER uberschreibt den Defaultwert tempor r. a ERASE l scht die Zeichen che o a TVSCL,im TV zeigt die Farbwerte, die in der Bilddatei stehen, direkt an. Der TVSCL-Befehl skaliert die vorhandenen Farbwerte auf den Bereich 0B bis 255B, d.h. es erfolgt eine Streckung der Farben auf die gesamte Farbpalette. besser TVSCL,BYTSCL(im,TOP=!D.TABLE SIZE-1) Streckung auf verf gbare Farben, u effektiv mit zus tzlichen Keywords: MIN, MAX a

Abbildung 11.1: Bildverarbeitung: TVSCL

120

KAPITEL 11. BILDVERARBEITUNG

11.5 Positionieren des Bildes


Es gibt zwei M glichkeiten, Bilder zu positionieren. Zum einen, uber einen Index und zum o anderen mit einem Bildoffset in Pixeln. Mit TV,im,0 wird die erste Position oben links des Ausgabeger tes verwendet. Bei meha reren Positionsangaben laufen die Bild-Positionen von links oben nach rechts unten,siehe auch Seite 121. Der Befehl TV,im,300,200 mit zwei Parametern 300,200 beinhaltet eine Positionsangabe. Das Bild im wird ab der Device-Koordinaten-Position X=300 und Y=200 von unten nach oben gezeichnet. Mit der Systemvariablen !ORDER=1 bzw. dem Keyword ORDER kann man steuern, da ein Bild von oben nach unten gezeichnet wird.

Beispiel: Anzeige eines Farbbalkens links und ein Bild rechts daneben bar=BYTARR(20,256) FOR i=0,19 DO bar[i,*]=BINDGEN(256) ERASE TV,bar TV,im,20,0

Abbildung 11.2: Bildverarbeitung: TV

11.6. BILDANALYSE

121

11.6 Bildanalyse
IDL bietet verschiedene Filter. Einige dieser Filter werden auf dieser Seite beispielhaft dargestellt. Durch die kombinierte Anwendung von Filter- und WHERE-Funktion ist IDL ein m chtiges Werkzeug zur Bildanalyse. Das Satelliten-Daten Auswerte-Programm ENVI a ist in IDL geschrieben.

11.6.1 Arbeiten mit Basisltern


In diesem Beispiel werden die Basislter SMOOTH, MEDIAN, SOBEL und die Filterung im Frequenzraum mit eingebautem FFT vorgestellt. Auerdem wird in diesem Beispiel die Positionierung eines Bildes uber einen Index vorgestellt. Damit ist die Darstellung mehrerer Bilder in einem Fenster m glich. Die Bilder werden in die Ausgabe geschrieben, o wie in der unten stehenden Graphik skizziert ist, und zwar von links nach rechts und von oben nach unten. Eventuell: LOADCT,5 zum Laden einer anderen Farbtabelle oder XLOADCT Groes Window, damit mehrere Bilder reinpassen WINDOW,XSIZE=800,YSIZE=600 TV,im,0 Position 0, links oben Ein Parameter = Position im Bild! Schematische Anordnung der Bilder im Window 0 1 2 3 4 5 TV,SMOOTH(im,3),1 Mittelwertlter uber 3 Nachbarn, Position 1 TVSCL,MEDIAN(im,3),2 Median- Filter, Unterdr ckung einzelner Spitzen, u geringe Kantenverschmierung, Position 2 TVSCL,SOBEL(im),3 Differentielle Kantenverst rkung, Position 3 a Filterung im Frequenzraum mit eingebautem FFT imf=FFT(im,-1); Daten im Frequ.Raum filter=DIST(256) LT 50 ;ideales Tiefpassfilter imf=filter*imf ; Filterung TVSCL,FFT(imf,1),4 ; Ruecktranf., Darstellung Mit dem TVRD()-Kommando kann man das Bild vom Bildschirm lesen. Die Zuweisung new=TVRD() kopiert das Bild in die Variable. new enth lt ein Array vom Typ: BYTE und a kann als PostScript-Datei abgespeichert werden. Information zur Ausgabe, siehe Seite 77.

122

KAPITEL 11. BILDVERARBEITUNG

Abbildung 11.3: Bildverarbeitung: Basislter

Hinweis: Zur weiteren Verarbeitung gibt es die Routinen: WRITE BMP, WRITE JPEG, WRITE PNG, WRITE TIFF, (WRITE GIF)

11.6. BILDANALYSE

123

11.6.2 Ausw hlen und Verarbeiten einer Region a


H ug ist es wichtig, zusammenh ngende Regionen eines Bildes z.B. gleicher Farbe zu a a identizieren. Dazu dient das Programm REGION GROW. Es ltert Daten, die einer bestimmten Bedingung entsprechen. Diese Bedingung kann als ein Bereich von einem minimalen und maximalen Wert vorliegen. Alle Indices, deren Werte in diesen Schwellenbereich fallen, werden zur ckgegeben. Damit kann man z.B. die Fl che einer Region bestimu a men. Das nachfolgende Beispiel zeigt eine Anwendung dieser Routine, um bestimmte Regionen in einem Bild zu identizieren. In unserem Beispiel ist dies ein Salatblatt.

Abbildung 11.4: Bildanalyse: Ausw hlen einer Region a

Das Beispiel verwendet eine BOX CURSOR Routine, damit man einen Bereich ausw hlen kann. Sobald der Bereich ausgew hlt wird, werden die Daten aus dem a a Bild img dazu verwendet, einen Grenzbereich zu bestimmen. Durch diese Schwelle THRESHOLD=[min,max] verhindert man, da Ausreier die Auswertung bestimmen. Die Routine REGION GROW gibt ein Index-Feld zur ck. Die dazugeh rigen Daten werden u o in der Farbe Rot eingef rbt. a

124
PRO bild_analyse DEVICE,DECOMPOSED=0 !P.color=255 !P.background=0 !ORDER=0 area=20.98*29.72

KAPITEL 11. BILDVERARBEITUNG

img=TRANSPOSE(READ_PNG(salat.png)) test=QUERY_IMAGE(salat.png,info) WINDOW,0,XSIZE=info.dimensions[1],YSIZE=info.dimensions[0] LOADCT,0 TVLCT,r,g,b,/GET TVLCT,r,g,b

&

r[5]=255b &

g[5]=0b &

b[5]=0b

TV,img WHILE N_ELEMENTS(RESULT) EQ 0 DO BEGIN XYOUTS,0.02,0.97,/NORM,COLOR=0,CHARSIZE=2,$ Select region with cursor XYOUTS,0.1,0.1,/NORM,COLOR=0,CHARSIZE=2, $ Drag Left button to move box!C+ $ Drag Middle button near a corner to resize box.!C+$ Right button when done. X0=100 & Y0=info.dimensions[0]-0.1*info.dimensions[0] N0=10 & N1=10 BOX_CURSOR,x0,y0,N0,N1,/INIT image_part=img[x0:x0+N0,y0:y0+N1] threshold=[MIN(image_part,MAX=MAX),max] x=INDGEN(N0)+X0 y=INDGEN(N1)+Y0 data=x#y region = REGION_GROW(img, data,THRESHOLD=threshold) IF region[0] NE -1 THEN BEGIN img[region]=5b TV,img all_pixels= info.dimensions[0]*info.dimensions[1] result=FLOAT(N_ELEMENTS(region))/FLOAT(all_pixels)*area XYOUTS,0.02,0.97,/NORM,CHARSIZE=2.0 , COLOR=0, $ Selected Area is +STRING(result,format=(F6.2))+$ cm!E2!B ENDIF ENDWHILE END Beispiel 11.1: Bildanalyse: Verarbeiten einer Region

11.6. BILDANALYSE

125

Falls das Beispiel beim ersten Mausklick kein Ergebnis liefert, erfolgt eine neue CursorAbfrage. Ein m gliches Ergebnis zeigt das nachfolgende Bild. o

Abbildung 11.5: Bildanalyse: Ausw hlen einer Region a

126

KAPITEL 11. BILDVERARBEITUNG

Kapitel 12 Lesen und Schreiben von Daten


IDL arbeitet in Anlehnung an FORTRAN so, da man eine Datei zum Lesen und/oder Schreiben zuerst offnen mu. Nachdem man die Datei gelesen und/oder geschrieben hat, mu man diese schlieen.

12.1 Offnen von Dateien


OPENR OPENW OPENU Offnen einer bereits existierenden Datei nur f r Eingabe u Offnen einer neuen Datei nur f r Ausgabe. Falls diese bereits existiert, u wird der bisherige Inhalt gel scht. o Offnen einer bereits existierenden Datei f r Ein- und Ausgabe u

Tabelle 12.1: Lesen und Schreiben von Daten: Offnen

Syntax:

OPENR,unit,filename Zuordnung einer Unitnummer zu der angegebenen Datei. Wird f r Ein- und Ausgaberoutinen ben tigt. u o Als unit sind die Unitnummern 1- 99 direkt w hlbar. a

Keywords: GET LUN Es wird automatisch eine freie Unitnummer ermittelt (100- 128)

APPEND Mit der Option APPEND ist es m glich, eine Datei zu erweitern. Die Daten werden o an das Ende der bestehenden Datei angef gt. u F77 UNFORMATTED F r unformatierte Fortran-Dateien u

127

128

KAPITEL 12. LESEN UND SCHREIBEN VON DATEN

12.2 Beispiele fur das Offnen und Schlieen von Dateien


Logische Unit Nummern (direkt) OPENR,5,maroo bells.dat CLOSE,5

Ermittlung einer Unitnummer mit GET LUN OPENR,unit,maroo bells.dat,/GET LUN FREE LUN,unit Alle Dateien schliessen CLOSE,/ALL o Auch mit GET LUN ge ffnete Dateien werden geschlossen

Hinweis: Bei mit GET LUN ge ffneten Dateien wird die Datei mit CLOSE zwar geschlossen, aber o der Counter bleibt auf der letzten ge ffneten Unitnummer stehen. Daher sollte man besser o FREE LUN zum Schlieen von Dateien verwenden, die mit GET LUN ge ffnet sind. Die o Datei wird geschlossen und die logische Unit Number (lun) wieder freigegeben.

12.3. LESEN UND SCHREIBEN VON DATEN

129

12.3 Lesen und Schreiben von Daten


Die Programme f r formatierte bzw. unformatierte Eingabe und Ausgabe von Daten sind u in nachfolgender Tabelle gelistet. READF PRINTF READU WRITEU Syntax: Formatierte Eingabe von einer Datei Formatierte Ausgabe auf eine Datei Unformatierte Eingabe von einer Datei Unformatierte Ausgabe auf eine Datei READF,unit,var1,var2,...varn (F r die anderen Routinen entsprechend.) u

Tabelle 12.2: Lesen und Schreiben von Daten: Lesen und Schreiben von Daten

Beispiel: Freies Format (nicht formatiert!) array=intarr(5) READ,array ; liest vom Keyboard var1=FLTARR(3,8) var2=INTAR(10) var3= OPENR,lun,datafile.dat,/GET_LUN READF,lun,var1,var2,var3 ... FREE_LUN,lun

130

KAPITEL 12. LESEN UND SCHREIBEN VON DATEN

12.3.1 Formale Vorschriften beim Lesen


Beim Einlesen ohne Formatangabe werden standardm ig Werte vom Typ FLOAT a erwartet. Variablen vom Typ INT bzw. LONG m ssen entweder vor dem Lesen initialisiert werden u oder nach dem Einlesen in den entsprechenden Typ umgewandelt werden. Hinweis: Einlesen in indizierte Variablen ist nicht m glich! o

Grund: READF ist ein IDL Programm. Ruft man dieses mit einem indizierten Feld auf, so ist dies eine Ubergabe call by value. Das IDL Programm READF kann keinen Wert zur ckgeben. u Nur eine Ubergabe call by reference kann einen Wert zur ckgeben, siehe auch Seite 144. u var1=FLTARR(10) & var2=var1 & var3=var1 temp1=0.0 & temp2=temp1 & temp3=temp1 OPENR,lun,datafile.dat,/GET_LUN FOR j=0,9 BEGIN READF,lun,temp1,temp2,temp3 var1[j]=temp1 & var2[j]=temp2 & var3[j]=temp3 ENDFOR FREE_LUN,lun Vorbesetzung mit FLOAT Werten, wenn man beim Lesen keinen Typ angibt! Weitere Regeln:

Eingabe durch Komma, Leerzeichen oder Tabulatoren trennen Jeder READ-Befehl greift auf eine neue Eingabezeile zu Wird auf eine Variable vom Typ STRING eingelesen, werden alle weiteren Zeichen der Zeile auf diese Variable eingelesen

Hinweis: ASCII Daten lassen sich nur dann schnell einlesen, wenn sie wie Arrays behandelt werden.

12.3. LESEN UND SCHREIBEN VON DATEN

131

12.3.2 Lesen (explizit) formatierter Daten


Das Lesen und Schreiben expliziter Format Daten funktioniert mit einer Formatangabe wie in der Programmiersprache Fortran! READF,lun,var,FORMAT= FORMAT=(I3) FORMAT=(6I2,4(I5,X)) FORMAT=(F10.2) FORMAT=(6F5,4(I4,F10.3)) D I E n X A F

double precision Integer scientic notation skip n character character data Float

132

KAPITEL 12. LESEN UND SCHREIBEN VON DATEN

12.3.3 Lesen und Schreiben unformatierter Daten


Daten vom Typ BYTARR (images) werden gew hnlich unformatiert gelesen und geschrieo ben. Die Gr e der Felder mu bekannt sein. o Lesen var1=FLTARR(30,200) var2=INTARR(30) OPENR,lun,datafile.dat,/GET_LUN READU,lun,var1,var2 FREE_LUN,lun Schreiben OPENW,lun,datafile.dat,/GET_LUN WRITEU,lun,var1,var2 FREE_LUN,lun

12.3.4 Lesen von unformatierten Daten mit assozierten Variablen


Mit dem Befehl ASSOC kann man mehrere gleichgroe Bilder in einer schnellen und komfortablen Art und Weise verarbeiten. Die Bilder m ssen hintereinander abgespeichert voru liegen. Mit den OPENR-Befehl offnet man die Datei und ordnet dann mit dem ASSOC Befehl die logische Unitnummer und die Bildgr e einer Variablen zu. Uber einen Index o greift man auf die einzelnen Bilder zu. Der Mechanismus funktioniert solange, wie die Datei offen ist. OPENR, lun, datafile.dat,/GET_LUN image = ASSOC ( lun, BYTARR(256,256) ) TVSCL, image[3] ; Verarbeitung von image[3] FREE_LUN, lun Hinweis: Es wird immer nur ein Bild im Speicher gehalten. Nach dem CLOSE bzw. FREE LUN kein Zugriff mehr auf die Variable image.

12.4. ARBEITEN MIT DATEIEN

133

12.4 Arbeiten mit Dateien


In diesem Abschnitt werden einige Befehle beschrieben, die f r das Arbeiten mit Dateien u sehr hilfreich sind.

Testen der End-Of-File Bedingung WHILE NOT EOF(lun) DO BEGIN ... Hilfe und Informationen uber Dateien HELP, /files info = FSTAT(lun) PRINT, info.size PRINT, info.cur_ptr HELP, info, /STRUCTURE

Posititionieren des File Pointer POINT LUN, lun, 0 Suchen nach Dateien files = FILE SEARCH($DATADIR/*.dat, COUNT=c ) Selektieren von Dateien pick=DIALOG PICKFILE(path=/idlkurs,filter=*.pro) IF STRLEN(pick) EQ 0 THEN RETURN OPENR, lun, pick, /GET LUN Ober che zur Selektion eines Files wird ge ffnet a o

134

KAPITEL 12. LESEN UND SCHREIBEN VON DATEN

12.5 Operationen auf Dateien/Verzeichnissen ohne Wechsel zum Betriebssytem


Eigenschaften von Dateien oder Verzeichnissen kann man mit IDL Routinen abfragen. Es ist kein Wechsel zum Betriebssytem notwendig. FILE CHMOD FILE DELETE Zugriffsrechte andern l scht ein oder mehrere leere Directories oder einen File o bzw. mehrere Files gibt zu einem File den voll qualizierten Pfad mit Namen an legt ein neues Directory oder mehrere Directories an (mit Default-Zugriffsrechten) sucht nach Dateien. Uberpr fen ob File existiert, ohne da man diesen offnen u mu durchsucht einen angegebenen Pfad nach einem File, sonst wird der IDL Pfad !PATH durchsucht z.B. Filegr e in Bytes und Modikationsdatum o

FILE EXPAND PATH FILE MKDIR

FILE SEARCH FILE TEST

FILE WHICH

FSTAT

12.6. AUTOMATISIERTE EINGABE EINES ASCII-DATENSATZES

135

12.6 Automatisierte Eingabe eines ASCII-Datensatzes


READ ASCII ist ein Programm zur automatisierten Eingabe von ASCII-Datens tzen, die a spaltenweise abgespeichert sind. READ ASCII erkennt ob Strings, Integerdaten oder Floatdaten eingelesen werden. Es k nnen wahlweise Zeilen zu Beginn uberlesen werden bzw. getrennt von den o Datenzeilen eingelesen werden. Die Daten werden in einer Struktur gespeichert. Das Programm ist bei groen Datenmengen recht langsam! Mit idlde steht dieses Programm zur interaktiven Anwendung uber das Men in der u Tool Area bereit. Das Datenle wird analysiert und gelesen. Dazu wird ein Widget gestartet, in dem der Benutzer die Analyse der Daten beeinuen kann.

Aufruf vom IDL-Programm Das Programm READ ASCII ben tigt ein Template, welches man interaktiv erstellen o kann. Dieses Template kann man sichern und in einer neuen IDL-Sitzung mit RESTORE laden. Eine andere M glichkeit ist, die mit ASCII TEMPLATE erstellte Struktur im Proo gramm zu deklarieren, siehe Beispiel lese ascii.pro. Das Programm und auch das skizzierte Beispiel arbeitet mit der Datei ascii input.dat filename=ascii_input.dat ; sonst Widget zur Auswahl template=ASCII_TEMPLATE(filename) SAVE, template, FILE=save.dat

Hinweis: READ ASCII l uft nicht in Run-Time (execute). a Das Einlesen groer Dateien mit READ ASCII ist sehr langsam, da mit Formatangabe zeilenorientiert gelesen wird. Eine Array-orientierte Eingabe dagegen ist schneller.

136

KAPITEL 12. LESEN UND SCHREIBEN VON DATEN

READ ASCII Template und Anwendung


RESTORE,save.dat filename=ascii_input.dat ;sonst Widget zur Eingabe data = READ_ASCII( filename, TEMPLATE=template, HEADER=header, DATA_START=17) help,template,/str ** Structure <300be730>, 10 tags, length=176, refs=1: VERSION FLOAT 1.00000 DATASTART LONG 16 DELIMITER BYTE 32 MISSINGVALUE FLOAT NaN COMMENTSYMBOL STRING FIELDCOUNT LONG 9 FIELDTYPES INT Array[9] FIELDNAMES STRING Array[9] FIELDLOCATIONS LONG Array[9] FIELDGROUPS INT Array[9] help,data,/str ** Structure <3046a500>, 9 tags, length=7160, refs=1: FIELD1 LONG Array[179] FIELD2 STRING Array[179] FIELD3 LONG Array[179] FIELD4 FLOAT Array[179] FIELD5 FLOAT Array[179] FIELD6 FLOAT Array[179] FIELD7 FLOAT Array[179] FIELD8 FLOAT Array[179] FIELD9 FLOAT Array[179] Beispiel 12.1: Arbeiten mit Dateien: READ ASCII Template

data.field1 enth lt die Daten der 1. Spalte, a data.field2 enth lt die Daten der 2. Spalte, usw. a Kopfzeilen der Datei kann man f r die Dateneingabe mit dem Keyword DATA START u ignorieren. Mit der Option HEADER kann man den uberlesenen Text in einer ASCII-Datei abspeichern. Die Option HEADER funktioniert nur in Verbindung mit dem Keyword DATA START.

12.6.1 Zusammenfassung gebr uchlicher Lese- uns Schreibroutinen a


READ ASCII READ BINARY READ IMAGE Lesen von ASCII Daten Lesen von bin rer Daten a Lesen von Image Daten

Tabelle 12.3: Lesen und Schreiben von Daten: Zusammenfassung von Lese- und Schreibroutinen

12.7. BEISPIEL: LESEN UND SCHREIBEN

137

12.7 Beispiel: Lesen und Schreiben


PRO datei_op ;-------------------------------------------; Oeffnen der Ein- und Ausgabedateien ;-------------------------------------------OPENR, unit_in, datei_op.in, /GET_LUN OPENW, unit_out, datei_op.out, /GET_LUN ;-------------------------------------------; Einlesen ;-------------------------------------------zeile = READF, unit_in, zeile zeile = STRCOMPRESS(zeile) params = STRSPLIT(zeile, ,/EXTRACT) maxwerte = 1000 nparams = N_ELEMENTS(params) werte = FLTARR(nparams,maxwerte) wertezeile = FLTARR(nparams) nwerte = 0 WHILE NOT EOF(unit_in) DO BEGIN READF, unit_in, wertezeile werte[*,nwerte] = wertezeile nwerte = nwerte + 1 ENDWHILE werte = werte[*,0:nwerte-1] ;-------------------------------------------; Verarbeitung der Werte ;-------------------------------------------werte = werte * 10. ;-------------------------------------------; Ausgabe der Ergebnisse ;-------------------------------------------PRINTF, unit_out, params, FORMAT=(+STRING(nparams)+A10) PRINTF, unit_out, werte, FORMAT=(+STRING(nparams)+F10.2) ;-------------------------------------------; Schliessen der Ein- und Ausgabedateien ;-------------------------------------------FREE_LUN, unit_in FREE_LUN, unit_out END Beispiel 12.2: Lesen und Schreiben: Programm zum Lesen und Schreiben

138

KAPITEL 12. LESEN UND SCHREIBEN VON DATEN

Kapitel 13 Programmierung und Kompilation

Main Programm

Folge von Statements, die mit END beendet wird. Ein Main Programm hat keine Argumente und ist nur explizit und nicht von anderen Programmen aufrufbar. IDL-Programm ohne expliziten R ckgabewert. Kommunikatiu on mit anderen Routinen uber Argumente. Wie Prozedur, jedoch mit explizitem R ckgabewert. u Eine Funktion kann in einem Ausdruck verwendet werden.

Prozedur

Funktion

Textuelles Einf gen von IDL Statements ist m glich, siehe Batchverarbeitung auf Seite u o 140. Hinweis: Die Erstellung der Programme ist mit einem beliebigem Texteditor m glich. o

139

140

KAPITEL 13. PROGRAMMIERUNG UND KOMPILATION

13.1 Batchverarbeitung
Eine Batch Datei (JOURNAL) enth lt ein oder mehrere IDL Befehle oder Statements. Bei a der Ausf hrung einer Batch Datei wird diese zeilenweise gelesen und direkt interpretiert. u Beispiel: Protokoll einer interaktiven Sitzung JOURNAL, Datei Start eines Protokolls JOURNAL beenden Die Textdatei mit Namen Datei enth lt alle eingegebenen Befehle. a Ein sp teres Editieren dieser Datei ist m glich. a o Mit dem Befehl @name kann man die Datei name interaktiv von der Kommandozeile als Batchdatei ablaufen lassen. Eine andere M glichkeit ist, @name in einem IDL-Programm einzuf gen. o u

13.2 Formales zu IDL-Programmen

IDL Programme ... 1. Statement beginnt mit ... PRO Prozedur FUNCTION Funktion Main: beginnt mit beliebigem IDL Statement Routine endet auf ... Main, Prozedur und Funktion enden mit END Bei der Funktion wird zus tzlich der R ckgabewert angegeben. a u RETURN,wert Namensgebung: Main, Prozedur und Funktion haben die Extension .pro

13.3 Denition einer Prozedur oder Funktion


PRO pro name,p1,p2,...KEYWORD1=pk1,KEYWORD2=pk2 ..... FUNCTION func name,p1,p2,...KEYWORD=pk1,KEYWORD2=pk2.... p1,p2,... Positionale Parameter, optional pk1,pk2... Optionale Keywordvariable

13.4. AUFRUF EINER PROZEDUR ODER FUNKTION

141

13.4 Aufruf einer Prozedur oder Funktion


(IDL Bibliotheksprogramm oder vom Benutzer geschriebenes Programm) Prozedur-Name,p1,p2,... KEYWORD1=pk1,KEYWORD2=pk2 ..... result=Funktions-Name(p1,p2,... KEYWORD1=pk1,KEYWORD2=pk2 .....) p1,p2,... pk1,pk2,... Positionale Parameter Reihenfolge mu eingehalten werden Keywordvariable beliebige Reihenfolge! Abk rzung m glich u o KEYWORD1,KEYWORD2 ist die Bezeichnung selbst, pk1, pk2 ist der Parameter

Beide Parametertypen k nnen optional sein, siehe Online Help: mit [ ] gekennzeichnet o sind die optionalen Parameter.

13.5 Regeln fur die Namensgebung von IDL Programmen


Der Name einer Funktion oder Prozedur ist durch die Bezeichnung gegeben, die auf PRO oder FUNCTION folgt. Daher Funktion/Prozedur mit diesem Namen und der Extension .pro benennen. Dadurch werden die Routinen als IDL Programme erkannt. In IDL kann man jede Prozedur oder Funktion als .pro abspeichern. Eine Datei kann aber auch aus mehreren Programmeinheiten bestehen.

142

KAPITEL 13. PROGRAMMIERUNG UND KOMPILATION

13.6 Kompilieren/Ausfuhren einer Prozedur/Funktion


Ein IDL Programm mu vor dem Aufruf kompiliert werden. Dieses kann explizit mit einem Befehl geschehen aber auch implizit durch einen Aufruf einer Routine. Hinweis: Das IDL-Programm wird nur gefunden, wenn es im aktuellen Verzeichnis oder im IDLSuchpfad liegt. Wenn die Datei mehrere Programmeinheiten enth lt, mu der Name der Datei gleich dem a Namen der letzten Prozedur/Funktion in dieser Datei gew hlt werden. a Grund: IDL ubersetzt beim ersten Aufruf das Programm und zwar sequentiell bis zu der Routine, die physikalisch als Filenamen vergeben wurde. Eventuell nachfolgende Routinen werden ignoriert. Beispiel: c.pro PRO a ... END PRO b ... END PRO c ... END Hinweis: Existiert eine weitere Routine b.pro (im aktuellen Suchpfad) zus tzlich zu oben aufa gef hrten Beispiel c.pro, so wird das Programm b.pro nicht neu ubersetzt, da dieses u Programm bereits bekannt ist. Bei jedem weiteren Aufruf wird die Prozedur oder Funktion nur ausgefuhrt und nicht wie der kompiliert. Nach einer Anderung ist eine explizite Kompilation mit dem .COMPILE Befehl erforderlich. Meist wird man jedoch mit der idlde-Ober che arbeiten und die Kompilation im RUNa Men mit dem COMPILE-Befehl erledigen. Dieser COMPILE-Befehl arbeitet wie der u .COMPILE-Befehl, den man von der Command-Line absetzen kann und ubersetzt alle Programme, die in der angegebenen Datei vorliegen. Die Ausf hrung erfolgt mit dem RUNu Befehl des RUN-Men s. u

13.7. BEISPIELE FUR IDL PROGRAMME

143

13.7 Beispiele fur IDL Programme


Hauptprogramm Der Name kann willk rlich gew hlt werden. u a Beispiel: sample_hauptprogramm.pro a=1 & b=FINDGEN(100) & HELP,a,b END Aufruf: .run sample_hauptprogramm Prozedur Den Namen so w hlen wie die Bezeichnung, die auf .pro endet a Beispiel: sample prozedur.pro PRO sample prozedur,title=title PLOT,FINDGEN(100),TITLE=title END Aufruf: sample prozedur,title=test Funktion Den Namen so w hlen wie die Bezeichnung, die auf .pro endet a Beispiel: sample function.pro FUNCTION sample function,faktor a=RANDOMU(SEED,10) ; 10 Zufallszahlen RETURN,a*faktor END Aufruf: ergebnis=sample function(5.)

144

KAPITEL 13. PROGRAMMIERUNG UND KOMPILATION

13.8 Speicherverwaltung von Daten


13.8.1 Ubergabe von Parametern an Prozeduren und Funktionen
Bei der Ubergabe von Parametern an Prozeduren und Funktionen unterscheidet man zwischen call by value und call by reference. Ausdr cke, Konstanten, Systemvariablen und indizierte Variablen werden by value u ubergeben.

by value bedeutet: Diese Werte sind Eingabewerte. Uber diese Werte k nnen keine o R ckgaben erfolgen u ergebnis=sample func(5.) ergebnis=sample func(a[6])

Variablen werden by reference ubergeben. by reference bedeutet: Diese Variablen sind Eingabewerte. Uber diese Werte k nnen o R ckgaben erfolgen. Wenn diese Variablen im Unterprogramm ver ndert werden, u a mu man beachten, da die ver nderten Werte zur ckgegeben werden. Um das zu a u verhindern, mu im Unterprogramm mit einer Kopie der Variablen gearbeitet werden. value=5. ergebnis=sample func(value) arr=MAKE ARRAY(5,5,/INT,VALUE=5) ergebnis=sample func(arr)

13.8. SPEICHERVERWALTUNG VON DATEN

145

13.8.2 Lokale Variable


Dynamische Verwaltung lokaler Daten in IDL Nach dem Abarbeiten einer Prozedur/Funktion werden alle lokalen Variablen gel scht o und sind bei einem zweiten Aufruf derselben Routine unbekannt. Es gibt kein Ged chtnis! a Wird dies ben tigt, m ssen die Daten uber Parameterliste, Systemvariablen, COMMON o u oder Pointer ubergeben werden. Hinweis: Speicherplatz von lokalen Variablen nur innerhalb der Prozedur/Funktion belegt!

13.8.3 Regeln fur Parameter


Nur die Parameter, passed by reference, werden an das aufrufende Programm zur ckgegeu ben. Parameter, passed by value, sind im aufrufenden Programm unver ndert. a Ausnahmen:

Nach Abarbeitung eines Main Programms bleiben die Variablen erhalten. MAIN Programme sind daher ideal zum Testen kleiner Programmsequenzen! Beispiel: Main Programm als mainpro.pro a=1 & b=1 ; .run mainpro PRINT,a,b ; dannach bekannt: Variablen a,b END IDL Systemvariablen !P, !PI, !D,... sind in jeder Programmeinheit bekannt. Common Block Pointer

146

KAPITEL 13. PROGRAMMIERUNG UND KOMPILATION

13.9 Beispiele: Aufruf von Funktionen und Prozeduren


1. FUNCTION multi,value,times RETURN,value*times END PRINT, multi(6,2) 2. FUNCTION quad,x RETURN,x2+x+4 END PRINT,quad(4) & PRINT,NR QROMB(quad,0.0,6.0) Die Funktion NR QROMB (Numerical Recipes) liefert ein Integral uber ge schlossenes Intervalle. quad ist der Name der Funktion, die integriert werden soll, 0.0 und 6.0 denieren die Intervallgrenzen 3. PRO ADD,a,b a=a+b END a=5 & ADD,a,4 ; OK,Uebergabe von A by reference ADD,4,a ; falsch,4 ist Konstante,Uebergabe by value ; Keine Fehlermeldung arr=FINDGEN(10) ADD,arr[5],4 ; falsch, indizierte Variable ; Uebergabe by value Hinweis: Das Ergebnis einer Funktion kann ohne Zwischenspeichern auf eine neue Variable mit dem PRINT-Befehl ausgegeben werden, siehe oben. Bei Prozeduren werden R ckgabeu werte nur uber Parameter ausgetauscht.

13.10. FORWARD FUNCTION FUNKTION

147

13.10 FORWARD FUNCTION Funktion


Ein Problem tritt auf, sobald Argumente in der Deklaration einer Routine gleich lauten wie Funktionsaufrufe. Ein Beispiel f r den Problemfall folgt im unteren Beispiel durch u die Deklaration des IDL-Programms MEAN. Der Name der IDL-Routine MEAN wird als Argument beim Aufruf der Funktion problem benutzt. Wenn man eine Variable mean als Argument benutzt, geht IDL davon aus, das auch der zweite Aufruf eine Variable sein soll und uberpr ft nicht mehr auf eine zu u ladende Funktion. Dies kommt daher, weil bis IDL5.0 Array-Indizierung mit runden Klammern ublich war. Daher wird x=MEAN(mean) in diesem Fall als Indizizierung von MEAN mit mean verstanden.
;Problem Argumentname gleich lautend wie Funktionsname ; ; FUNCTION problem,mean x=MEAN(mean) RETURN,x END Beispiel 13.1: Programmierung und Kompilation: ohne FORWARD FUNCTION

Aufruf: x=problem(INDGEN(10)) PRINT, x 0 1 2 3 4 5 6 7 8 9 Mit der Routine FORWARD FUNCTION hat man die M glichkeit, diesen Konikt zu o beheben. Dadurch wird in der Routine deniert, da das Argument mit dem gleichlautenden Namen in einem Funktions- hnlichem Aufruf auf jedem Fall als Funktion von IDL a interpretiert wird. Syntax: FORWARD FUNCTION Name1,Name2,....
; Anwendung von FORWARD_FUNCTION um den Konflikt ; Argumentname gleich Funktionsaufruf zu beheben. ; FUNCTION no_problem,mean FORWARD_FUNCTION MEAN x=MEAN(mean) RETURN,x END Beispiel 13.2: Programmierung und Kompilation: mit FORWARD FUNCTION

148

KAPITEL 13. PROGRAMMIERUNG UND KOMPILATION

Aufruf: x=no problem(INDGEN(10)) PRINT, x 4.50000 Hinweis: Man sollte darauf achten, Argumente niemals so zu nennen wie Funktions-Aufrufe in der selben Routine.

13.11. KONTROLL-STATEMENTS

149

13.11 Kontroll-Statements
Wie in jeder Script-Sprache gibt es auch in IDL Denitionen, die eine strukturierte Programmierung erlauben. Das Format solcher Anweisungen unterscheidet sich zwischen Script-Sprachen. IDL spezisch ist, da Bl cke mit BEGIN, IF, CASE, FOR usw. beginnen. Die jeweio ligen Endstatements spezizieren den Typ des zu schliessenden Blocks (END, ENDIF, ENDCASE, ENDFOR usw.). Der BEGIN-Block ist eine Zusammenfassung von Statements, die dann wie ein Statement behandelt werden. BEGIN statement_1 ...... statement_n END Mit IF wird eine Bedingung auf true/false gepr ft. Falls die Bedingung erf llt ist, wird der u u BEGIN-Block ausgef hrt. Wahlweise kann ein Block f r die Behandlung erfolgen, sobald u u die Bedingung nicht erf llt ist. u IF (true) THEN BEGIN ...... ENDIF [ ELSE BEGIN ...... ENDELSE] Falls nur ein Statement ausgef hrt wird, kann man den IF-Fall auch in eine Zeile schreiu ben. IF A THEN B=1 ELSE BEGIN C=2 & D=4 ENDELSE

IF A NE 2 THEN PRINT,A is not 2

Aquivalente Schreibweisen: IF ( a EQ b ) THEN c=a ELSE c=0.0 c = ( a EQ b ) ? a : 0.0

In beiden F llen wird gepr ft, ob der Ausduck (a EQ b) G ltigkeit hat. Bei Gleichheit a u u wird c=a gesetzt, sonst c=0.

150

KAPITEL 13. PROGRAMMIERUNG UND KOMPILATION

Die Variable test wird getestet. Im Beispiel werden die F lle test=0, test=1, a test=2 behandelt. F r test=0 wird ein PRINT ausgef hrt und f r test=1 wird der u u u BEGIN-Block ausgef hrt. F r test=2 werden andere beliebige Anweisungen ausgef hrt. u u u Falls test keinen der Werte 0, 1 oder 2 hat, gilt das was bei der ELSE-Anweisung programmiert ist. test=0 CASE test OF 0: PRINT,OK 1: BEGIN .... ; mehrere Statements als BEGIN Block END 2: .... ELSE: ; Crash ohne ELSE bei nicht abgeprueftem Wert ENDCASE

SWITCH arbeitet anders als CASE. Wenn x den Wert 1 hat, wird ab der Stelle 1: abgearbeitet bis zum ENDSWITCH Wenn x=2 ist, wird ab der Stelle 2: abgearbeitet bis zum ENDSWITCH x=2 SWITCH x OF 1: PRINT,one 2: PRINT,two 3: PRINT,three 4: PRINT,four ENDSWITCH

Ausgabe: two three four

Die FOR-Schleife wird f r die Werte I=1,... bis N durchlaufen. u FOR I=1,N DO BEGIN ...... ENDFOR Die FOR-Schleife wird f r die Werte I=N,... bis -5 mit dem Inkrement -1 durchlaufen u FOR I=N,-5,-1 DO BEGIN ...... ENDFOR

13.11. KONTROLL-STATEMENTS

151

Wenn man FOR X=0,1.,0.1 kodiert, hat man eine Endlos-Schleife, da x=0 vom Typ INT ist und eine Addition einer FLOAT Zahl 0.1 den Wert X nicht erh ht. o FOR X=0.,1.,0.1 DO BEGIN ; Inkrement 0.1 ; ... ENDFOR Diese Schleife l uft ab 0. mit dem Inkrement 0.1, also f r die Werte a u 0.,0.1,0.2,...,1.0

Die WHILE-Schleife wird ausgef hrt, solange die Bedingung (A LT B) erf llt ist. Die u u Bedingung wird am Schleifenanfang getestet. A=1 B=10 WHILE ( A LT B ) DO A=A*2 ; Ergebnis: A=16 Diese WHILE-Schleife wird ausgef hrt, solange die Bedingung (NOT EOF(1)) erf llt u u ist. Beendet wird die Schleife, wenn das Dateiende gefunden wird. WHILE ( NOT EOF(1) ) DO BEGIN readf,1,a i=i+1 ... ENDWHILE

Die REPEAT-Schleife wird solange ausgef hrt, bis die Bedingung (A GT B) erf llt ist. u u Die Bedingung wird am Schleifenende getestet. A=1 B=10 REPEAT A=A*2 UNTIL ( A GT B) ; Ergebnis: A=16

GOTO ist eine Verzweigung zu einer Stelle, die im Programm mit einem Label ende: markiert ist. GOTO, ende .... ende: STOP

152

KAPITEL 13. PROGRAMMIERUNG UND KOMPILATION

13.12 Uberprufung der Argumente und Keywords


Der Aufruf einer Prozedur/Funktion kann mit weniger oder ohne Parameter/Keywords erfolgen, als durch die jeweilige Denition festgelegt ist.

Anzahl der positionalen Parameter Keywordparameter nicht ber cksichtigt u number=N_PARAMS() Ist ein Keywordparameter gesetzt? defined=KEYWORD_SET(variable) dened=1 (true) bzw. dened=0 (false) Die Anzahl der Werte selbst ist nur mit N ELEMENTS zu ermitteln. Anzahl der Elemente n=N_ELEMENTS(variable) Ein Skalar hat nur ein Element A=1 Im Gegensatz dazu ist A=[1] ein Vektor mit einem Element (siehe SIZE-Funktion auf Seite 25). Bei Array: Produkt der Dimensionen falls undeniert: 0 Wie wurde das Argument ubergeben? defined=ARG_PRESENT(variable) defined=1 Ubergabe: by reference defined=0 Ubergabe: by value

Hinweis: KEYWORD SET, N ELEMENTS und ARG PRESENT gelten f r Positional- und Keywordparameter u

13.13. BEISPIEL

153

13.13 Beispiel
Das Programm zeigt die Uberpr fung der aktuellen Aufrufparameter einer Funktion. Mit u N PARAMS ermittelt man die Anzahl der positionalen Parameter. N ELEMENTS hat den Wert 0, wenn kein Wert vorliegt. Mit KEYWORD SET uberpr ft man, ob eine Keyword u Variable TRUE oder FALSE deniert wurde.
PRO PLOT_IT,P1,P2,COLOR=color,SYMBOL=yes ON_ERROR,1 CASE N_PARAMS() OF 0: Message,Must Call Plot_it With One Parameter 1: BEGIN dep=P1 indep=INDGEN(N_ELEMENTS(P1),/FLOAT) END 2: BEGIN dep=P2 indep=P1 END ELSE: BEGIN MESSAGE,Must call Plot_it With one Parameter,$ /INFO,/CONTINUE RETURN END ENDCASE IF (N_ELEMENTS(color) EQ 0) THEN color=0 IF KEYWORD_SET(yes) THEN psym=4 else psym=0 LOADCT,5 PLOT,indep,dep,/Nodata OPLOT,indep,dep,COLOR=color,PSYM=psym END Beispiel 13.3: Programmierung und Kompilation: Uberpr fung der Parameter u

M gliche Aufrufe: o a=INDGEN(100,/FLOAT) & curve=SIN(a/5)/EXP(a/50) time=INDGEN(100,/FLOAT)*6./99 PLOT_IT,curve PLOT_IT,time,curve PLOT_IT,curve,COLOR=150 PLOT_IT,curve,/SYMBOL PLOT_IT,time,curve,COLOR=100,SYMBOL=1 P1 und P2 sind positionale Parameter. SYMBOL ist die Bezeichnung der KeywordVariablen, w hrend yes der Wert der Keyword-Variablen ist. a

154

KAPITEL 13. PROGRAMMIERUNG UND KOMPILATION

13.14 Durchschleusen zus tzlicher Argumente a


Das EXTRA Keyword hat folgende Bedeutung: IDL erlaubt die Vererbung von Keyword Parametern. Dadurch ist es m glich, Keywords, o die nicht in einer Prozedur oder Funktion deklariert sind, an darunter liegende Routinen zu ubergeben. Damit hat man die M glichkeit, sehr leicht sogenannte Wrapper-Routinen o zu schreiben, da man nicht alle Keywords neu deklarieren mu. PRO uebung,TITLE=title,_EXTRA=extra HELP,extra,/STR a=DIST(20) SURFACE,a,_EXTRA=extra HELP,extra,/STR ; Information! was steht in extra? IF (N_ELEMENTS(TITLE) eq 1) then $ XYOUTS,0.5,0.5,/NORM,TITLE END Folgende Aufrufe sind m glich: o uebung uebung,/LEGO,TITLE=Surface Programm uebung,BACKGROUND=100,/SKIRT Die Keywords LEGO, BACKGROUND und SKIRT werden an die Routine SURFACE weiter gereicht. Hinweis: EXTRA ist eine Strukturvariable! Es k nnen alle m glichen Ubergaben auf diese Art o o gemacht werden, auch Tippfehler! Ein nicht g ltiger Parameter/Keyword wird von der jeweiligen Funktion ignoriert. u

13.15. COMMON BLOCKE

155

13.15 COMMON Bl cke o


COMMON Bl cke dienen dazu, Daten in verschiedenden Programmeinheiten bekannt zu o machen. Diese Art der Daten bergabe ist wohl die alteste. Man macht eine Initialisierung u der Daten im Programm und ist damit nicht sehr exibel. Vorsicht ist auch geboten, wenn sich die L nge des COMMON-Blocks andert. a Hinweis: Es gibt eine andere Moglichkeit der Daten bergabe: u Daten in Strukturen, Pointer auf Strukturen Einige IDL Routinen arbeiten mit COMMON Bl cken. o Syntax: COMMON commonblock_name,var1,var2,...varn IDL belegt die Common-Block Variablen mit Werten (Gegensatz dazu: FORTRAN ein Speicherbereich) Beispiel:
PRO A COMMON SHARE,E,F,G E=1 & F=2 & G=3 END PRO B COMMON SHARE A=E*F END PRO C COMMON SHARE PRINT,E,F,G END ; Deklaration ; a muss einmal aufgerufen werden ; E, F, G dann ueberall bekannt ; beliebig referierbar ; Variablen E,F,G bekannt

Beispiel 13.4: Programmierung und Kompilation: COMMON-Bl cke o

Hinweis: Nur im ersten Programm PRO A einen Commonblock denieren, in allen weiteren Pro zeduren diesen Commonblock, wie unter PRO B referieren. Bei einer Anderung des Commonblocks ist dieser nur an einer Stelle zu andern. Bei einer Anderung des Commonblocks IDL neu starten oder Command Line Interface: .reset session oder .full reset session Umgebung idlde Men Run u Reset (ohne idlde-Umgebung zu verlassen)

156

KAPITEL 13. PROGRAMMIERUNG UND KOMPILATION

13.16 Dynamische Erweiterung von Programmen


Das Kompilieren und die Ausf hrung von Programmen w hrend der Programmausf hrung u a u ist wichtig, wenn sich der Programmcode w hrend einer IDL-Sitzung andert! a Mit RESOLVE ROUTINE kann man wie mit .COMPILE kompilieren, jedoch ist dieser Aufruf auch innnerhalb einer Prozedur oder Funktion m glich. Dieser Befehl o erzwingt also eine Neu-Kompilation. Anschlieend mu die Prozedur oder Funktion aufgerufen werden. PRO check ... RESOLVE_ROUTINE,test ... END test.pro wird w hrend der Programmausf hrung kompiliert. a u

Mit EXECUTE(string) kann man w hrend der Programmausf hrung IDLa u Statements kompilieren und ausf hren. Man kann z.B. w hrend der Laufzeit neue u a Variablen generieren. r=EXECUTE(PLOT,[0,1]) r=EXECUTE(vec=FINDGEN(100)) Der Return-Value r hat den Wert 1 falls der String z.B. PLOT,[0,1] richtig kompiliert wurde. Hinweis: EXECUTE und RESOLVE ROUTINE sind bei RUNTIME nicht erlaubt!

Mit CALL PROCEDURE bzw. CALL FUNCTION k nnen Parameter an kompilierte o Routinen ubergeben werden. result=CALL_PROCEDURE(PLOT,para1, para2,...) Schneller als EXECUTE!

13.17. UBUNGEN

157

13.17 Ubungen
Die L sungen zu den Ubungen ndet man im Anhang auf Seite 208. o 1. Ubung mit KEYWORD SET, ARG PRESENT und N ELEMENTS

Ubung mit KEYWORDS Die unten stehende Tabelle kann als Ubung ausgef llt werden! u FUNCTION test1,minimum=min_val IF KEYWORD_SET(min_val) THEN RETURN,1 ELSE RETURN,0 END FUNCTION test2,minimum=min_val IF ARG_PRESENT(min_val) THEN RETURN,1 ELSE RETURN,0 END FUNCTION test3,minimum=min_val IF N_ELEMENTS(min_val) GT 0 THEN RETURN,1 $ ELSE RETURN,0 END

CALL |test1 |test2 |test3 _______________________________________________________ PRINT, testX( ) | | | _______________________________________________________ PRINT, testX(minimum=0) | | | _______________________________________________________ PRINT, testX(minimum=10) | | | _______________________________________________________ PRINT, testX(minimum=-10) | | | _______________________________________________________ mv=0 & PRINT, testX(minimum=mv) | | | _______________________________________________________ mv=10 & PRINT, testX(minimum=mv)| | | _______________________________________________________ PRINT, testX(minimum=mv2) | | | _______________________________________________________

158

KAPITEL 13. PROGRAMMIERUNG UND KOMPILATION Ubung mit positionalen Parametern Die unten stehende Tabelle kann als Ubung ausgef llt werden! u

FUNCTION test1,min_val IF KEYWORD_SET(min_val) THEN RETURN,1 ELSE RETURN,0 END FUNCTION test2,min_val IF ARG_PRESENT(min_val) THEN RETURN,1 ELSE RETURN,0 END FUNCTION test3,min_val IF N_ELEMENTS(min_val) GT 0 THEN RETURN,1 $ ELSE RETURN,0 END

CALL | test1 | test2 |test3 ___________________________________________________ PRINT, testX( ) | | | ____________________________________________________ PRINT, testX(0) | | | ____________________________________________________ PRINT, testX(10) | | | ____________________________________________________ PRINT, testX(-10) | | | ____________________________________________________ mv=0 & PRINT, testX(mv) | | | ____________________________________________________ mv=10 & PRINT, testX(mv) | | | ____________________________________________________ PRINT, testX(mv2) | | | ____________________________________________________

2. Schreibe eine IDL-Prozedur, die eine schattierte Ober che (SHADE SURF) zeicha net und mit einer Gitterlinie (SURFACE) ubermalt (/OVER). Zeichne einen H henlinienplot ganz oben ins Bild (Z=1) und w hle einen Farbindex o a f r die Gitterlinie und den H henlinienplot. u o Folgende Denition der Prozedur mysurface soll gelten: PRO mysurface,data,xgrid,ygrid,CONT=cont,COLOR=col

13.17. UBUNGEN

159

3. Schreibe eine Funktion mit zwei Input Variablen. Der Typ der ersten Input Variablen soll auf die zweite Variable ubertragen werden. Die zweite Variable soll im ge nder a tem Typ zur ckgegeben werden. u result=my_type(var1,var2)

4. Schreibe eine Funktion, die ein Zeichen in einem Text ersetzen kann, z.B. das Zeichen E. txt=DiEs ist ein Test!

5. Simulation einer SMS-Eingabe: Schreibe eine Routine die z.B. den Satz DIES IST EIN TEST in den SMS Zahlencode ubersetzt. Ein Wort pro Zeile z.B.: DIES : 31 43 32 74. Das Ergebnis soll in einer Datei gesichert werden, z.B. sms.txt Verwende hierzu lediglich die Tasten 2 bis 9. Diese entsprechen den Zeichen: A bis Z. Achte beim Eingeben darauf, keine Worte mit anderen Zeichen zu verwenden. Diese Eintragungen sollen sortiert und Dupletten entfernt werden. Sobald ein Wortschatz von ca. 70 Worten besteht, entwickle eine Routine sms t9 die die t9-Logik verwendet. Nach Tastendruck von zwei Ziffern soll ein Wort aus der vorher gespeicherten Datei das mit A, B usw. beginnt, vorgeschlagen werden. Durch weitere Tastendr cke soll der Vorschlag verbessert werden. Mit der Taste 0 u wird zwischen m glichen Worten ausgew hlt. Mit der Taste # wird der Vorschlag o a akzeptiert. Beispiel: Nach Eingabe von 2 ENTER 6 ENTER wird AM vorgeschlagen Mit 0 ENTER wird in den Auswahl Modus geschaltet Weitere 0 ENTER Eingaben werden solange bet tigt, bis AN vorgeschlagen wird Die Eingabe wird mit a # beendet. Kann kein passendes Wort vorgeschlagen werden, soll in den Eingabemodus des ersten Programms gewechselt werden, um den Wortschatz zu vergr ern. o

160

KAPITEL 13. PROGRAMMIERUNG UND KOMPILATION

Kapitel 14 Fehlersuche
Selten ist die Arbeit an einem Programm mit dessen Kompilation abgeschlossen. Meistens beginnt mit dem Austesten auch die Fehlersuche. Hilfreich dazu ist ein Debugger. Dieser erlaubt die schrittweise Ausf hrung von Programmen. W hrend der Laufzeit kann man u a den Programmablauf kontrollieren und Anderungen von Variablen anzeigen. Die Ausf hrung der Debug-Befehle sind im Kapitel Beschreibung der Applikationen u siehe Seite 10 beschrieben.

Vorgehen bei der Fehlersuche In der Regel geht man bei der Fehlersuche in der Entwicklungsober che idlde wie folgt a vor. In der Kommando-Umgebung zu IDL ist das Vorgehen ahnlich. 1. An eine geeignete Stelle, die vor einem m glichen Fehler liegen sollte, setzt man o einen Breakpoint. Ein Breakpoint wird durch Ausw hlen einer Zeile mit dem Befehl a Set Breakpoint aus dem Men RUN gesetzt. u 2. Das Programm wird gestartet. Es h lt am Breakpoint an. Alle in diesem Script dea nierten Variablen vor dem Breakpoint sind jetzt bekannt und werden im VariablenWatch-Window angezeigt. 3. Die Variablen werden auf ihre Richtigkeit uberpr ft. Evtl. sieht man daran schon, u was falsch ist. 4. Mit dem Kommando Step aus dem RUN Men ist eine schrittweise Ausf hrung u u weiterer Befehlszeilen m glich. Man sieht an Hand der Variablen, was das Proo gramm macht. Durch das st ndige Uberpr fen der Variablen und das Wiederholen a u dieses Schrittes ndet man schlielich den Fehler. 5. Die Anweisungen werden verbessert bzw. erg nzt und der Fehlertest wird noch mal a wiederholt.

161

162

KAPITEL 14. FEHLERSUCHE

Kapitel 15 Programmanalyse
Wenn die Ausf hrungszeit eines Programmes langsamer ist als man erwartet, kann man u dies mit dem Proler analysieren. Er erlaubt eine Analyse eines Programmes und aller aufgerufenen Unterprogramme. PROFILER Dieses Programm erm glicht eine Performance-Analyse der Anwendung mittels Monitoo ring. Die Aufruf-Frequenz eigener und System-Programme kann gelistet werden. ; einschliesslich IDL System Prozeduren PROFILER, /SYSTEM ; Bibliotheksfunktion DIST. ; DIST wird direkt kompiliert A= DIST(500) TV, A ; Ergebnisse mit PROFILER, /REPORT PROFILER, /REPORT IDL listet: Module FINDGEN FLTARR N_ELEMENTS ON_ERROR SQRT TV Type Count (S) 1 (S) 1 (S) 1 (S) 1 (S) 251 (S) 1 Only(s) 0.000239 0.010171 0.000104 0.000178 0.099001 2.030000 Avg.(s) 0.000239 0.010171 0.000104 0.000178 0.000394 2.030000 Time(s) 0.000239 0.010171 0.000104 0.000178 0.099001 2.030000

163

164

KAPITEL 15. PROGRAMMANALYSE

Kapitel 16 Error Handling


Um zu vermeiden, da IDL bei unerwarteten Fehlern abbricht, hat man die M glichkeit, o das Verhalten beim Auftreten von Fehlern zu steuern. IDL bricht die Ausf hrung standardm ig in der Routine ab, die den Fehler erzeugt. u a Innerhalb dieser Routine hat man Zugriff auf die lokal bekannten Variablen und keinen Zugriff auf die Variablen der aufrufenden Routine.

Bei einem Fehler im Unterprogramm bleibt das Programm stehen und kehrt nicht in das aufrufende Programm zur ck. Damit ist der Zugriff auf die Variablen des u Unterprogramms beschr nkt. a Der Befehl RETALL bewirkt, da zur Aufruf-Ebene zur ck verzweigt wird (oberste u Ebene). Der Befehl RETURN [, wert] bewirkt da IDL einen Wert an das anrufende Programm zur ckgibt (eine Ebene). u Reset bei idlde: STOP im Run-Men u Als Befehl: .RESET SESSION, bzw. .FULL RESET SESSION Bei unerkl rlichen Fehlern: a IDL mit exit verlassen und neu starten

In der System-Variablen !ERROR STATE sind Informationen zum Fehler gespeichert.

165

166

KAPITEL 16. ERROR HANDLING

16.1 Abfrage des Fehlerzustandes


Wenn ein Fehler auftritt kann man uber die Systemvariable !ERROR STATE Informatio nen zu dem Fehler erhalten. HELP,!ERROR_STATE <Expression> STRUCT = -> !ERROR_STATE Array[1] Struktur,Systemvariable mit verschiedenen Informationen HELP,!ERROR_STATE,/STRUCT ** Structure !ERROR_STATE, 7 tags, length=52: NAME STRING IDL_M_SUCCESS BLOCK STRING IDL_MBLK_CORE CODE LONG 0 SYS_CODE LONG Array[2] MSG STRING SYS_MSG STRING MSG_PREFIX STRING % Die System-Variablen !ERR, !ERROR, !ERR STRING sollten durch die neuen SystemVariablen !ERROR STATE.CODE, !ERROR STATE.NAME, !ERROR STATE.MSG ersetzt werden. Der Informationsgehalt dieser Variablen ist gr er. o Genaue Information siehe Reference Guide

16.2. UMLEITEN VON FEHLERN

167

16.2 Umleiten von Fehlern


Man kann verhindern, da ein Fehler zum Abbruch des Programms f hrt. Dies erreicht u man mit den Routinen ON ERROR, ON IOERROR oder CATCH

ON IOERROR,label Mit ON IOERROR kann ein IO-Error abgefangen werden. Das Prgramm verzweigt zu dem angegebenen label. Dieser Befehl hat eine h here Priorit t als CATCH. o a ON ERROR,1 bei Fehler R cksprung zum IDL-Main-Level (veraltet, besser CATCH) u CATCH,error status genereller Mechanismus zur Fehlerbehandlung Keine Behandlung mathematischer Fehler! CATCH Prozedur als Batch File einf gen (kein end!) u Der Error-Status wird mit 0 initialisiert wenn ein Fehler auftritt, wird im Calling-Stack nach CATCH gesucht. Ist CATCH vorhanden ist, wird das auf CATCH folgende Statement ausgef hrt. u Falls kein CATCH vorhanden wird nach ON ERROR gesucht. mit CATCH,/CANCEL wird der aktuelle CATCH-Mechanismus aufgehoben. Damit ist es m glich, weitere Fehler mit diesem CATCH-Mechanismus zu beo arbeiten.

168

KAPITEL 16. ERROR HANDLING

16.3 Beispiel zu CATCH


PRO err_test err_test1 err_test2 END PRO err_test1 @catch_proc PRINT,var1 END PRO err_test2 @catch_proc PRINT,var2 END Listing von catch proc errornum = 0 CATCH, errornum IF errornum NE 0 THEN BEGIN CATCH,/CANCEL HELP,/LAST_MESSAGE,OUTPUT=traceback errarray = [Error caught: , traceback] a = DIALOG_MESSAGE(errarray,/ERROR) RETURN ENDIF Beispiel 16.1: Error Handling: CATCH

Die Prozedur err test wird aufgerufen. Diese ruft err test1. In err test1 wird catch proc als Folge von IDL-Statements eingezogen. In err test1 wird eine unbekannte Variable gedruckt. Dieser Fehler wird mit CATCH,erronum abgefragt. Wenn diese Error-Number ungleich Null ist, wird der Fehler in dem Widget, da mit DIALOG MESSAGE erstellt wurde, mit Traceback dokumentiert. Das Programm wartet, bis der OK-Knopf in dem Widget quittiert wird. Voraussetzung daf r, da ein weiterer u Fehler in der gleichen Art und Weise behandelt werden kann, ist das der CATCHMechanismus mit dem Befehl CATCH,/CANCEL zur ckgesetzt wird. In err test2 u passiert ein weiterer Fehler. Das Programm f ngt diesen Fehler auch ab. a

Abbildung 16.1: Error Handling: CATCH

Beispiel: err test.pro, err test1.pro, err test2.pro, catch proc

16.4. AUSGABE VON FEHLERNACHRICHTEN

169

16.4 Ausgabe von Fehlernachrichten


Mit MESSAGE wird eine Meldung ausgegeben, z.B. MESSAGE,error occured. Es gibt die Optionen /CONTINUE oder /INFORMATIONAL. Mit CONTINUE wird der Fehler kommentiert und das Programm l uft weiter. a INFORMATIONAL ist mit !QUIET=1 abschaltbar (man sieht dann die Message nicht). Ohne eines der beiden Keywords h lt die Routine an dieser Stelle. a

170

KAPITEL 16. ERROR HANDLING

Kapitel 17 Widgets
Ein Widget stellt eine graphische Bedienober che dar. Es dient damit der Kommunikation a zwischen einem Benutzer und einem Programm. Durch verschiedene Komponenten, wie Schalter und Anzeigen kann der Benutzer mit dem darunter liegenden Programm kommunizieren und den Ablauf beeinussen. Im folgenden wird die Erstellung einer graphischen Bedienober che beschrieben. a

17.1 GUI Builder


In der Windows Version von IDL gibt es seit Version 5.2 einen Widget Editor. Mit diesem Widget Editor lassen sich sehr einfach positional angeordnete Widgets erstellen. Diese formal erstellte Bedienober che kann, ohne da man diese andern mu, auf andere a Plattformen portiert werden. Der Widget Editor ist nur in der Microsoft Windows Version verf gbar und wird in diesem u Dokument nicht behandelt.

171

172

KAPITEL 17. WIDGETS

17.2 Typen von Widgets


Eine Ober che wird durch Aufrufe einzelner Widget Funktionen gestaltet. Eine Ubersicht a uber die verf gbaren Widget Funktionen gibt folgende Aufstellung. u WIDGET BASE Ein Widget, welches in hierarchischer Anordnung andere Widgets enth lt a Zuordnungsbasis mit positionalen Eigenschaften deniert Kn pfe, Gruppen von Kn pfen o o deniert editierbaren Text deniert Graphikfenster ahnlich Window deniert eine Tabelle deniert einen Schieberegler deniert ein Beschriftung, kann nicht editiert werden deniert eine Liste von Textzeilen, z.B. Men u deniert einen Knopf, der eine herunter-klappbare Liste von Optionen enth lt. a

WIDGET BUTTON WIDGET TEXT WIDGET DRAW WIDGET TABLE WIDGET SLIDER WIDGET LABEL WIDGET LIST WIDGET DROPLIST

17.3 Erstellung von Menu Widgets


Die Widgets werden in einer zentralen Einheit, der Main-Base, angeordnet. In dem Beispiel wird ein Men bar erstellt, der mit dem Text Menu beschriftet ist. Wenn man auf diesen u Bar klickt, werden die Buttons mit den Beschriftungen ONE, TWO, THREE sichtbar. base = WIDGET_BASE(MBAR=bar) menu = WIDGET_BUTTON(bar, VALUE=MENU,$ /MENU) button1 = WIDGET_BUTTON(menu, VALUE=ONE) button2 = WIDGET_BUTTON(menu, VALUE=TWO) button3 = WIDGET_BUTTON(menu, VALUE=THREE)

17.4. GESTALTUNG DES LAYOUTS EINES WIDGETS

173

17.4 Gestaltung des Layouts eines Widgets


Ein Widget kann positional oder durch Angabe einer zeilen- bzw. spaltenweisen Anordnung deniert werden. Im folgenden Beispiel werden die Buttons in einfacher Art und Weise spaltenweise angeordnet. base = WIDGET_BASE(COLUMN=1) but1 = WIDGET_BUTTON(base, VALUE=Button 1) but2 = WIDGET_BUTTON(base, VALUE=Button 2) Im folgenden Beispiel hat die Main-Base eine Zeile. In der Zeile wird eine neue Base col1 mit einer Spalte und eine zweite Base col2 mit zwei Spalten angelegt. base = WIDGET_BASE(ROW=1 ) col1 = WIDGET_BASE(base, COLUMN=1) col2 = WIDGET_BASE(base, COLUMN=2) Die Main-Base wird h ug auch als Top-Level-Base (TLB) bezeichnet. a Ein komplexeres Beispiel folgt. Es zeigt die hierarchische Anordnung von Zeilen und Spalten.

174
PRO buttons base = WIDGET_BASE(ROW = 2)

KAPITEL 17. WIDGETS

baseo = WIDGET_BASE(base, ROW = 1, FRAME=6) baseu = WIDGET_BASE(base, COLUMN = 1, FRAME=6) base1 = WIDGET_BASE(baseo, COLUMN = 1, FRAME=1) base2 = WIDGET_BASE(baseo, ROW = 1, FRAME=1) base3 = WIDGET_BASE(baseu, ROW = 2, FRAME=1) base4 = WIDGET_BASE(baseu, ROW = 4, FRAME=1) but1 but2 but3 but4 but1 but2 but3 but4 but1 but2 but3 but4 but5 but6 but1 but2 but3 but4 = = = = = = = = = = = = = = = = = = WIDGET_BUTTON(base1, WIDGET_BUTTON(base1, WIDGET_BUTTON(base1, WIDGET_BUTTON(base1, WIDGET_BUTTON(base2, WIDGET_BUTTON(base2, WIDGET_BUTTON(base2, WIDGET_BUTTON(base2, WIDGET_BUTTON(base3, WIDGET_BUTTON(base3, WIDGET_BUTTON(base3, WIDGET_BUTTON(base3, WIDGET_BUTTON(base3, WIDGET_BUTTON(base3, WIDGET_BUTTON(base4, WIDGET_BUTTON(base4, WIDGET_BUTTON(base4, WIDGET_BUTTON(base4, VALUE VALUE VALUE VALUE VALUE VALUE VALUE VALUE VALUE VALUE VALUE VALUE VALUE VALUE VALUE VALUE VALUE VALUE = = = = = = = = = = = = = = = = = = B1 B1 B1 B1 B2 B2 B2 B2 B3 B3 B3 B3 B3 B3 B4 B4 B4 B4 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, UNAME=B1 UNAME=B1 UNAME=B1 UNAME=B1 UNAME=B2 UNAME=B2 UNAME=B2 UNAME=B2 UNAME=B3 UNAME=B3 UNAME=B3 UNAME=B3 UNAME=B3 UNAME=B3 UNAME=B4 UNAME=B4 UNAME=B4 UNAME=B4 1) 2) 3) 4) 1) 2) 3) 4) 1) 2) 3) 4) 5) 6) 1) 2) 3) 4)

WIDGET_CONTROL, base, /REALIZE END

Beispiel 17.1: Widgets: Layout eines Widgets

Mit but1 = WIDGET BUTTON(base1, VALUE = B1 1, UNAME=B1 1) wird ein Button mit der Beschriftung B1 1 erstellt. Der UNAME beinhaltet einen Wert zur eindeutigen Identikation des Buttons.

17.5. WIE FUNKTIONIERT EINE OBERFLACHE?

175

17.5 Wie funktioniert eine Ober che? a


Der XMANAGER ist ein IDL-Programm, das st ndig abfragt, welche Kn pfe auf der Obera o che gedr ckt werden. Diese Information wird an den Event-Handler weitergegeben. a u Der Event-Handler sorgt f r den Kommunikationsaustausch zwischen Ober che und u a XMANAGER. Der Event-Handler wei genau, welche Kn pfe oder Slider auf der Obero che bedient worden sind. Die Ereignisse, die eintreten k nnen, m ssen in der sogenanna o u ten Event-Handler Routine programmiert werden. Eine wichtige Funktion hat dabei die im n chsten Kapitel beschriebene WIDGET CONTROL und WIDGET INFO Funktion. a

17.6 Kontrolle uber die Widgets


Es gibt Funktionen, die der Abfrage der Events dienen oder f r die Steuerung n tig sind. u o Abfrage von Events x=WIDGET_INFO( w_id, /UNAME) gibt den UNAME zur ck. u x=WIDGET_INFO( w_id, FIND_BY_UNAME=TEST) ndet die ID, wenn das Widget mit UNAME=TEST deniert wurde.

Abfrage von Werten WIDGET_CONTROL, w_id, GET_UVALUE=test Mit GET UVALUE holt man den User Value WIDGET_CONTROL, w_id, SET_UVALUE=DONE Mit SET UVALUE setzt man den User Value WIDGET_CONTROL, w_id, GET_VALUE=test Mit GET VALUE holt man den Wert WIDGET_CONTROL, w_id, SET_VALUE=50 Mit SET VALUE setzt man einen Wert Steuerung der Widgets WIDGET_CONTROL, w_id, /REALIZE Mit dem Keyword /REALIZE wird das Widget als Ober che gestartet a WIDGET_CONTROL, w_id, /DESTROY Mit dem Keyword /DESTROY zerst rt man das Widget-Element und alle abh ngigen Eleo a mente

176

KAPITEL 17. WIDGETS

17.7 Registrierung der Widgets mit dem XMANAGER


Der XMANAGER ist ein komplexes Programm, das in der Regel ausreicht, um mittels einer EVENT-Handler Routine mit der Ober che zu kommunizieren. Die Funktion a XREGISTERED ermittelt, ob ein Widget Programm durch den XMANAGER verwaltet wird. XMANAGER, Program Name, base id IF XREGISTERED(Program Name) THEN RETURN Man benutzt die zweite Form IF XREGISTERED ..., wenn mehr als eine Kopie des Programms zur gleichen Zeit l uft. a

17.8. SCHREIBEN EINES KLEINEN WIDGET PROGRAMMS

177

17.8 Schreiben eines kleinen Widget Programms


Zur Erkl rung des Event Handlers wird nachfolgend ein kleines Beispiel deniert. a rstwid.pro
PRO firstwid base = WIDGET_BASE( COLUMN=1 ) but1 = WIDGET_BUTTON( base, VALUE=HELLO, $ UNAME=HELLO) but2 = WIDGET_BUTTON( base, VALUE=GOODBY, $ UNAME=GOODBY) WIDGET_CONTROL, base, /REALIZE XMANAGER, firstwid, base END Beispiel 17.2: widgets: kleines widget Programm

In dem Beispiel wird eine Main-Base eingerichtet. Die Widgets, die angelegt werden, sind Kn pfe mit den Beschriftungen HELLO und GOODBY. Die Ausrichtung der Kn pfe o o ist spaltenweise. Wie in den obigen Beispielen, wird keine Gr enangabe gemacht. Man o uberl t es IDL, die Buttons anzulegen. a Diese denierte Anordnung der Widgets wird durch den WIDGET CONTROL Befehl mit dem Keyword /REALIZE realisiert.

17.8.1 Initialisierung der Event-Loop


Das Beispiel zeigt die Denition der Event-Routine. PRO firstwid ... XMANAGER, firstwid, base END Der XMANAGER-Befehl wird vor dem END eingef gt und startet die Event-Routine u zu dem angegebenen Programm firstwid. Die Event-Routine heit daher firstwid event. Wenn der XMANAGER gestartet ist, wartet er darauf, da einer der beiden Kn pfe geo dr ckt wird. Diese Aktionen werden in der sogenannten Event-Struktur abgespeichert. u Diese Event-Struktur kann in der Event-Handler Routine kontrolliert abgearbeitet werden.

178

KAPITEL 17. WIDGETS

17.8.2 Ubergabe der Event Struktur an den Event-Handler


Das Beispiel zeigt, wie der Event-Handler auf einzelne Aktionen reagiert.
PRO firstwid_event, event cmd=WIDGET_INFO(event.id,/UNAME) CASE cmd OF HELLO: PRINT, Hi, hello there ! GOODBY: BEGIN PRINT, See you later ! WIDGET_CONTROL,event.top,/DESTROY END ELSE: ENDCASE END PRO firstwid ... END Beispiel 17.3: widgets: Event Handler

F r die Event-Handler Routine gelten ein paar formale Regeln, die im folgenden beschrieu ben werden. Der Name der Prozedur, in der der XMANAGER aufgerufen wird (firstwid), bestimmt den Namen der Event-Handler Prozedur (firstwid event). Die Event-Struktur (in dem Beispiel event) hat Informationen, die f r die Abarbeitung u des Events erforderlich sind. Diese Struktur wird an die Event-Handler Routine ubergeben. Wie eine solche Struktur aufgebaut ist, ist auf Seite 179 beschrieben. In dem Beispiel werden dann mit der Widget Kontrollfunktion WIDGET INFO die Ereignisse abgefragt und verarbeitet. WIDGET INFO liefert den UNAME des gedr ckten u Knopfes. Dadurch ist die eindeutige Identikation gegeben. Dieser Name steht dann bei der CASE-Anweisung vor dem Doppelpunkt und kann entsprechend verarbeitet werden. Wird der Knopf mit der Beschriftung HELLO gedr ckt, wird der String Hi, hello there u ! ausgegeben. Wird dagegen der Knopf mit der Beschriftung GOODBY gedr ckt, wird u der String See you later ! ausgegeben und das Widget wird beendet.

Hinweis: Der Befehl WIDGET CONTROL,event.top,/DESTROY zeigt, wie man in der EventRoutine das Programm sauber verlasssen kann, indem man die ID des Top-Level Widgets und das Keyword DESTROY angibt.

17.9. UBERGABE VON INFORMATIONEN ZWISCHEN WIDGETS

179

17.8.3 Aufbau der Event Struktur fur WIDGET BUTTON


Der Aufbau der Event Struktur wird gelistet. Die Event Struktur steht zur Auswertung der Event Handler Routine zur Verf gung. u HELP,event,/str ** Structure WIDGET_BUTTON, 4 tags, length=16: ID LONG 2 TOP LONG 1 HANDLER LONG 1 SELECT LONG 1 event.top event.id event.handler Nummer des Top-Level-Widgets Nummer des Widgets, das den Event ausgel st hat o Nummer des Widgets, das den Event-Handler aufgerufen hat

ID, TOP und HANDLER sind in allen Events enthalten. Die einzelnen Wigetfunktionen geben zus tzliche Informationen zur ck, s.o Beispiel WIDGET BUTTON gibt SELECT a u zur ck. u

17.9 Ubergabe von Informationen zwischen Widgets


Bei der Event-Handler Routine kann man keine Parameter-Ubergabe benutzen. Zum Datenaustausch stehen folgende M glichkeiten zur Verf gung: o u 1. Common Bl cke: o COMMON ids, w1, w2, w3 COMMON ids (by reference) 2. Ubergabe von Daten (Strukturen) in dem User Value der Main-Base oder auch Top-Level-Base (TLB). 3. Man kann IDL Pointer nutzen, um komplexe Datenstrukturen in die TLB als User Value bekannt zu machen.

180

KAPITEL 17. WIDGETS

17.10 Widgetprogrammierung im Wandel von IDL


Die M glichkeit, Widgets zu schreiben, gibt es in IDL schon lange. Die Art, wie diese o Widgets geschrieben werden, hat sich mit der Entwicklung von IDL gewandelt. Anhand der nachfolgenden kleinen Beispiele wird diese Entwicklung aufgezeigt.

Beispiel 17.4: Widgets: Dieses Widget wird in Beispiel 1 bis 5 bearbeitet

Der Datenaustausch im Widget Programm, d.h. was der Event-Handler braucht, kann in folgender Weise geschehen (historisch geordnet) 1. Datenaustausch mit Event-Handler uber COMMON Block Selektion uber UVALUE, siehe wid1.pro 2. Datenaustausch mit Event-Handler uber UVALUE Selektion uber UVALUE, siehe wid2.pro 3. Datenaustausch mit Event-Handler uber die Funktion WIDGET INFO, damit Zugriff auf die Top-Level-Event-Handler Struktur Selektion uber UNAME, siehe wid3.pro 4. wie 3, aber Information wird zuvor in Beispiel wid4 in eine Struktur geschrieben, die mit SET UVALUE in der Main-Base an den Event-Handler ubergeben wird Die Selektion erfolgt uber UNAME, siehe wid4.pro 5. wie 4, aber die Struktur wird als Pointer auf die Main-Base ubergeben. Die Selektion erfolgt uber UNAME, siehe wid5.pro

17.10. WIDGETPROGRAMMIERUNG IM WANDEL VON IDL

181

17.10.1 Beispiel: Widget 1


Dieses Beispiel verwendet einen COMMON Block, in dem die WIDGET ID des Text Widgets gespeichert wird. In der Denition der Widget Funktionen wurde ein UVALUE (User Value) verwendet und zwar mit einem Namen. Da im EVENT-Handler immer die EVENT.ID des Widgets bekannt ist, das den EVENT ausgel st hat, kann man UVALUE o mit GET UVALUE auslesen. Darauf aufbauend kann man in einer CASE Abfrage die einzelnen Namen unterscheiden. Sobald der Schalter PRINT gedr ckt wird, wird die COMMON Block Variable id text u verwendet, um den Text DONE in das Text Widget zu schreiben. Mit QUIT wird das Widget beendet.
; ; ; ; Merkmale: Alles was im Event Handler benoetigt wird, wird im COMMON deklariert. Selektion ueber "uvalue"

PRO wid1_event,event COMMON wid_co,id_text WIDGET_CONTROL,EVENT.ID,GET_UVALUE=uv CASE uv OF PRINT:WIDGET_CONTROL,id_text, SET_VALUE=DONE QUIT:WIDGET_CONTROL,event.top,/DESTROY ELSE: ENDCASE END PRO wid1 COMMON wid_co,id_text id_base=WIDGET_BASE(row=3) id_PRINT=WIDGET_BUTTON(id_base,VALUE=PRINT,UVALUE=PRINT) id_quit=WIDGET_BUTTON(id_base,VALUE=QUIT, UVALUE=QUIT) id_text=WIDGET_TEXT(id_base,VALUE=) WIDGET_CONTROL,id_base,/REALIZE XMANAGER,wid1,id_base END Beispiel 17.5: Widgets: wid1

182

KAPITEL 17. WIDGETS

17.10.2 Beispiel: Widget 2


In diesem Beispiel wird die Variable id text mit SET UVALUE auf die Main-Base geschrieben. Die Main-Base ist im EVENT HANDLER immer EVENT.TOP zugeordnet. Daher kann man diesen Wert mit GET UVALUE dort auslesen und auf einer Variablen id text speichern. Die Abfrage der bet tigten Schalter ist gleich dem vorherigen a Beispiel wid1.pro. Wenn nun der Schalter PRINT gedr ckt wird, wird die Variable u id text verwendet, um den Text DONE in das Text Widget zu schreiben. Mit QUIT wird das Widget beendet.
; ; ; ; Merkmale: Alles was im event handler benoetigt wird ueber uvalue der Main-Base deklariert. Selektion ueber "uvalue"

PRO wid2_event,event WIDGET_CONTROL,event.top,GET_UVALUE=id_text WIDGET_CONTROL,event.id,GET_UVALUE=uv CASE uv OF PRINT:WIDGET_CONTROL,id_text,SET_VALUE=DONE QUIT:WIDGET_CONTROL,event.top,/DESTROY ELSE: ENDCASE END PRO wid2 id_base=WIDGET_BASE(row=3) id_PRINT=WIDGET_BUTTON(id_base,VALUE=PRINT,UVALUE=PRINT) id_quit=WIDGET_BUTTON(id_base,VALUE=QUIT,UVALUE=QUIT) id_text=WIDGET_TEXT(id_base,VALUE=) WIDGET_CONTROL,id_base,/REALIZE,SET_UVALUE=id_text XMANAGER,wid2,id_base END Beispiel 17.6: Widgets: wid2

17.10. WIDGETPROGRAMMIERUNG IM WANDEL VON IDL

183

17.10.3 Beispiel: Widget 3


Dieses Beispiel zeigt einige der M glichkeiten durch die Verwendung von UNAME. Ein o Name, der mittels UNAME anstelle von UVALUE in der Denition der Widget Funktionen verwendet wird, ist entlang der Widget ID Hierarchie zuordbar. Zun chst wird der a den EVENT ausl sende Name durch WIDGET INFO erfragt. Dieser kann in der CASE o Anweisung verglichen werden. Sobald der Schalter PRINT bet tigt wurde, kann die a ID des WIDGET TEXT ausgelesen werden. Der groe Unterschied zu den vorherigen Beispielen ist, da keine Information redundant zwischengespeichert werden mu.
; ; ; ; ; Merkmale: Selektion findet ueber uname statt. Alle von Main-Base abhaengigen widgets und deren uname ist mit WIDGET_INFO zu erreichen, daher kann man alle ids ermitteln, weitere Daten werden nicht benoetigt

PRO wid3_event,event cmd=WIDGET_INFO(event.id,/UNAME) CASE cmd OF QUIT : WIDGET_CONTROL,event.top,/DESTROY PRINT: BEGIN id=WIDGET_INFO(event.top,FIND_BY_UNAME=TEXT) WIDGET_CONTROL,id,SET_VALUE=DONE END ELSE: ENDCASE END PRO wid3 id_base=WIDGET_base(ROW=3) id_PRINT=WIDGET_BUTTON(id_base,VALUE=PRINT,UNAME=PRINT) id_quit=WIDGET_BUTTON(id_base,VALUE=QUIT, UNAME=QUIT) id_text=WIDGET_text(id_base,VALUE=,UNAME=TEXT) WIDGET_control,id_base,/REALIZE XMANAGER,wid3,id_base END Beispiel 17.7: Widgets: wid3

184

KAPITEL 17. WIDGETS

17.10.4 Beispiel: Widget 4


In diesem Beispiel wird neben der Verwendung von UNAME gezeigt, wie man Daten z.B. eine Struktur x, von der Denitions Prozedur in den Widget Handler bekommt und dort bearbeiten kann. Damit man an die Variable im Event Handler kommt, wird sie als UVALUE auf die Main-Base geschrieben. Daher kann sie im Event Handler mit GET UVALUE von EVENT.TOP gelesen werden. Sobald der Schalter bet tigt wird, wird a zun chst der alte Text Hallo Du ausgegeben und dann der Text neuer Text a der Struktur Variablen zugewiesen. Ausgegeben wird er erst nach dem n chsten Bet tigen a a des Schalters. Damit der Event Handler dann die Anderung noch kennt, mu die Struktur wieder als UVALUE auf EVENT.TOP gespeichert werden.
; ; ; ; ; ; ; ; ; ; ; Merkmale: Selektion findet ueber uname statt. Alle von Main-Base abhaengigen widgets und deren uname ist mit WIDGET_INFO zu erreichen, daher kann man alle ids ermitteln. Daten die schon waehrend des Ablaufs von wid4 vorliegen sollen in den Event-Handler uebergeben werden. Dies geschieht mit einer Struktur die auf die Main-Base mit uvalue gesetzt wird und dann mit WIDGET_CONTROL ausgelesen werden kann. Bei einem neu setzen der Werte muss die Struktur aber wieder auf event.top geschrieben werden.

PRO wid4_event,event WIDGET_CONTROL,event.top,GET_UVALUE=x cmd=WIDGET_INFO(event.id,/UNAME) CASE cmd OF QUIT : WIDGET_CONTROL,event.top,/DESTROY PRINT: BEGIN id=WIDGET_INFO(event.top,FIND_BY_UNAME=TEXT) WIDGET_CONTROL,id,set_VALUE=x.value x.value=neuer Text WIDGET_CONTROL,event.top,SET_UVALUE=x END ELSE: ENDCASE END PRO wid4 x={value:Hallo Du} id_base=WIDGET_base(row=3) id_PRINT=WIDGET_BUTTON(id_base,VALUE=PRINT,UNAME=PRINT) id_quit=WIDGET_BUTTON(id_base,VALUE=QUIT,UNAME=QUIT) id_text=WIDGET_TEXT(id_base,VALUE=,UNAME=TEXT) WIDGET_CONTROL,id_base,/REALIZE,SET_UVALUE=x XMANAGER,wid4,id_base END Beispiel 17.8: Widgets: wid4

17.10. WIDGETPROGRAMMIERUNG IM WANDEL VON IDL

185

17.10.5 Beispiel: Widget 5


Dieses Beispiel ist identisch zu dem vorherigen mit dem Unterschied, da das UVALUE, welches auf die Main-Base geschrieben wird, zuvor in einen POINTER konvertiert wurde. Dadurch mu man nicht nach Anderung des Wertes die Struktur wiederum als UVALUE sichern.
; ; ; ; ; ; ; ; ; ; Merkmale: Selektion findet ueber uname statt. Alle von Main-Base abhaengigen Widgets und deren uname ist mit WIDGET_INFO zu erreichen, daher kann man alle ids ermitteln. Daten die schon waehrend des Ablaufs von wid5 vorliegen sollen in den Event-Handler uebergeben werden. Dies geschieht mit einer Struktur die als Pointer auf die Main-Base in uvalue gesetzt wird und dann mit WIDGET_CONTROL ausgelesen werden kann. Der Wert kann einfach geaendert werden.

PRO wid5_event,event WIDGET_CONTROL,event.top,GET_UVALUE=x cmd=WIDGET_INFO(event.id,/UNAME) CASE cmd OF QUIT : WIDGET_CONTROL,event.top,/DESTROY PRINT: BEGIN id=WIDGET_INFO(event.top,FIND_BY_UNAME=TEXT) WIDGET_CONTROL,id,set_VALUE=(*x).value (*x).value=neuer Text END ELSE: ENDCASE END PRO wid5 x={value:Hallo Du} x=PTR_NEW(x,/NO_COPY) id_base=WIDGET_base(ROW=3) id_PRINT=WIDGET_BUTTON(id_base,VALUE=PRINT,UNAME=PRINT) id_quit=WIDGET_BUTTON(id_base,VALUE=QUIT,UNAME=QUIT) id_text=WIDGET_TEXT(id_base,VALUE=,UNAME=TEXT) WIDGET_CONTROL,id_base,/realize,SET_UVALUE=x XMANAGER,wid5,id_base PTR_FREE,x END Beispiel 17.9: Widgets: wid5

186

KAPITEL 17. WIDGETS

17.11 Widget Programme fur Runtime-L ufe a


start IDL .COMPILE runtime RESOLVE_ALL,runtime SAVE,/ROUTINES,FILENME=runtime.sav Der XMANAGER mu vor dem SAVE einmal aufgerufen worden sein.

17.12. COMPOUND WIDGETS

187

17.12 Compound Widgets


Compound Widgets sind Kombinationen von Basis-Widget-Funktionen. Der Name eines Compound Widgets beginnt mit CW . An dem nachfolgendem Widget wird die Funktionsweise erkl rt. a

Abbildung 17.1: Widgets: Compound Widgets, cw switch

Das Compound Widget ist in diesem Beispiel eine Kombination von WIDGET BUTTON, WIDGET LABEL und WIDGET DRAW. Es stellt einen neuen Schalter-Typ mit einer Anzeige des Schaltzustandes dar. Der Aufruf des Compound Widgets cw switch.pro ist Anhand dem nachfolgendem Beispiel test cw zu sehen.
PRO test_cw_event,ev cmd=WIDGET_INFO(ev.id,/UNAME) CASE cmd OF DONE: WIDGET_CONTROL,ev.top,/dest TEST_CW_EX: BEGIN WIDGET_CONTROL,ev.id,GET_UVALUE=v CASE v.label[v.label_index] OF AN: PRINT,Schalter an AUS: PRINT,Schalter aus ELSE: ENDCASE END ELSE: ENDCASE END PRO test_cw base_0=WIDGET_BASE(row=2,TITLE=TEST_CW_SWITCH,XSIZE=250) VALUE={button:Schalter,label:[AN,AUS],label_index:1,$ image:[green.png,red.png]} id_ex=cw_switch(base_0,VALUE=VALUE,UNAME=TEST_CW_EX,$ COLUMN=2,FRAME=1) id_button=WIDGET_BUTTON(base_0,VALUE=done,UNAME=DONE) WIDGET_CONTROL,/realize,base_0 WIDGET_CONTROL,id_ex,set_VALUE=VALUE XMANAGER,test_cw,base_0 END Beispiel 17.10: Widgets: Compound Widgets, test cw

Das nachfolgende Beispiel zeigt die Denition des Compound Widgets.

188

KAPITEL 17. WIDGETS

FUNCTION cw_switch_event,ev child=ev.handler id_base_0 = WIDGET_INFO(child, /CHILD) WIDGET_CONTROL, id_base_0, GET_UVALUE=VALUE IF ev.id EQ $ WIDGET_INFO(ev.top,FIND_BY=BUTTON) THEN BEGIN value.label_index=value.label_index+2 IF value.label_index/2.0 EQ value.label_index/2 THEN $ value.label_index=1 ELSE value.label_index=0 WIDGET_CONTROL,WIDGET_INFO(ev.top, FIND_BY=LABEL), $ SET_VALUE=value.label[value.label_index] WIDGET_CONTROL,WIDGET_INFO(id_base_0, FIND_BY=DRAW),$ GET_VALUE=win x=READ_PNG(value.image[value.label_index],r,g,b) WSET,win & TVLCT,r,g,b & TV,x WIDGET_CONTROL, id_base_0, SET_UVALUE=value ENDIF RETURN, { ID:id_base_0, TOP:ev.top, HANDLER:0L} END FUNCTION cw_switch_get_value, id id_base_0 = WIDGET_INFO(id, /CHILD) WIDGET_CONTROL, id_base_0, GET_UVALUE=value RETURN,value END PRO cw_switch_set_value, id,value id_base_0 = WIDGET_INFO(id, /CHILD) WIDGET_CONTROL,WIDGET_INFO(id_base_0,FIND_BY=LABEL),$ SET_VALUE=value.label[value.label_index] WIDGET_CONTROL,WIDGET_INFO(id_base_0,FIND_BY=BUTTON),$ SET_VALUE=value.button WIDGET_CONTROL,WIDGET_INFO(id_base_0,FIND_BY=DRAW),$ GET_VALUE=win x=READ_PNG(value.image[value.label_index],r,g,b) WSET,win & TVLCT,r,g,b & TV,x WIDGET_CONTROL, id_base_0, SET_UVALUE=value END FUNCTION cw_switch,parent_base,value=value,uvalue=uvalue,$ _extra=extra child_base=WIDGET_BASE(parent_base,group_leader=parent_base,$ EVENT_FUNC = cw_switch_event,$ FUNC_GET_VALUE = cw_switch_get_value,$ PRO_SET_VALUE = cw_switch_set_value ) id_base_0=WIDGET_BASE(child_base,_EXTRA=extra) id_button=WIDGET_BUTTON(id_base_0,$ VALUE=value.button,/NO_RELEASE,UNAME=BUTTON) id_label=WIDGET_LABEL(id_base_0,$ VALUE=value.label[value.label_index],/ALIGN_CENTER,$ /DYNAMIC_RESIZE,UNAME=LABEL) id_draw=WIDGET_DRAW(id_base_0,XSIZE=22,YSIZE=22,UNAME=DRAW) WIDGET_CONTROL,id_base_0,SET_UVALUE=value RETURN,child_base END Beispiel 17.11: Widgets: Compound Widgets, cw switch

17.12. COMPOUND WIDGETS

189

Ein Compound Widget ben tigt im Gegensatz zu einem normalen Widget drei Mechaniso men 1. einen Event Handler f r sich selbst u 2. eine Funktion zum Auslesen des Values innerhalb des Compound Widget 3. eine Prozedur zum Setzen des Values innerhalb des Compound Widget Damit das Compound Widget auch selber Kenntnis von diesen zus tzlichen Routinen hat, a mu es dem Compound Widget in der Denition bekannt gegeben werden. Dies erfolgt in der Denition der Compound Widget Base (child base). child_base=WIDGET_BASE(parent_base,$ GROUP_LEADER=parent_base, $ EVENT_FUNC = cw_switch_event, $ FUNC_GET_VALUE = cw_switch_get_value, $ PRO_SET_VALUE = cw_switch_set_value ) Durch die Verwendung der Keywords: EVENT FUNC, FUNC GET VALUE und PRO SET VALUE werden Zugriffe auf die Widget Elemente des Compound Widget in bestimmte Funktionen umgeleitet. Der Event Handler cw switch event wird f r die Abarbeitung der events u die innerhalb des compound Widget entstehen verwendet. Wenn das VALUE auf das compound Widget mit SET VALUE gesetzt wird, erfolgt dies mit der Routine cw switch set value die durch PRO SET VALUE deniert ist. Sobald man das VALUE von dem Widget liest (GET VALUE) wird cw switch get value verwendet, das durch FUNC GET VALUE deniert ist.

Hinweis: In der IDL-Bibliothek gibt es eine Vorlage (cw tmpl.pro), die zur Erstellung von Compound Widgets verwendet werden kann.

190

KAPITEL 17. WIDGETS

Kapitel 18 Verknupfung mit anderer Software


Im Kapitel Einbettung ins Betriebssystem auf Seite 60 wurde bereits auf den Aufruf von externen Programmen hingewiesen. Der nachfolgende Abschnitt behandelt noch weitere M glichkeiten. o

18.1 SPAWN Kommando


Erzeugung eines Child Processes SPAWN, ls, result (Blocking) PRINT, result SPAWN, c_program, unit=lun ; (nicht bei der PC Version) WRITEU, lun, var1, var2 READU, lun, var3, var4 Das Programm kann auf einem anderen Host laufen: SPAWN, ssh benutzer@machine ls, result CALL EXTERNAL() siehe Advanced Development Guide Link Image siehe Advanced Development Guide Literaturhinweis, siehe 199.

191

192

KAPITEL 18. VERKNUPFUNG MIT ANDERER SOFTWARE

18.2 SPAWN Kommando bei einem C Programm


Das C Programm mu fur die Kommunikation mit dem SPAWN Kommando vorbereitet werden #include <stdio.h> #include <stdio.h> setbuf( stdout, NULL ); fread( &value1, sizeof(short), 1, stdin ); fread( feld, sizeof(float), len, stdin ); fwrite( result, sizeof(float), len, stdout );

Bitte Vorsicht : unter Alpha und anderen Workstations mit demselben Programm benutze nur SHORT INTEGER unter Sun und DEC Workstations konvertiere Floatingpoint Zahlen mit dem BYTEORDER Kommando

18.3. AUFRUF VON FORTRAN AUS IDL: CALL EXTERNAL

193

18.3 Aufruf von Fortran aus IDL: CALL EXTERNAL

abh ngig vom Betriebssytem a Laden und Aufruf von Routinen in shared libraries schneller als SPAWN (overhead weil neue Shell) Sharable library wird nur bei der ersten Referenzierung geladen Nur Ubergabe der Adresse, kein Bewegen von Daten!

Syntax: result=CALL_EXTERNAL(./image,entry,p1,...) result image entry p1 long integer (default) oder andere Typen Name der shared object library, volle Pfadangabe notwendig! entry point zu image (Name des Programms) plattformspezisch: f hrende, abschlieende Underscores u 1. Parameter Default: passed by reference

Prototyp der mit CALL EXTERNAL aufgerufenen Routine SUBROUTINE ENTRY(argc,argv) ! C artgiger Aufruf INTEGER argc,argv(*) j=LOC(argc) ! number of arguments, Annahme j=3 ! Adresse der Argumente aus argv CALL ENTRY1(%VAL(argv(1)),%VAL(argv(2)),%VAL(argv(3))) ... ! konvertiere IDL Parameter to standard Fortran ! by reference ! ENTRY1 hat keinen IDL spezifischen Code SUBROUTINE ENTRY1(array,n,sum) ! .... Eine Anwendung w re, da das IDL Programm simultan die Ergebnisse eines Fortran Proa gramms zeigt, z.B. mit Zufallszahlen erzeugte Punkte.

194

KAPITEL 18. VERKNUPFUNG MIT ANDERER SOFTWARE

Anhang A Informationen
A.1 Informationen zu IDL
Der Dokumentationssatz zu IDL umfat folgende B cher: u

Getting started with IDL Ubersicht uber alle Anwendungsbereiche fr her: IDL Basics: kurzes Tutorial u Using IDL einschlielich Mathematics Building IDL Applications IDL Sprache, Pointer, Widgets, GUI Builder IDL Reference Guide (3 Volumes) IDL Reference Guide A-M IDL Reference Guide N-Z IDL Reference Guide (Objects & Appendices) IDL HandiGuide: Alphabetische Auistung aller IDL-Funktionen IDL External Development Guide callable IDL, Linkimage, Call External Whats new in IDL 5.1 ( 5.2 / 5.3 / 5.4 / 5.5)

195

196

ANHANG A. INFORMATIONEN

Demoprogramm Ohne Lizenz lauff hig ist das Script idldemo. a Falls das Kommando-Interface zu IDL bzw. die Ober che idlde gestartet ist, a Aufruf mit demo IDL Library Im Verzeichnis /usr/local/idl/idl/lib

Beispiele /usr/local/idl/idl/examples Verzeichnis doc (Demo!) Verzeichnis demo/demosrc und misc idlhelp Unix-Script ohne IDL zu starten Newsgruppe comp.lang.idl-pvwave

A.2. PUBLIKATIONEN UND AKTIVITATEN ZU IDL IM FZJ

197

A.2 Publikationen und Aktivit ten zu IDL im FZJ a


TKI 341 Interner Bericht IDL: Informationen, Lizenzen und Installation FZJ-ZEL-IB-500300 Gormet Goniometer Measurement for Rutherford Backscattering Spectronomy and ion Channeling Experiments on Wafers up to 150 mm Durchmesser Autoren: H. Heer, M. Wagener (ZEL) Dr. B. Holl nder (ISI/IT) a Beschreibung der IDL-Software zur Datenverarbeitung im ICG Autor: Reimar Bauer, ICG I J l 3786 u ISSN: 0944-2952 http://www.fz-juelich.de/icg/icg-i/idl icglib/idl lib intro.html Im ICG entwickelte Routinen Beispiele zu den IDL-Kursen unter /usr/local/idl/FZJ FZJ interne Newsgruppe: kfa.forum.idl ZAM-Graphics-Home Page http://www.fz-juelich.de/vislab/software Auf dieser Page liegen Informationen zu IDL, unter anderem eine Beispielsammlung zu IDL. Die Beispielsammlung ndet man auch unter der URL http://www.fz-juelich.de/vislab/idl-beispiele Software-Distributions-Server des ZAM : Binaries f r AIX, IRIX, Solaris, u OSF4, HPUX, Linux

Jul-Bericht

ICG Library

FZJ Infos IDL Newsgruppe WWW- Server

zamsoft

198

ANHANG A. INFORMATIONEN

A.3 Wichtige URLs zu IDL


Wichtige Informationenen zu IDL ndet man unter folgenden URLs. http://www.rsinc.com http://www.creaso.com http://www.dfanning.com http://www.fz-juelich.de/vislab/software

A.4. LITERATUR

199

A.4 Literatur
IDL Programming Techniques, 2nd Ed. Author: David W. Fanning, Ph.D. Summary: Wisecracking author with misinformed notion of Native American religious iconography provides eclectic view of the essentials of IDL. Strong on the use of color in plots. ISBN/ISSN: 096623832X Practical IDL Programming Author: Liam E. Gumley Summary: (From the amazon.com book description) In Practical IDL Programming, Liam E. Gumley provides a solid foundation in the fundamentals of procedural programming in IDL. He presents concise information on how to develop IDL programmers that are well structured, reliable, and efcient. The example programs in the book demonstrate key concepts and provide functionality that can be applied immediately. In addition, the book offers readers practical tips and advice on IDL programming, which they would otherwise discover only after years of experience. ISBN/ISSN: 1558607005 Application Development with IDL Author: Ronn L. Kling Summary: (From the amazon.com book description) This book is written for scientists, engineers and programmers who want to combine their analytical techniques with widget interfaces. In the past we were restricted to writing procedural programs that read namelists, les, or had data entered in from a prompt. This book shows how to integrate widget interfaces with analysis code resulting in an application that will increase your productivity and quality of your results. By using a widget interface, input values can be changed and results displayed in real time without having to endlessly execute the same procedures over and over again. ISBN/ISSN: 0967127009

200

ANHANG A. INFORMATIONEN

Calling C from IDL - Using DLMs to extend your IDL code Author: Ronn Kling Summary: (from www.kilvarock.com) This 74 page book is written for anyone that wants to be able to call C programs from IDL. Using very simple examples written in C the reader will be able to create and pass scalars, arrays, strings and structures back and forth from IDL to C. The code is written for IDL version 5.3 and later but can be made to run on earlier versions with only minor modications. Nearly 1000 lines of source code are provided on the accompanying disk with a makele for all UNIX platforms, com le for VMS, Visual C++ 6.0 project for windows, and a Code Warrior 5 project for the Macintosh. This code can either be received on a 3-1/2 inch oppy or CD ISBN: 0967127025

Anhang B L sungen o
B.1 L sungen zu Kapitel: Datenstrukturen o
Die zugeh rigen Ubungen ndet man auf Seite 47. o 1. f=CREATE_STRUCT(black ,0, $ white ,1, $ red ,2, $ green ,3, $ blue ,4, $ cyan ,5, $ magenta ,6, $ yellow ,7, $ orange ,8) DEFSYSV,!F,F

2. vector1=MAKE_ARRAY(/FLOAT,10) READS,data[0:9],vector1 vector2=MAKE_ARRAY(/INT,10) READS,data[10:19],vector2 vector1=FLOAT(data[0:9]) vector2=FIX(data[10:*])

3. x=[a,b] PRINT,x x=[a[0:4],b,a[5:*]] PRINT,x

4. x=MAKE_ARRAY(2011,/INDEX,/INT) x=x[1990:2010] 201

202

ANHANG B. LOSUNGEN

5. x=CREATE_STRUCT(D,!D,P,!P,X,!X,Y,!Y)

6. v=PTRARR(3,/ALLOC) *v[0]=a *v[1]=b *v[2]=c

7. a=MAKE_ARRAY(20,2) b=MAKE_ARRAY(/INDEX,20,2) HELP,[a,b] HELP,[[a],[b]]

8. a=MAKE_ARRAY(10,10,3) HELP,REFORM(a,300) b=MAKE_ARRAY(1,10) HELP,REFORM(b)

9. a=MAKE_ARRAY(/INDEX,10,2) HELP,TRANSPOSE(a)

B.2. LOSUNGEN ZU KAPITEL: ARBEITEN MIT DATENSTRUKTUREN

203

B.2 L sungen zu Kapitel: Arbeiten mit Datenstrukturen o


Die zugeh rigen Ubungen ndet man auf Seite 57. o 1. vek = INDGEN(11) + 2000

2. a = [ 7 , 8 , 1 , 2 , 5 , 5 ] b = [ 0 , 5 , 3 , 4 ] PRINT, a[b] 7 5

3. str1=Idl ist; str2= eine starke Sprache str = str1 + str2 print,str Idl ist eine starke Sprache

4. upper=INDGEN(1,26,/BYTE)+65b lower=upper+32b result=STRING([upper,lower]) HELP,result PRINT,result upper=[A,B,C] lower=[a,b,c] result=upper+lower HELP,result PRINT,result

5. a=[-1,-1,-1,-999,-999,-1,-1,-999,-1] idx=WHERE(a EQ -999) a[idx]=999 b=[-999,-999,-999,-999,-1] idx=WHERE(b EQ -999) b[idx]=999

204 6. a=[1,1,1,2,1,2] idx=SORT(a) PRINT,idx PRINT,a[idx] PRINT,a[UNIQ(a,SORT(a))]

ANHANG B. LOSUNGEN

7. s=REPLICATE(CREATE_STRUCT(NAME=my_s,x,0.0,$ y,0.0),10) READS,TRANSPOSE(data),s idx=WHERE(s.y LT 5) result=s[idx] PRINT,result.x,result.y

B.3. LOSUNGEN ZU KAPITEL: DEFINITIONEN ZUR DATENAUSGABE

205

B.3 L sungen zu Kapitel: Denitionen zur Datenausgabe o


Die zugeh rigen Ubungen ndet man auf Seite 79. o 1. red= [255B, 0B, 0B] green=[ 0B, 255B, 0B] blue= [ 0B, 0B, 255B] TVLCT,red,green,blue a=MAKE_ARRAY(1,3,/INDEX,/BYTE) ; ???? a=REFORM([a,a,a,a,a],15) b=MAKE_ARRAY(80,VALUE=1,/BYTE) TV,a#b

2. LOADCT,6 ERASE TVLCT,red,green,blue, /GET HELP,red red[!D.TABLE_SIZE-1]=255 green[!D.TABLE_SIZE-1]=255 blue[!D.TABLE_SIZE-1]=255 TVLCT,red,green,blue a=MAKE_ARRAY(!D.TABLE_SIZE,/INDEX,/BYTE) b=MAKE_ARRAY(80,VALUE=1,/BYTE) TV,a#b

3. old_dev=!D.NAME SET_PLOT,PS DEVICE,/ISOLATIN1,FILE=my_plot.ps XYOUTS,0.2,0.5,Heute lernen wir IDL!!,CHARSIZE=2 DEVICE,/CLOSE SET_PLOT,old_dev ; UNIX SPAWN,lpr -Pdrucker my_plot.ps ; MICROSOFT SPAWN,lpr -Pdrucker -Sserver my_plot.ps

206

ANHANG B. LOSUNGEN

B.4 L sungen zu Kapitel: Programme zur Anwendungso Darstellung


Die zugeh rigen Ubungen ndet man auf Seite 115. o 1. ang = 2*!PI*INDGEN(360,/FLOAT)/359. x = COS(ang) y = SIN(ang) (a) ohne Achsen PLOT,x,y,xstyle=4,ystyle=4 (b) Achsen in Schwarz, Daten in Blau TEK_COLOR PLOT,x,y,/nodata OPLOT,x,y,color=4,psym=1 (c) nur die positiven Y-daten in Rot und die negativen in Blau TEK_COLOR PLOT,x,y,/nodata OPLOT,x,y,color=2,min_value=0 OPLOT,x,y,color=4,max_value=0 (d) Die Achsen sollen zentrisch angeordnet werden LOADCT,0 ERASE TEK_COLOR AXIS,0,/SAVE AXIS,0,/yaxis,/SAVE OPLOT,x,y,color=2 (e) Der Kreis soll als Kreis dargestellt werden.

1. L sung o position=[0.1,0.1, 0.5,0.5] WINDOW,xsize=480,ysize=480 PLOT,x,y,position=position 2.L sung, Papier ist nicht quadratisch. o WINDOW,xsize=500,ysize=710 paper_width =30. paper_height =21. plot_width =10. plot_height =10. xs=plot_height/paper_height ys=plot_width/paper_width position=[0.2,0.2,0.2+xs,0.2+ys] PLOT,x,y,position=position WSHOW,0 END

B.4. LOSUNGEN ZU KAPITEL: PROGRAMME ZUR ANWENDUNGS-DARSTELLUNG 2. CONTOUR, a, NLEVLES=15,/FILL} CONTOUR, a, NLEVLES=15,/FOLLOW,/OVER}

207

VALUES=[6,12.5,18.7,24] CONTOUR,a,LEVELS=values,/FOLLOW,C_Color=BINDGEN(4)*50+50}

208

ANHANG B. LOSUNGEN

B.5 L sungen zu Kapitel: Programmierung und Kompio lation


Die zugeh rigen Ubungen ndet man ab Seite 157. o 1. CALL |test1 |test2 |test3 _______________________________________________________ PRINT, testX( ) | 0 | 0 | 0 _______________________________________________________ PRINT, testX(minimum=0) | 0 | 0 | 1 _______________________________________________________ PRINT, testX(minimum=10) | 1 | 0 | 1 _______________________________________________________ PRINT, testX(minimum=-10) | 1 | 0 | 1 _______________________________________________________ mv=0 & PRINT, testX(minimum=mv) | 0 | 1 | 0 _______________________________________________________ mv=10 & PRINT, testX(minimum=mv)| 1 | 1 | 1 _______________________________________________________ PRINT, testX(minimum=mv2) | 0 | 1 | 0 _______________________________________________________

Ubung mit positionalen Parametern

CALL | test1 | test2 |test3 ___________________________________________________ PRINT, testX( ) | 0 | 0 | 0 ____________________________________________________ PRINT, testX(0) | 0 | 0 | 1 ____________________________________________________ PRINT, testX(10) | 1 | 0 | 1 ____________________________________________________ PRINT, testX(-10) | 1 | 0 | 1 ____________________________________________________ mv=0 & PRINT, testX(mv) | 0 | 1 | 0 ____________________________________________________ mv=10 & PRINT, testX(mv) | 1 | 1 | 1 ____________________________________________________ PRINT, testX(mv2) | 0 | 1 | 0 ____________________________________________________

B.5. LOSUNGEN ZU KAPITEL: PROGRAMMIERUNG UND KOMPILATION 2. PRO mysurface,data,xgrid,ygrid,CONT=contour,COLOR=col ON_ERROR,1 ;return to main level and stop when error detected !P.CHARSIZE=1.5 IF (N_ELEMENTS(col) EQ 0) THEN col=!D.TABLE_SIZE-1

209

CASE N_PARAMS() OF 0: MESSAGE,$ mysurface must be called with one or three parameters 1: BEGIN SHADE_SURF,data,/SAVE SURFACE,data,/NOERASE,COLOR=col IF KEYWORD_SET(contour) THEN $ CONTOUR,data,/T3D,ZVALUE=1,NLEVELS=10,/NOERA END 3: BEGIN SHADE_SURF,data,xgrid,ygrid,/SAVE SURFACE,data,xgrid,ygrid,/NOERASE,COLOR=col IF KEYWORD_SET(contour) THEN $ CONTOUR,data,xgrid,ygrid,/T3D,ZVALUE=1,/NOERA END ELSE: PRINT,wrong number of arguments ENDCASE END

3. FUNCTION my_type,var1,var2 result=MAKE_ARRAY(TYPE=SIZE(var1,/TYPE),N_ELEMENTS(var2)) ; Anzahl Elemente und Typ festgelegt result[*]=var2 IF (SIZE(var2,/DIM))[0] EQ 0 THEN RETURN,result[0] $ ELSE RETURN,result END

4. FUNCTION repstr,txt,char,new_char b=BYTE(txt) ix=WHERE(b EQ (BYTE(char))[0],count) IF count EQ 1 THEN BEGIN b[ix]=BYTE(new_char) ENDIF RETURN,STRING(b) END

210 5. PRO sms_t9


file=sms.txt OPENR,lun,file,/GET_LUN sz=(FSTAT(lun)).SIZE data=MAKE_ARRAY(/BYTE,sz) READU,lun,data FREE_LUN,lun

ANHANG B. LOSUNGEN

IF !version.os_family EQ Windows THEN $ data=STRSPLIT(STRING(data),STRING(10b)+ $ STRING(13b),/EXTRACT) $ ELSE $ data=STRSPLIT(STRING(data),STRING(10b),/EXTRACT) n=N_ELEMENTS(data) FOR i=0,n-1 DO BEGIN x=STRCOMPRESS(STRSPLIT(data[i],:,/EXTRACT),/REMOVE_ALL) IF N_ELEMENTS(worte) EQ 0 THEN worte=x[0] $ ELSE worte=[worte,x[0]] IF N_ELEMENTS(code) EQ 0 THEN code=x[1] $ ELSE code=[code,x[1]] ENDFOR small=BYTE(code) ix=INDGEN(13)*2 small=STRING(small[ix,*]) ix =SORT(LONG(small)) worte=worte[ix] code=code[ix] small=small[ix] key= count_ix=0 z=1 PRINT,Nur immer ein Zeichen 2 bis 9 eingeben. PRINT,Mit 0 zwischen Worten whlen. # beendet die Eingabe WHILE key NE # DO BEGIN IF key EQ 0 THEN key = SEARCH WHILE key EQ SEARCH DO BEGIN PRINT,Auswahl: PRINT,result IF key NE 0 THEN READ,key IF key EQ 0 AND z LT count_ix THEN BEGIN result=worte[ind[ix[z]]] z=z+1 PRINT,result IF key EQ 0 THEN key = SEARCH ENDIF IF z GE count_ix THEN z=0 ENDWHILE IF key NE # THEN BEGIN READ,key

B.5. LOSUNGEN ZU KAPITEL: PROGRAMMIERUNG UND KOMPILATION

211

IF key NE 0 THEN BEGIN IF key NE # THEN $ IF N_ELEMENTS(test) EQ 0 THEN test=key $ ELSE test=test+key IF STRLEN(test) GT 1 THEN BEGIN ind=WHERE(STRLEN(STRMID(small,0, $ STRLEN(test))) EQ STRLEN(test),count_ind) ix=WHERE(STRPOS(small[ind],test) EQ 0 ,count_ix) IF count_ix EQ 0 THEN BEGIN key=# PRINT,Wort nicht bekannt PRINT,Eingabe Modus: PRINT,Bitte Wort mit den Zeichen A bis Z+ $ in Datei speichern wort= READ,wort sms,wort RETURN ENDIF ELSE BEGIN IF count_ix NE 0 THEN result=worte[ind[ix[0]]] ENDELSE ENDIF IF N_ELEMENTS(result) EQ 1 THEN PRINT, result ENDIF ENDIF ENDWHILE PRINT, PRINT,Ergebnis: ,result END PRO sms,input IF N_ELEMENTS(input) EQ 1 THEN $ phrase = STRTRIM(STRUPCASE(input),2) $ ELSE $ phrase=DIES IST EIN TEST arr=STRSPLIT(phrase, ,/EXTRACT) nn=N_ELEMENTS(arr) FOR ii=0,nn-1 DO BEGIN text=arr[ii] d={a0: ,$ a1:.,$ a2:[A,B,C],$ a3:[D,E,F],$ a4:[G,H,I],$ a5:[J,K,L],$ a6:[M,N,O],$ a7:[P,Q,R,S],$ a8:[T,U,V],$ a9:[W,X,Y,Z]}

212
data=BYTE(text)

ANHANG B. LOSUNGEN

n=N_ELEMENTS(data) FOR i=0,n-1 DO BEGIN x=0 count=0 WHILE count EQ 0 AND x LT 10 DO BEGIN pos=WHERE(d.(x) EQ STRING(data[i]),count) x=x+1 ENDWHILE IF N_ELEMENTS(result) EQ 0 THEN $ result=STRTRIM(STRING(x-1),2)+$ STRTRIM(STRING(pos+1),2)+ $ ELSE $ result=result+STRTRIM(STRING(x-1),2)+ $ STRTRIM(STRING(pos+1),2)+ ENDFOR IF N_ELEMENTS(sms) EQ 0 THEN sms=text+ : + $ TEMPORARY(result) $ ELSE $ sms=[sms,text+ : +TEMPORARY(result)] ENDFOR file=sms.txt IF FILE_TEST(file) EQ 1 THEN append=1 OPENW,lun,file,/GET_LUN,APPEND=append PRINTF,lun,TRANSPOSE(sms) FREE_LUN,lun OPENR,lun,file,/GET_LUN sz=(FSTAT(lun)).SIZE data=MAKE_ARRAY(/BYTE,sz) READU,lun,data FREE_LUN,lun IF !version.os_family EQ Windows THEN $ data=STRSPLIT(STRING(data),STRING(10b)+ $ STRING(13b),/EXTRACT) ELSE $ data=STRSPLIT(STRING(data),STRING(10b),/EXTRACT) data=data[UNIQ(data,SORT(data))] OPENW,lun,file,/GET_LUN PRINTF,lun,TRANSPOSE(data) FREE_LUN,lun PRINT,TRANSPOSE(data) END

Index
EXTRA, 154 3D Transformationen, 101 64-bit Long, 24 64-bit unsigned Long, 24 ALLOCATE HEAP, 40 ANNOTATE, 114 APPEND, 127 ARG PRESENT, 152 Array, 26 Arrayindizierung, 28 ASSOC, 132 Ausf hrbare Kommandos u .COMPILE, 13, 186 .CONTINUE, 13 .EDIT, 13 .FULL RESET SESSION, 165 .GO, 13 .RESET SESSION, 165 .RNEW, 13 .RUN, 13 .SKIP, 13 .STEP, 13 .TRACE, 13 Auswahl eines Fonts, 66 AXIS, 83, 87, 113 BAR PLOT, 90 Batch Verarbeitung, 140 BEGIN, 149 BOX CURSOR, 123 BREAKPOINT, 13 by reference, 144 by value, 144 Byte, 24 BYTSCL, 119 CALL EXTERNAL, 191 CASE, 150 CATCH, 167, 168 CD, 17 CLOSE, 128 213 Command Line Interface, 11 COMMON, 155, 179 COMPILE OPT, 54 compiling, 9 Complex, 24 CONGRID, 118 CONTOUR, 76, 94, 97, 98, 100, 113 CREATE STRUCT, 33 CURSOR, 106, 112 CW Base, 189 CW ANIMATE, 111 cw tmpl, 189 DATA, 65 debug, 161 DECIMATE, 114 DEFINT32, 54 DEFSYSV, 22 DELVAR, 52 DEMO, 114 DEVICE, 65, 69, 74, 77 DIALOG MESSAGE, 168 DIALOG PICKFILE, 133 Double Complex, 24 Doubleprecision, 24 Drucken, 77 Einstellungen, 3 ELSE, 149 emacs, 8 EOF, 133 ERASE, 83, 113, 120 EVENT FUNC, 189 EXECUTE, 156 exit, 11 F77 UNFORMATTED, 127 Fehlerbalken, 91 Fehlersuche, 161 FFT, 121 FILE CHMOD, 134 FILE DELETE, 134

214 FILE EXPAND PATH, 134 FILE MKDIR, 134 FILE SEARCH, 133, 134 FILE TEST, 134 FILE WHICH, 134 Floatingpoint, 24 FLTARR, 26 FOR, 150 FORMAT, 131 FORWARD FUNCTION, 147 FREE LUN, 128, 132 FSTAT, 133, 134 FUNC GET VALUE, 189 FUNCTION, 146 Funktion, 143 GET LUN, 127, 128 GOTO, 151 Hardware Fonts, 67 Hauptprogramm, 143 HEAP GC, 44 HELP, 25, 33, 41, 61, 166 Hershey Fonts, 67 Hilfe zu IDL, 15 idl, 11 idl -rt, 14 IDL STARTUP, 3 idlde, 7 idlhelp F1 , 15 ?, 15 IF, 149 IMAGE CONT, 114 INDGEN, 27, 50 Indizierung von Variablen, 24 INTARR, 26 Integer, 24 JOURNAL, 140 KEYWORD SET, 152 Konversionsroutinen, 25 FIX, 25 FLOAT, 25 STRING, 25 Link Image, 191 LOADCT, 68 Long, 24 MAKE ARRAY, 26, 27, 41 MAKE ARRRAY, 32 MAP CONTINENTS, 104 MAP GRID, 104 MAP IMAGE, 105 MAP SET, 104106 MAX, 55 MEDIAN, 121 MESSAGE, 169 MIN, 55 missing values, 96 MODIFYCT, 68

INDEX

N ELEMENTS, 152 N PARAMS, 152 N TAGS, 37 Namenskonvention fur Variablen, 23 NODATA, 83 NOERASE, 83, 85 NORMAL, 65 Nullpointer, 38 ON ERROR, 167 ON IOERROR, 167 Online Hilfe, 15 OPENR, 127, 128 OPENU, 127 OPENW, 127 Operatoren , 118 , 49 , 118 , 49 # , 49 ## , 49 AND, 49 EQ, 49 GE, 49 GT, 49 LE, 49 LT, 49 NE, 49 NOT, 49 OR, 49 XOR, 49 OPLOT, 85, 86, 113

INDEX Optimierung der Laufzeit eines IDLProgrammes, 53, 54 OVERPLLOT, 83 Parameter Keyword, 19 Positional, 19 PLOT, 18, 8486, 113 PLOTS, 83, 88, 106, 113 POINT LUN, 133 Pointer, 38 Array, 45 verkettete Pointer Liste, 45 Polarplot, 91 POLYFILL, 83, 88, 113 POLYSHADE, 108 POSITION, 73 Positionieren von Zeichen, 66 PostScript, 70 Preferences, 9 PRO, 146 PRO SET VALUE, 189 PROFILER, 163 Prozedur, 143 PS SHOW FONTS, 67 PTR FREE, 39, 44 PTR NEW, 39, 40 PTR VALID, 39, 41, 44 PTRARR, 39 RANDOMU, 99 READ ASCII, 135, 136 READ BINARY, 136 READ IMAGE, 136 READF, 129131 READS, 31, 32 READU, 129, 132 REBIN, 118 REFORM, 29, 50 REGION GROW, 123 REPEAT, 151 REPLICATE, 28, 32, 37 reservierte Worte, 23 RESOLVE ALL, 14, 186 RESOLVE ROUTINE, 156 RESTORE, 38, 62, 135 RETAIN, 74 RETALL, 165 RGB, 69 Runtime, 14

215

SAVE, 14, 38, 62, 135, 186 SAVE,/ROUTINES, 14 SCALE3, 103, 108 Scatter-Plot mit Zufallszahlen, 92 Set Breakpoint, 161 SET PLOT, 70, 77 SHADE SURF, 99, 100, 113 SHADE VOLUME, 108 SHOW3, 114 SIZE, 25, 28 Skalar, 25 SLICER3, 109, 114 SMOOTH, 121 SOBEL, 121 SORT, 55 SPAWN, 60, 191, 192 Spezikation, 23 SQL, 1 Start-Up, 3 Step, 161 STRCOMPRESS, 31 STRICTARR, 54 STRING, 31 String, 24 Strings, 31 STRJOIN, 31 STRLEN, 31 STRLOWCASE, 31 STRMID, 31 STRPOS, 31 STRPUT, 31 STRSPLIT, 31 STRTRIM, 31 STRUPCASE, 31 Suchpfad, 17 Suchreihenfolge von IDL Programmen, 17 SURFACE, 76, 94, 101, 113 SURFR, 102 SWITCH, 150 System-Variablen !DIR, 21 !DPI, 21 !DTOR, 21 !P.MULTI, 71, 72 !P.POSITION, 71, 73

216 !PATH, 17, 21 !PI, 21 !QUIET, 20 !RADEG, 21 !VERSION, 21 T3D Keyword, 100102 T3D Prozedur, 103 TAG NAMES, 37 TEK COLOR, 68, 69 TEMPORARY, 51, 52 TRANSPOSE, 29 TRIANGULATE, 107 TRIGRID, 107 TV, 105, 108, 119121 TVCRS, 112 TVLCT, 68 TVRD, 121 TVSCL, 118, 119, 121 Typ, 23 UNIQ, 56 Unsigned Integer, 24 Unsigned Long, 24 USERSYM, 113 Waveletts, 1 WDELETE, 74 WHERE, 55, 118 WHILE, 151 WIDGET BASE, 172, 173 WIDGET BUTTON, 172, 173, 179 WIDGET CONTROL, 175, 178 WIDGET DRAW, 172 WIDGET DROPLIST, 172 WIDGET INFO, 175, 178, 180 WIDGET LABEL, 172 WIDGET LIST, 172 WIDGET SLIDER, 172 WIDGET TABLE, 172 WIDGET TEXT, 172 WINDOW, 74, 121 WRITEF, 129 WRITEU, 129, 132 WSET, 74 WSHOW, 74 XFONT, 67, 114 XINTERANIMATE, 111 XLOADCT, 68, 114 XMANAGER, 175, 176, 186 XPALETTE, 68, 114 XREGISTERED, 176 XSURFACE, 114 XVAREDIT, 114 XVOLUME, 114 XYOUTS, 83, 89, 113 Z-Buffer, 75, 76 Zeichen !, 20 ( ), 20 *, 20, 38, 39 +, 31 ., 20 :, 20 ;, 20 ?, 20 [ ], 20, 28, 29 $, 20, 60 &, 20 @, 20 , 20, 33 Zeichenkettenvariablen, 31 ZOOM, 114

INDEX

Katalog der Benutzerhandbucher des ZAM (Stand: 08.08.2002)


Eine aktuelle und nach Sachgebieten eingeteilte Liste der Benutzerhandb cher und Techu nischen Kurzinformationen des ZAM erhalten Sie in der Technischen Kurzinformation TKI-0000 und auf dem WWW-Server des Forschungszentrums unter der URL: <http://www.fz-juelich.de/zam/docs/topic/topic d.html>. BHB-0034 BHB-0063 BHB-0092 BHB-0095 BHB-0096 BHB-0097 MTA-Kurs: PL/I Vorlesungsschrift MTA-Kurs: Einf hrung in Datenverarbeitung - Materialien zum Kurs u Quantum Chemistry Program Exchange Einf hrung in die Programmiersprache C u GR - Software GKS und CGM Anwendungen inklusive GR-Software auf den zentralen Rechnern BHB-0101 Einf hrung in die Benutzung des zentralen AIX u BHB-0102 REDUCE Users Manual BHB-0105 Kurze Einf hrung in die formale Logik u BHB-0109 Users Manual for MOLPRO BHB-0110 XL-Fortran unter AIX auf einer RISC/6000 - Einf hrung, Hilfsmittel, Erfahu rungen BHB-0111 Statistische Datenanalyse mit SAS und BMDP BHB-0112 TEX im Forschungszentrum J lich u BHB-0114 GNUPLOT - An Interactive Plotting Program BHB-0115 GNU Emacs Manual BHB-0117 XV - Interactive Image Display for the X Window System BHB-0118 ImageMagick - Users Guide BHB-0119 Das Graksystem XGraf BHB-0120 GLI - Graphics Language Interpreter - Reference Manual BHB-0121 Free recode, version 3.5d - The character set converter, Edition 3.5d BHB-0122 Tcl and the Tk Toolkit, Part 1 + 2 BHB-0123 Tcl and the Tk Toolkit, Part 3 + 4 BHB-0124 Programmieren in Fortran 90/95 - Vorlesungsskript BHB-0125 Xhibition - Ein Werkzeug zur Erstellung eines Men -Systems auf der Basis u von X-Window BHB-0129 xmgr (ACE/gr) Users Manual BHB-0130 Installationshinweise zur Datensicherung und Archivierung mit TSM/ADSM f r Workstations und PCs im JuNet u BHB-0133 Programmieren in Fortran 90/95 - Ubungsaufgaben BHB-0134 LaTeX - eine Einf hrung und ein bichen mehr u BHB-0135 LaTeX - Fortgeschrittene Anwendungen oder: Neues von den Hobbits BHB-0136 Forms Library - Toolkit zur Erstellung graphischer Benutzerober chen a BHB-0138 The Cray Systems at Research Centre J lich - Volume 1 - Handling of Jobs u and Data BHB-0139 The Cray Systems at Research Centre J lich - Volume 2 - Programming Enu vironment and Application Software BHB-0140 Programmierung in C - Vorlesungsskript BHB-0141 Pretty Good Privacy (pgp) Bedienungsanleitung BHB-0142 BALSAC - Users Guide and Manual BHB-0144 Gsharp - Tutorial, Users Guide, and Applications

BHB-0145 BHB-0146 BHB-0147 BHB-0148 BHB-0149 BHB-0150 BHB-0152 BHB-0153 BHB-0154 BHB-0155 BHB-0156 BHB-0157 BHB-0158 BHB-0159 BHB-0160 BHB-0161 BHB-0162 BHB-0167

Gsharp - Reference Guide, Part 1 Gsharp - Reference Guide, Part 2 GIMP - Das ofzielle Benutzerhandbuch, Teil 1 GIMP - Das ofzielle Benutzerhandbuch, Teil 2 GIMP - Das ofzielle Benutzerhandbuch, Teil 3 Windows NT V4.0 Workstation - ein Installationsprotokoll Introduction To Scilab - Users Guide Vampir 2.0 - Users Manual Programming in C++ - Part I Programming in C++ - Part II NWChem User Documentation Perl5.005 Handbuch (Teil I) Perl5.005 Handbuch (Teil II) DDD - Data Display Debugger SSH-WIN PC-Benutzerhandbuch Grace - ein graphisches Analyse-Tool f r 2D Daten u MOLMOL Manual Eine Einf hrung in Scilab u

Das könnte Ihnen auch gefallen