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

[Arduino/C++]Rozdzielenie long long

0 głosów
105 wizyt
pytanie zadane 30 grudnia 2018 w C i C++ przez robertwe Gaduła (4,600 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 VIP (111,180 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,800 p.)
U mnie wywala errora, a nie powinno zwrócić longa w postaci 49505149495049 (lub podobnej) ?
komentarz 31 grudnia 2018 przez mokrowski VIP (111,180 p.)
Nie nie powinno. Powinno właśnie "wywalać error'a".
komentarz 31 grudnia 2018 przez Hiskiel Pasjonat (22,800 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 VIP (111,180 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,600 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,660 p.)
wybrane 1 stycznia 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,800 p.)
Dzięki
komentarz 31 grudnia 2018 przez Knayder Nałogowiec (37,660 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,800 p.)
Nie jestem autorem wątku.
komentarz 31 grudnia 2018 przez robertwe Gaduła (4,600 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,660 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,600 p.)

Wielkie dziękismiley

komentarz 1 stycznia przez mokrowski VIP (111,180 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 przez robertwe Gaduła (4,600 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 przez mokrowski VIP (111,180 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 przez robertwe Gaduła (4,600 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ź 152 wizyt
pytanie zadane 16 listopada 2018 w C i C++ przez robertwe Gaduła (4,600 p.)
0 głosów
1 odpowiedź 575 wizyt
pytanie zadane 18 grudnia 2016 w C i C++ przez Jan Dobrakowski Użytkownik (580 p.)
0 głosów
3 odpowiedzi 131 wizyt
pytanie zadane 26 lipca w C i C++ przez Jacob7 Nowicjusz (210 p.)
Porady nie od parady
Pytania na temat serwisu SPOJ należy zadawać z odpowiednią kategorią dotyczącą tej strony.SPOJ

66,513 zapytań

113,278 odpowiedzi

239,905 komentarzy

46,647 pasjonatów

Przeglądających: 236
Pasjonatów: 21 Gości: 215

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...