-
Path: news-archive.icm.edu.pl!news.icm.edu.pl!news.chmurka.net!eternal-september.org!
news.eternal-september.org!.POSTED!not-for-mail
From: heby <h...@p...onet.pl>
Newsgroups: pl.misc.elektronika
Subject: Re: Dziwny problem z kodem w C (gcc mips/pic32)
Date: Thu, 18 May 2023 20:23:56 +0200
Organization: A noiseless patient Spider
Lines: 70
Message-ID: <u45qg6$bgmh$1@dont-email.me>
References: <u45b4h$9a1b$5@dont-email.me>
<c...@g...com>
<u45ddm$9vcl$1@dont-email.me>
<a...@n...icm.edu.pl>
<u45j6m$an6o$1@dont-email.me>
<a...@n...icm.edu.pl>
<u45lkr$atup$3@dont-email.me>
<a...@n...icm.edu.pl>
<u45ngs$b7ed$1@dont-email.me>
<a...@n...icm.edu.pl>
<u45p0o$b7ed$5@dont-email.me>
<a...@n...icm.edu.pl>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Thu, 18 May 2023 18:24:06 -0000 (UTC)
Injection-Info: dont-email.me; posting-host="9e372acaf9cbddb2066dbe1fe96e32a1";
logging-data="377553";
mail-complaints-to="a...@e...org";
posting-account="U2FsdGVkX1/4Xt7Ngxl3A3UJbV2UqRlY"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101
Thunderbird/102.11.0
Cancel-Lock: sha1:7AOCtieZrFiCoewltwy1ALvxq6Q=
In-Reply-To: <a...@n...icm.edu.pl>
Content-Language: en-US
Xref: news-archive.icm.edu.pl pl.misc.elektronika:780666
[ ukryj nagłówki ]On 18/05/2023 20:05, Marek wrote:
>> Aby były *bezpieczne*.
> Co jest niebezpieczne w moim przykładzie?
PA1 ^=1; ?
Wybrałeś sobie prymitywny przykład, więc niebezpieczeńśtwo jest mniejsze.
Mój był inny.
Może tak:
setupUart( F_UART_SINGLE_BIT_MULTIPLY | F_UART_CONTROL | UART_SPEED_9600 );
Ten kod zawiera błąd.
Jest - mniej więcej - podobny do faktycznego kodu w systemie, gdzie
szukałem kiedyś niedziałajacego UARTu, tylko tych flag było nascie o
bardzo różnych nazwach.
Wyjaśnię na czym polega problem:
#define UART_SPEED_9600 4
#define F_UART_SPEED_9600 (1<<UART_SPEED_9600)
Już rozumiesz? Funkcja zaakceptowała #define z i bez F_. A powinna tylko
z F_, bo tak jest zaimplemnetowana, ze przyjmuje maski a nie numery
bitów. Ta wiedza, maska czy numer bitu, nie istnieje nigdzie, bo to
prymitywny C. Ba, nawet nie wiadomo do której to fukcji są flagi. To
tylko nazwane numerki.
Nikt tego nie kontroluje, funkcja przyjmuje cokolwiek i jedyna nadzieja
w białku, które pisze kod, że się nie pomyli. Naiwna.
Takich funkcji w kodzie są setki.
> Niebezpieczne to jest właśnie przekombinowanie jak to zrobić "lepiej".
Być może inaczej definicujesz słowo "niebezpiecznie".
Funkcjonalnośc została przerobiona tak, że nie dało się już podać flagi
bez F_ mimo, że obie były liczbami. Wymagało to napisania
kilkudziesięciu lini w C++ i zmiany z #define na class enum.
C++ pozwolił mi zatkać źródło błędu którego nie da się w sposób sensowny
zatkać w samym C z uwagi na prymitywizm wyrażania intencji.
Bezkosztowo. Podczas implementacji nie ucierpiał ani jeden mnemonik
asemblera a przy okazji znalazły się jeszcze dwa takie same przypadki
dla innych elementów systemu, gdzie pomylono flagi.
Po kilku latach pytałem jeszcze kolegi, mieli to w użyciu cały czas i
używali dla nowych funkcji.
Deklaracja dla klienta kodu zmieniał się z:
setupUart( int _flags )
na
setupUart( flags<UartFlags> _flags )
Gdzie UartFlags było wyliczniem co wolno za pomocą prostego template.
Całosc redukuje się do 1 liczby na kompilacji, jak dla C.
I tyle. Reszta nikogo nie interesowała.
Dzieki C++ jestem w stanie napisać teraz kod, który w wypadku pomylenia
flagi, zatrzyma kompilację, zamiast wesoło zrzucić problem na frajera z
debuggerem.
Rozumiesz już po co jest ten C++?
Następne wpisy z tego wątku
- 18.05.23 20:30 Marek
- 18.05.23 20:39 heby
- 18.05.23 21:02 Janusz
- 18.05.23 21:08 Janusz
- 18.05.23 21:12 Janusz
- 18.05.23 21:29 Dawid Rutkowski
- 18.05.23 21:40 Janusz
- 18.05.23 21:49 heby
- 19.05.23 09:33 JDX
- 19.05.23 09:45 JDX
- 19.05.23 10:19 JDX
- 19.05.23 10:29 JDX
- 19.05.23 10:30 heby
- 19.05.23 11:25 JDX
- 19.05.23 11:51 JDX
Najnowsze wątki z tej grupy
- Hiszpania bez pradu
- amperomierz w plusie
- 3G-nadal działa
- Historia pewnego miernika kalibratora
- Ustym 4k Pro i wyświetlacz
- Czemu rozwaliło celę?
- Wojna w portfelu
- Jaki trojfazowy licznik tuya lub podobny?
- Problem z dekoderem adresów
- Intel się wyprzedaje: po 10latach pchnęli pakiet kontrolny Altery za 1/4 kwoty zakupu
- Korekcja perspektywy
- Wentylator zabija zasilacze LEDek?
- Re: Kompensacja mocy biernej przy 230VAC
- Totaliztyczny obowiązek naprawy maszyn i urządzeń
- Niby uziom ale nie
Najnowsze wątki
- 2025-04-30 Szczecin => Key Account Manager IT <=
- 2025-04-30 Chiny => Koordynator Produkcji / Przedstawiciel ds. rozwoju produktu <
- 2025-04-30 Wrocław => Konsultant wdrożeniowy Comarch XL (Logistyka, WMS, Produk
- 2025-04-29 Nożownik zaatakował i zabił lekarza
- 2025-04-29 Polecam żarówki Blackout na Blackout z dużym gwintem
- 2025-04-29 Porażka kasty sędziowskiej przed Trybunałem Sprawiedliwości UE
- 2025-04-29 Kombinacja znaków A11 i B33?
- 2025-04-29 Na jakim etapie jest sprawa karna "gaśnicowego" Brauna z grudnia 2023?
- 2025-04-29 TSUE jest "przeciw a nawet za" neosędziami :-)
- 2025-04-29 Wrocław => Konsultant wdrożeniowy (systemy kontrolingowe) <=
- 2025-04-29 China => Production Coordinator / Representant Product Dev <=
- 2025-04-29 Warszawa => Specjalista rekrutacji IT <=
- 2025-04-28 Hiszpania bez pradu
- 2025-04-28 chinska stal
- 2025-04-28 QR kody