Typy uint i przedrostki

Odpowiedz Nowy wątek
2020-03-26 22:01

Rejestracja: 1 tydzień temu

Ostatnio: 6 dni temu

0

Mam pytanie dotyczące zasad dobrego programowania. Po pierwsze jak definiować poprawnie typ uint32? Jeżeli int i long ma taką samą długość (np. 32 bity), powinienem użyć

typedef unsigned long uint32

czy

typedef unsigned int uint32

Druga sprawa, czy dobrą praktyką jest przy zapisywaniu wartości do zmiennej używanie przyrostków (U, UL) i warto się tego trzymać?

edytowany 1x, ostatnio: kq, 2020-03-26 22:17
powinienes skorzystać z gotowych typów np uint32_t inaczej jest niebezpieczeństwo, że int i long mogą nie mieć takiej samej długości, bo nie muszą... - kaczus 2020-03-27 08:34

Pozostało 580 znaków

2020-03-26 22:15

Rejestracja: 5 lat temu

Ostatnio: 2 godziny temu

Lokalizacja: Chorzów

1

Metod nazewnictwa zmiennych, funkcji, typów, klas itp... w programowaniu jest bardzo wiele. Są na ten temat całe książki ale także znajdziesz sporo materiałów w internecie.
Sam język nie narzuca żadnych zasad. W praktyce zupełnie inne zasady przyjmuje się w środowisku ludzi, którzy piszą kod w c/c++ na mikrokontrolery a inne podczas kodowania logiki biznesowej. Także niektóre firmy trzymają się popularnych standardów a inne tworzą własne konwencje nazewnictwa.
Ostatecznie ważne jest to żeby w ramach jednego projektu lub grupy projektów ze sobą powiązanych być konsekwentnym i stosować jeną metodologię. Przyjąć jedną z popularnych i nie wymyślać własnych "kulfonów".


Projektowanie i programowanie. Hobbystycznie elektronika i audio oszołom.
edytowany 1x, ostatnio: katakrowa, 2020-03-26 22:17

Pozostało 580 znaków

2020-03-26 22:15

Rejestracja: 1 rok temu

Ostatnio: 34 minuty temu

6
  1. Typy już są zdefiniowane, nieco inaczej się piszą
    https://stackoverflow.com/que[...]-defined-in-any-stdlib-header

Dodatkowe ich zmapowanie sądzę nie będzie pomagało w niczym

  1. Literki wskazujące na typ zmiennej to dość archaiczna rzecz. Potrafię sobie przypomnieć takowe w Win32 API, tam miały częściowe uzasadnienie. Współcześnie mogą mieć sens w pisaniu kodu na mikrokontrolery (i podobne urządzenia, hardware), ale nie bardzo widzę inne zastosowanie.

Używa się nazw mających znaczenie merytoryczne, np (PL) suma/ (EN) sum.
Po drugie staramy się deklarować zmienne w jak najbardziej wewnętrznym zakresie, jednym z efektów jest to, że wzrok ma blisko deklarację i użycie.

W środowisku embedded zmiana nazw typów jest bardzo popularna gdyż różnej długości int'y w różnych kompilatorach są dość popularną sprawą przy przenoszeniu kodów. Dlatego dość często w projektach na AVR, PIC czy STM można znaleźć na dzień dobry własne redeklaracje/mapowanie wszystkich typów prostych. - katakrowa 2020-03-26 22:20

Pozostało 580 znaków

2020-03-26 22:17

Rejestracja: 4 lata temu

Ostatnio: 3 minuty temu

5
  1. Nie masz absolutnie żadnej gwarancji, że ani unsigned long, ani unsigned int będą 32-bitowe — standard mówi jedynie, że ten pierwszy musi być co najmniej 32-bitowy (i na LP64 będzie 64-bitowy), a ten drugi co najmniej 16-bitowy (co na LP32 da mu 16 bitów). Jeśli chcesz mieć inta o gwarantowanej długości, użyj uint32_tcstdint.
  2. Kwestia stylu. Nie zaszkodzi Ci, może polepszyć czytelność, może być uznana za niepotrzebne śmieci. Osobiście tego nie robię, ale zacząłbym, gdybym pisał kiedyś kod, w którym rozmiar zmiennych i tego typu szczegóły techniczne zaczynają mieć fundamentalne znaczenie.

Pozostało 580 znaków

2020-03-26 22:31

Rejestracja: 1 tydzień temu

Ostatnio: 6 dni temu

0

Pracuję z oprogramowaniem pod systemy wbudowane i w projekcie są używane typy zdefiniowane w sposób, jaki podałem w pierwszym poście , stąd moje pytanie :). Natomiast zauważyłem, że stosowane są też przyrostki określające typ zmiennej, ale nie jest to zasada, której programiści sztywno się trzymają, stąd moje pytanie, czy to tylko kwestia dobrych manier w pisaniu kodu, czy może mieć kluczowe znaczenie w jakichś szczególnych przypadkach?

