WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   [Cobol] Index "missbrauchen" (http://www.wcm.at/forum/showthread.php?t=162178)

pong 26.03.2005 11:38

[Cobol] Index "missbrauchen"
 
Hallo,

jaja wieder mal ein Problem:

Habe einen 3-dimensionalen Table aufgebaut 3x8x10. Für hab ich einen Index per indexed by erstellt.

Nun möchte ich den Index der dritten Verschachtelung als Index für einen weiteren 1-dimensionalen Table verwenden, allerdings stürzt mit bei Durchführung das Programm mit dem Fehler, dass ein Element referenziert wird welches nicht deklariert ist bzw. ein Abend 4038 auf einem MVS/zos (beim 1-dimensionalen Table).

Kann mir vielleicht jemand sagen warum? Ich war eigentlich der Meinung, dass bei einem mittels indexed by erstellten Index, immer ein ganzzahliger Wert bzw. der Wert als Halbbyte drinnsteht, oder liege ich da falsch? (Was genau geht denn dabei vor... ich kann es nun wirklich nicht nachvollziehen)

pong

YDM 29.03.2005 15:22

Es gibt in COBOL ja zwei Arten um auf eine Tabelle zuzugreifen:
  • Normalindizierung (Numerisches Feld, Literal)
  • Spezialindizierung (INDEXED BY)
Bei Spezialindizierung ist der Index ein 4-Byte-Element dass die relative Adresse (Offset) des Tabellenelements enthält.
Bei der Normalindizierung hingegen ist der Index immer der Zähler für die Feldposition.

Bei der Spezialindizierung wird die Adresse immer vor dem Zugriff auf das Tabellenelement berechnet (bei Änderung des Index mit SET).
Bei der Normalindizierung hingegen immer erst direkt beim Zugriff.

Ein Spezialindex ist nur für die Adressierung der Tabelle/Tabellenebene vorgesehen für die er auch deklariert worden ist.

Satan_666 05.04.2005 15:52

Was YMD so trocken schreibt, stimmt genau!

Oder einfach ausgedrückt: ein Index, definiert mit indexed by, ist immer mit der Tabelle verknüpft, bei der der Index anglegt wurde und somit außerhalb dessen nicht verwendbar.

Verwende einfach 1 normales Datenfeld zur Indizierung beider Tabellen:

Zitat:

77 indexfeld pic 9(5) comp-3 value 0.

pong 05.04.2005 19:28

Danke, aber die Erklärung von YMD war schon total ok, habs leider sowieso nur mehr mittels 3 numerischen Werten lösen können, schade eigentlich, hat mir den Code total verhunzt

Aber comp-3 nutzt ich für sowas nicht, brauch ja weder Vorzeichen noch Komma, somit bringts mir keinen Vorteil.

pong

Satan_666 06.04.2005 08:42

comp-3 hat nix mit Vorzeichen oder Komma zu tun; comp-3 ist ein so genanntes gepacktes Datenformat, wo für jede Ziffer nur ein halbes Byte verwendet wird.

Beispiel - die Zahl 12345:

- ohne comp-3 wird sie wie folgt codiert (hex-Schreibweise): F1F2F3F4F5

- mit comp-3 wird sie aber so codiert: 12345F

Ohne kostet die Zahl eben 5 Byte, mit nur 3! Außerdem ist die Maschine mit comp-3 deutlich schneller, weil der Compiler dieses Format voraussetzt und notfalls selber intern konvertiert. Gerade bei Tabellen-Indices ein nicht zu vernachlässigender Mehraufwand bei der Durchführung des Programmes!

pong 06.04.2005 18:00

Nur machts bei so geringen Zahlen keinen Unterschied, da 95% nur Zuweisungen geschehen

Und Platz ist auch kein Thema http://www.microfocus.com/Academic/P...landBinary.asp

pong

Satan_666 07.04.2005 10:14

Du hast von Cobol wohl wenig Ahnung, was? Im Klartext: Du schreibst im Programm folgende Zeile

Zitat:

move 12345 to tabelle (idx).
Das Feld 'idx' hast Du mit

Zitat:

77 idx pic 9(5).
definiert. Was bedeutet das?

Zum Zeitpunkt des Compilierens des Programmes legt der Compiler ein Feld an:

Zitat:

77 zwischenfeld-vom-compiler pic s9(5) comp-3.
Jedesmal, wenn Dein Programm zur Laufzeit (!!!) zum obigen Befehl kommt, wird implizit ein

Zitat:

move idx to zwischenfeld-vom-compiler.
durchgeführt. Dabei kann es sogar passieren, dass er diesen 'move' jedesmal durchführt, wenn beispielsweise mehrere gleichlautende Befehle a-la

Zitat:

move a to tabelle-a (idx).
move b to tabelle-b (idx).
move c to tabelle-c (idx).
:
:
schreibst. Da habe ich schon die verrücktesten Dinge gesehen in meiner mehr als 20-jährigen Cobol-Laufbahn... :D

Dieser Aufwand ist generell leicht zu vermeiden, wenn Du dieses 'comp-3' einfach bei der Datendefinition dazuschreibst. Dein Aufwand steht hier in keinem Verhältnis zum Vorteil einer rascheren Durchführung des Programmes.

Auch wenn die Tabelle nicht groß ist und auch nicht oft angesprochen wird, sollte man sich solche Sachen angewöhnen, weil es dadurch 'in Fleisch und Blut' übergeht.

pong 08.04.2005 12:21

Nicht

Zitat:

move 12345 to tabelle (idx)
Sondern

Zitat:

move 2 to idx
;)

Aber da du ja - zwangsweise - viel Wissen hast

usage comp-3 ist doch äquivalent mit einem packed-decimal, oder irre ich da?

pong

Satan_666 08.04.2005 14:11

Das belegen des Indexes ist nicht das Problem - das Zugreifen auf die Tabelle wird langsamer, wenn Du dieses comp-3 nicht anführst! Weil eben vor jeder Verwendung als Index der Inhalt konvertiert wird.

Das 'usage' ist optional, brauchst Du also nicht angeben - und es stimmt: packed-decimal ist der Fachbegriff dafür!


Alle Zeitangaben in WEZ +2. Es ist jetzt 04:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag