• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wykorzystanie LIST<T> do bufora cyklicznego

Object Storage Arubacloud
0 głosów
342 wizyt
pytanie zadane 4 stycznia 2016 w C i C++ przez Mateusz Tocha Bywalec (2,560 p.)

Korzystam z Interfejsu Szeregowego do odbioru danych z uC, danych jest dużo bo są tam wartości wszystkich zmiennych, mierzonych, podczas sterowania silnika z magnesami trwałymi.

<span style="font-size:10px">void RS232v0001::MyForm::OnDataReceived(System::Object ^sender, System::IO::Ports::SerialDataReceivedEventArgs ^e)
{
	int maxItems=5;	 
	if (((SerialPort^)sender)->IsOpen) {
		String^ indata = ((SerialPort^)sender)->ReadExisting();		
		this->SetText(indata); //przypisanie do label 1 z obsługą wątku
		
		this->vec->Add(indata);	
		//vec[0]
		//vec[1]
		//vec[2]
		//vec[3]
		//vec[4]
		//vec[5]
		if (this->vec->Count >= maxItems) {
			//chciałbym ustawić "wskażnik" na początek 
			//vec[0] 
			//i w każedej iteracji nadpisywać kolejne itemy
		}
		}
}</span>

Czy Lista<T> w tym przypadku może być wykorzystywana do takiego celu? Czy lepiej pisać własny bufor cykliczny z Iteratorem?

 

1 odpowiedź

0 głosów
odpowiedź 4 stycznia 2016 przez nouveu Bywalec (2,560 p.)
Ja bym polecił listę cykliczną:
głowa_listy->0->1->2->...->5->0->1->...

Możesz też kombinować za pomocą operatora modulo:
i%6 // daje indeksy po kolei 0,1,2,3,4,5,0,1,2,3,...

Ale jak zmienna 'i' wykroczy poza zakres nie wiadomo co z tego wyniknie.

W każdym razie rozwiązanie z if-em wygląda źle, 6 razy sprawdza warunek który spełniony będzie tylko raz na cykl.
komentarz 4 stycznia 2016 przez Mateusz Tocha Bywalec (2,560 p.)
edycja 4 stycznia 2016 przez Mateusz Tocha

Dzięki za odpowiedź

Tak własnie chodzi o coś takiego jak buffor cykliczny który pokazałeś, tak robię np na mikroprocesorze, ale tutaj z racji tego ze potem ten bufor "vec" będę później jeszcze parsował to wygodniej byłoby mi korzystać z listy.

Teraz znalazłem metodę, Listy<T> Enumerator 

this->vec->Add(indata);    
this->En = this->vec->GetEnumerator();
this->En.Reset();

 

lecz muszę się nauczyć jak się do niej odwołać bo źle to robię, przede wszystkim bo obiekt zwracany jest typu   List<String^>::Enumerator En;

Ale momencie użycia metody Reset() wysypuje się.

Co do sprawdzania warunku to masz jakiś ciekawszy sposób? Myślałem żeby rozszerzyć tą klasę i nadpisać metode Add, stworzyć delegaty i event który będzie triggerowany w momencie przekroczenia zakresu, ale to i tak nie zmienia ilości sprawdzeń ...

komentarz 4 stycznia 2016 przez nouveu Bywalec (2,560 p.)
Hej, List<T> to jest lista dwukierunkowa (niestety nie cykliczna) to znaczy że możesz dodawać/usuwać do niej elementy na początku i na końcu. Możesz próbować robić to na zasadzie że wywalasz ostatni element i dodajesz nowy na przodzie ale ja bym stawiał jednak na bufor cykliczny.

Bufor(lista) cykliczny obejdzie się bez if-a:
http://pastebin.com/wzr1rvjx
komentarz 4 stycznia 2016 przez Mateusz Tocha Bywalec (2,560 p.)
Twój kod jest dobry, dzięki. Jednak martwię się trochę o to że zaczynam pisać pod ten C++/CLI, i nie wiem czy przez takie dowiązanie przez & nie zadziała jakiś Garbage.Collection. Muszę o tym poczytać

Skąd wiesz że LIST<T> jest listą dwukierunkową skoro jego Enumerator ma właściwie metode MoveNext a nie posiada MovePrev?
komentarz 4 stycznia 2016 przez nouveu Bywalec (2,560 p.)
Chyba mówimy o różnych listach, ja mówię o tej którą znalazł mi Google: http://en.cppreference.com/w/cpp/container/list
komentarz 4 stycznia 2016 przez Mateusz Tocha Bywalec (2,560 p.)
Tak z innej ja korzystam nie z biblioteki std tylko tej System.Collection.Generics

Podobne pytania

0 głosów
1 odpowiedź 268 wizyt
pytanie zadane 31 października 2018 w C i C++ przez Aleksander Początkujący (360 p.)
0 głosów
1 odpowiedź 131 wizyt
pytanie zadane 17 marca 2019 w C i C++ przez muzyk Użytkownik (860 p.)
0 głosów
1 odpowiedź 1,620 wizyt
pytanie zadane 18 sierpnia 2016 w C i C++ przez matemika Obywatel (1,550 p.)

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,964 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...