problem z otrzymywaniem wartości w funkcji itoa.

0

Witam serdecznie wszystkich użytkowników.
Mam pewien problem. Muszę pewną liczbę binarną zamienić na char, a następnie ponownie wartości zer i jedynek wyciągnąć do int.

Zamiana na char wygląda u mnie następująco:

int bin=010010;
int dec;
char wartosc[10];
char buf;

itoa(bin,wartosc,2);

i gdy chcę wyciągnąć wartości ukryte pod wskaźnikiem (i każdym kolejnym) w następujący sposób:

buf=*wartosc
dec=(int)buf;

do zmiennej dec, zapisana zostaje wartość 49(zakładam, ze do wartość liczbowa komórki pamięci), zamiast zera.
Pozdrawiam.
Ktoś ma pomysł co robię źle?

0

'0' to inaczej 49. Musisz odjąć od tego '0' - Zmianna = string[1] -= 49;

0

Konwersji odwrotnej możesz dokonać za pomocą:
strtol - http://www.cplusplus.com/reference/clibrary/cstdlib/strtol/
Z tym że raczej miałeś to zrobić nie za pomocą itoa i strtol tylko napisać te funkcje samodzielnie, nie koniecznie w postaci funkcji.

0

Witam.
Dzięki uprzejmie za odpowiedzi.

Co do pisania własnej funkcji, raczej nie muszę, bowiem nie jest to zadanie na uczelnie;) ten przykład służy mi do programowana mikro kontrolera. Sprawdzę jeszcze tą jedną funkcję, którą podał jeden z kolegów, aczkolwiek tutaj zależy mi na jak najmniejszym poborze pamięci.

Pozdrawiam serdecznie! :)

edit:
Skorzystam i zapytam o jeszcze jedną rzecz, mianowicie nie rozumiem dlaczego nie działa mi wskaźnik tak jak powinien(nie piszę co robią funkcje tylko jakie wartości zwracają).

char *zamien_char(int liczba)
{
char znaki[10];

	itoa(liczba,znaki,10);
	
	return &znaki[0];

}
char bin_dec(char bin) //Zamiana z kodu binarnego na dziesiętny
{
char tab_dec[10];
return &tab_dec[0];
}
pierwsza funkcja działa bez problemu:
char
jakas_liczba;
char
bin;
char tablica[10];
int x;
jakas_liczba=zmien_char(x);

i teraz chciałbym zrobić tak
bin=bin_dec(jakas_liczba);

dlaczego to nie działa? (zmienna "jakas_liczba" jest "ok" bo sprawdzam debuggerem).
mogę to zrobić jedynie w ten sposób:

for(i=0;i<10;i++)
{
tablica[i]=*jakas_liczba;
jakas_liczba++;
}
bin=bin_dec(&tablica[0]);

Ma ktoś jakiś pomysł dlaczego pierwszy sposób nie działa?

Z góry dzięki :)

0

Jeżeli zależy ci na jak najmniejszym poborze pamięci to zrób te funkcje sam.
Te funkcje (itoa,strtol) są uniwersalne, przetwarzają z każdego / na każdy system, przez to są większe i wolniejsze.

0

itoa nie zajmuje, aż tak dużo pamięci. Przynajmniej w granicach przyzwoitości(w porównaniu do strcpy) :).
Jakieś pomysły co do drugiego pytania?:)
Pozdrawiam.

0

Obie twoi funkcje nie działają poprawnie:
1.

char *zamien_char(int liczba)
  {
   char znaki[10];                
               
   itoa(liczba,znaki,10);
   return &znaki[0]; // tu można zapisać return znaki; na to samo wyjdzie, czyli zwróci adres pierwszego elementu
  }
// Po powrocie z funkcji tablica znaki już nie istnieje i może zostać zamazana przez wywołanie kolejnej funkcji.
char *bin_dec(char *bin) //Zamiana z kodu binarnego na dziesiętny
  {
   char tab_dec[10];
   return &tab_dec[0]; // tu można zapisać return tab_dec; na to samo wyjdzie, czyli zwróci adres pierwszego elementu
  }
// Ten sam problem co w pierwszej funkcji, oprócz tego na początku ta tab_dec zawiera jakieś śmieci i te śmieci zwracasz.
// czy ta funkcja nie powinna zwracać int ?
0

[quote] Po powrocie z funkcji tablica znaki już nie istnieje i może zostać zamazana przez wywołanie kolejnej funkcji.[/quote]

I to wiele tłumaczy. Jakoś ten fakt mi umknął, myślałem że komórki pamięci są zarezerwowane do końca. Czyli jedynym wyjściem jest kopiowanie tablicy w funkcji main?
Pozdrawiam!

0

Nie, nie musisz tego robić w main. Zadeklaruj tablicę jako static:
static char znaki [];
Po zakończeniu działania funkcji tablica "przetrwa".

0

int bin=010010;
Twoja zmienna bin wynosi dziesięć tysięcy dziesięć. W języku C o ile mi wiadomo nie ma literałów binarnych (chyba że coś dodali w standardzie C99).

0

Dzięki uprzejmie za wszelaką pomoc!
Myślę, że jak wrócę za tydzień do programowania to uda mi się dokończyć, niestety miałem przerwę w programowaniu i zapomniałem o takich podstawach jak static... wstyd. :)
Dzięki bardzo!

1 użytkowników online, w tym zalogowanych: 0, gości: 1