Array erzeugen, Werte hinzufügen, auslesen und löschen

Ausserdem ist die Zeile umständlich:
Visual Basic:
If IIf(meMPIO1.GetCachedLine(1, i), "1", "0") = 1 Then
besser Ersetzen durch:

Visual Basic:
If meMPIO1.GetCachedLine(1, i) Then
Erfülllt das gleiche unter der Annahme das die GetCachedLine Methode Wahr für Erfolg zurückgibt.
 
@mage,
natürlich habe ich mir deinen Post durchgelesen.
Dachte aber daran könnte es nich liegen. Hab es eben doch mal ausprobiert, und? :suspekt:
Klappt :D
Jedenfalls so halb...
Jetzt wird bei der letzten Message Box immer 1 angezeigt, was ja nicht richtig ist. Es soll eine Reihe angezeigt werden, in der alle gesetzten Kontakte aufgeführt sind. Ob nun 1x die 1 und 1x die 5 oder sonst was. :)
Hier nochmal der Code:
Code:
Dim bArray()    As Boolean
Dim i           As Long

If meMPIO1.Attached Then
    If connect = 1 Then
        ReDim bArray(0)
        For i = 1 To 8  'Schleife für Kanal 1 bis 8
            If (meMPIO1.GetCachedLine(1, i) = "1") Then
                'Wert 1 bis 8 in Array hinzufügen
                ReDim Preserve bArray(UBound(bArray) + 1)
                bArray(UBound(bArray)) = True
                MsgBox (UBound(bArray))     'Meldung zeigt immer 1 an, selbst wenn Kontakt 2 gesetzt wurde
            End If
        Next i
    End If
End If

mfg
 
Hallo,

Wie zählt er denn bis 8 hoch?
Hier nochmal die Vorgehensweise:
Wenn ich einen Timer aktiviere, prüft er, ob alle Kontakte offen sind, und wenn dies der Fall ist, deaktiviert er sich selber und aktiviert wieder einen anderen Timer, der alle 50ms den oben geposteten Code aufruft. Der soll dann prüfen, ob ein neuer Kontakt gesetzt wird, und wenn dies der Fall ist, diesen in ein Array speichern. Anschließend muss ich noch eine Funktion schreiben, die wartet, bis wieder alle Kontakte offen sind und anschließend wieder auf neue Kontakte prüft und diese dann ggf. ebenfalls in dieses Array an nächste Stelle speichert.
Wenn jetzt also jeder Kontakt theoretisch nur 50ms dauern würde und ich 3 verschiedene Kontakte nacheinander setze, sollen diese dann mit den passenden Werten (1 bis 8) in mein Array gespeichert werden. In diesem Fall wären dann 3 Werte vorhanden.
Denk nicht: :rolleyes: , irgendwie hat das schon nen Sinn... :suspekt:

MFG
 
Hallo,

habe mich nochmal näher mit dem Code beschäftigt. Das meiste habe ich jetzt durchblickt, nur diese eine Zeile noch nicht:

Code:
bArray(UBound(bArray)) = True

Was genau wird in dieser Zeile gemacht? Ich habe bis jetzt noch keine Funktion gefunden, in der ein Wert zum Array hinzugefügt wird, sondern nur das Array um einen erweitert wird, der aber leer bleibt. (jedenfalls habe ich das so aus dem Code herausgelesen)

MFG
 
Den Sinn dahinter verstehe ich auch nicht.
Aber was es macht ist ganz einfach. UBound(bArray) gibt die oberste Grenze des boolschen Arrays "bArray" zurück. Mit dieser Grenze, das also das letzte Feld des Array darstellt, wird dem letzen Feld des Arrays der Wert Wahr zugeordnet.
 
Naja, der Sinn ist der, dass der höchste Wert (entspr. dem Wert des Kanals) auf True gesetzt wird, somit ein Signal eingegangen ist.
Er wollte laut seinem 1. Post das Array erweitern, und Wert1-XX reinschreiben, ich habe ein Boolean Array genommen, in dem die Zustände angezeigt werden (True/False).
Nun könnte er das Array rückwärts durchlaufen und seine weitere Aufgabenstellung bearbeiten.
 
Da liegt der Fehler :rolleyes:

Und zwar soll das ganze so laufen:

Ich rufe die Prozedur auf und lege nacheinander die Kontakte 5 - 8 - 4 - 1. Das ist jetzt nur ein Beispiel. Und mein Array soll dann folgende Werte enthalten: 5, 8, 4, 1. Ganz einfach.
Ich muss nur wissen wie ich diese Werte richtig in mein Array speichere und hinterher auch anzeigen lassen kann (alle auf einmal, nur zum testen) und gezielt herauslesen kann. Zuerst den ersten, dann den zweiten usw.

Geht das?

MFG
 
Warum dann ein Boolesch Array? Das ist doch viel Besser mit Flags zu lösen.

Visual Basic:
Public Enum Kontakte
    Nicht = 0
    Kontakt1 = &1
    Kontakt2 = &2
    Kontakt3 = &4
    Kontakt4 = &8
    Kontakt5 = &F ' 16
    Kontakt6 = &20 ' 32
    Kontakt7 = &40 ' 64
    Kontakt8 = &80 ' 128
End Enum

Visual Basic:
   Dim Signal as Kontakte
  
 ' setzen 
  Signal = Signal And Kontakt1 And Kontakt6

  ' Lesen
  If Signal Or Kontakt1 = Kontakt1 Then
...
  End If
 
Zurück