Implementationsbeschreibung

Komponente: Diffraktometrie/Reflektometrie Ablauf und Einstellungen
Jens Ullrich, Stephan Berndt
Status: fertig

Gliederung

1. Einleitung
2. Ausgangssituation
3. Fehler
4. Kommentierung der Quellen
5. Formatierung der Quellen mit 'astyle'
6. Erweiterungen

1. Einleitung

Der folgende Abschnitt dieses Dokument stellt den vorgefundenen Zustand der Quellen dar. Sie werden auf das Vorkommen von totem Code, die Wahl der Bezeichner sowie die vorgefundene Kommentierung hin untersucht. Im dritten Kapitel werden die Fehler bezüglich ihres Auffindens und ihrer Art näher untersucht. Im folgenden Abschnitt wird das Vorgehen bei der Kommentierung beschrieben und welche Werkzeuge dazu benutzt wurden. Der fünfte Teil beschäftigt sich mit der Formatierung der Quellen mit 'astyle' bzgl. unserer Projekt-Vereinbarungen. Im letzten Abschnitt geht es um die vorgenommenen Erweiterungen mit einer tabellarischen Darstellung zum Umfang der hinzugekommenen, entfernten bzw. veränderten Quelltextzeilen.

Der Gesamtumfang der zu kommentierenden Quellen lag bei ca. 6000 Quelltextzeilen. Die vorgefundenen Quellen sollten in ihrer Funktionalität nicht verändert werden, auch vorhandene Kommentare sollten erhalten bleiben. Sofern sie nicht aussagekräftig waren, sollten sie auskommentiert werden und durch einen eigenen Kommentar ersetzt werden. Die Kommentierung umfaßte die folgenden Dateien:

LOC

Datei

Bemerkungen

1223

m_scan.cpp

.

3232

m_arscan.cpp

.

324

m_steerg.cpp

nur die Klassen TAreaScanCmd und TScanCmd

791

m_curve.cpp

.

520

Headerdateien

m_xscan.h, m_curve.h, m_data.h, m_steerg.h

2. Ausgangssituation

Toter Code

Die kommentierten Quellen enthalten mehr als 300 LOC toten Code.

Die folgende Tabelle enthält implementierte Methoden, die nicht benutzt werden.


LOC

Datei

Klasse

Methode

4

m_scan.cpp

TScan

SaveDataBase()

2

m_xscan.h

TScan

GetArgumentMin()

2

m_xscan.h

TScan

GetArgumentMax()

42

m_arscan.cpp

TAreaScan

LoadReport()

2

m_xscan.h

TAreaScan

GetArgumentMin()

2

m_xscan.h

TAreaScan

GetArgumentMax()

19

m_curve.cpp

TCurve

ValueAdd(float)

24

m_curve.cpp

TCurve

DeleteUnderGround()

46

m_curve.cpp

TCurve

DeleteFlanks()

1

m_curve.h

TCurve

SetLastPoint()

2

m_curve.h

TCurve

GetPP()

2

m_curve.h

TCurve

GetLastId()

41

m_curve.cpp

TCurve

GetPeakProperties()

20

m_curve.cpp

TCurve

Save()

2

m_curve.h

TCurve

GetId()

71

m_curve.cpp

TCurve

GetReflection()

18

m_curve.cpp

TCurve

GetGravityCenter()

2

m_curve.h

TDataBase

Reset()

2

m_curve.h

TDataBase

GetFault()

