-
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
Następne wpisy z tego wątku
- 23.05.23 15:10 JDX
- 23.05.23 15:27 JDX
- 23.05.23 15:35 Grzegorz Niemirowski
- 23.05.23 15:56 heby
- 23.05.23 16:00 heby
- 23.05.23 16:11 Grzegorz Niemirowski
- 23.05.23 16:22 heby
- 23.05.23 16:35 Grzegorz Niemirowski
- 23.05.23 16:52 heby
- 23.05.23 17:21 Grzegorz Niemirowski
- 23.05.23 17:26 titanus
- 23.05.23 18:19 heby
- 23.05.23 18:32 heby
- 23.05.23 19:00 Grzegorz Niemirowski
- 23.05.23 19:15 heby
Najnowsze wątki z tej grupy
- DS1813-10 się psuje
- Taki tam szkolny problem...
- LIR2032 a ML2032
- SmartWatch Multimetr bezprzewodowy
- olej psuje?
- Internet w lesie - Starlink
- Opis produktu z Aliexpress
- No proszę, a śmialiście się z hindusów.
- Zewnętrzne napięcie referencyjne LM385 1,2V -> 100mV dla ICL7106, Metex M-3800
- karta parkingowa
- Wl/Wyl (On/Off) bialy/niebieski
- I3C
- Pytanie o transformator do dzwonka
- międzymordzie USB 3.2 jako 2.0
- elektronicy powinni pomysleć o karierze elektryka
Najnowsze wątki
- 2024-11-25 Karty przedpłacone (podarunkowe) Google Play - pytanie do korzystających
- 2024-11-26 wina Tóska
- 2024-11-26 Rewolucja/Rewelacja!
- 2024-11-25 grupa ożyła ;)
- 2024-11-24 Być jak Clint
- 2024-11-24 Rura kanalizacja konceptu Franke = problem
- 2024-11-25 Wrocław => Lead Java EE Developer <=
- 2024-11-25 Warszawa => Business Development Manager - Network and Network Securit
- 2024-11-25 Kraków => Programista Full Stack (.Net Core) <=
- 2024-11-25 Lublin => Senior PHP Developer <=
- 2024-11-25 Karlino => Konsultant wewnętrzny SAP (FI/CO) <=
- 2024-11-25 Warszawa => ECM Specialist / Consultant <=
- 2024-11-25 Katowice => Regionalny Kierownik Sprzedaży (OZE) <=
- 2024-11-25 Warszawa => Senior Frontend Developer (React + React Native) <=
- 2024-11-25 Lublin => Inżynier Serwisu Sprzętu Medycznego <=