Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Potrzebna pomoc - uC

22 Wrz 2004 11:50 2846 13
  • Poziom 12  
    Kompiluje w Code Vision AVR
    Potrzebuje napisać funkcje która bedzie ze zmiennej typu unsigned int(65535) "wyciągała" ilośc jedności dziesiatek, setek ... i zapisywała w tablicy 5- elementowej ( int temp[5] ) . Dzieki
  • Poziom 42  
    Dziel liczbe przez 10 a reszte z dzielenia ładuj do tablicy od najmłodszej cyfry.
  • Poziom 18  
    Funkcja itoa konwertuje liczbe do string'a a chyba nie o to koledze chodzilo, jesli chcemy uzyskac liczbę dziesiątek, setek itp. to lepiej zrobić to tak jak radzi elektryk.
    Pozdrawiam
  • Poziom 33  
    sygi napisał:
    Kompiluje w Code Vision AVR
    Potrzebuje napisać funkcje która bedzie ze zmiennej typu unsigned int(65535) "wyciągała" ilośc jedności dziesiatek, setek ... i zapisywała w tablicy 5- elementowej ( int temp[5] ) . Dzieki


    unsigned char tablica[5];
    unsigned int liczba;

    tablica[0]=liczba/10000;
    liczba%=10000;
    tablica[1]=liczba/1000;
    liczba%=1000;
    tablica[2]=liczba/100;
    liczba%=100;
    tablica[3]=liczba/10;
    tablica[4]=liczba%10;

    W tablica[0] masz ilosc dziesiątek tysięcy w tablica[4] jednosci. tablica nie musi być typu int, wystwrczy char ale jeżeli tak Ci wygodniej...
  • Specjalista PLD
    :arrow: Tdv,
    Wybacz, ze usprawnie Twoj w 100% poprawny program, ale serce mnie boli gdy potegi dziesietne nie odpowiadaja indexom w tablicy.
    Dodatkowo mozna jeszcze troszke zagescic ten kod.

    #define DLUGOSC_DZISIETNA 5
    unsigned char tablica[DLUGOSC_DZISIETNA];
    unsigned int liczba;
    unsigned char index;
    ...
    ...
    for(index=0;index<DLUGOSC_DZISIETNA;index++)
    {
    if(liczba != 0)
    {
    tablica[index]=liczba%10;
    if(index < (DLUGOSC_DZISIETNA-1))
    liczba/=10;
    }
    else
    break;
    }


    Teraz mozna zadawac spodziewana liczbe cyfr dziesietnych w wyniku poprzez zmiane wartosci definicji "DLUGOSC_DZISIETNA". Czyli n.p. dla liczby binarnej o dlugosci 32bity bedzie to wartosc 10. Oczywiscie trzeba wtedy zmienic typ zmiennej "liczba" na wlasciwy, by kompilator nie krzyczal i by liczba sie zmiescila. Dodatkowo indexy tablicy odzwierciedlaja potegi dziesietne w danej lokacji tablicy.
    Ten kod nie spowoduje znaczacego wzrostu czasu wykonania, a na pewno oszczedzi troche miejsca we flashu procesora.
    Mam nadzieje, ze program jest poprawny, choc pisalem go z rana.
  • Poziom 33  
    yego66 :arrow: wybaczam :D ale żeby mi to było przedostatni raz 8)
  • Specjalista PLD
    Tdv napisał:
    yego66 :arrow: wybaczam :D ale żeby mi to było przedostatni raz 8)

    :arrow: Tdv

    Dzieki. :) :) Chyba sie juz to nie powtorzy :) , no chyba zeby.
    Wiem, ze pisales kod tak by osoba poczatkujaca wszystko pojela,
    ale nie sadze by trzeba bylo az tak dalece upraszczac sprawy. Wiecej wiary w ludzi :D
    Pozdrawiam, Yego
  • Poziom 33  
    Hehehe, jak już chcesz tak optymalizować to:

    if(liczba) wystarczy ;-D
    i to else break; też tak trochę jak na mój gust nadmiarowe jest...

    BTW to fajny pomysł na konkurs, napisać jak najbardziej optymalny kod do okreslonego algorytmu. Konkurs siłą rzeczy musiałby być w kilku kategoriach (C, BASCOM, asm).
  • Specjalista PLD
    Tdv napisał:
    Hehehe, jak już chcesz tak optymalizować to:

    if(liczba) wystarczy ;-D

    Jesli chodzi o sposob zapisu to masz 100% racji, ale kompilator dokladnie taki sam kod wygeneruje w obu przypadkach :)
    Tdv napisał:

    i to else break; też tak trochę jak na mój gust nadmiarowe jest...

    Nie jest nadmiarowy, gdyz bez niego petla bedzie mlocic indeksy dla zerowej wartosci liczby, a tak zaoszczedzisz na czasie, co przy operacjach dzielenia i modulo moze dac pare ladnych milisekund.
    Tdv napisał:
    BTW to fajny pomysł na konkurs, napisać jak najbardziej optymalny kod do okreslonego algorytmu. Konkurs siłą rzeczy musiałby być w kilku kategoriach (C, BASCOM, asm).

    Pomysl jest fajny, tyle ze nie chcialem sie z Toba scigac, a tylko zoptymalizowac ten kod i pokazac ze zawsze jest wiecej niz jeden sposob na napisanie programu. To wszystko. Zadnych zawodow nie urzadzalem. :wink:
  • Specjalista PLD
    Tdv napisał:
    Mnie nie chodziło o ściganie:
    https://www.elektroda.pl/rtvforum/topic159114.html]
    Sprobuj to zglosic, bo pomysl jest dobry. Mysle, ze wywola zainteresowanie. Niemniej oprocz podzialu na jezyki programowania ( ASM, C, C++, C--, itd itp, trzeba bedzie okreslic czy chodzi nam o jak najwieksza czytelnosc programu, czy o zwiezly kod, czy o wydajnosc czasowa, czy tez zgodnosc z tym lub tamtym standardem. Bedzie na ten temat cala wielka dyskusja, ktora pewnie wobec wielosci rozbieznych zdan znow utknie w martwym punkcie :(
    Tdv napisał:
    Nie bardzo rozumie o co Ci idzie z tym młóceniem indexów... Ale mniejsza już o to, reszta to już sprawa autora postu.
    Sprawa ma sie tak, ze majac n.p. liczbe 16 bitowa o wartosci 32768 bedziemy potrzebowali wszystkich pieciu iteracji do jej przetworzenia, natomiast liczba 123 wymaga zaledwie trzech iteracji. W chwili gdy if(liczba) wyczai zerowa wartosc argumentu, else break; spowoduje przerwanie wykonywania petli FOR zamiast pozwolic jej przejsc ( niepotrzebnie zreszta ) jeszcze dwie iteracje ( zmieniajac tylko indexy ) na zerowym argumencie. Zaoszczedzisz w ten sposob troche cennego czasu.
  • Poziom 29  
    owszem zaoszczędzisz, ale pamiętaj o zainicjowaniu tablicy, bo mogą w niej zostać jakieś śmieci.
  • Poziom 12  
    Albo można tak:

    W pętli np. while odejmować od danej liczby 10000 i zliczać ile razy pętla się wykona, dopóki liczba będzie większa od 10000. W tym liczniku będzie właśnie liczba dziesiątków tysięcy, tysięcy itd. Potem odejmować w ten sposób 1000, 100 i 10, na końcu zostanie liczba jedności.
    Kto wie czy nie będzie się szybciej wykonywać niż dzielenie. U mnie działa - robiłem na tym właśnie miernik częstotliwości z wy na 7seg:)