Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: Jürgen Schomann am 12.04.12 - 19:10:44

Titel: LotusScript-Fehler
Beitrag von: Jürgen Schomann am 12.04.12 - 19:10:44
ich habe folgenden LotusScript-Code

Dim FieldLong(1) As Long
Dim FieldVariant(1) As Variant
Dim ScalarVariant As Variant
   
FieldLong(0) = 1
FieldLong(1) = 2

FieldVariant(0) = "a"
FieldVariant(1) = FieldLong      ' OK
   
ScalarVariant = FieldVariant     ' Fehler Type mismatch

Einer Variant-Variablen können ja verschiedene Datentypen zugewiesen werden. Wenn in einem Feld von Typ Variant aber einem Element ein Feld zugewiesen wird, kann diese Variantvariable nicht weiteren Variantvariablen zugewiesen werden. Es kommt 'Type mismatch'.
Eigentlich sind die Zuweisungen intern doch nur Zeiger, so dass Adresse auf Adresse verweisen müsste oder?
Titel: Re: LotusScript-Fehler
Beitrag von: koehlerbv am 12.04.12 - 23:04:17
Jürgen, Du hast da ein fixed Array und ein Variant. Und *das* ist Dein Problem.

Bernhard
Titel: Re: LotusScript-Fehler
Beitrag von: Peter Klett am 13.04.12 - 08:01:21
Eigentlich sind die Zuweisungen intern doch nur Zeiger, so dass Adresse auf Adresse verweisen müsste oder?
Nein, das können keine Zeiger sein. Dein Script etwas abgewandelt beweist es:

Dim FieldLong(1) As Long
Dim ScalarVariant As Variant
   
FieldLong(0) = 1
FieldLong(1) = 2

ScalarVariant = FieldLong
ScalarVariant (0) = 3
   
Print FieldLong (0) '-> 1
Print ScalarVariant (0) '-> 3
Titel: Re: LotusScript-Fehler
Beitrag von: pram am 13.04.12 - 08:40:38
Zitat
FieldVariant(1) = FieldLong
ScalarVariant = FieldVariant
FieldLong ist vom Typ "Array Of Long" und FieldVariant ist somit vom Typ "Array Of Array Of Long"

Wie Peter schon schrieb, werden Arrays kopiert, das geht aber nur, wenn das Array keine weiteren Arrays enthält
(Bei Listen ist es änlich)

Wenn du mit Zeigern arbeiten willst, so musst du mit Objekten arbeiten (welche das Array als Member haben)
Letzteres ist sowieso komfortabler, weil man ins Objekt Methoden wie Add etc einbauen kann

Code
Public Class ObjArray
   private data() as Variant
   private length as long ' Länge des Arrays (muss immer <= ubound(data) sein)


   public sub add(toAdd)
      '... sicherstellen, dass noch ausreichend Platz in Data ist, wenn nicht, dann vper redim vergrößern
      ' aber nicht nur um ein Element, sondern gleich um mehrere (wg. Performance)
      data(length) = toAdd
      length = length + 1
   end sub

end class

Gruß
Roland
Titel: Re: LotusScript-Fehler
Beitrag von: Jürgen Schomann am 13.04.12 - 10:17:50
Vielen Dank für eure Antworten. Haben mir fürs Verständnis sehr geholfen.