'Option Base' für Felder

Moin,

die untere Grenze des Indexes von Feldern kann man mit „Option Base 1“ festlegen. Der Index beginnt dann nicht bei „0“.
Jetzt habe ich fast stundenlang nach einem Fehler gesucht und dann erst gesehen, dass ich irgendwo „feld(0)“ verwendet hatte - muss natürlich „feld(1)“ heissen.
Frage: Gibt es denn gar keine Warnung „Grenzverletzung“ dafür?
Wenn ich einen zu großen Index setze, kommt ja auch eine Meldung „Index ausserhalb des gültigen Bereichs“.

Danke
Laika

Hallo,

Frage: Gibt es denn gar keine Warnung „Grenzverletzung“ dafür?
Wenn ich einen zu großen Index setze, kommt ja auch eine
Meldung „Index ausserhalb des gültigen Bereichs“.

doch gibt es.

Mein Test als Beispiel:

Option Explicit
Option Base 1

Private Sub Command1\_Click()
 Dim Arr1(2) As String
 Dim Arr2(0 To 2) As String
 Arr2(0) = "Test"
 Arr1(0) = "Test" '

Man kann trotz Optionbase 1 einen Index(0) anlegen, wenn man will. Ob das passiert kommt auf die Art der Deklaration an.

Gruß Rainer

Hallo Laika,

die untere Grenze des Indexes von Feldern kann man mit „Option
Base 1“ festlegen. Der Index beginnt dann nicht bei „0“.

ja bei Option Base muß man 0 oder 1 angeben oder weglassen, dann gilt das als 0.
Das bedeutet aber nicht daß der untere Index des Feldes nur 1 oder 0
sein kann, im nachfolgenden Code ist der untere Index die minus 10.

Codiere nicht arr(0)= … hart sondern dynamisch
arr(LBound(arr))=…

Gruß
Reinhard

Option Explicit
Option Base 1

Sub tt()
Dim arr(-10 To 5), N
For N = LBound(arr) To UBound(arr)
 arr(N) = N ^ 2
Next N
MsgBox arr(5)
MsgBox LBound(arr)
MsgBox UBound(arr)
MsgBox UBound(arr) - LBound(arr) + 1
MsgBox arr(0)
MsgBox arr(LBound(arr))
End Sub

Jetzt habe ich fast stundenlang nach einem Fehler gesucht und
dann erst gesehen, dass ich irgendwo „feld(0)“ verwendet hatte

  • muss natürlich „feld(1)“ heissen.
    Frage: Gibt es denn gar keine Warnung „Grenzverletzung“ dafür?
    Wenn ich einen zu großen Index setze, kommt ja auch eine
    Meldung „Index ausserhalb des gültigen Bereichs“.

Danke
Laika

Danke erstmal …
Ich deklariere Felder zunächst unbestimmt:

Dim Verzeichnis\_Liste()

passe sie dann später mit

Redim 

an die erforderliche Größe an - alles unter Option Base 1.
Da dachte ich, dass Index 0 einen Fehler geben sollte. So wie ja auch ein größerer Index als der definierte einen Fehler gibt. Ein

Dim arr(-10 To 5)

d.h. negative Indices habe ich nicht.
Hat mich halt verdammt viel Zeit gekostet, das zu finden. Man ist ja blind und sieht manchmal nur das, was glaubt, was da stehen sollte und nicht das, was da wirklich steht - kenne ich sehr gut aus meiner früheren Programmierpraxis.

Gruss
Laika

Hallo laika,

Ich deklariere Felder zunächst unbestimmt:
Dim Verzeichnis_Liste()
passe sie dann später mit Redim an die erforderliche Größe an

du bist fit genug das selbst zu testen/codieren.
Ich würde mal aus dem Bauch heraus sagen, der Code müßte m.E. schneller ablaufen wenn du in einer Schleife eine Variable
mit (10000) dimensionierst, dann bei jedem hinzukommenden Eintrag in dieser Variablen ein „mitlaufende“ Zählvariable um eins erhöst.

Verglichen mit einer ähnlichen For-Schleife wo du hinzukommende Einträge
in die Variable per Redim einfügst.

Logisch, bei kleinen Feldern merkste sichtbar keinen Geschwindigkeitsunterschied. Vor der Bearbeitung von großen Datenmengen würde ich das unbedingt austesten.

  • alles unter Option Base 1.

