Cześć,
Od jakiegoś czasu kombinuję nad stworzeniem własnego gateway'a ZigBee na #linux. Dokopałem się do dokumentacji IEEE 802.15.4 i chciałbym postawić taki stack, żeby komunikacje obsługiwać po socketach z wykorzystaniem interfejsu. Nie wiem jak dokładnie się za to zabrać. Czy wrzucenie takiego stack'u wymaga kompilacji kernela, czy jest to możliwe w jakiś inny łatwy sposób?
#programowanie #zigbee #embedded #cpp #raspberrypi
  • 1
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

Czy trzeba dodawać sfinae/concept jeżeli kod i tak się nie skompiluje bez spełnienia warunku? Jest to dobra praktyka?
#cpp
  • 2
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

Właśnie dowiedziałem się, dlaczego makra są złe. Próbuję zaincludować header i nagle wielki error "makro redefined" i widzę, że identyczne makro includuje linuksowa libka i header.
Jednego makra nie mogę zmienić, bo to plik linuxa, a drugie makro ma około 6000 wystąpień w kodzie, więc też wolałbym tego nie zmieniać.
Da się coś z tym zrobić? Rozważam wypowiedzenie.
#programowanie #cpp
  • 4
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@Gerax9: nie makra są generalnie złe, tylko makra z C / C++ są złe. Inne języki z makrami nie mają takich problemów.

Możesz spróbować oddefiniować makro przez #undef zaraz po zainkludowaniu headera. Wtedy kolejny include nie będzie widział tego makra i zdefiniuje swoje.
  • Odpowiedz
Czy jeżeli robię kopię w funkcji to argumenty powinny być zawsze przekazane by value?

void funkcja(std::string str)
{
std::string s = std::move(str);
}
  • 11
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@Gerax9: Dla ciężkich obiektów typu string używaj albo const string&, albo string&& i move. Często robi się oba jako overloady.
  • Odpowiedz
@Gerax9: podejście z const referencją ma wadę jak przychodzi do konwersji. przekazując const char* stworzysz temporary stringa, którego będziesz kopiował, w podejściu z wartością zmovujesz ten, który powstał przy konwersji.

teoretycznie fajnie by było mieć obie sygnatury. w praktyce idzie się skichać przy 2^n overloadach dla n parametrów.

po to powstał perfect forwarding, żeby miec jeden generyczny overload, ale wtedy witajcie szablony i ich mankamenty.
  • Odpowiedz
Mam kilka pytań do osób zajmujących się rtosami.
1. Czy można tam programować w C++ używając stla/boosta i czy jest to popularne rozwiązanie?
2. Większość pracy to programowanie czy rozwiązywanie problemów rtosowych?
3. Czy jest to ciekawa działka w którą warto iść, czy raczej ślepy zaułek?
4. Jak zacząć? FreeRtos? Jakieś specjalne IDE?
#programowanie #cpp
  • 2
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@Gerax9: 1. Wszystko można, tylko po co :) Z C++ jest ten problem, że jak napieprzysz wirtualnych metod, wyjątków i innych cudów nie widów, to bardzo trudno przewidzieć ile potrzebujesz czasu, żeby wykonać ten kawałek kodu. Szablony i wszystko co się z nimi wiąże, są znacznie bardziej przewidywalne.
2. Wszystko zależy od projektu.
3. Ciekawe jest to, co Cię interesuje :) Ale to jest nisza, więc nie spodziewaj się tylu
  • Odpowiedz
1. Czy można tam programować w C++ używając stla/boosta i czy jest to popularne rozwiązanie?


@Gerax9: Można pod warunkiem, że wiesz co robisz. std::vector, std::map - zapomnij*, ale std::array i inne szablony bardzo ułatwiają robotę.

2. Większość pracy to programowanie czy rozwiązywanie problemów
  • Odpowiedz
Dawno dawno temu uczyłem się c++ i próbowałem robić gry. Mówię sobie wrócę do tego.

Po trzech godzinach walki z środowiskiem, kompilatorem, źródłami i wgl wszystkim innym przypomniało mi się dlaczego nigdy żadnej gry nie zrobiłem ;)

#cpp #programowanie
  • 3
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@ulath: Popracuj nad formatowaniem, zwykle edytory mają funkcję automatycznego formatowania. Wyeliminuj duplikujący się kod poprzez użycie funkcji. Podziel kod na dużo mniejsze funkcje - to jest ok, nawet jeśli używasz funkcji tylko w jednym miejscu. Zamiast drabinki ifów "if(choice == "ssak").." możesz użyć mapy. Funkcja zmienParametry do wywalenia, nie wiem po co jej używasz, skoro i tak masz bezpośredni dostęp do zmiennych składowych klasy zwierze. Nie używaj nazw typu a,
  • Odpowiedz
