• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Czy da się w c++ zrobić zmienną która będzie mogła być tylko od x do y?

VPS Starter Arubacloud
0 głosów
611 wizyt
pytanie zadane 26 stycznia 2018 w C i C++ przez Hiskiel Pasjonat (22,830 p.)
Chodzi mi o zmienną/obiekt która/który będzie mogła/mogła przyjmować wartości np. od 1 do 9... Da się coś takiego wykonać?
komentarz 26 stycznia 2018 przez jpacanowski VIP (101,940 p.)

Możesz ew. użyć najmniejszy 8-bitowy typ zmiennej - char.

3 odpowiedzi

0 głosów
odpowiedź 26 stycznia 2018 przez shy_fox Gaduła (4,320 p.)
wybrane 26 stycznia 2018 przez Hiskiel
 
Najlepsza
Są typy zmiennych o różnych wartościach ale chyba nie w tym zakresie, to od ciebie zależy jakie rzeczy chcesz wprowadzić, chyba że masz na myśli tablicę, wtedy możesz wprowadzić kilka elementów do niej.

 

Masz na myśli tablice czy ustalenie dla zmiennej jakie wartości wyłącznie może przyjmować? jeśli to drugie to dodaj np. już z biedy funkcje sprawdzającą czy dana zmienna mieści się w tym przedziale, jeśli nie to zwróć błąd lub wyzeruj.
komentarz 26 stycznia 2018 przez Hiskiel Pasjonat (22,830 p.)
Chodziło mi właśnie o to drugie. Dzięki za pomoc. Niestety muszę zrezygnować z tego pomysłu, ponieważ to jednak byłoby troszku trudne do zrealizowania w moim przypadku i namieszałoby w kodzie :/. Dzięki jeszcze raz.
komentarz 26 stycznia 2018 przez Milesq Nałogowiec (32,020 p.)
zainteresuj się typescript, można w nim użyc enum
komentarz 26 stycznia 2018 przez shy_fox Gaduła (4,320 p.)
Poczekaj, może ktoś inny ci udzieli lepszej odpowiedzi, od tego jest forum, zawsze warto poczekać
komentarz 26 stycznia 2018 przez jpacanowski VIP (101,940 p.)

zainteresuj się typescript, można w nim użyc enum

A na co mu nadzbiór języka JS, skoro mu chodzi o język C/C++ ?

komentarz 26 stycznia 2018 przez Milesq Nałogowiec (32,020 p.)
@jpacanowski XD, nie zauważyłem a przed chwilą patrzyłem na pytania z Js'a.

więc możesz użyć typu wyliczeniowego enum, działa to na podobnej zasadzie.
+4 głosów
odpowiedź 26 stycznia 2018 przez mokrowski Mędrzec (155,460 p.)

Jeśli operacje które będziesz wykonywał na tym typie ograniczają się do małego zbioru (np pre/post inkrementacja/dekrementacja, wyciągnięcie wartości), taki typ łatwo jest stworzyć. W przykładzie okrojony typ:

#include <iostream>
#include <cstdint>
#include <exception>

template<int MinValue, int MaxValue>
class BoundedValues {
public:
    BoundedValues(): value{MinValue} {}
    explicit BoundedValues(int value_): value{value_} {
        if(value < MinValue || value > MaxValue) {
            throw std::range_error("Value out of bound.");
        }
    }
    operator int() const {
        return value;
    }
    BoundedValues(const BoundedValues& src) {
        value = src.value;
    }
    BoundedValues& operator=(const BoundedValues& src) {
        value = src.value;
        return *this;
    }
    BoundedValues& operator++() {
        ++value;
        if(value > MaxValue) {
            value = MinValue;
        }
        return *this;
    }
    BoundedValues operator++(int) {
        auto prevValues = *this;
        ++(*this);
        return prevValues;
    }
    BoundedValues& operator--() {
        if(value == MinValue) {
            value = MaxValue;
        } else {
            --value;
        }
        return *this;
    }
    BoundedValues operator--(int) {
        auto prevValues = *this;
        --(*this);
        return prevValues;
    }
private:
    int value;
};

int main() {
    BoundedValues<0, 9> value(8);
    // Proste naiwne testy... 
    std::cout << value << std::endl;
    std::cout << ++value << std::endl;
    std::cout << ++value << std::endl;
    std::cout << --value << std::endl;
    std::cout << value++ << std::endl;
    std::cout << value << std::endl;
    std::cout << --value << std::endl;
    std::cout << value-- << std::endl;
    std::cout << value << std::endl;
}

Resztę operatorów można łatwo dopisać :-)

+2 głosów
odpowiedź 26 stycznia 2018 przez criss Mędrzec (172,590 p.)
edycja 26 stycznia 2018 przez criss

Jeśli chcesz ograniczyć się do jakiegoś niewielkiego zbioru wartości, to możesz użyć enum class (c++11). Zwykły enum w tym wypadku też nie zrobi ci raczej różnicy od enum class. Tylko ostatecznie to jest tylko iluzja - koniec końców jesteś w stanie przypisać inną wartość jeśli zcastujesz. https://www.cprogramming.com/c++11/c++11-nullptr-strongly-typed-enum-class.html

Jeśli możesz sobie pozwolić na zbiór wartości zaczynający się od 0 i kończący na 2^(n)-1, to możesz wykorzystać tzw. 'bit fields'. To jest w cpp od dawna jeśli nie od zawsze. http://en.cppreference.com/w/cpp/language/bit_field

struct A {
   unsigned a : 4; // `a` okupuje 4 bity więc przyjmuje wartości 0..15
};

Oczywiście to nie znaczy, że obiekt klasy A zajmuje 4 bity. Jeśli unsigned int ma rozmiar 4 bajtów, to A też będzie miało rozmiar 4 bajtów, tylko 28 bitów pozostanie niewykorzystanych.
Problemem może być też, że nie jesteś w stanie utworzyć pointera/referencji do 'bit fielda'. To możesz jednak obejść tutaj biorąc adres całego obiekt skoro i tak posiada tylko jeden member,

komentarz 26 stycznia 2018 przez jpacanowski VIP (101,940 p.)

To jest w cpp od dawna jeśli nie od zawsze.

Już w samym języku C było.

92,453 zapytań

141,262 odpowiedzi

319,086 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...