Weiterhin gibt es Quellcode-Abschnitte, die nur durchlaufen werden, wenn eine Variable einen bestimmten Wert annimmt, sie diesen Wert aber nie annimmmt. Der folgende Abschnitt aus der Datei m_arscan.cpp zeigt einen case-Zweig, der nicht durchlaufen wird. Die Variable eSaveFormat nimmt den Wert ShiftedStandard nie an. In diesem Beispiel sind das 36 LOC toter Code.

  switch ( eSaveFormat )
  {
                //! fehler (nur Standard moeglich)
         case ShiftedStandard:
                // 1. Scan ist noch nicht mit gueltigen Daten belegt
                if ( bSaveContinuous && ( 1 == lpDBase->GetCNumber() ) )
                  break;
                buf = new char [ 8 * 3000 ];
                for ( nCIdx = 0; nCIdx < lpDBase->GetCNumber(); nCIdx++ )
                {
                  sprintf( buf, "Scan %d von %d schreiben.", nCIdx + 1,
                                lpDBase->GetCNumber() );
                  SetInfo( buf );
                  TheCurve = lpDBase->GetCurve( nCIdx );
                  TheCurve->SetPP( 0 );
                  TheCurve->FastOpen();
                  numbercolumn = GetAdditionalColumns() + MainCurve->GetPNumber();
                  for ( idx = 0; idx < numbercolumn; idx++ )
                  {
                         if ( GetShift( nCIdx ) <= idx )
                                if ( TheCurve->FastPGet( d0, fIntensity, d2 ) )
                                  if ( 0.0 != fIntensity )
                                  {
                                         short pp = 3 - log10( fIntensity );
                                         strcpy( fmt, "%.3f " );
                                         if ( pp < 0 ) pp = 0;
                                         fmt[ 2 ] = ( char ) ( '0' + pp );
                                         sprintf( buf, fmt, fIntensity );
                                         goto Ready2;
                                  }
                         sprintf( buf, "0 " );
Ready2:
                         _lwrite( hFile, ( LPSTR ) buf, strlen( buf ) );
                  }
                  TheCurve->FastClose();
                  strcpy( buf, EOL );
                  _lwrite( hFile, ( LPSTR ) buf, strlen( buf ) );
                }
                delete[] buf;
                break;

Bezeichner

Die Wahl der Bezeichner für die Klassen, ihre Methoden und Attribute sind meistens aussagekräftig und mitunter hilfreich beim Verstehen der Quellen. Bei Attributen ist meist ein Buchstabe vorangestellt, der den Typ verdeutlicht, z.B. ist bFileChanged eine Bool'sche Variable. Die Bezeichnungen der Klassen-Methoden geben meist schon einen Hinweis auf ihre Funktion, z.B. rButtonDown für das Kommando 'Rechte Maustaste gedrückt' oder UpdateFile aktualisiert die Datei mit dem gerade verwendeten Dateinamen. Es werden durchweg englischsprachige Bezeichnungen gewählt.

Kommentare

Die Quellen enthalten so gut wie keine Kommentare. Die vorhandenen Kommentare sind für das Verstehen der Quellen oft unbrauchbar. Die Kommentare sind verschiedensprachlich gehalten. Es gibt sowohl englischsprachige als auch deutschsprachige Kommentare.

Weitere Bemerkungen

  • Das Konzept, alle Ausgaben in Englisch und in Deutsch anzubieten, wurde nicht konsequent verfolgt. Teilweise gibt es nur deutsche Ausgaben (z.B. in Messageboxen oder in der Statuszeile).
  • In der Datei m_arscan.cpp sind 2 Funktionen (SetHKL() und GetHKL()) implementiert, die aber durch mehrere Programmfunktionen genutzt werden. Sie waeren daher besser in der m_main.cpp aufgehoben.

  • 3. Fehler

    Je komplexer ein Programm ist, desto fehleranfälliger ist es. Dies bestätigt sich auch beim XCTL-Programm.
    Schon aufgrund der starken Interaktion mit fast allen Softwarekomponenten (wie Motoren, Detektoren, Steuerung ,Darstellung ...) trifft das auf den Programmteil 'Diffraktometrie/Reflektometrie' besonders zu.
    Die vollständige Fehlerliste zum Use-Case 'Diffraktometrie/Reflektometrie' ist hier zu finden.

    Welche Arten von Fehlern wurden gefunden?

    Die vorgefundenen Fehler lassen sich in verschiedene Kategorien einordnen. Da wäre zum einen die Kategorie von Fehlern, die aus fehlerhaften Eingaben in den diversen Dialogen resultiert. Dieser häufig auftretende Fehler war einfach zu finden und relativ leicht zu beheben, da die Überprüfung der Dialogeingaben zumeist in der Methode ‚CanClose’ der jeweiligen Dialogboxklassen stattfindet.
    Diese Fehler wurden zu einem frühen Zeitpunkt entdeckt und korrigiert, um auch die Anzahl der Folgefehler zu verringern.
    Eine weitere Kategorie bilden die Fehler, die mit dem Speichern bzw. Nachladen von Werten zu tun haben. Dabei reichen die Fehler vom unterlassenen Einlesen wichtiger Parameter bis zum Benutzen von Dateizugriffsmethoden beim Speichern und Nachla-den, die nicht vollständig miteinander kompatibel sind.

    Eine weitere größere Kategorie sind die Fehler, die mit dem eigentlichen Scanvorgang zu tun haben. Auf diesem Gebiet gibt es aber auch zahlreiche Vermischungen und Überschneidungen mit anderen Gebieten (Speichern, Darstellung, usw.). Grundsätzlich kann man sagen, daß die Fehler aus diesem Gebiet am schwierigsten aufzudecken und deren Ursachen sehr schwer zu lokalisieren waren. Grund dafür ist unter anderem die starke Interaktion zwischen den Klassen sowie das verstärkte Versenden von Komman-dos  zwischen den Komponenten und dem daraus resultierenden, sehr schwer nachvoll-ziehbaren Programmablauf. Aber auch der Zugriff auf Motoren, Detektoren und weitere Komponenten erschwerte die Lokalisierung von Fehlerursachen in diesem Gebiet. So trat häufiger das Problem auf, das für einen uns mitgeteilten Fehler nicht alle Vorbe-dingungen bekannt waren und so das Reproduzieren des Fehlers auf Anhieb nicht möglich war.

    Wie wurden die Fehler gefunden?

    Die meisten Fehler sind während des Prozesses der Einarbeitung in die Quellen durch Tests mit Hilfe der simulierten Hardware gefunden worden. In diesem Zusammenhang waren die Möglichkeiten der Simulation von Hardware (siehe Kapitel 6.1) von enormem Vorteil für das Auffinden, Lokalisieren und Reproduzieren von Fehlern.
    Auf Fehler wurden wir aber auch von den Physikern bzw. anderen Projektgruppen aufmerksam gemacht (z.B. Frau Richter, Herr Panzner).
    Beim Auffinden der Fehler gab es 2 unterschiedliche Vorgehensweisen. Im Falle eines uns bekannten Fehlers, der uns mitgeteilt wurde bzw. der uns bei Simulationen aufgefallen war, wurde dieser über den gerade aktiven Quelltext zurück verfolgt und so der Fehler im Quelltext lokalisiert. Dieses Vorgehen war aber z.B. bei Folgefehlern oder Seiteneffekten wegen der problematischen Reproduzierbarkeit sehr aufwendig.
    Ein zweites Vorgehen war das Auffinden und Beheben von offensichtlichen Fehlern während der Phase der Einarbeitung und Kommentierung der Quellen. In dieser Phase wurde jede Funktion und Methode aller für unseren Use-Case wichtigen Klassen be-trachtet, nachvollzogen und kommentiert, so daß in diesem Zusammenhang auch Fehler in der Programmierung auffielen. Die Art der Fehler, die hierbei gefunden wurden, waren also eher auf schlechten Programmierstil zurückzuführen und weniger auf Fehler in der Umsetzung der Wünsche der Physiker in das Programm.

    Zu welchem Zeitpunkt wurden Fehler gefunden?

    Ein großer Teil der Fehler wurde zu einem frühen Zeitpunkt während der Phase der Ein-arbeitung in die Quellen bzw. die Kommentierung der Quellen gefunden. Dies betrifft in besonderem Maße die Fehler, welche auf fehlende bzw. ungenügende Kontrolle der in den Dialogboxen eingegebenen Werte beruhen. Aber auch kleinere Fehler aus allen anderen Kategorien wurden gefunden. In dieser Phase wurden vor allem Fehler, die auf eine einzelne Methode oder Funktion begrenzt waren, gefunden.
    Schwierigere Fehler waren solche, die auf mehrere Methoden verteilt waren bzw. erst durch die Interaktion zwischen verschiedenen Methoden zu Fehlern führten. Diese Art von Fehlern waren von uns erst zu lokalisieren, nachdem ein gewisses Verständnis für die Quellen und für die Abläufe und Interaktionen in ihnen vorhanden war. Teilweise wurden solche Fehler erst in der Phase der Programmierung der Erweiterungswünsche entdeckt, also zu einem Zeitpunkt, zu dem wir eigentlich der Meinung waren, die Fehlerbehebung abgeschlossen zu haben. Auch zum jetzigen Zeitpunkt (nach dem Ende der Implementation der Erweiterungen) kann die Fehlerbehebung nicht als abgeschlos-sen betrachtet werden.

    Welche Schwierigkeiten traten auf?

    Besondere Schwierigkeiten traten bei Fehlern auf, die sich nicht auf den reinen Teil der Diffraktometrie/Reflektometrie begrenzen ließen. In diesen Fällen war es teilweise nötig, sich genauer in die Methoden fremder Klassen wie z.B. ‚TMotor’ oder ‚TDevice’ einzuarbeiten. Dieser Prozess war auch durch Nachfragen und Gespräche bei den für diese Programmteile zuständigen Projektgruppen oftmals nicht zu umgehen.
    Eine weitere Schwierigkeit stellte das fehlende exakte physikalische Hintergrund-wissen dar. So waren einige Fehler, die korrekt und fehlerfrei implementiert waren, erst durch Gespräche mit den Physikern als Fehler zu entlarven (z.B. Absorber).
    Ungenügende Information über die genauen Vorbedingungen und Einstellungen, die zu einem Fehler führten, bilden eine weitere Schwierigkeit bei Fehlern, die uns von den Physikern oder anderen Personen mitgeteilt wurden. Um eine Fehlerursache finden zu können und außerdem die Richtigkeit der Korrektur eines Fehlers testen zu können, ist eine Reproduzierbarkeit unerlässlich. Die Fehler beruhen aber oft auf Spezialfällen, bei denen jeder veränderte Ausgangsparameter zu einem anderen Ergebnis führen kann.

    Bewertung der Fehler und ihrer Ursachen:

    Bei dem von uns betrachteten Quellcode entstand oft der Eindruck, daß sich das Programm noch mitten in der Entwicklungsphase befindet. Die Art der Fehler verstärkte diesen Eindruck noch, denn der Großteil der Fehler resultiert auf scheinbaren Flüchtigkeitsfehlern bzw. nur ansatzweise durchgeführter Überprüfung von Eingabe-werten. Bei anderen Funktionen (z.B. SLD-Scan) hatte man  den Eindruck, daß die Implementation vorzeitig  abgebrochen wurde, denn bei diesen Funktionen finden sich zahlreiche Fehler in allen Kategorien. Dabei sind diese Fehler oftmals so offensichtlich und in der Benutzung des Programms auch deutlich als Fehler zu identifizieren, daß man zu diesem Schluss kommen mußte, d.h. vermutlich ist entweder die Programment-wicklung mitten in der Entwicklung oder Weiterentwicklung abgebrochen worden oder der Programmierer hatte seine Methoden nicht genügend getestet.

    4. Ablauf der Kommentierung

    Konventionen

    Folgende Konventionen waren im Rahmen des Projekts für die Kommentierung vereinbart worden (s.a. Codekonventionen)

    Kommentierung

    Zunächst ging es uns darum, zu verstehen, zu welchen Stellen im Programmtext bei Aufruf von bestimmten Programm-Funktionen gesprungen wird. Dazu haben wir Messagboxen in das Programm integriert, die uns fortlaufend die Stelle im Programm zeigten, an der sich das Programm gerade befand. Dadurch konnten wir schon vorab auf die Funktion der einzelnen Methoden schließen. Ebenfalls geholfen hat uns dazu aber auch die gute Wahl der Klassenbezeichnung sowie die Bezeichnung ihrer Methoden und Attribute. Ein weiteres wichtiges Werkzeug war die in die Borland-Umgebung integrierte Anwendung 'grep'. Mit ihr konnten wir leicht die Stellen im Programm finden, an denen eine Funktion implementiert ist, die uns bis dahin unbekannt war. Teilweise haben wir auch auf die Windows-Suche zurückgegriffen. Messageboxen dienten uns auch später, den Wert einiger Variablen im Verlauf des Programms auszugeben, um auf bestimmte Reaktionen des Programms schließen zu können.

    5. Formatierung der Quellen mit 'astyle'

    Nach Abschluß der Kommentierung waren die Quellen entsprechend den Projektvereinbarungen zu formatieren. Als Werkzeug diente hierzu das Programm astyle von Tal Davidsen. Die von uns verwendete Befehlszeile lautete:

    Entsprechend unseren Projekt-Vereinbarungen waren die folgenden Optionen zu wählen:

    Option

    Bedeutung

    --mode=c

    Zielsprache C

    --indent=spaces=2

    jeder Einzug 2 Leerzeichen

    --indent-classes

    public, protected, private in den class-Block einziehen

    --indent-switches

    case in den switch-Block einziehen

    --indent-namespaces

    Namespaces zusätzlich einziehen

    --brackets=break

    geschweifte Klammern auf neuer Zeile

    --pad=paren

    um Klammern Leerzeichen einfügen

    --one-line=keep-blocks

    Ein-Zeilen-Blöcke nicht umbrechen

    Die erzielten Ergebnisse waren zufriedenstellend. Astyle fügte allerdings TABS in das Dokument ein. Es mußten demzufolge nach der Benutzung von 'astyle' alle TABS durch Leerzeichen ersetzt werden.

    Eine Möglichkeit, die wir verwendeten, ist mit dem Editor nedit unter Unix mit dem Kommando Replace bei zuersetzendem Text ALT+TAB zu drücken und durch 8 Leerzeichen zu ersetzen.

    Hier noch ein Beispiel für die Ergebnisse der Formatierung:

    die Methode TScan::SetTitle vor der Kommentierung

    BOOL TScan::SetTitle()
            {
            char  aTitle[MaxString];
    
    #ifdef GermanVersion
            strcpy(aTitle,"Diffraktometrie:");
    #else
            strcpy(aTitle,"Diffractometry:");
    #endif
            if(bIsNewFile)
                    strcat(aTitle,"");
                    else
                    strcat(aTitle,FileName);
            SetWindowText(hWndChild,aTitle);
            return TRUE;
            };
    

    die Methode TScan::SetTitle nach der Formatierung incl. Kommentare

    //! setzt Titel des ScanFensters
    //! Rueckkehrcode immer True
    BOOL TScan::SetTitle()
    {
      char aTitle[ MaxString ];
    
      //! setzt aTitle
    #ifdef GermanVersion
      strcpy( aTitle, "Diffraktometrie:" );
    #else
    strcpy( aTitle, "Diffractometry:" );
    #endif
      //! haengt "" bei neuer Datei , sonst FileName an
      //! und schreibt ihn ins Fenster
      if ( bIsNewFile )
             strcat( aTitle, "" );
      else
             strcat( aTitle, FileName );
      SetWindowText( hWndChild, aTitle );
      return TRUE;
    };

    6.  Erweiterungen

    Für die Umsetzung der Erweiterungen sind ca. 1900 LOC hinzugekommen und 230 Zeilen wurden entfernt. Geändert wurden ca. 200 LOC.
    Bei der Benennung der neuen Klassen sowie der Methoden und Attribute wurde ver-sucht, dem bestehenden Stil zu folgen, um so die Lesbarkeit des Quelltextes erhalten zu können.
    Für die Dialogelemente der neuen bzw. veränderten Dialogboxen wurden automatisch definierte ID’s in der Datei rc_def.h erstellt.
    Weiterhin wurde beim Überarbeiten des Use-Case ‚Diffraktometrie/Reflektometrie’ bezüglich einer vollständigen Zweisprachigkeit in allen Meldungen, Hinweisen und Dialogboxen der größte Teil der Meldungen bzw. Hinweise im Kopfteil der Dateien m_arscan.cpp, m_scan.cpp und m_dlgdif.cpp als Variablen definiert.
    Die nachfolgende Tabelle gibt zu jeder Erweiterung die Dateien an, in denen Veränderungen vorgenommen wurden. Dabei wurden zu den jeweils geänderten Klassen Angaben darüber gemacht, in welchem Umfang und an welcher Stelle (Methode) jeweils neue Quelltextzeilen hinzugekommen sind, alte entfernt bzw. vorhandene geändert wurden.

    Legende:
    + hinzugefügt
    - entfernt
    +/- geändert

    Erweiterung

    Datei

    Klasse

    Methode

    LOC

    Zusatzinfo

    m_dlgdiff.cpp

    TChooseScan

    Dlg_OnInit

    +24

     

     

     

    Konstr.

    +1

     

     

     

    Dlg_OnCommand

    +35

     

     

     

     

    +/-1

     

     

    TSetupAreaScan

    Dlg_OnInit

    +11

     

     

     

    Dlg_OnCommand

    +26

     

     

     

    CanClose

    +7

     

    m_xscan.h

    Typendef.

    ReportUse (neuer Typ)

    +8

     

     

    TAreaScanParameters

    (neues Attribut)

    +1

     

     

    TAreaScan

    (neues Attribut)

    +1

     

     

    TChooseScan

    (neue Attribute)

    +4

     

    m_arscan.cpp

    sonstiges

    (Meldung)

    +1

     

     

    TAreaScanParameters

    Konstruktor

    +4

     

     

     

     

    +/-1

     

     

     

     

    -38

     

     

    TAreaScan

    Konstruktor

    +4

     

     

     

    CallLocalAction

    +7

     

     

     

    New

    +1

     

     

     

    InitializeTask

    +12

     

     

     

     

    -16

     

     

     

    CounterSetRequest

    +26

     

     

     

     

    -55

     

     

     

    SaveReport

    +49

     

     

     

     

    -19

     

     

     

    LoadReport

    +145

     

     

     

    LoadOldData

    +10

     

    m_steerg.cpp

    TScanCmd

    Konstruktor

    +3

     

     

     

     

    +/-2

     

    main.rc

     

     

    +15

     

    rc_def.h

     

     

    +3

    dynam. Schrittweite

    m_scan.cpp

    TScanParameters

    Konstruktor

    +2

     

     

     

     

    +/-1

     

     

     

     

    -1

     

     

    TScan

    Destr.

    +7

     

     

    TSetupStepScan

    Dlg_OnInit

    +2

     

     

     

    Dlg_OnCommand

    +17

     

     

     

    CanClose

    +1

     

     

    TSetupDynamicStep

    (Impl. aller Methoden)

    +52

     

    m_xscan.h

     

     

    +14

     

    main.rc

     

    (nur dt. Dialoge gezählt)

    +91

     

    rc_def.h

     

     

    +31

    2-Theta

    m_dlgdiff.cpp

    TSetupAreaScan

    Dlg_OnInit

    +3

     

     

     

    Dlg_OnCommand

    +11

     

     

     

    CanClose

    +63

     

    m_xscan.h

    TScanParameters

    Attribut

    +1

     

     

    TAreaScanParameters

    Attribut

    +1

     

     

    TSetupAreaScan

    Attribut

    +1

     

     

    TSetupStepScan

    Attribut

    +1

     

    m_scan.cpp

    TScanParameters

    Konstruktor

    +1

     

     

    TSetupStepScan

    Konstruktor

    +1

     

     

     

    Dlg_OnInit

    +3

     

     

     

    Dlg_OnCommand

    +2

     

     

     

    CanClose

    +14

     

    m_arscan.cpp

    TAreaScanParameters

    Konstruktor

    +1

     

     

    TAreaScan

    SaveMeasurementInfo

    +6

     

     

     

    SaveMeasurementInfo

    +/-2

     

     

     

    LoadOldData

    +2

     

    m_steerg.h

    TScanCmd

    Attribut

    +1

     

     

    TAreaScanCmd

    Attribut

    +1

     

    m_steerg.cpp

    TScanCmd

    Konstruktor

    +6

     

     

     

    Konstruktor

    +/-1

     

     

     

    ControlStep

    +1

     

     

     

    ControlStep

    +/-2

     

     

    TAreaScanCmd

    Konstruktor

    +1

     

     

     

    Konstruktor

    +/-1

     

     

     

    ControlStep

    +2

     

     

     

    ControlStep

    +/-1

     

    rc_def.h

     

    ID's

    +1

     

    main.rc

     

    Dialogelemente (nur dt.)

    +2

    Offset

    m_xscan.h

    TAreaScanParameters

    Attribute (4)

    +3

     

     

    TSetupAreaScan

    2 Attibute + Friend-Klass. + 1 Dialog

    +20

     

    m_dlgdiff.cpp

    TSetupAreaScan

    Konstruktor

    +2

     

     

     

    Dlg_OnInit

    +10

     

     

     

    Dlg_OnCommand

    +18

     

     

     

    CanClose

    +31

     

     

     

     

    +/-14

     

     

    TSetOffset

    Alle (Implementation)

    +116

     

     

     

    Meldung (nur dt.)

    +2

     

    m_arscan.cpp

    TAreaScanParameters

    Konstruktor

    +3

     

     

    TAreaScan

    CounterSetRequest

    +2

     

     

     

     

    +/-4

     

     

     

    SaveMeasurementInfo

    +/-3

     

     

     

    LoadMeasurementInfo

    +6

     

     

     

     

    +/-4

     

    m_steerg.cpp

    TScanCmd

    Konstruktor

    +6

     

     

     

     

    +7

     

     

     

    ControlStep

    +/-1

     

     

    TAreaScanCmd

    Konstruktor

    +/-3

     

    m_steerg.h

    TScanCmd

    Attribute

    +1

     

    rc_def.h

     

    ID's

    +16

     

    main.rc

     

    Dialog(nur dt. gezählt)

    +29

    Akkum.

    Darstellung

    m_xscan.h

    TAreaScanParameters

    Attribut(bAccumulatedDisplay)

    +1

     

    m_curve.h

    TDataBase

    Methode(DelCurve())

    +1

     

    m_curve.cpp

    TDataBase

    DelCurve

    +9

     

    m_dlgdif.cpp

    TSetupAreaScan

    Dlg_OnInit

    +2

     

     

    TSetupAreaScan

    Dlg_OnCommand

    +10

     

    .cpp

    TSetupAreaScan

    CanClose

    +1

     

    m_arscan.cpp

    TAreaScanParameters

    Konstruktor

    +1

     

     

    TAreaScan

    GetThetaOffset

    +5

     

     

     

    InitializeTask

    +/-4

     

     

     

    CounterSetRequest

    +6

     

     

     

    SteeringReady

    +2

     

    m_counters.cpp

    TPsd

    GetData(TCurve)

    +/-5

     

     

     

    GetData(float)

    +/-1

     

     

     

    MeasureStart

    +/-1

     

     

     

    PollDevice

    +/-1

     

     

     

    PsdReadOut

    +/-6

     

     

     

     

    +6

     

    main.rc

     

    (nur dt. Dialoge gezählt)

    +4

    Spektren-Zerlegung

    rc_def.h

     

    ID's

    +2

     

    rc_def.h

     

    ID's

    +6

     

    main.rc

     

    Dialog1(nur dt. gezählt)

    +15

     

     

     

    Dialog2(nur dt. gezählt)

    +14

     

    dlg_diff.cpp

    TComposeDB

    Alle

    +109

     

     

    TDismantleDB

    Alle

    +48

     

    m_xscan.h

    TAreaScanParameters

    Attribute

    +2

     

     

    TAreaScan

    Attribute

    +1

     

     

     

    Methoden

    +3

     

     

    TDismantleDB

    Alle

    +10

     

     

    TComposeDB

    Alle

    +11

     

    m_arscan.cpp

    TAreaScan

    Konstruktor

    +3

     

     

     

    CallLocalAction

    +6

     

     

     

    rButtonDown

    +4

     

     

     

    ComposeDB

    +124

     

     

     

    DismantleDB

    +12

     

     

     

    SaveDismantleCurve

    +98

     

     

     

    LoadMeasurementInfo

    +19

     

    m_curve.h

    TCurve

    Attribute

    -9

     

     

    TCurve

    Attribute

    +/-2

     

    m_curve.cpp

    TCurve

    Konstruktor

    -3

     

     

     

     

    +/-2

     

     

     

    Destruktor

    -3

     

     

     

    New

    -4

     

     

     

     

    +5

     

     

     

    = Operator

    -19

     

     

     

     

    +/-4

     

     

     

    FastPAdd

    +/-16

     

     

     

     

    +/-4

     

     

     

    FastOpen

    -6

     

     

     

     

    +2

     

     

     

     

    +/-3

     

     

     

    FastClose

    -3

     

     

     

    Padd

    +/-16

     

     

     

    Pget

    +/-4

     

     

     

    GetValueByValue

    +/-5

     

     

     

    ValueAdd

    +/-4

     

     

     

    GetGravityCenter

    -6

     

     

     

     

    +/-13

     

     

     

    DeleteUnderGround

    -6

     

     

     

     

    +/-4

     

     

     

    DeleteFlank

    -6

     

     

     

     

    +/-9

     

     

     

    GetPeakProperties

    -6

     

     

     

     

    +/-8

    Kontinuierl. Scan

    m_scan.cpp

    TSetupContinuousScan

    Insgesamt

     +122

     

     

     

     

    -24

     

     

     

     

    +/-11

     

    m_data.cpp

    TPlotData

    SaveSecondCurve

    +/-1

     

    m_arscan.cpp

    TAreaScan

    CallLocalAction

    +/-1

     

     

     

    SaveDismantleCurve

    +/-2

     

     

     

    LoadMeasurementInfo

    +/-1

     

    counters.cpp

    TDevice

    EventHandler

    +1

     

     

     

    SetEventHost

    +1

     

     

     

    KillEvent

    +1

     

     

     

    GetEventIntensity

    +6

     

     

    TRadicon

    EventHandler

    +/-15

     

     

     

    InitializeEvent

    +/-6

     

    m_devcom.h

    TDevice

    Methoden

    +3

     

    mottypes.h

     

    TvalueType

    +/-1

     

    m_motcom.h

    TDevice

    GetAcceleration

    +5

     

     

     

    GetMaxSpeed

    +1

     

    m_layer.cpp

     

    mGetValue

    +4

     

    m_xscan.h

    TSetupContinuousScan

    Attribute

    +1

     

     

     

     

    -6

     

     

     

    Methoden

    -1

     

    main.rc

     

    Dialog (nur dt. gezählt)

    +5

     

     

     

    Dialog (nur dt. gezählt)

    -2

     

    m_scan.cpp

    Allgemein

     

    +/-1

     

     

    TScan

    InitalizeTask

    +/-7

     

     

     

     

    -1

     

     

     

     

    +61

     

     

     

    CounterSetRequest

    +8

     

     

     

     

    +/-2

     

     

     

    SteeringReady

    +11

     

     

     

     

    +/-1

     

     

     

    Interrupt

    +9

     

     

     

    rButtonDown

    +4

     

     

     

    SaveFile

    +14

     

     

     

     

    +/-1

     

     

     

    LoadOldData

    +14

     

     

     

     

    +/-3

     

     

     

    LoadMeasurementInfo

    +24

     

     

     

     

    +/-3

     

     

     

    SaveMeasurementInfo

    +8

     

     

     

     

    +/-2

     

     GESAMT 

     

    hinzugekommen 

     

    1861

     

     

    Geändert

     

    +/-197

     

     

    weggefallen 

     

    -234


    zuletzt geändert 11.11.2001 Jens Ullrich / Stephan Berndt