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

[Arduino/C++]Rozdzielenie long long

VPS Starter Arubacloud
0 głosów
397 wizyt
pytanie zadane 30 grudnia 2018 w C i C++ przez robertwe Gaduła (4,620 p.)

Witam! :D

Mam mały problem z podziałem zmiennej typu long long...

Mam zmienną którą chcę rozdzielić na wiele int'ów lub tablicę intów... 

Tzn. np. mam zmienną

long long x =  "1231121";

chcę ją rozdzielić na

int y[7] = { "1", "2", "3", "1", "1", "2", "1"};

Nie wiem jak to zrobić natomiast w internecie znalazłem tylko zamianę na inne typy takie jak char...

Z góry dzięki :D

komentarz 31 grudnia 2018 przez mokrowski Mędrzec (155,460 p.)

A co to jest?

long long x =  "1231121";

Przypisanie do zmiennej typu long long int literału łańcuchowego? Chcesz tego?

komentarz 31 grudnia 2018 przez Hiskiel Pasjonat (22,830 p.)
U mnie wywala errora, a nie powinno zwrócić longa w postaci 49505149495049 (lub podobnej) ?
komentarz 31 grudnia 2018 przez mokrowski Mędrzec (155,460 p.)
Nie nie powinno. Powinno właśnie "wywalać error'a".
komentarz 31 grudnia 2018 przez Hiskiel Pasjonat (22,830 p.)
W komentarzu spytałeś autora "chcesz tego?", jakoby skutkowałoby to UB, lub czymś podobnym, a nie error'em, który można zauważyć.
komentarz 31 grudnia 2018 przez mokrowski Mędrzec (155,460 p.)
Nie jest dla mnie jasne czego chce. Jeśli chce zapisu long long w postaci literału string, niech rzutuje. Jeśli chce liczby niech usunie znaczniki " .

PS. Pamiętaj że to Arduino a nie normalne środowisko programistyczne.
komentarz 31 grudnia 2018 przez robertwe Gaduła (4,620 p.)
Masz racje! Przez przypadek dałem znacznik " powinno być bez :D

1 odpowiedź

0 głosów
odpowiedź 30 grudnia 2018 przez Knayder Nałogowiec (37,640 p.)
wybrane 1 stycznia 2019 przez robertwe
 
Najlepsza
#include <iostream>
#include <vector>

std::vector<int> split(long long number) {
    std::vector<int> result;
    do {
        result.insert(result.begin(), number%10);
        number /= 10;
    }while(number);
    return result;
}


int main()
{
    std::vector<int> result = split(123456);
    for(auto& i : result)
        std::cout << i << '\n';
}

 

komentarz 30 grudnia 2018 przez Hiskiel Pasjonat (22,830 p.)
Dzięki
komentarz 31 grudnia 2018 przez Knayder Nałogowiec (37,640 p.)
No spoko. Jak ta odpowiedź cie zadowala to zaznacz ją jako `Najlepszą` żeby zamknąć wątek.
komentarz 31 grudnia 2018 przez Hiskiel Pasjonat (22,830 p.)
Nie jestem autorem wątku.
komentarz 31 grudnia 2018 przez robertwe Gaduła (4,620 p.)

@Knayder, Może kod działa w czystym c++ ale na arduino nie bardo ponieważ nie ma tych bibliotek...

komentarz 31 grudnia 2018 przez Knayder Nałogowiec (37,640 p.)
#include <iostream>


void split(long long number, int* tab, int tabSize) {
    for(int i = tabSize-1; i>=0; --i) {
        tab[i] = number%10;
        number /= 10;
    }
}

int main()
{
    long long number = 123456789;
    int tab[9];
    split(number, tab, 9);
    for(int i = 0; i<9; ++i)
        std::cout << tab[i] << ' ';
}

Kod bez libek (iostream tylko dla celów demonstracyjnych, std::cout)

komentarz 31 grudnia 2018 przez robertwe Gaduła (4,620 p.)

Wielkie dziękismiley

komentarz 1 stycznia 2019 przez mokrowski Mędrzec (155,460 p.)

