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

Terminator2

Erfahrenes Mitglied
Hi,

habe eine kleine Frage zu der Array Funktion. Und zwar wir eine Prozedur mit einem Timer alle 50 ms aufgerufen. Dort wird geprüft, ob an einem externen IO-Modul einer der 8 Eingänge geschaltet wurde. Diese haben die Bedeutung vom Wert 1 bis 8. Anschließend soll dann jedes Mal, wenn einer dieser Kontakte geschaltet wurde, der dazu gehörige Wert in ein Array gespeichert werden, welches dann immer auf die passende Größe vergrößert wird. Hier der Quelltext:
Code:
        If IIf(meMPIO1.GetCachedLine(1, 1), "1", "0") = 1 Then
            'Wert 1 in Array hinzufügen
        End If
   
        If IIf(meMPIO1.GetCachedLine(1, 2), "1", "0") = 1 Then
            'Wert 2 in Array hinzufügen
        End If

        If IIf(meMPIO1.GetCachedLine(1, 3), "1", "0") = 1 Then
            'Wert 3 in Array hinzufügen
        End If

        If IIf(meMPIO1.GetCachedLine(1, 4), "1", "0") = 1 Then
            'Wert 4 in Array hinzufügen
        End If

        If IIf(meMPIO1.GetCachedLine(1, 5), "1", "0") = 1 Then
            'Wert 5 in Array hinzufügen
        End If

        If IIf(meMPIO1.GetCachedLine(1, 6), "1", "0") = 1 Then
            'Wert 6 in Array hinzufügen
        End If
   
        If IIf(meMPIO1.GetCachedLine(1, 7), "1", "0") = 1 Then
            'Wert 7 in Array hinzufügen
        End If

        If IIf(meMPIO1.GetCachedLine(1, 8), "1", "0") = 1 Then
            'Wert 8 in Array hinzufügen
        End If

Der Timer wird dann bei einem bestimmten Ereignis gestoppt und das Array wird nicht mehr erweitert.

Dann sollen die Werte nacheinander (der, der am ersten hinzugefügt wurde, zuerst und dann die anderen hintereinander) ausgelesen werden und bei jedem ein bestimmtes Ereignis ausgeführt werden. Wenn dieses Ereignis dann ausgeführt wurde, soll der Wert dann aus dem Array gelöscht werden.
Ich hoffe mal, das geht. ;-)

Danke im vorraus (fertige Quelltexte hab ich am liebsten ;-) :) )
 
Guten Morgen,

sowas in der Art ? (ungetestet)
Code:
Dim bArray()    As Integer
    Dim i           As Long

    
    For i = 1 To 8
            
        If (meMPIO1.GetCachedLine(1, i) = "1") Then
            ReDim Preserve bArray(UBound(bArray) + 1)
            bArray(UBound(bArray)) = True
        End If
    Next i
 
Also wenn ich mir das durchlese sieht das ja logisch aus. Aber irgendwie funktioniert das trotzdem nicht.
Ich habe einfach mal eine MsgBox am Ende eingefügt, in welcher dann UBound(bArray) angezeigt werden soll.
Jedoch erscheint keine Meldung, wenn ich einen Kontakt erzeuge. Woran kann das liegen?

Habe vor die For i = 1 To 8 Schleife eine MsgBox gesetzt, die auch immer schön kommt. Also scheint irgendetwas mit der For Schleife nicht zu stimmen... :mad:
Ich poste nochmal meinen aktuellen Quelltext:
Code:
Dim bArray()    As Integer
Dim i           As Long

If meMPIO1.Attached Then
    If connect = 1 Then
        MsgBox ("Vor For Schleife angekommen")
        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))
            End If
        Next i
    End If
End If

MFG
 
Hi,

wie ist es denn, wenn Du einen Breakpoint auf die IF-Abfrage setzt und mit F9 durchstepst ?
Ich verwende das "IIF" Konstrukt nicht, kann ja sein, dass ich das falsch übersetzt habe.
Ersetze meine IF-Abfrage durch
Code:
IIf(meMPIO1.GetCachedLine(1, i), "1", "0") = 1 Then

