Funckja do konwersji systemów liczbowych.

0

Witam, jestem w trakcie pisania funkcji do celow w.w. i juz na początku napotkałem pewien problem, który nie wiem z czego wynika i nie wiem jak mógłbym go rozwiązać:

char* Int_To_XXX(int INT, int system)
{
	int value = system;
	int counter = 1;
	bool minus_sign = false;
	if (INT < 0)
	{
		INT = -INT;
		minus_sign = true;
		counter++;
	}

	while (value < INT)
	{
		counter++;
		value = value * system;
	}
	char *CONV = new char[counter];

	cout << counter << endl;
	if (minus_sign == false)
	{
		for (int i = counter - 1; i >= 0; i--)
		{
			if (INT%system < 10)
				CONV[i] = INT%system + '0';
			else
				CONV[i] = INT%system;
			INT = INT / system;

			cout << CONV[i] << endl;
			
		}
	}
	else
	{
		for (int i = counter - 1; i > 1; i--)
		{
			if(INT%system < 10)
				CONV[i] = INT%system + '0';
			else
				CONV[i] = INT%system;
			INT = INT / system;
		}
		CONV[0] = '-';
	}
        cout << CONV << endl;
	return CONV;
} 

w funkcji main:

 char* test = Int_To_XXX(10, 2);

a na ekranie pokazuje sie:
http://postimg.org/image/h4wgcctgx/

Gdzie moze lezec przyczyna problemu ?

Funkcja nie jest jeszcze ukonczona - nie sa obslugiwane przypadki dla systemow 10+, ale to bez znaczenia.

7
  1. Dlaczego używasz nagiego new i delete? W C++ masz RAII, masz kontenery i w tym przypadku masz też std::string
  2. C-stringi muszą kończyć się znakiem '\0'. Funkcje na nich operujące nie znają ich długości i np. wypisują aż do napotkania tego znaku. Jak go nie masz to wypisują śmieci z pamięci aż do napotkania go (co jest UB, przy okazji).
  3. Dlaczego funkcja konwertująca liczbę na string wypisuje coś na stdout?
  4. CONV[i] = INT%system; to nie ma sensu

Tyle na szybko, po tym kodzie spodziewam się więcej błędów.

2

wszystko co napisał @kq +
Niech żyją wycieki pamięci (ta twoja funkcja to zapewnia).
A wypisuje się, źle bo nie dodałeś zera kończącego napis.

0
kq napisał(a):

1 Dlaczego używasz nagiego new i delete? W C++ masz RAII, masz kontenery i w tym przypadku masz też std::string
2 C-stringi muszą kończyć się znakiem '\0'. Funkcje na nich operujące nie znają ich długości i np. wypisują aż do napotkania tego znaku. Jak go nie masz to wypisują śmieci z pamięci aż do napotkania go (co jest UB, przy okazji).
3 Dlaczego funkcja konwertująca liczbę na string wypisuje coś na stdout?
4 CONV[i] = INT%system; to nie ma sensu

Tyle na szybko, po tym kodzie spodziewam się więcej błędów.

  1. docelowo konwertuje macierz intow do innych systemow liczbowych, i uzycie tablicy char 3D wydalo mi sie najbardziej intuicyjne (przyzwyczajenie z C), nie watpie, ze wybor optymalny nie byl.

  2. kompletnie o tym zapomnialem - to rozwiazalo problem.

  3. to tylko na czas debugowania...

  4. dlatego dopisalem na koncu posta, ze obslugiwanie reszty z dzielenia 10+ nie jest jeszcze zaimplementowane.

0

Ta funkcja powinna mieć nagłówek: string Int_To_XXX(int INT,unsigned system);
lub ewentualnie: void Int_To_XXX(int INT,unsigned system,char *buffer,size_t bufferSize);
Aczkolwiek ta druga może zwrócić ten buffer.
Wywal to wszystko, bo wystarczy tylko tyle:

string int2sys(int value,unsigned sys)
  {
   static const char digit[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
   string ret;
   bool neg=(value<0);
   if(neg) value=-value;
   for(int div=0;value;value=div) ret=digit[value-10*(div=value/sys)]+ret; // w sumie cała konwersja odbywa się w tym wierszu
   if(!ret.size) ret="0";
   return neg?"-"+ret:ret;
  }

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