A skąd wiadomo że będzie 9 cyfr? To trzeba policzyć. Funkcja log10(...) na AVR jest koszmarnie wolna i w dodatku na danych zmiennoprzecinkowych więc zje dużo pamięci Flash.

Dodatkowo większość indeksów mieści się w bajcie co dla platformy 8-bit jest naturalne.

Alternatywny split(...)...

#include <iostream>
#include <cstdint>

uint8_t count_digits(long long number) {
    uint8_t result = 0;
    while(result += 1, number /= 10);
    return result;
}

void split(long long number, uint8_t * tab, uint8_t count) {
    uint8_t * ptr = tab + count;
    while (ptr-- != tab) {
	    *ptr = number % 10;
	    number /= 10;
    }
}

void show_table(const uint8_t * tab, uint8_t count) {
    for (uint8_t i = 0; i < count; ++i) {
	    std::cout << static_cast<unsigned>(tab[i]) << ' ';
    }
    std::cout << '\n';
}
 
int main()
{
    long long number = 9'223'372'036'854'775'806;
    uint8_t count = count_digits(number);
    uint8_t tab[19]; // 64-bitowy long long, może mieć 19 cyfr.
    split(number, tab, count);
    std::cout << number << '\n';
    show_table(tab, count);
}

Cóż... trochę pachnie C ale chciałem pokazać alternatywę.

PS. Od Arduino wolę "surowe MCU".

komentarz 2 stycznia 2019 przez robertwe Gaduła (4,620 p.)
Problem jest w brakującej bibliotece na arduino cstdint...

A co do surowego MCU to kiedyś próbowałem wykorzystać atmega328p lecz działała znacznie wolniej od arduino które miałem więc zrezygnowałem... Masz jakieś propozycje MCU lepszego od tej atmega'i? Słyszałem coś o STM32 ale nie wiem czy to się sprawdzi...

#EDIT

Kod daje się skompilować bez tych bibliotek. Widocznie domyślnie ma te biblioteki zaimplementowane :D Sprawdzę kod i później dam znać czy działa
komentarz 2 stycznia 2019 przez mokrowski Mędrzec (155,460 p.)

Masz nagłówek <stdint.h> zamiast tego <cstdint>. To że to niezgodne z konwencją C++ to już inna sprawa.

To bardzo ciekawe co napisałeś..

A co do surowego MCU to kiedyś próbowałem wykorzystać atmega328p lecz działała znacznie wolniej od arduino które miałem więc zrezygnowałem...

Śmiem wątpić ba.. nawet jestem pewien że to nie jest prawda. Adruino bardzo rozrzutnie zarządza zasobami. Stosuje virtual, niezgrabne klasy i inne słabe technicznie rozwiązania.

A co do STM32, to o wiele bardziej skomplikowane MCU niż AVR. Nie rzucał bym się na Twoim miejscu na nie na początku. Mają o wiele bardziej stromą krzywą uczenia. Oczywiście jest coś podobnego do Arduino. Podobieństwo jest dalekie...

https://www.mbed.com/en/

komentarz 2 stycznia 2019 przez robertwe Gaduła (4,620 p.)
To mbed troszkę drogie jest... Natomiast co do atmega'i to, miała długi czas bootowania a jak już udało się jej uruchomić działała wolniej tzn nawet zwykły blink led zamiast co 1s był co ~2s. Nie wiem czy to przez to że wgrałem tam bootloader arduino... A jak to nie to, to nie wiem co robiłem nie tak...

Podobne pytania

0 głosów
1 odpowiedź 789 wizyt
pytanie zadane 16 listopada 2018 w C i C++ przez robertwe Gaduła (4,620 p.)
0 głosów
2 odpowiedzi 158 wizyt
pytanie zadane 28 sierpnia 2023 w Systemy operacyjne, programy przez Niepokonana7999 Bywalec (2,250 p.)
0 głosów
1 odpowiedź 1,902 wizyt
pytanie zadane 18 grudnia 2016 w C i C++ przez Jan Dobrakowski Użytkownik (580 p.)

92,417 zapytań

141,222 odpowiedzi

318,983 komentarzy

61,831 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!

...