Tenonymous

  1. C++ Engineer
Tenonymous
2019-08-28 14:01

Jeżeli ktoś ma dość niewygodnych narzędzi w #embedded #cpp to być może idziemy ku lepszemu :)
https://blog.qt.io/blog/2018/05/03/qt-microncontrollers-mcu/

no_solution_found

kiedyś pisałem w QT i fajnie, że się rozwijają :)

Tenonymous

@no_solution_found: na desktop to raczej konieczne zło, jak chcemy C++ i chcemy crossplatform. Wciąż jednak chyba wygodniejszy jest dla mnie Xamarin czy WPF.
Natomiast w embbedded jest taka bieda z narzędziami, że traktowałbym to jako mini przełom. :)

PrzemysławWiśniewski

mikroe.com mają dobre środowiska dla mcu.

Tenonymous
2019-08-10 11:05

Swego czasu, w jednym z postów/komentarzy wspomniałem, że zabieram się niebawem za Clean C++
Sustainable Software Development Patterns and Best Practices with C++ 17, Pana Stephane Rotha, I jak tylko przeczytam to dam znać czy warto.

Co prawda trochę od tego czasu minęło, ale wreszcie się za nią zabrałem i ukończyłem.
Moim zdaniem świetna pozycja dla każdego programisty C++[ale nie tylko], nie dość że w książce znajdziemy sporą ilość wskazówek odnośnie pisania czystego kodu, to jeszcze mamy omówienie zasad odpowiedniego programowania obiektowego, funkcyjnego, pokazano jak podejść do TDD oraz wykazano wzorce projektowe. Praktycznie do każdej zasady autor dodaje sensowny, prosty do zrozumienia przykład, idealnie oddający sedno problemu.

Świetna, zwięzła alternatywa dla książki Clean Code. Polecam.

#cpp #books #recenzja

Sunnydev

też właśnie skończyłem czytać i popieram Twoją recenzję - naprawdę świetnie wytłumaczone oraz zobrazowane wzorce, czytelny oraz bardzo ładny, nowoczesny kod. Mnóstwo pojęć o których wcześniej w ogóle nigdy nie słyszałem. Też polecam ;D

Tenonymous
2019-03-31 22:16

Zdążyłem już polubić C# i zaakceptować pracę na Windowsie, ale niezmiernie mnie zaskakują.

Ostatnio miałem problem z użyciem klasy, załadowanej po przez dll'ke. Wszystko było poprawnie zarejestrowane, X podpowiedzi na stacku nie przyniosło rozwiązania. Co robić?
No więc, aby wytestować, czy problem nie dotyczy przypadkiem tylko tej jednej klasy - przed jej użyciem, stworzyłem sobie obiekt innej klasy z tej dll'ki, i co? Śmiga. DLLka załadowana, obiekt utworzony, no więc puszczam debugga do problematycznej klasy i co? Bangla. Idę krok dalej, usuwam niepotrzebną klasę testową, pozostawiam wszystko tak jak było pierwotnie, rekompilacja, startuję, i co? dll'ka załadowana, obiekt utworzony.

Windows to jednak stan umysłu.

Hispano-Suiza

To samo spotykało mnie dziesiątki razy x lat temu. 6h siedziałem nad problemem. Poszedłem spać. Wstałem. Odpalam projekt żeby zobaczyć błąd jeszcze raz - błędu nie ma. Tyle słów ile wtedy z siebie wyrzuciłem ahh :-) Zawsze w VS, zawsze ten ułomny język.

Afish

Clean all + Restart + Rebuild często rozwiązuje problem. Ważne jest zrobienie clean, rebuild nie robi tego samego.

Tenonymous

@Afish: od tego zacząłem. Ale to nic nie zmieniało.
@Hispano-Suiza: tutaj akurat chyba najbardziej po łapach dałbym systemowi. :P

Hispano-Suiza

U mnie nigdy Clean Solution ani Rebuild i tym podobne NIGDY nie pomogly. Najwiekszy bug mialem z Razor w VS2015 po premierze gdy pisalem projekt i do *.cshtml wciskalem

@model MvcApp.Models.Product

(chyba tak sie robilo importy modeli?) to nie wykrywalo mi ich w ogole. Przesiadka na 2013 zalatwila sprawe ale 3 dni mordowania byly.
@Tenonymous Ciezko mi stwierdzic co w tym przypadku jest bardziej ulomne :P

superdurszlak

