Warum fangen Listen eigentlich mit 0 an?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Karl
User
Beiträge: 252
Registriert: Freitag 29. Juni 2007, 17:49

Dienstag 17. Juni 2008, 14:42

Y0Gi hat geschrieben:
Leonidas hat geschrieben:Y0Gi: Visual Basic tut das auch. Also zumindest bis Version 6.
Oh, ich dachte, es dreht sich hier nur um Programmiersprachen ;)
Ich dachte es ginge um Python :o
lunar

Dienstag 17. Juni 2008, 17:44

n4p hat geschrieben:Wo hast du das denn her?
Meine Delphi-Erfahrungen sind schon ein paar Jahre her, aber soweit ich weiß, ist folgendes gültige Syntax und lässt ein Array bei 1 beginnen:

Code: Alles auswählen

var zahlen: array[1...10] of string;
BlackJack

Dienstag 17. Juni 2008, 23:32

@Lunar: Das stimmt zwar, aber deswegen würde ich Delphi nicht als Einser-Offset-Sprache bezeichnen. Man kann da nämlich mit *jedem* Index beginnen:

Code: Alles auswählen

Var Foos: Array[23..42] Of tBar;
Damit gehört Delphi also genauso zu der seltenen Gattung der 23er-Offset-Sprachen, aber eben auch zu den Nuller-Offset-Sprachen. Es liegt in der Hand des Programmierers.

Ich hatte bei Pascal jedenfalls immer brav bei 0 angefangen, weil ich das von CBM BASIC V2 vom C64 so kannte und mir die Offsetberechnung, die in Maschinensprache dahinter steckt, bekannt war. :-)
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Mittwoch 18. Juni 2008, 15:11

Verwechselt ihr da zufällig Ranges und Indizes?
BlackJack

Mittwoch 18. Juni 2008, 15:50

Inwiefern? Man kann bei Pascal Ranges verwenden, die dann die gültigen Indizes angeben. Das erste Element in meinem Beispiel hat den Index 23. Werte kleiner als 23 werden als Bereichsverletzung aufgefasst, falls die entsprechenden Prüfungen zur Laufzeit aktiviert sind, ansonsten wird auf Elemente *vor* dem Array zugegriffen. Die Adressberechnung im Maschinencode für den Index `i` sieht so aus: ``@Foo-23+i``. ``@`` ist in Pascal der "Address-Of"-Operator.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Mittwoch 18. Juni 2008, 18:40

Notiz ins Gedankenbuch: JA, Pascal *ist* komisch!

;)
lunar

Donnerstag 19. Juni 2008, 16:44

BlackJack hat geschrieben:@Lunar: Das stimmt zwar, aber deswegen würde ich Delphi nicht als Einser-Offset-Sprache bezeichnen.
Ok, dann zahlen wir Delphi eben zur Gattung der "Jedes-Offset-ist-möglich"-Sprachen ;) Ich wollte nur darauf hinaus, dass Delphi nicht bei null anfängt, da der OP die null ja erwähnt hatte.
Karl
User
Beiträge: 252
Registriert: Freitag 29. Juni 2007, 17:49

Donnerstag 19. Juni 2008, 17:54

Python gehört auch zu den "Jedes-Offset-ist-möglich"-Sprachen.
Nur weil die Standardklassen das so wollen, muss man's ja nicht beibehalten.
Mal ein einfaches Beispiel:

Code: Alles auswählen

class OffsetList(list):
    def __init__(self, offset=0):
        super(OffsetList, self).__init__()
        self.offset = offset

    def __setitem__(self, index, item):
        s = super(OffsetList, self)
        return s.__setitem__(index - self.offset, item)

    def __getitem__(self, index):
        s = super(OffsetList, self)
        return s.__getitem__(index - self.offset)
Erweitert die Klasse `list` ganz einfach um die Möglichkeit, selbst den Startindex zu bestimmen.
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Donnerstag 19. Juni 2008, 18:14

Eine eigene Listenimplementierung, die dann irgendwo anfängt zu zählen, kannst du in jeder beliebigen Sprache schreiben. Man kann nur nicht in jeder Sprache den Operator dazu überladen und muss ggf. anders auf die Elemente zugreifen. Daher sieht man den Unterschied nur nicht.

Von Haus aus beginnt Python also bei 0.
Karl
User
Beiträge: 252
Registriert: Freitag 29. Juni 2007, 17:49

Donnerstag 19. Juni 2008, 18:22

EyDu hat geschrieben:Eine eigene Listenimplementierung, die dann irgendwo anfängt zu zählen, kannst du in jeder beliebigen Sprache schreiben. Man kann nur nicht in jeder Sprache den Operator dazu überladen und muss ggf. anders auf die Elemente zugreifen. Daher sieht man den Unterschied nur nicht.

Von Haus aus beginnt Python also bei 0.
Natürlich aber ich denke Delphi oder sonsteine Sprache wird intern auch, unabhängig davon, bei welchem Wert man anfängt, auf 0 zeigen, oder?
Das wäre dann ja nichts anderes als die obige Klasse.
Deshalb würde ich schon sagen, dass Python nicht unbedingt bei 0 anfängt.
Eine Frage der Implementierung der list-Klassen (ich zähle zu List-Klassen jetzt einfach mal alle Klassen, die den Indexoperator implementiert haben, ich kenn mich nicht mit den Fachbegriffen aus ;) ), wo man anfängt.
Man hätte die Klasse ja auch von Haus aus so schreiben können, wie ich das jetzt oben gemacht habe, wäre ja Python an sich egal und dadurch wär's immer noch dieselbe Sprache. Wobei das wahrscheinlich nicht unbedingt den Prinzipien von Python entspricht, weshalb man dann auch streng genommen sagen könnte "Das ist kein Python", aber das ist jetzt Haarspalterei.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Freitag 20. Juni 2008, 12:54

Der Streit, ob 0 oder 1 ist alt.

Stefan
Karl
User
Beiträge: 252
Registriert: Freitag 29. Juni 2007, 17:49

Freitag 20. Juni 2008, 13:10

sma hat geschrieben:Der Streit, ob 0 oder 1 ist alt.

Stefan
Gibts das auch als "normalen" Text? Ich hab keine Lust mir englische handgeschriebene Texte durchzulesen, welche ein Thema zu einem Fachbereich behandeln, das ist irgendwie doppelt anstrengend :p
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Freitag 20. Juni 2008, 13:17

Ich fand es gerade nett, das Dijkstra seine Gedanken noch mit der Hand aufgeschrieben hat und das auch noch in einer sehr ausdrucksstarken Schrift. Aber wenn's sein muss...

Stefan
Karl
User
Beiträge: 252
Registriert: Freitag 29. Juni 2007, 17:49

Freitag 20. Juni 2008, 13:27

sma hat geschrieben:Ich fand es gerade nett, das Dijkstra seine Gedanken noch mit der Hand aufgeschrieben hat und das auch noch in einer sehr ausdrucksstarken Schrift. Aber wenn's sein muss...

Stefan
Naja vielleicht schon nett, aber ich bin vielleicht einfach zu dumm dazu :)
Danke für den Link
Antworten