Nazywa się to notacją węgierską - stivens 2020-03-26 22:53

Pozostało 580 znaków

2020-03-26 22:57

Rejestracja: 3 lata temu

Ostatnio: 1 godzina temu

2

W dobie nowoczesnych IDE notacja węgierska chyba tylko przeszkadza

vUsing adjHungarian nnotation vmakes nreading ncode adjdifficult.

PS:

czy to tylko kwestia dobrych manier

Jesli antypattern nazywasz dobrymi manierami...

https://softwareengineering.s[...]-not-using-hungarian-notation


01010100 01110101 01110100 01100001 01101010 00100000 01101110 01101001 01100101 00100000 01101101 01100001 00100000 01101110 01101001 01100011 00100000 01100011 01101001 01100101 01101011 01100001 01110111 01100101 01100111 01101111 00101110 00100000 01001001 01100011 00100000 01110011 01110100 01101111 01101110 01110100 00101110
edytowany 6x, ostatnio: stivens, 2020-03-26 23:04

Pozostało 580 znaków

2020-03-26 23:49

Rejestracja: 1 tydzień temu

Ostatnio: 6 dni temu

0

Mówię o przyrostkach unsigned, unsigned long, np.

unsigned long var = 0xFFFFUL
Strasznie nieprecyzyjnie piszesz. Do tej pory była mowa o przedrostkach zmiennych, a tu nagle wrzucasz stałe (literały) i ich przyrostki - AnyKtokolwiek 2020-03-26 23:50
Cały czas piszę o przyrostkach, jedynie w nazwie tematu jest słowo "przedrostek" - mój błąd. - rafcio100 2020-03-27 00:12

Pozostało 580 znaków

2020-03-27 00:17

Rejestracja: 4 lata temu

Ostatnio: 3 minuty temu

0

A nie, no to już jest zupełnie inna bajka. Ja to w ogóle myślałem, że Ci chodzi o pisanie np. unsigned long long variable = 123456ull zamiast unsigned long long variable = 123456; koledzy że o notacji węgierskiej, czyli unsigned long long variable_ull = 123456

W każdym razie, unsigned long to jest coś zupełnie innego niż long, więc to różnica semantyczna, nie tylko estetyczna jak wyżej.

EDYCJA: a, czyli jednak Ci chodziło o to, co na początku myślałem, że Ci chodziło…

edytowany 2x, ostatnio: Althorion, 2020-03-27 00:18
notacja węgierska to raczej unsigned long long ull_variable = 123456… - vpiotr 2020-03-27 00:43

Pozostało 580 znaków

2020-03-27 00:24

Rejestracja: 3 lata temu

Ostatnio: 1 godzina temu

1

Ale to sa literaly :v

http://www.cs.technion.ac.il/[...]numeric-literal-suffixes.html


01010100 01110101 01110100 01100001 01101010 00100000 01101110 01101001 01100101 00100000 01101101 01100001 00100000 01101110 01101001 01100011 00100000 01100011 01101001 01100101 01101011 01100001 01110111 01100101 01100111 01101111 00101110 00100000 01001001 01100011 00100000 01110011 01110100 01101111 01101110 01110100 00101110
edytowany 1x, ostatnio: stivens, 2020-03-27 00:36

Pozostało 580 znaków

2020-03-27 00:48

Rejestracja: 8 lat temu

Ostatnio: 1 godzina temu

0

Najbezpieczniej tak:


    #include <iostream>
    #include <cstdint>
    using namespace std;

    typedef uint32_t uint32;

    int main() {
        uint32 liczba = 123u;
        cout << "Liczba: " << liczba << endl;
        return 0;
    }

https://ideone.com/zevCHB

W inny sposób generowanie typów o określonej długości może być bardzo pracochłonne jeśli ma być przenośne.


Szacuje się, że w Polsce brakuje 50 tys. programistów

Pozostało 580 znaków

2020-03-27 00:52

Rejestracja: 3 lata temu

Ostatnio: 1 godzina temu

2

To nie lepiej od razu z stdint korzystac?

https://en.cppreference.com/w/cpp/header/cstdint

Edit: W sensie po co skracac o ten '_t'?


01010100 01110101 01110100 01100001 01101010 00100000 01101110 01101001 01100101 00100000 01101101 01100001 00100000 01101110 01101001 01100011 00100000 01100011 01101001 01100101 01101011 01100001 01110111 01100101 01100111 01101111 00101110 00100000 01001001 01100011 00100000 01110011 01110100 01101111 01101110 01110100 00101110
edytowany 6x, ostatnio: stivens, 2020-03-27 00:58

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0