Jak jeszcze użerałem się z .NET to w VS 2015 musiałem na wszelki wypadek ręcznie czyścić bin, bo VS w losowych momentach postanawiał jednak nie usuwać losowych projektowych DLLek. A czasem build umierał w trakcie, nie dało się go zcancelować, nie dało się też wyłączyć VS bo build niby trwał nadal.

superdurszlak

Dlatego nauczyłem się omijać to szerokim łukiem :D

siloam

Pewnie jakiś cache. W JS tego też sporo istnieje, ale i Java nie jest wolna od takich akcji. Szczególnie gdy programujesz w Eclipse.

Tenonymous

@siloam: na szczęście z Javą nie mam styczności. :D

Tenonymous
2019-01-27 22:55

Na koniec tygodnia, aby następny był lepszy, podzielę się z wami patologią jaka mnie spotkała przy ostatnim debuggowaniu kodu.

#define Root* root

Przyznam szczerze, że nawet nie chciałbym wiedzieć co na celu miał autor. Chciałbym natomiast nie poprawiać tego - ale tutaj niestety, tak kolorowo nie było.

spartanPAGE

Szkoda, że w C nie istnieje np. typedef... a nie czekaj >:I autor był małpką z atomówek

Tenonymous

@spartanPAGE: gdyby to chociaż było C, a nie młodszy kolega. :(

Michał Kuliński

W C łatwo strzelić sobie w stopę. W C++ jest to trudniejsze, jeśli jednak już to zrobisz, odstrzelisz sobie całą nogę! — Bjarne Stroustrup

Tenonymous

Złote słowa, na szczęście kompilator z C++11 minimum[a mam tę przyjemność, że wspiera aż 17'stkę] i takie potworki są sukcesywnie kasowane, natomiast za commita z #definem można wylecić z pracy. :P

Sunnydev

@Tenonymous: znasz może jakąś stronkę albo pdf'a z przykładami podobnych kwiatków jak ta definicja? Znalazłem na stacku temat w którym ludzie wypisują złe nawyki, ale to zwykła ściana tekstu i dość mało realnych przykładów..

Tenonymous
2018-12-15 15:38

Projekt, o którym wspominałem(Często spotykam się z opinią...) dostał nowe życie. Logika została całkowicie wydzielona do klas, doszło kilka nowych funkcjonalności(między innymi ściemnianie/rozjaśnianie). Dla lepszej abstrakcji postanowiłem także pozbyć się reprezentowania kolorów po przez liczbę bez znaku, tworząc klasę Colo, co ułatwiło mi operacje na poszczególnych składowych R, G i B.
Jest więcej STL'a, mniej forów, mniej ifów, więcej nowego standardu i to wszystko na 64kB Flashu. :)
Pochwalę się również, że projekt będzie wykorzystany w pracy licencjackiej - Modernistyczna Lampa. Będziemy mieć też namiastkę IOT, ponieważ powstanie crossplatformowa aplikacja do obsługi lampy z poziomu telefonu.

Ciało klasy sterującej wygląda obecnie tak:
https://pastebin.com/pV3SiXqv

Implementacja:
https://pastebin.com/AZMvrwTe

Klasa do koloru wraz z implementacją:
https://pastebin.com/dQYMFe14

E: Praca licencjacka nie jest moja - mam za zadanie jedynie napisać soft.

Pijak

Przekazywanie vectora przez wartość !?! Poczytaj jeszcze o execution policies z C++17 - mogą się przydać, bo używasz dużo algorytmów STL.

Tenonymous

@Pijak: a czemu nie? używam wersji tylko do odczytu. Vector posiada konstruktor przenoszący, nie widzę specjalnie powodów, żeby wymuszać kopiowanie.

stryku

@Tenonymous: C++ w embedded daje radę, fajnie, że to promujesz (:
Co do tego vectora to Ciebie nie rozumiem. Piszesz:

Vector posiada konstruktor przenoszący, nie widzę specjalnie powodów, żeby wymuszać kopiowanie.

A w kodzie właśnie robisz dokładnie to czego nie chcesz - przez branie vectora przez wartość, wymuszasz kopiowanie (chyba, że przy każdym wołaniu tych metod, jawnie przenosisz vector (co i tak imo nie jest fajne i lepiej przyjąć const refkę)). W żadnej metodzie, która taki vector bierze, nie zmieniasz tego vectora. Czemu nie const &?

Tenonymous

@stryku: jak wywołuję metodę, np rotate_left w sposób neopixel.roatate_left(std::vector<Color>{lista argumentow}); to nie będę miał przenoszenia? Generalnie jestem otwarty na rady i sugestie - chętnie to zatem poprawię, daj tylko informacje czemu Twoim zdaniem to nie jest dobry pomysł? :D

Azarien

tylko po co takie skomplikowane wywołanie? neopixel.rotate_left(lista argumentow);

Tenonymous

@Azarien: nie mam potrzeby na sztywno trzymać tablicy kolorów, większość metod korzysta z pojedynczego koloru. Natomiast jeżeli chodzi o użycie std::vector w przykładzie to chciałem po prostu lepiej oddać czego oczekuje metoda. Jak wywołuje to w aplikacji to robię Twoim sposobem.

stryku

jak wywołuję metodę ... to nie będę miał przenoszenia?

Racja, w takim wypadku kopia się nie wykona - będzie na Twoje.

IMHO, w Twoim przypadku foo(const vector<>&) jest lepsze od foo(vector<>) bo:

  • API jasno mówi, że nie potrzebuje swojej kopii wektora, nie będzie go zmieniać, musi tylko poodwoływać się do jego wartości i koniec.
  • parametr z const& nie zrobi kopii NIGDY vs parametr przez wartość nie zrobi kopii tylko jeżeli user użyje API w odpowiedni sposób. Jeżeli się walnie i zrobi coś takiego: vector<> v; foo(v); z miejsca leci kopia.

I tak ogólnie bardziej: Jeżeli kiedyś zechcesz zmienić API na np. wektor czegoś, co nie jest kopiowalne będziesz miał sporo miejsc do poprawiania. Z const& byś prawie nie miał roboty.

Tenonymous

@stryku: dzięki! Argumenty mnie przekonały, poprawiłem zatem na const& :)

Tenonymous
2018-12-10 23:39

https://kodolamacz.pl/bootcamp-cpp/

bootcamp c++, tego jeszcze nie grali : - )

Aryman1983

I to w dwa miechy :-) Niedługo będzie Haskell w weekend :-)

