[VB] Rozdzielenie jednej zmiennej na trzy


(Davidkbc) #1

Witam, działam w Visual Basic Express 2010 z komunikacją po UDP i nie moge rozwiązać nastepującego problemu.

Dostaje po komunikacji ciąg znaków który zapisuje do zmiennej np. x = 100;200;OK lub 3;4;OK itd. i teraz potrzebuje rozdzielić tą zmienną na trzy inne tzn. a=100, b=200, c=OK tzn. każde wyrażenie oddzielone ";" (lub jakimś innym znakiem) do innej zmiennej. Czy jest na to jakiś prosty sposób?


(floyd) #2

Chyba jesteś bardzo początkującym programistą bo nawet z zapisem zmiennej x jest coś nie tak. :slight_smile:

Zmienne powinno się raczej deklarować określając ich typ. np.

dim x as string             (zmienna tekstowa)

x=“100;200;OK”

aby ją rozdzielić tworzymy tablicę

Wcześniej deklarujemy tablicę :

dim tablica() as string

Przy pomocy funkcji Split rozdzielamy elementy zmiennej X i zapisujemy je w naszej tablicy

tablica=split(x,";")

Poszczególne elementy tej tablicy będą tymi rozdzielonymi elementami, czyli:

tablica(0) będzie oznaczała zmienną “100”

tablica(1) będzie oznaczała zmienną “200”

tablica(2) będzie oznaczała zmienną “OK”

Jeżeli nie znamy liczby elementów tablicy, to do jej określenia można użyć funkcji Ubound

LiczbaElementow=ubound(tablica)

w tym przypadku liczbaElementow=2 (licząc od zera)

Zmienna LiczbaElementow też powinna być wcześniej zadeklarowania np.

dim LiczbaElementow as long

Jeżeli znamy liczbę elementów tablicy to można w pętli for coś tam z tymi elementami tablicy robić dalej np. wypisywać, tworzyć nowe zmienne itd

For i=0 to LiczbaElmentow

next i

albo po prostu tak jakTy chcialeś;

a=tablica(0)

b=tablica(1)

c=tablica(2)

Po zadeklarowaniu wcześniej zmiennych,a,b,c jako zmienne tekstowe

Jeżeli chcemy aby zmienna była liczbą, to do takiej zamiany używamy funkcji val

liczba1=val(tablica(0) itd.


(Edgarus) #3

Jeśli to visual basic .net to klasa string ma metodę split. http://msdn.microsoft.com/en-us/library/6x627e5f(v=vs.90).aspx

A później poszczególne elementy z tablicy, która jest wynikiem działania Split, przypisać do zmiennych.


(Davidkbc) #4

Dziękuje za pomoc o to mi chodziło :slight_smile:

żeby nie zakładać nowego tematu zadam tutaj jeszcze jedno pytanie:

 

posiadam podłączony do komputera przez usb sterownik z wjściami oraz wyjściami i obsługuje go z poziomu VB za pomocą ActiveX tzn. odpytuje o stan wejść, wystawiam wyjścia itd. I tutaj pytanie czy jest w VB jakaś możliwość ciągłego “monitorowania” tych wejść? Do tej pory używałem do tego celu timera który co określony czas odpytywał dane wejście.


(floyd) #5

Nie wiem co Ty rozumiesz przez ciągły monitoring.

Dla mnie każde działanie cykliczne odbywa się co pewien określony czas, krótszy lub dłuższy w zależności od potrzeb.

Jeżeli wykorzystujesz kontrolkę timer, to standardowo umieszczona w niej procedura jest wywoływana co 1 sek czyli zmienna interval=1000 (czas mierzony w milisekundach). Nic nie stoi na przeszkodzie aby ustawić wartość tej zmiennej na: interval=100 i wówczas procedura będzie wywoływana co 0,1 sek, a gdy ustawimy interval=10, to co 0,01 sek.

Jak dla mnie jest to wystarczająco krótki czas aby w większości zastosowań mówić o ciągłym monitoringu.


(Davidkbc) #6

 

Może źle to napisałem. W tym momencie robie to tak jak napisąłeś za pomocą kontorlki timer z interval=100. Pytałem o to czy nie ma w VB gotowej funkcji do “odpytywania” tych wejść żeby nie robić tego za pomocą timera.


(floyd) #7

Nawet gdyby była taka kontrolka, to działała by na tej samej zasadzie, tylko wszystko było by bardziej ukryte.


(Davidkbc) #8

Ok, masz racje.

 

Jeszcze jedno pytanie w jaki sposób mogę zrealizować żeby program czekał z wykonaniem kolejnych insturkcji aż pojawi się sygnał na wejściu?

W timerze odpytuje co 0,1s to wejście:

 

 in1 = abb.get_InX(4)

 

i niezależnie od tego wykonuje się kod proagramu, próbowałem robić to w ten sposób:

 

      in1t.Text = “start”


(Edgarus) #9

Jak dla mnie, to gdy kod wejdzie w pętlę, to z niej nie wyjdzie, no chyba że z innego miejsca i w innym wątku zmieni się in1

 

takie pytania:

  1. Co to za ActiveX, napisz dokładnie, może ma eventy, którymi się załatwi logikę odbierania danych.
  2. Czy sterownik komunikuje się natywnie przez usb, czy emuluje port com? Jeśli emulje, to w .NET masz klasę SerialPort http://msdn.microsoft.com/pl-pl/library/system.io.ports.serialport(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1

(floyd) #10

Taka pętla będzie działać bez końca. :frowning:

Jeśli już chcesz korzystać z takiej pętli to musiało by być coś w tym stylu:

Do While (in1 = False)

n1 = abb.get_InX(4)

Loop

i gdy n1 przyjmie wartość true, to pętla będzie opuszczona.

ale jeśli odczytujemy wartość n1 w pętli to dzialanie timer jest w tym przypadku zbyteczne, czyli ustawiamy

timer.enabled=false ’ i co najwyżej po wyjściu z pętli uruchamiamy ponownie zegar o ile to potrzebne.

n1 = abb.get_InX(4)

Do While (in1 = False)

n1 = abb.get_InX(4)

loop

timer.enabled=true

===============

Można też nie używać żadnej pętli, a tylko użyć instrukcji if przy jednocześnie włączonym timer czyli timer.enabled=true

n1 = abb.get_InX(4)

if n1=true then

else

endif