@ulath: Możesz się już zainteresować czym są słowniki w programowaniu. To takie struktury, które służą do szybkiego wyszukiwania obiektów. Szybszego niż wkładanie obiektów do tablicy i sortowanie jej. Takie struktury w C++ noszą nazwę set,unorderedset, map, unorderedmap. Wtedy po prostu przy tworzeniu obiektu wkładasz do takiej struktury, a w odpowiednim momencie wyciągasz z niej, jeśli klucz istnieje. Być może uda ci się to zaimplementować
  • Odpowiedz
@Gerax9:

Co z konstrukcjami typu std::vector<std::sharedptr<T>> ?

Zależy od przypadku użycia. Na przykład, jeżeli jesteś w stanie zagwarantować, że obiekty w wektorze "przeżyją" ten wektor, to co jest złego w surowych wskaźnikach? Przez właśnie taką paranoję powstają dziwactwa jak std::observer_ptr ( ͡° ͜ʖ ͡°)
I prawdopodobnie takie powinno być jedyne znaczenie surowych wskaźników we współczesnym C++ - odniesienie do obiektu, którego nie jesteśmy właścicielem.
  • Odpowiedz
Firma ma budżet na szkolenia. Nie wiem skąd ten nacisk, ale koniecznie przy wyborze musimy się kierować tym, żeby było stacjonarnie.

Jaka firmę/osobę możecie polecić do przeprowadzenia takiego kursu?

Działamy w #embedded i w głosowaniu wygrywa szkolenie z #cpp #c++ . Nie zamykamy się na inne tematy, ale Cpp must have.

#programowanie #naukaprogramowania #krakow
  • 12
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

#c++ #cpp #informatyka #programowanie

Działam z klasami w C++. Jest klasa ryba i ptak, co dziedziczą po klasie zwierze.
Jest też klasa ptakoryb co dziedziczy po ptaku i rybie ale mam problem z dostaniem się do metody jedz() która jest zdefiniowana w klasie zwierze.

class Zwierze
  • 9
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

Jak piszesz class ptakoryb : public Ryba, public Ptak to robisz stwora który ma i pysk ryby i dziób ptasi (a bardziej technicznie - masz dwie kopie cech zwierzęcych w ptakorybie - jedne od ryby a drugie od ptaka). Inaczej je się pyskiem ryby a inaczzej dziobem. Kompilator nie wie którym z nich chcesz coś zjeść. Masz dwa wyjścia:
- możesz powiedzieć kompilatorowi (explicit) - zjedz dziobem poprzez pr.Ptak::jedz()
- albo możesz
  • Odpowiedz
Sprawdzam projekt cppcheckiem i dostałem wskazówkę, żeby pętlę zamienić na std::transform.
Napisałem sobie test, żeby zobaczyć jak będzie zachowywał się obiekt po takiej zmianie i widzę, że przy każdym obiekcie wywoływany jest konstruktor przenoszący. Robię coś źle, czy po prostu std::transform w takim prostym przypadku wykorzystuje więcej zasobów od pętli?

Co byście użyli w takiej sytuacji?
https://godbolt.org/z/7fMbPabEo

#cpp
  • 7
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@Gerax9: lambda by default zwraca przez wartość, zatem zwracasz w tej lambdzie kopię. dorzuć tam ->decltype(auto) w lambdzie, to będzie referencję zwracać i nie będzie przenoszenia
  • Odpowiedz
@Gerax9: jednakże w korzystając z transforma chcemy tak naprawę tworzyć nowe obiekty(czyli zwracać przez wartość(rvo) i przenosić), a nie zwracać referencje do istniejących, więc zastanów się co tak naprawdę chcesz zrobić. chyba, że zwracasz referencję do membera, to ok
  • Odpowiedz
@noway321: wrzucac, wrzucac co sie da i ile sie da technologii wylistowac.. nawet takie pierdy jak HTML, XML.. wszystko jak leci.. edytory jakich uzywales.. wszystko
  • Odpowiedz
wrzucac co sie da i ile sie da technologii wylistowac.. nawet takie pierdy jak HTML, XML.. wszystko jak leci.. edytory jakich uzywales.. wszystko


@6a6b6c:pierdyliard technologii, których nawet nie znasz ale widziałeś raz na oczy, jak u hindusa, co za bezsens
  • Odpowiedz
Mam vector w którym są sharedpointery

std::vector<shared
ptr<Object>> tab;

i teraz chcę wyszukać obiekt po jednym z jego
  • 3
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@Gerax9: możesz stworzyć też stworzyć (generyczny) adapter, który będzie przyjmował funktor akceptujący T, a który będzie zwracał funktor akceptujący U, gdzie dereferencja U będzie dawać T. wtedy będzie można użyć tego mniej więcej tak

std::find_if(tab.begin(), tab.end(), withDeref([](const Object& obj){return obj.atr == 3;}));
przykładowy jednolinijkowy adapter w c++17(ofc można dorzucić tam perfect forwarding, ale to troche skomplikowane przy capture)

constexpr auto withDeref = [](auto& functor){return [functor](const auto& dereferencable){return
  • Odpowiedz