Tenonymous

@Aryman1983: bez problemu można by takiego puścić na produkcję, do pracy ze sprzętem! :D

Satanistyczny Awatar

A zapewniają odpowiednio dobrane do planu nauczania narkotyki? Bez wprowadzenia umysłu w stan zbliżony do tego w jakim znajdowały się mózgi członków komisji standaryzacyjnej może być cienko.

Tenonymous

@Satanistyczny Awatar: bez przesady, jest sporo złych rzeczy, ale absolutnie nie ma konieczności ich używania. Mi się w C++ pisze bardzo przyjemnie.

Satanistyczny Awatar

Jak pousuwasz złe (wedle ciebie) rzeczy, to żaden wyczyn. Gorzej, jak trzeba pracować z kodem kilku innych osób, które za "złe rzeczy" uznawały zupełnie inne rzeczy. Wolę pluszowy pokój w domu bez klamek, niż taką robotę. Debugowanie kernela to przy tym wyrafinowana rozkosz.

several

znajomość podstaw programowania w dowolnym języku (rozumienie pojęć takich jak pętla, instrukcja warunkowa, zmienna itp.)

piotrpo

Otrzymasz wsparcie w przygotowaniu profilu LinkedIn

vpiotr

@Aryman1983: "Haskell w weekend" już jest, ale niestety trzeba czytać, co kandydatom na bootcamp niekoniecznie może pasować: https://www.manning.com/books/get-programming-with-haskell

Aryman1983

@vpiotr: no tak bym powiedział na kilka weekendów :-)

superdurszlak

z ładnych parę miesięcy temu pokazała mi się ich reklama - hurr durr programista C++ embedded i współbieżny w ledwie parę tygodni :D

albundy

to co następne? Assembler w 2 tygodnie?

Pijak

@albundy: Machine Code Developer Bootcamp

albundy

w sumie kodołamacz to pewnie nauczą jakichś profesjonalnych algorytmów np łamania kodu enigmy

Sunnydev

ooooo. c++ w dwa miechy? BIERE W CIEMNO

grzesiek51114

łamania kodu enigmy - Kiedy wreszcie ludzie się nauczą, że kod to nie to samo co szyfr? Ja wiem, że w telewizji, w różnych programach historycznych, trąbią ciągle o "kodzie Enigmy" i wszystko byłoby wspaniale, gdyby nie to, że kod nie służy do utajniania informacji.

vpiotr

@grzesiek51114: przecież Kod Da Vinci właśnie do tego służył.

Tenonymous
2018-11-03 02:22

