eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaDziwny problem z kodem w C (gcc mips/pic32)Re: Dziwny problem z kodem w C (gcc mips/pic32)
  • Data: 2023-05-22 22:29:59
    Temat: Re: Dziwny problem z kodem w C (gcc mips/pic32)
    Od: heby <h...@p...onet.pl> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    On 22/05/2023 21:30, J.F wrote:
    >>> Ale rozmiar w elementach, czy w bajtach? :-P
    >> Rozmiar tablicy.
    >> Co kogo obchodzi jej rozmiar w bajtach, poza allokatorami?
    > A może chcę zapisać na dysk?

    To musi napisać serializator. Prawdopodobnie będzie miał w środku
    std::size() aby zserializować każde pole osobno. Nie chcesz przeciez
    zapisywać śmieci z paddingu pamięci, prawda? Albo, o zgrozo, gołych
    pointerów, co w naszym wypadku zrzutu tablicy stringów miało by miejsce.

    >>>> W dodaku działa tak samo dobrze dla tablic i dla znacznie bardziej
    >>>> skomplikowanych kontenerów czy nawet głupich stringów.
    >>> stringa powiadasz ... bajtowego, unicode, utf-8 ? :-P
    >> C++ nie wspiera UTF-8. Nie wspiera też Mazovii ani ATASCI.
    > Ale programy wymagają UTF-8.

    I dlatego możesz wybrać Qt, które używa natywnie UTF-16 i potrafi, jesli
    potrzebujesz, policzyć ile jest tam *znaków* jak również przemieszczać
    się między UTF-8. Tylko że od razu mówię, że policzenie ilosci znaków w
    UTF to zagadnienie na habilitację. Nie bez powodu jest skomplikowane a
    zdaje się że w kilku wypadkach (bodaj Koreański) mocno mętne.
    QTextBoundaryFinder.

    Innymi słowy, jeśli masz zagadnienia związane z tekstem UTF, to masz
    zagadnienia związane z jego wyświetlaniem, a to jest cecha biblitek
    graificznych, nie C++. C++ nie posiada w standardzie nic [G]UIowego.

    > To sobie klase zdefiniuje ... taki u8string :-)

    Już to zrobiono i to znacznie lepiej niz tylko u8. QString.

    >> U mnie true i false są zdefiniowane przez standard.
    > W C/C++
    > A to moze być np program do komunikacji z czytnikiem kart bankowych.

    Wtedy masz połaczenie z hardware i wtedy piszesz translator z
    hardwarowego true na softwareowy true.

    Reszta algorytmini nie powinna nic wiedzieć o jakims hardware, a
    prawidłowo napisana powinna dać się uruchmić i przetestować bez hardware.

    >> Patrz, jeszcze jeden powód żeby porzucić guano C.
    > Przeciez w C tez są zdefiniowane przez standard.
    > Tylko trochę słabo.

    C nie wspiera typu bool. Różne OSy różnie definiują TRUE/FALSE.
    Napisanie w tym bałaganie generycznego/przenośnego algorytmu jest
    utrudnione.

    Prawie każda przenośna bibliteka, z korzeniami w C, redefiniuje wszstko.
    To świadczy o tym, jak kiepski to język, skoro nawet podstawowe typy nie
    mają sensownie okreśonych sizeof i trzeba to łatać ręcznie.

    > Albo lepiej niz w C++, bo brak wartosci nieokreślonych :-)

    A są jakieś nieokreslone wartości bool?

    Jak chcesz świadomie, to w boost jest tribool. On ma trzecią wartość,
    niezdefiniowaną.

    Jest też boost::optional<bool> który może służyć za to samo.

    >>> obfuscate jednak cieszy sie popularnoscią ... tzn jako ciekawostka,
    >>> niekoniecznie w praktyczny użytku.
    >> Nie przejdzie przez review.
    > Oby.
    > Bo jak bedzie dobrze zaciemniony ... to przejdzie ?

    Zakładasz corner case.

    Tak, czasmi trafia się cieżki kod na review. Ale nie na tyle cieżki, aby
    ktoś przerzucił przez niego sabotaż. Kod obiektowy jest relatywnie
    czytelny. Schowanie tam jakiejś niegrzecznej logiki jest trudne jeśli
    review przegląda doświadczony programista.

    Jeszcze raz: jeśli masz w zespole sabotażystę, to nie tylko wylatuje on
    z automatu z teamu, jego wrzuty też się przegląda i wycofuje/naprawia.

    >>>> b) sami ustalają co można, a co nie, używać i z czym czują się komfortowo.
    >>> A jak to jest zespół złośliwych programistów?
    >> To *ty* sie zwalniasz.
    > Ja sie rozumiem z zespołem :-)

    Nie zawsze tak jest. Część ludzi z którymi pracowałem zwalniała się z
    poprzednich firm z powodu toksycznej atomsfery, intryg, czy zwykłego
    bullying. Rózne były opowieści, ale zazwyczaj po czyms, co amerykanie
    nazywają "red flags" ludzie się zwalniają. Są firmy i korpo, gdzie red
    flags jest widoczne na wejściu a są też takie, że pojawiają się po
    tygodniach pracy.

    >>> Którzy dbają o swoje pensje ? :-)
    >> Dużo nie zrobią hackując zamiast programować.
    > Zaraz tam hackować ...

    Hackowanie to pisanie kodu w sposób, który jest czytelny tylko dla
    piszącego, albo powodujący rózne problemy w teamie, w przyszłych
    refactoringach itd itp.

    Na przykład wykorzystywanie, nielegalnie, pamięci poza zakresem
    allokacji, bo "tam przecież jest padding", co powoduje milion błedów
    valgrinda, choć aplikacja działa. To jest hacking. Można zrobić to
    normalnie i poprawnie, ale można też pokazać że jest się samcem omega,
    wprowadzajac fikuśne rozwiązania mające na celu zdenerowwanie wszystkich
    na około.

    >>>> Jedną z najtrudniejszych sztuczek jakie miałem w swojej karierze, jako
    >>>> osoba ucząca nowych członków zespołu, to była potrzeba wyplenienia z
    >>>> nich potrzeby wiedzy o tym jak coś działa w środku. Przestawienie
    >>>> programisty C z asemblera na myślenie abstrakcyjne jest nadludzkim
    >>>> wysiłkiem i nie w każdej sytuacji udało się.
    >>> Taa ... a ja potem sobie w "jeszcze lepszym" C#
    >> Teraz znowu eskalujesz do zupełnie innego języka. To nieuczciwe.
    > Jest i w C++. Tylko nie moge znależć dokumentacji MS.

    Ale co jest?

    > Taki tam mały przykład
    > https://www.functionx.com/vccli/controls/dgv.htm

    To jest Managed C. Nie ma nic wspólnego z C++.

    > I sie teraz nie interesuj jak to jest zrobione, tylko powiedz
    > czy np mogę kolor komórki zmienić?

    Zazwyczaj odpowiada za to, w typowym GUI, Delegat. Poszukaj możliwosci
    nadania delegata, którego zadanime jest rysowanie zawartości komórki.

    Zobacz na przykąłd w Qt:

    https://doc.qt.io/qt-6/qstyleditemdelegate.html

    Model danych nie zawiera i nie powinien zawierać nic, co ma związek z
    reprezentacją graficzną. On ma dostarczać dane i niczym innym nie
    powinien się zajmować.

    > Albo co się stanie, jak wpiszę nową wartość w komórkę?

    To masz zazwyczaj jakiś "Editor" podpięty pod View (zobacz delegata z
    Qt). W różnych biblitekach GUI to może się róznie nazywać (np. Setter)
    ale ogólnie to jest cecha niezwiązana z modelem, choć model będzie miał
    możliwośc akceptacji wyniku tego wpisania.

    To jest wielopoziomowo rozbite w taki sposób, aby zadowolić jakiś
    wariant wzorca MVC. Jeśli zrobiono to poprawnie, to każdy z elementów
    tego mechanizmu ma ściśle określone zadania.

    > Albo np chcę jakąs funkcje wywołać po kolei dla dla wszystkich
    > wierszy, czy dla zakresu wierszy ... szybka sprawa, bo kolekcja
    > Rows juz sie składa z pojedynczych wierszy, czy taki pojedynczy
    > wiersz trzeba będzie dopiero zbudować?

    Dlaczego chcesz wywołać jakąś metodę chodząc po modelu tabelki, a nie po
    danych wprost?

    Jeśli chcesz chodzić po np. selekcji, to na 100% z selekcji możesz
    wydłubać element modelu. Ponieważ to Ty kontrolujesz model, to masz
    dostęp do tego, co tam trzymasz.

    Detale są rózne w róznych implementacjach, ale prawdę mówiąc, czy to
    Java Swing, C# Forms czy Qt, podobieństwa są znaczne w ogólnej
    organizacji koncepcji MVC.

    >> Wrappery na BLAS/LAPACK są bardzo cienkie. Nie wiem w jaki magiczny
    >> sposób miały by liczyć coś wolniej, keidy 99.99% kodu to ten sam kod co
    >> w Fortranie.
    > Być moze te wrappery obchodzą problemy, ale ... Fortran potrafi
    > operowac na liczbach zespolonych, bo to jego natywny typ.

    I jak go reprezentuje w pamieci? W C++ reprezentacja to dwa
    floaty/double, czyli sizeof(double)*2. Fortran dał radę magicznie zrobic
    to lepiej?

    > W c++ to typ skonstruowany z innych.

    Nie. Natomiast jest to typ szablonowy. Możesz chcieś zamiast float mieć
    double. Szablon jest bezkosztowy - wynikowy kod asm jest perfekcyjnie
    dobrany do danego typu i nie generuje w runtime śladu narzutu.

    > Jako, że było za wolno,
    > to nawrzucano inline.

    inline jest w gestii kompilatora. jak uz na, że to coś da, to wstawia.

    > Ale nadal, jak gdzies jest zwracana wartosc zespolona, to fortran
    > używał dwóch rejestrów, a c++ ... nie musi budować obiektu?

    Nie.

    Sposoby zwracania złożonych typów w C++ to osobny temat i jest to dość
    skomplikowane jesli chcesz odpowiedzi na poziomie asm. To, co się stanie
    w kodzie wynikowym, zależy od optymalizacji. Ogólnie dla x86, jak to
    sprawdzałem wiele lat temu, skomplikowane funkcje zwracające dane
    złożone były bardzo często optymalizowane tak, że nie było wywołań
    funkcji i używane było wiele rejestrów (taki żart z x86). Wszystko
    zależy od typu CPU i zakresu optymalizacji, w dodatku często podlega
    wagowemu ocenianiu przez kompilator, biorący wiele pod uwagę (w tym
    pipeline i out of order execution). Nie bez powodu poważniejsze
    kompilatory akcpetują nawet konkretny typ achitektury CPu (np
    SandyBridge) aby te wybory były trafniejsze.

    I mała uwaga: współcześnie cache jest prawie tak samo szybki jak
    rejestry. Na tyle, że mało kogo obchodzi czy dana jest w rejestrze czy
    cache, przy pipeline w procesorze robiącym kilka instrukcji w cyklu te
    detale nie mają większego znaczenia.

    >> Myślę, że nie rozumiesz jakie problemy rozwiązuje się z użyciem C++. C
    >> też magicznie nie wyczaruje więcej RAMu. Probem z algorytmiką i miejscem
    >> jest dokładnie taki sam. Natomiast C++ oferuje gotowe, przetestowane
    >> algorytmy operujące na tych danych. Co w przypadku C zazwyczaj oznacza
    >> qsotr i tyle, reszta to kwadratowe koła wymyślane przez brodatych
    >> 60-latków z założeniem, że nikt inny nie wpadł na ich popsute
    >> rozwiązanie.
    > No fakt, sort w c++ szybki ... zrobili
    > wieloprocesorowo/wielordzeniowo?

    Może po prostu ktoś wie jak poprawnie używać słowa const, std::move itp,
    aby wyjaśnić kompilatorowi co chce, a nie jak w C jak to coś uzyskać.
    C++, dzięki określaniu intencji, ma wiecej swobody w wyborze narzędzi do
    jej uzyskania.

    >> Nie zliczę ile widziałem hash map napisanych w C. Każda
    >> inna. I każda nieuniwersalna, nieprzetestowana inaczej jak na produkcji.
    > owszem ... ale czy nie wynika to z tego, ze różne wymagania, czy różne
    > optymalizacje mogą być?

    Może nalezy zacząc od tego, czy te funkcje są w ogóle poprawne. W C
    bardzo cieżko testować unit testami, wiec nie dowiesz się tego łatwo.

    > a ta z c++ dobra na wszystko? I wydajna?

    std::unordered_set jest tak wydajny, jak dobrze rozumiesz jak działają
    wysokopoziomowe elementy języka i jak dobry jesteś w pisaniu poprawnych
    funkcji haszujacych. Więc, jeśli napiszesz funckję haszującą { return 1;
    } to wydajny nie będzie, jeśli nie dostarczysz operatora && to wydajny
    nie będzie, jeśli wstawisz za dużo std::shared_ptr trzymajacych inty to
    wydajny nei będzie itd.

    Dodatkowo standard nic nie mówi o implementacji. Implementacja jest
    rózna w różncyh wersjach kompilatora, OSa itd itp. Kiedyś był na
    przykład zewnętrzny zestaw, o nazwie STLPort. W niektórych przypadkach
    lepszy (szybszy, mniejszy narzut) od dostaczonego przez MS. Obecnie jest
    też alternatywny zestaw w boost.

    Jeśli szukasz czegoś konkretnego, prawie na pewno ktoś to juz napisał:

    https://www.boost.org/doc/libs/1_80_0/doc/html/conta
    iner.html

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: