To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
-
mr_andre
- -
- Posty: 11
- Rejestracja: 15 wrz 2007, 13:15
- Lokalizacja: Z domu
Post
autor: mr_andre » 24 lip 2008, 16:21
Witam, chcę sobie napisać funkcję która będzie mi zamieniała zmienne liczbowe typu char na znaki ansii, wiem jak zamienić dowolną liczbę na tablicę:
char tablica[] = "123456789";
ale nie wiem jak zamienić jakąś zmienną na tablicę, czy może mi ktoś w tym pomóc? Drugie pytanie jak od razu wiedzieć po zapisaniu do tablicy zmiennej ile ona ma elementów ;] Nie chcę używać bibliotek do obsługi tego, chcę jak najmniej obszerny kod mieć ;]
Pozdrawiam
Andrzej
-
Wesker
- -
- Posty: 27
- Rejestracja: 01 lut 2006, 10:33
- Lokalizacja: Leżajsk
Post
autor: Wesker » 24 lip 2008, 16:30
by liczbę zamienić na asci wystarczy użyć dzielenia całkowitego i dodać '0'.
-
mr_andre
- -
- Posty: 11
- Rejestracja: 15 wrz 2007, 13:15
- Lokalizacja: Z domu
Post
autor: mr_andre » 24 lip 2008, 16:44
---------------------------------------------------------------------------------------------
[ Dodano: 2008-07-25, 15:53 ]
Witam ponownie, może mi ktoś napisać jak użyć poniższej funkcji? Chodzi mi o to jakiego typu dane zadeklarować i jak uruchomić ja ;]
int a = '4849'
char *string_ptr;
const unsigned int divisor[4]={10000,1000,100,10};
void itoa(unsigned int value,char *string_ptr)
{
int i;
for(i=0;i<4;i++) // do that down to tenths
{
string_ptr='0'; // initial value is ASCII '0'
while(value>=divisor) // loop while current value >= divisor
{
value-=divisor; // decrement current value
string_ptr++; // and increment the char in result table
}
}
string_ptr[4]=(char)value+'0'; // last char equals the final value + '0'
}
a = itoa(a, *string_ptr);
-
Wesker
- -
- Posty: 27
- Rejestracja: 01 lut 2006, 10:33
- Lokalizacja: Leżajsk
Post
autor: Wesker » 26 lip 2008, 17:14
Moim zdaniem powinno być tak:
Kod: Zaznacz cały
unsigned int a=4849; //argumentem twojej funkcji jest liczba dodatnia bez znaku
char buffer[5]; //dla liczb do 99999 potrzeba 5 znaków
string_ptr= & buffer[0]; //wskaźnik trzeba zainicjować, może być też string_ptr=buffer;
// ale od razu możesz przekazać do funkcji nazwę tablicy i nie używać char *string_ptr;
//twoja funkcja wypełnia tablice char poszczególnymi cyframi w kodzie asii ale nic nie //zwraca
//a = itoa(a, *string_ptr); jest błędem
itoa(a, *string_ptr); //prawidłowe wywołanie
itoa(a, buffer); //jeszcze lepiej
//pozostaje wyświetlić elementy tablicy
//nie wiem jaką masz funkcje do wyświetlania, ale może to być tak
signed char i;
for(i=4;i>=0;i--)
{
wyswietl_cyfre(buffer[i]);
}
niestandardowa funkcja itoa jest w stdlib więc weź pod uwagę użycie innej nazwy
-
alaris
- Użytkownik
- Posty: 530
- Rejestracja: 21 lut 2006, 14:56
- Lokalizacja: Gorzow/Poznan
Post
autor: alaris » 26 lip 2008, 17:22
Sprobuj tego:
Kod: Zaznacz cały
char liczba = 123;
char wynik[3] = {0} ; //zerowanie
for(char i=0 ; i<3 ; i++){
wynik[i] = liczba%10 ; //pobierz ostatnia cyfre
liczba = liczba / 10 ; //usun ostatnia cyfre
}
Operacja % (modulo) zwraca reszte z dzielenia, czyli ostatnia cyfre w tym wypadku. Jezeli liczbe podzielisz przez dziesiec to "przesuwasz" ja o jedna pozycje i usuwasz odczytana wlasnie cyfre.
Petla for wykonuje sie trzy razy, bo masz do trzech cyfr, np. 123 daje Ci 1, 2, 3.