Często spotykam się z opinią, że C++ w Embedded to zły wybór, a modern C++ jest niemożliwy do użycia, jeżeli pracujemy blisko sprzętu.
Tymczasem płytka LPC1347 + RGB Led Ring z 12 diodami jak najbardziej daje rade.
Popełniłem prosty program pozwalający zapalać diody od 1 do 12, potem 12 do 1, itd. Z kodu zostały wycięte elementy charakterystyczne dla samego sprzętu(na życzenie, w wiadomości prywatnej mogę udostępnić całość).

class Neopixel
{
    public:
        Neopixel(LPC_SSP_T *pPort, uint32_t n);
        virtual ~Neopixel();
        void Send();
        std::vector<uint32_t> values;

        enum class Mode
        {
            UP,
            DOWN
        };

        Mode mode;

    private:
        LPC_SSP_T *pSSP;
        uint16_t LED_data;

        constexpr static const uint32_t CODE_0{0x7C00};
        constexpr static const uint32_t CODE_1{0x7F80};
        constexpr inline bool GET_BIT(uint32_t k, uint32_t n) const { return (k &   (1 << (n))); }
        constexpr inline bool SET_BIT(uint32_t k, uint32_t n) const { return (k |=  (1 << (n))); }
        constexpr inline bool CLR_BIT(uint32_t k, uint32_t n) const { return (k &= ~(1 << (n))); }
};
Neopixel::Neopixel(LPC_SSP_T *pPort, uint32_t n)
    : values(n), mode(Mode::UP)
{
    values.shrink_to_fit();

    for (auto& val : values) val = 0;
        (...).
}

Funkcja wywołująca:

constexpr static const uint32_t LED_COUNT{12};
constexpr static const uint32_t COLOR_S{6};

std::array<uint32_t, COLOR_S> colors{
        0xFFC000, //Amber
        0x0000FF, //Blue
        0x00FF00, //Lime
        0xFF0000, //Red
        0xFF00FF, //Magenta
        0xFFD700, //Gold
};

std::unique_ptr<Neopixel> LedRing;

uint32_t cnt{0};
uint32_t dnt{11};

extern "C" void SysTick_Handler(void) {
    if (LedRing -> mode == Neopixel::Mode::UP) {
        LedRing -> values[cnt % LED_COUNT] = colors[cnt % 6];
        LedRing -> Send();

        if (LedRing -> values[LED_COUNT -1] != 0) {
            for (auto& val : LedRing -> values) val = 0;
            LedRing -> mode = Neopixel::Mode::DOWN;
        }
        ++cnt;
    }

    if (LedRing -> mode == Neopixel::Mode::DOWN) {
        LedRing -> values[dnt] = colors[dnt % 6];
        LedRing -> Send();

        if (LedRing -> values[0] != 0) {
            for (auto& val : LedRing -> values) val = 0;
            LedRing -> mode = Neopixel::Mode::UP;
            dnt = 12;
        }
        --dnt;
    }

}

int main(void) {

    (...)

    LedRing = std::make_unique<Neopixel>(LPC_SSP0, LED_COUNT);
    (void) SysTick_Config(SystemCoreClock / 6);
    (...)
}
Pijak

constexpr static const uint32_t LED_COUNT{12}; lol constexpr jest obliczane w czasie kompilacji więc static const nic nie zmienia

Pijak

for (auto& val : LedRing -> values) val = 0; to chyba można zrobić tak: std::fill(std::begin(LedRing->values), std::end(LedRing->values), 0);

Tenonymous

@Pijak: słuszna uwaga właściwie do obu. Przy pierwszym sprawdzałem co na to kompilator[nic]. Co do drugiego, nie wiem czy to cokolwiek zmieni, pod jakimkolwiek względem. std::fil nie jest constepxr(ma być w C++20), więc tutaj chyba nie wiele zyskamy.

Natomiast for będzie miało przewagę, jak zamienię klasę na klasę szablonową z parametrem jawnym, vectora na array. Wtedy mam constexpr konstruktor.

vpiotr

@Tenonymous: Po co inline w GET_BIT? Nie czytałem jeszcze, ale możliwe że przydało by Ci się przeczytać Real-Time C++: Efficient Object-Oriented and Template Microcontroller Programming, czyli w skrócie jak robić duże rzeczy na małym kompie.

Tenonymous

@vpiotr: Chip_SSP_SendFrame(pSSP, LED_data) - ta metoda potrzebuje odpowiedniego bitu dla ramki. Łatwiej mi to było zapisać jako funkcję niż na sztywno w kodzie.

