Перевод из 10-ой в 16-ую

Модератор: Модераторы разделов

Аватара пользователя
LuckyStr
Сообщения: 159
ОС: Fedora

Перевод из 10-ой в 16-ую

Сообщение LuckyStr »

Пишу следующий код, по переводу из десятичной в шестнадцатиричную целого числа:

Код: Выделить всё

string photo(unsigned int n)
{
char hex[17]="0123456789abcdef";

string ph_no;
   int i=0;
   unsigned int no=n;
   while ((no-pow(16,i))>1)i++;

   i=i-1;
   int j=0;
unsigned int k=0;
unsigned int he=0;

for(;i>=0;i--)
{ if(i>0)he=pow(16,i);
   k=(no-no%he)/he;
   if(no>15)no=no%he;

   if(k<17)ph_no[j]=hex[k];
   j++;
}
return ph_no;
}

int main(int argc, char *argv[])
{
.....
string ch;
ch=photo(2114948818);
.....
}


в принципе код выполняеться (если ставить брейкпоинты в KDevelop), но если компилируешь при запуске посылаеться сигнал SIGSEGV (Segmentation fault).
В случае если возвращать не string а char*, то такая же фигня. Но если брать мелкие числа, то все нормально.
Однако, в справочниках писано, что unsigned int принадлежит [0;+4,294,967,295]. Пробывал long, double, float - везде одно и тоже.
Прошу помощи.
Это наш химический дом для печальных жителей Земли!
Спасибо сказали:
svary
Сообщения: 49
ОС: Linux FC-9

Re: Перевод из 10-ой в 16-ую

Сообщение svary »

Извините, но то, что вы написали - просто ужасно ! :-( Абсолютно нечитаемое нагромождение беспорядочных операторов.
Что бы не быть голословным, потратил 5 минут на написание того, как это должно (приблизительно) выглядеть :

Код: Выделить всё

#include <iostream>
#include <cstdlib>
using namespace std;

string photo(unsigned int n)
{
    char hex[17]="0123456789abcdef";
    int j, k;
    string ph_no;
    char ch;

    ph_no = "        ";

    // Перебираем все ПОЛУбайты в исходном слове
    for(j=0; j<8; j++){
        //Выделяем младший полубайт
        k = n & 0x0F;
        // Превращаем его в симовл
        ch = hex[k];
        // Помещаем на нужное место в строку
        ph_no[7-j] = ch;
        // Сдвигаем слово, подготавливая следующую итерацию
        n = n>>4;
    }

    return ph_no;
}

int main(int argc, char *argv[])
{
    string ch;

    ch=photo(1);
    cout << "1 in hex " << ch << endl;
    ch=photo(15);
    cout << "15 in hex " << ch << endl;
    ch=photo(16);
    cout << "16 in hex " << ch << endl;
    ch=photo(255);
    cout << "255 in hex " << ch << endl;
    ch=photo(256);
    cout << "256 in hex " << ch << endl;
    ch=photo(4294967295);
    cout << "4294967295 in hex " << ch << endl;

    return EXIT_SUCCESS;
}


И вот результвты рабоы этой ПРОСТОЙ и ОЧЕВИДНОЙ программы :


Код: Выделить всё

$ ./to16
1 in hex 00000001
15 in hex 0000000f
16 in hex 00000010
255 in hex 000000ff
256 in hex 00000100
4294967295 in hex ffffffff
$

Настоятельный совет : или читайте умные книжки, или бросайте эту профессию...
Спасибо сказали:
ssh
Сообщения: 78
ОС: Debian

Re: Перевод из 10-ой в 16-ую

Сообщение ssh »

5 минут - это слишком много. Достаточно 10 сек:

Код: Выделить всё

#include <iostream>
#include <cstdlib>
using namespace std;

#include <stdio.h>

string photo(unsigned int n)
{
 char s[ 100 ];
 sprintf( s, "%x", n );
 return string( s );
}


Кстати, если речь идет только о печати числа, то достаточно единственного оператора printf("%x", n ).
Спасибо сказали:
svary
Сообщения: 49
ОС: Linux FC-9

Re: Перевод из 10-ой в 16-ую

Сообщение svary »

Достаточно 10 сек

Ну, насколько я понял, это что-то типа домашнего задания, в котором требовалось показать ПОНИМАНИЕ АЛГОРИТМА преобразования внутреннего формата хранения чисел в символьное представление. :-) Поэтом использовать sprintf показалось мне неспортивным... :-)
Спасибо сказали:
Аватара пользователя
LuckyStr
Сообщения: 159
ОС: Fedora

Re: Перевод из 10-ой в 16-ую

Сообщение LuckyStr »

всем спасибо, учту все замечания и далее буду писать понятнее и быстрее
Это наш химический дом для печальных жителей Земли!
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: Перевод из 10-ой в 16-ую

Сообщение Женя Подсыпальников »

LuckyStr писал(а):
10.06.2009 02:49
в принципе код выполняеться (если ставить брейкпоинты в KDevelop), но если компилируешь при запуске посылаеться сигнал SIGSEGV (Segmentation fault).
В случае если возвращать не string а char*, то такая же фигня.


Дак а ты локальную переменную возвращаешь...
А кто его знает: может эта "string" себя в стэк копировать ли не... :)

Но с char* - точна труба :)

Выход тада простой может быть:
расширить число параметров:
void photo(unsigned int uiDec, string& strHex) {../*заполняем strHex*/..}

Ну, и вызвать, например, так: photo(123123, ch); :)
Пойдём на рыбалку !
Спасибо сказали: