| Autor |
Beitrag |
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: So 14.10.07 15:49
Ich kenn da jemanden, der fängt grade mit seinem Informatikstudium an. Verwendete Programmiersprache ist Pascal, TurboPascal 5.5. Und da der weiß, dass ich mich etwas damit auskenne, fragt der mich halt ab und zu bei Problemen.
Jetzt gibbets da Programmieraufgaben, wo ich nicht so ganz den Sinn in einigen Vorgaben erkenne. Es geht darum, ein sortiertes Feld der Größe 5 mit einem der Größe 8 zusammenzufügen, so dass ein sortiertes Feld der Größe 13 rauskommt. Also quasi ein Schritt Mergesort in einem speziellen Fall.
Dafür definiert er (also der Prof) erstmal Konstanten
Delphi-Quelltext 1: 2: 3: 4:
| const
GRENZE1 = 5;
GRENZE2 = 8;
GRENZE = 13; | dann Typen Delphi-Quelltext 1: 2: 3:
| type tIndex1 = 1..GRENZE1;
tIndex2 = 1..GRENZE2;
tIndex = 1..GRENZE; | und schließlich die konstanten Arrays als
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| type
tFeld1 = array [tIndex1] of integer;
tFeld2 = array [tIndex2] of integer;
tFeld = array [tIndex] of integer;
var
Feld1 : tFeld1;
Feld2 : tFeld2;
Feld : tFeld; |
Jetzt müssen beim Mergen diese Felder durchlaufen werden. Dafür braucht man drei Variablen i,j,k, in denen die Positionen in den drei Feldern stehen. Diese werden da nun so deklariert:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| const
GRENZE1PLUS1 = 6;
GRENZE2PLUS1 = 9;
GRENZEPLUS1 = 14;
type
tIndex1Plus1 = 1..GRENZE1PLUS1;
tIndex2Plus1 = 1..GRENZE2PLUS1;
tIndexPlus1 = 1..GRENZEPLUS1;
var
i : tIndex1Plus1;
j : tIndex2Plus1;
k : tIndexPlus1; |
Frage an euch: macht so ein Typen-Overkill Sinn? Im oberen Teil sehe ich das ja noch etwas ein, aber welchen Sinn macht es, i,j und k so zu deklarieren und nicht als Integer?
_________________ We are, we were and will not be.
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: So 14.10.07 16:11
Hi,
also das hier finde ich ziemlich unsinnig:
Delphi-Quelltext 1: 2: 3: 4:
| const GRENZE1PLUS1 = 6; GRENZE2PLUS1 = 9; GRENZEPLUS1 = 14; |
es müsste wenn schon
Delphi-Quelltext 1: 2: 3: 4:
| const GRENZE1PLUS1 = GRENZE1+1; GRENZE2PLUS1 = GRENZE2+1; GRENZEPLUS1 = GRENZE+1; |
heißen, da sonst die Grenzen 2x angegeben werden müssen.
Das ganze macht vielleicht in sofern Sinn, dass man
a) die Konstanten in eine "Daten-Unit" packen kann, und
b) dass i,j,k nur den minimalsten Speicher belegen, der für diese Grenzen möglich ist.
//Edit: und man sollte vielleicht GRENZE=GRENZE1+GRENZE2 definieren 
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
dummzeuch
      
Beiträge: 593
Erhaltene Danke: 5
Delphi 5 ent, Delphi 6 bis Delphi XE8 pro
|
Verfasst: So 14.10.07 16:42
Gausi hat folgendes geschrieben: |
Frage an euch: macht so ein Typen-Overkill Sinn? Im oberen Teil sehe ich das ja noch etwas ein, aber welchen Sinn macht es, i,j und k so zu deklarieren und nicht als Integer? |
Man kann sich sicherlich darueber streiten, wie sinnvoll diese Deklarationen sind, insbesondere die Konstanten, die schon Xion angemerkt hat. Aber dem Prof geht es auch darum, den Studenten zu zeigen, welche Moeglichkeiten Pascal bietet.
Ob man das dann in einem Real-World Programm so macht, ist eine ganz andere Sache. Meiner Ansicht nach benutzt man (auch ich) viel zu haeufig Standard-Datentypen, wo man besser spezielle Typen deklarieren sollte. Und symbolische Konstanten sind definitiv underused.
twm
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: So 14.10.07 16:56
In Zeiten, da man wegen Performanceritis Range- und Overflowchecks ausschaltet, ergibt das nicht so viel Sinn.
Ein Grund für die Deklaration von Bereichstypen ist ja die Sicherstellung der semantischen Korrektheit, indem eben Bereichsfehler erzeugt werden, wenn die Variable außerhalb des Gültigkeitsbereichs liegt.
Das Wichtigste beim Coden ist doch sowieso, das man ein Gefühl für Übersichtlichkeit bekommt. Wenn es für das Verständnis eines Verfahrens wichtig ist, dann sollte man ruhig die Typen so deklarieren, aber mal im Ernst: In welchem echten Programm haben wir es mit Arrays konstanter Länge zu tun? Die Fälle kann man an den Fingern einer Hand abzählen (z.B. 3D-Transformation) und da kann man das ja dann so machen.
_________________ Na denn, dann. Bis dann, denn.
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: So 14.10.07 19:04
Geschmackssache. Üblich ist es zu mindest nicht. Übersichtlich auch nicht besonders.
Was zu mindest dafür spricht: Es steckt eine Annahme weniger im Code. Man kann davon ausgehen, dass, wenn der Code kompiliert, der Range auch durch die Variable abgedeckt wird.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: So 14.10.07 20:55
delfiphan hat folgendes geschrieben: | | Geschmackssache. ... Übersichtlich auch nicht besonders. |
Na ja....
Delphi-Quelltext 1: 2: 3:
| Type TChessChoord = 1..8; TChessBoard = Array [TChessChoord, TChessChoord] Of TChessPiece; |
Das verstehe ich unter selbstdokumentierendem Code. So sind versehentliche Zugriffe in Spalte 9 des Schachbrettes schon von der Typendeklaration her unmöglich, also sowas wie eine implizite Assertion.
Aber das man darüber geteilter Meinung sein kann, da gebe ich Dir Recht, denn es ist schon mittlerweile sehr unüblich.
_________________ Na denn, dann. Bis dann, denn.
|
|
|