Warum?

Da dachte ich, dass Index 0 einen Fehler geben sollte. So wie
ja auch ein größerer Index als der definierte einen Fehler
gibt.

? je nach Umständen kommt ja der Fehler.

Ein Dim arr(-10 To 5) d.h. negative Indices habe ich nicht.

*gg*, ich sah das bislang auch noch nie, es entstand als ich aufgrund deiner Anfrage ein wenig rumspielte.
Solche Spielereien sind m.E. auch eine sehr gute Sache um bestimmten
Dingen auf den Grund zu gehen.

Hat mich halt verdammt viel Zeit gekostet, das zu finden.

Was genau? *verwirrt schau*

Gruß
Reinhard

Hat mich halt verdammt viel Zeit gekostet, …
Moin Reinhard,

Ich würde mal aus dem Bauch heraus sagen, der Code müßte m.E.
schneller ablaufen wenn du in einer Schleife eine Variable
mit (10000) dimensionierst, dann bei jedem hinzukommenden
Eintrag in dieser Variablen ein „mitlaufende“ Zählvariable um
eins erhöst.

Das geht sicher auch gut, halte ich programmiertechnisch aber für nicht so elegant. Bei meiner neuen Maschine (core i7, zugeschnitten auf Videobearbeitung) sieht man da wohl auch bei größeren Feldern keinen Unterschied.

  • alles unter Option Base 1.

Warum?

Hmm, weiss ich nicht mehr so genau, habe das vor div. Jahren aus bestimmten Gründen so angefangen. Bei Base 0 müsste ich meine Denke umstellen: „Hamm wir schon immer so gemacht, kann ja jeder kommen“ :wink:)

? je nach Umständen kommt ja der Fehler.

Bei mir nicht - siehe auch unten.

Ein Dim arr(-10 To 5) d.h. negative Indices habe ich nicht.

*gg*, ich sah das bislang auch noch nie, es entstand als ich
aufgrund deiner Anfrage ein wenig rumspielte.
Solche Spielereien sind m.E. auch eine sehr gute Sache um
bestimmten Dingen auf den Grund zu gehen.

Das finde ich im Prinzip nicht schlecht. Bestimmte Aufgaben sind sehr elegant mit negativen Indices zu machen. Ist zwar schon lange her (40 Jahre, 'ne Abschlussarbeit mit Fortran), da waren symmetrische Vektoren, Matrizen. Deren Index lief von -n bis +n, konnte man sehr elegant formulieren. Frag mich aber nicht mehr nach Einzelheiten.

Hat mich halt verdammt viel Zeit gekostet, das zu finden.

Was genau? *verwirrt schau*

Eine Schleife, die eine Liste nach bestimmten Namen durchsucht und aussteigt, wenn er gefunden wurde:

For i\_verzeichnisliste = 1 To UBound(Verzeichnis\_Liste)
 If ordnername = Verzeichnis\_Liste(i\_verzeichnisliste, 0) Then Exit For '\>\>\>\>\>\>
Next i\_verzeichnisliste

Das stieg immer sofort aus. Ich habe eine MsgBox in die Schleife gesetzt und mich gewundert, dass die gar nicht anspricht:

For i\_verzeichnisliste = 1 To UBound(Verzeichnis\_Liste)
 MsgBox i\_verzeichnisliste
 If ordnername = Verzeichnis\_Liste(i\_verzeichnisliste, 0) Then Exit For '\>\>\>\>\>\>
Next i\_verzeichnisliste

Dann habe ich die „0“ gesehen. Mit

For i\_verzeichnisliste = 1 To UBound(Verzeichnis\_Liste)
 If ordnername = Verzeichnis\_Liste(i\_verzeichnisliste, 1) Then Exit For '\>\>\>\>\>\>
Next i\_verzeichnisliste

lief es dann richtig: Der zweite Index muss natürlich „1“ sein bei Base 1. Selbst bei intensivstem Draufschauen habe ich das erst nach Stunden gesehen … werde halt langsam älter. Andererseits: ich kenne das aus früheren Berufszeiten. Da haben Programmierer den ganzen Nachmittag rumgemacht, und es lief nicht. Feierabend … am nächsten Morgen fiel es ihnen wie Schuppen von den Augen.

Gruß
Laika