Ansonsten würde ich sagen, da kommt kein Signal.

Achja, ersetz mal "Dim bArray() As Interger" durch "As Boolean"
 
Habe noch einmal etwas rumprobiert und folgendes festgestellt. Mit meinem akutellen Quelltext:
Code:
Dim bArray()    As Boolean
Dim i           As Long

If meMPIO1.Attached Then
    If connect = 1 Then
        For i = 1 To 8  'Schleife für Kanal 1 bis 8
            If IIf(meMPIO1.GetCachedLine(1, i), "1", "0") = 1 Then
                MsgBox ("Kontakt " & i & " angekommen") 'Meldung erscheint bei jedem Kontakt mit richtiger Nummer
                'Wert 1 bis 8 in Array hinzufügen
                ReDim Preserve bArray(UBound(bArray) + 1)
                bArray(UBound(bArray)) = True
                MsgBox (UBound(bArray))     'Meldung erscheint nicht
            End If
        Next i
    End If
End If

Wird jedesmal, wenn ich einen Kontakt erzeuge (Mit Hardware usw.) die Meldung angezeigt "Kontakt i angekommen". Jedoch wars das dann. Danach kommt nichts mehr. Erst wieder die gleiche Meldung, wenn ich den Kontakt von vorher oder einen anderen setze.

mfg
 
Hast du eventuell eine Fehlerbehandlung drin ?
Meines Wissens bekommt man eine Fehlermeldung, wenn UBound über ein undimensionierten Array aufgefrufen wird.
Also vor der Schleifer erstmal "ReDim bArray(0)" aufrufen.
 
Hi,

Habe jetzt auch den Debugg Modus entdeckt :)
Also mal alles mit Stop-Punkten versehen und festgestellt, dass er folgendes macht:
Code:
Dim bArray()    As Boolean
Dim i           As Long

If meMPIO1.Attached Then
    If connect = 1 Then
        For i = 1 To 8  'Schleife für Kanal 1 bis 8
            If IIf(meMPIO1.GetCachedLine(1, i), "1", "0") = 1 Then
                MsgBox ("Kontakt " & i & " angekommen") 'Meldung erscheint bei jedem Kontakt mit richtiger Nummer
                'Wert 1 bis 8 in Array hinzufügen
                ReDim Preserve bArray(UBound(bArray) + 1)

und das hier nicht mehr:
Code:
                bArray(UBound(bArray)) = True
                MsgBox (UBound(bArray))     'Meldung erscheint nicht
            End If
        Next i
    End If
End If

Also nehme ich mal an dass etwas mit dem bArray... = True nicht stimmt.
Aber ich glaube, ihr habt mehr Ahnung davon ;)

mfg
 
Bist Du den Code auch mit F8 durchgelaufen?
Er springt dann nach der Zeile "ReDim Preserve bArray(UBound(bArray) + 1)" wieder in die Schleife?

Fehler verstehe ich nicht, läuft bei mir problemlos.
 
Meinen Post durchgelesen ? Sicher nicht.
Es kommt der Fehler ungültiger Index an der Stelle an dem das Array das erste mal neudimensioniert wird.
Du hast sicherlich eine Fehlerbehandlung On Error Goto 0 oder ähnlich.

Visual Basic:
        ReDim bArray(0)
       
         For i = 1 To 8  'Schleife für Kanal 1 bis 8
            If 1 = 1 Then
                MsgBox ("Kontakt " & i & " angekommen") 'Meldung erscheint bei jedem Kontakt mit richtiger Nummer
                'Wert 1 bis 8 in Array hinzufügen
                ReDim Preserve bArray(UBound(bArray) + 1)
                bArray(UBound(bArray)) = True
                MsgBox (UBound(bArray))     'Meldung erscheint nicht
            End If
        Next i
 
Zurück