Autor Beitrag
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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
ausblenden Delphi-Quelltext
1:
2:
3:
4:
const

  GRENZE1 = 5;
  GRENZE2 = 8;
  GRENZE = 13; { GRENZE1 + GRENZE2 }
dann Typen
ausblenden Delphi-Quelltext
1:
2:
3:
type tIndex1 = 1..GRENZE1;

  tIndex2 = 1..GRENZE2;
  tIndex = 1..GRENZE;
und schließlich die konstanten Arrays als
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
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)
BeitragVerfasst: So 14.10.07 16:11 
Hi,

also das hier finde ich ziemlich unsinnig:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
const
  GRENZE1PLUS1 = 6;
  GRENZE2PLUS1 = 9;
  GRENZEPLUS1 = 14;

es müsste wenn schon
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 593
Erhaltene Danke: 5


Delphi 5 ent, Delphi 6 bis Delphi XE8 pro
BeitragVerfasst: So 14.10.07 16:42 
user profile iconGausi 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: So 14.10.07 20:55 
user profile icondelfiphan hat folgendes geschrieben:
Geschmackssache. ... Übersichtlich auch nicht besonders.

Na ja....
ausblenden 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.