tablica danych

Tematy związane z tworzeniem dużych aplikacji. Zaganiednia dotyczące architektury oraz zasad tworzenia optymalnych rozwiązań.
Awatar użytkownika
The River
Posty: 3
Rejestracja: 04 gru 2013 16:52
Wersja środowiska: LabVIEW 2013

tablica danych

Post autor: The River »

Witam

Chciałbym zaimplementować w labview taki fragment algorytmu który ma za zadanie przeszukiwać tablicę jednowymiarową zawierającą 4 elementy. Każdy element przyjmuje wartość 0 lub 1. Ja potrzebuję odczytać ten stan , wykonać inną czynność i skasować jedynkę. W języku c napisałbym to mniej więcej w ten sposób:

Kod: Zaznacz cały

void wywołaj_funkcje(int argument);
int tablica[4];     // tablica jest  modyfikowana gdzieś tam w jakiejś pętli
(...)
int i;
for(i=0;i<4;i++)
{ 
  if(tablica[i])  wywołaj_funkcje(i);    tablica[i]=0;
}
Ponieważ od jakiegoś już czasu programuję w C więc algorytmy od razu układają mi się w tej formie, a niestety mam jakiś problem z przekładaniem tego na diagram blokowy w labview. Pewno dlatego że nie znam jeszcze w pełni wszystkich możliwość i wszystkich funkcjonalności poszczególnych bloków. Byłbym wdzięczny gdyby ktoś podpowiedział jak to zaimplementować w labview lub chociaż podpowiedział jakie bloki można byłoby tutaj wykorzystać.
Awatar użytkownika
Pitol
Moderator
Posty: 983
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków

Re: tablica danych

Post autor: Pitol »

No to po kolei analizujemy Twój kod i przetwarzamy na obrazki ;)

Kod: Zaznacz cały

int tablica[4];
1. Inicjalizacja tablicy - bloczek Initialize Array

Kod: Zaznacz cały

int i;
2. iteratora nie trzeba definiować

Kod: Zaznacz cały

for(i=0;i<4;i  )
3. pętla FOR, do której podłączasz tablicę tak, aby wejściowy terminal był trybie indeksowania:
FOR.gif
FOR.gif (2.21 KiB) Przejrzano 7751 razy
Dzięki takiemu podłączeniu nie musisz "iterować" po elementach tablicy. Zrobi to za Ciebie sama pętla FOR. Sama pętla również będzie wiedziała ile razy ma się zakręcić.
LabVIEW robi to za Ciebie ;)

Kod: Zaznacz cały

if(tablica[i])  wywołaj_funkcje(i);    tablica[i]=0;
5. Następnie sprawdzasz czy element równy jest 1 np. za pomocą bloczka Equal. Następnie wynik podpinamy do struktury CASE. W przypadku stanu FALSE przeciągamy element tablicy dalej, a w przypadku TRUE element tablicy zerujemy i wywołujemy jakąś funkcję.
6. Po wyjściu ze struktury CASE element tablicy podpinamy do wyjścia z pętli FOR, czyli po prostu do "prawej" ściany :) I tu też ważne, żeby był włączony tryb indeksowania.

Ech... tyle pisania, a można to było zrobić małym jednym obrazkiem.
Ale u mnie nie ma łatwo, gotowców nie rozdaję...
ObrazekObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj
Awatar użytkownika
The River
Posty: 3
Rejestracja: 04 gru 2013 16:52
Wersja środowiska: LabVIEW 2013

tablica danych

Post autor: The River »

dzięki wielkie, taka analiza dała mi dużo więcej niż tysiąc gotowców
Awatar użytkownika
The River
Posty: 3
Rejestracja: 04 gru 2013 16:52
Wersja środowiska: LabVIEW 2013

Re: tablica danych

Post autor: The River »

Witam ponownie

Przeanalizowałem sobie to wszystko jeszcze raz i działa to bardzo ładnie tylko teraz inna kwestia związana z tablicą. Mianowicie wygeneruję sobie w pętli jak powyżej jakąś tablicę zawierającą 5 elementów, początkowo same 0. I chciałbym oprócz sprawdzania w pętli jaka jest aktualna jej zawartość, również modyfikować jej zawartość. Wybaczcie mi że znów posłużę się przykładem w C

Kod: Zaznacz cały

int tablica[5]={0,0,0,0,0}              // co prawda zera sa dodawane automatycznie ale ...niech będzie :)
(...)
// dalej w jakimś miejscu w programie edytuję tablicę
if(coś_tam)                tablica[3]=9;                        // aktualny wygląd tablicy ->     tablica[5]={0,0,0,9,0}
if(coś_tam_innego)    tablica[2]=7; tablica[3]=1;     // tablica ulegnie zmianie ->    tablica[5]={0,0,7,1,0}
Wiec tym razem spróbowałem sam przenieść coś takiego do labview (w załączniku) ale niestety nie działa to należycie. Mianowicie udaje mi się umieścić element pod wskazany index ale przy próbie umieszczenia jakiejś wartość w innym miejscu, ta poprzednia wartość w poprzednim miejscu mi znika i nie mam pojęcia co źle robię.
Załączniki
tab2.vi
(11.71 KiB) Pobrany 346 razy
Awatar użytkownika
Pitol
Moderator
Posty: 983
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków

tablica danych

Post autor: Pitol »

Wszystko jest w porządku poza jednym faktem.
Brakuje Ci rejestru przesuwnego (shift register), który będzie pamiętał wartość "zmiennej" tablica.

Aktualnie w każdym wywołaniu pętli do "obliczeń" będzie brana wartość zainicjowana przed pętlą, czyli same zera.
Aby móc zmieniać i zapamiętywać aktualną wartość tablicy musisz stworzyć rejestr przesuwny.
Po kolei:
Klikasz prawym na krawędź pętli while (lewą lub prawą, dowolnie) i wybierasz Add Shift Register.
Następnie do rejestru przed pętlą podpinasz to co zainicjowałeś.
Wyjście z bloczka Replace Array Subset podpinasz do prawego "węzła" rejestru przesuwnego.

Odpal sobie program z żarówką (Highlighted Execution - parę w lewo od przycisku RUN) i zobacz jak to działa.
ObrazekObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj
ODPOWIEDZ