Tenonymous

@vpiotr: ojezus. Miałem już pisać, że doskonale wiem, że funkcje inline nie są tym, czym większość myśli, że są, ale zerknąłem wcześniej do tego co podrzuciłeś i aż mi wstyd. :v

Tenonymous
2018-10-14 00:50

Całkiem fajny jest ten #Swift od Apple. Pobawiłem się i bardzo fajnie. Jako nieposkromiony fan wszystkiego co szybkie, muszę zapytać - jak ten język wypada na tle #C++ #Golang #Rust pod względem prędkości? Ma ktoś jakieś stosunkowo bliskie prawdy benchmarki?

https://benchmarksgame-team.p[...]chmarksgame/faster/swift.html ten chyba był tutaj swego czasu mocno krytykowany.

TurkucPodjadek

A zrobiłeś już jakiś większy projekt w którymś z tym języków (to znaczy taki, co ma wiele plików/modułów, wiele źródeł danych z których pobiera i do których zapisuje, robi wiele rzeczy z takimi danymi w "locie", oraz najlepiej, jak korzysta z niego na dodatek wielu użytkowników) i trafiłeś na jakieś mierzalne problemy z wydajnością, które faktycznie były "zasługą" języka czy wciąż zastanawiasz się, który Ci szybciej "Hello World" wyświetli?

Tenonymous

@TurkucPodjadek: C, C++ i Go używam na ARMach, zatem trochę nietrafiona uszczypliwość. ;)

TurkucPodjadek

A to przepraszam. Nie ten poziom widzę, że też śmiałem tak głupie pytanie zadać... idę wybrać sobie karę.

AMD64

Szkoda, że Apple i JetBrains(jest tylko pod Apple pakiet dmg), nie udostępnili IDE na Linux, bardzo ciekawi mnie ten język.

Tenonymous

@AMD64: ogarnij sobie Cliona jak masz licencje(wtyczka do Swift) , lub po prostu wtyczkę do Sublime Text. Do sprawdzenia powinno wystarczyć

Hispano-Suiza

@AMD64: Poziom spier...dzielenia w tej firmie jak zwykle sięga sufitu. Stworzyli język, który chcą promować, a dostęp z innych platform niż OS X utrudniony. Obudzą się za kilka lat jak będzie odrobinę za późno o ile już nie jest ;-)

AMD64

Microsoft też nie udostępnia swojego Visual Studio, tylko trzeba się ratować jakimiś MonoDevelopami :)

AMD64

Po prostu nie interesowałem się .NET, ostatnio jak chciałem sobie programować w C# pod Linuksem, to było tylko MonoDevelop. I co to jest to samo IDE Visual Studio, do którego Windows 10 kazał sobie wraz z nim pobrać ponad 7 GB danych?

Hispano-Suiza

VS Code z wtyczką. Ewentualnie Rider od JetBrains. Instalacja samego Core to 3 linijki w Terminalu i o dziwo działa. Chociaż ostatnio jak kończyłem tego używać to niedomagało (Ubuntu 18.04 nie miał wsparcia).

AMD64

VS Code to instaluje jednym poleceniem sudo pacman -S code, ale to się raczej nie nadaje do programowania w C#, bynajmniej bez wtyczek, których nie sprawdzałem!

Hispano-Suiza

.NET Tutorial - Hello World in 10 minutes - wybierz po prawo Linux, dystrybucję i gotowe. Wtyczka C# i chyba tyle.

Tenonymous

@Hispano-Suiza: no przecież tak samo to wygląda ze Swiftem - w sensie wtyczki.

Hispano-Suiza

Nie mam pojecia z racji uczulenia na Apple. Ale skoro tak mowisz to moze zerkne ktoregos zimowego wieczora :P

Tenonymous

Dla fana Go, ten język to nieco bardziej rozbudowany Golang :D nawet jest func i brak nawiasów przy ifach, forach, etc :D

Hispano-Suiza

@Tenonymous: "Fanatyka". Coś jak pasta o fanatyku wędkarstwa :-D

Tenonymous
2018-10-04 20:19

Pan Jacek Galowicz napisał przystępną książkę "C++17 STL. Receptury".
Jeżeli ktoś się zastanawia, to będąc w trakcie lektury, myślę że warto. Czyta się przyjemnie, nie dostrzegam błędów[przynajmniej poważniejszych, co do jakichś mniejszych - ciężko zweryfikować na moim etapie kariery].

Jest to chyba jedna z niewielu pozycji do #cpp #17. Śmiało polecam.