| Author |
Message
|
sygi Poziom 12

Joined: 19 Jun 2003 Posts: 82 Location: Wrocław
|
#1
22 Sep 2004 11:50 Potrzebna pomoc - uC |
|
|
|
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
|
|
| Back to top |
|
 |
elektryk Poziom 26

Joined: 25 Apr 2002 Posts: 11092
|
#2
22 Sep 2004 12:18 Re: Potrzebna pomoc - uC |
|
|
|
Dziel liczbe przez 10 a reszte z dzielenia ładuj do tablicy od najmłodszej cyfry.
|
|
| Back to top |
|
 |
Google

|
#
22 Sep 2004 12:18 |
|
|
|
|
|
| Back to top |
|
 |
Xitami Poziom 21

Joined: 10 Aug 2004 Posts: 1126 Location: Gliwice
|
#3
23 Sep 2004 00:52 Potrzebna pomoc - uC |
|
|
|
itoa() zobacz w helpie
|
|
| Back to top |
|
 |
Robot_ Poziom 16

Joined: 03 Jun 2004 Posts: 277 Location: Zabrzeg
|
#4
23 Sep 2004 00:56 Re: Potrzebna pomoc - uC |
|
|
|
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
|
|
| Back to top |
|
 |
Tdv Poziom 22

Joined: 27 Aug 2002 Posts: 2263 Location: Śląsk
|
#5
23 Sep 2004 07:25 Re: Potrzebna pomoc - uC |
|
|
|
| sygi wrote: |
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...
|
|
| Back to top |
|
 |
yego666 Poziom 21

Joined: 26 Feb 2004 Posts: 1366
|
#6
23 Sep 2004 09:45 Re: Potrzebna pomoc - uC |
|
|
|
: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.
|
|
| Back to top |
|
 |
Google

|
#
23 Sep 2004 09:45 |
|
|
|
|
|
| Back to top |
|
 |
Tdv Poziom 22

Joined: 27 Aug 2002 Posts: 2263 Location: Śląsk
|
#7
23 Sep 2004 09:53 Re: Potrzebna pomoc - uC |
|
|
|
yego66 :arrow: wybaczam :D ale żeby mi to było przedostatni raz 8)
|
|
| Back to top |
|
 |
yego666 Poziom 21

Joined: 26 Feb 2004 Posts: 1366
|
#8
23 Sep 2004 10:04 Re: Potrzebna pomoc - uC |
|
|
|
| Tdv wrote: |
| 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
|
|
| Back to top |
|
 |
Tdv Poziom 22

Joined: 27 Aug 2002 Posts: 2263 Location: Śląsk
|
#9
23 Sep 2004 10:15 Potrzebna pomoc - uC |
|
|
|
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).
|
|
| Back to top |
|
 |
yego666 Poziom 21

Joined: 26 Feb 2004 Posts: 1366
|
#10
23 Sep 2004 10:31 Re: Potrzebna pomoc - uC |
|
|
|
| Tdv wrote: |
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 wrote: |
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 wrote: |
| 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:
|
|
| Back to top |
|
 |
Tdv Poziom 22

Joined: 27 Aug 2002 Posts: 2263 Location: Śląsk
|
|
| Back to top |
|
 |
Google

|
#
23 Sep 2004 10:48 |
|
|
|
|
|
| Back to top |
|
 |
yego666 Poziom 21

Joined: 26 Feb 2004 Posts: 1366
|
#12
23 Sep 2004 11:09 Re: Potrzebna pomoc - uC |
|
|
|
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 wrote: |
| 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.
|
|
| Back to top |
|
 |
Xitami Poziom 21

Joined: 10 Aug 2004 Posts: 1126 Location: Gliwice
|
#13
23 Sep 2004 11:27 Potrzebna pomoc - uC |
|
|
|
owszem zaoszczędzisz, ale pamiętaj o zainicjowaniu tablicy, bo mogą w niej zostać jakieś śmieci.
|
|
| Back to top |
|
 |
juliusz Poziom 8

Joined: 15 Jul 2004 Posts: 28 Location: 3miasto
|
#14
23 Sep 2004 11:44 Re: Potrzebna pomoc - uC |
|
|
|
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:)
|
|
| Back to top |
|
 |