Zwraca 48 ponieważ taki jest kod ASCII dla cyfry 0. Jeżeli chcesz uzyskać wartość zamiast kodu ASCII musisz użyć funkcji “atoi ( const char * str );” .
Kod wydaje się zdecydowanie za długi, nie wnikałem co dokładnie te funkcje robią, ale przypisania po całej długości tablicy to raczej średni pomysł (czemu nie pętla?)
Pisanie do .c_str() to prawdopodobnie bardzo zły pomysł.
XOR zwraca wartości numeryczne 0 lub 1 (nie wnikam już w sens ten funkcji i całego programu oraz tego jak zostały napisane) - a więc takie kody ASCII przypisujesz do stringu. Znów, jeśli chcesz mieć kody ASCII ‘0’ i ‘1’ to dodaj do tej wartości ‘0’. Chociaż tak jak mówię, kod nie wydaje się elegancki, wszystko to dałoby się napisać krócej i wydajniej.
Faktycznie, troszkę naeksperymentowałem. Coś mi nadal nie chce działać i się wykrzacza, ale mniejsza z tym.
Chciałem jeszcze zapytać o jedną rzecz:
Bo napisałem funkcję, która pobiera liczbę w systemie dziesiętnym, przerabia na dwójkowy i zwraca tę dwójkową w stringu. A czy dało by się tak, żeby funcja zwracała liczbę binarną analogicznie, ale w tablicy intów? …i jak się do tego odwołać. Bym był wdzięczny za frament kodu.
Oczywiście, że by się dało. Musiałbyś tylko podjąć parę decyzji - czy zwracać tablicę o stałym rozmiarze, czy dynamicznie obliczać jej rozmiar (a jeśli dynamicznie to czy zwracać również rozmiar czy może zakończyć jakąś specjalną wartością). No i musiałbyś pamiętać o zwalnianiu takiej tablicy gdy już nie będzie potrzebna (std::string ma te zaletę, że sam zarządza potrzebną mu pamięcią).
Ale z czym konkretnie masz problem? Obliczyć rozmiar tablicy, zarezerwować ją dynamicznie (skoro chcesz dynamicznie to jeszcze to o czym wspomniałem - czy np. zakończyć ją wartością inną niż 0 i 1 czy osobno zwracać jej rozmiar), wypełnić ją, zwrócić z funkcji. Jeśli chcesz tylko na system dwójkowy to zamiast bawić się w dzielenie i dzielenie modulo możesz użyć przesunięcia bitowego i koniunkcji logicznej do testowania zawartości bitów. Najwięcej się nauczysz, jeśli sam to napiszesz.
int * tablica = new int[20];
w nawiasach kwadratowych może być również zmienna
potem zwyczajnie w funkcji return tablica
ale musisz pamiętać, żeby po zakończeniu używania zwolnić zarezerwowaną na nią pamięć
delete [] tablica;
Usuwasz po zakończeniu pracy w ogóle, to co napisałeś jest bez sensu, bo delete w funkcji się nie wykona (a nawet jak już to do kasowania pamięci alokowanej new [] służy delete []).
#include
#include
using namespace std;
int *tablica(int liczba)
{
int* tablica = new int[5];
for(int i=0; i<5; i++)
{
tablica[i] = liczba-1;
liczba--;
}
return tablica;
}
int main(int argc, char *argv[])
{
int *arr = tablica(5);
for(int i = 0; i < 5; ++i)
{
cout << arr[i];
}
delete [] arr;
return EXIT_SUCCESS;
}
Tylko oczywiście jeszcze jakoś trzeba rozwiązać przekazywanie rozmiaru tablicy.