さまざまな基数 (基数 10、バイナリ、基数 53 など) で数値を書き込むプログラムを作成しました。
私は最初にそれを win32 コンソール アプリケーションとして Visual C++ 2010 で作成し、それを Windows フォーム アプリケーションに変換しました (わかっています、わかっています...)。
元の形式では問題なく動作していましたが、変換後に動作しなくなりました。問題を次のように絞り込みました。
このプログラムは、数字を受け取って char を返す関数を使用します。
char corresponding_digit(int digit)
{
char corr_digit[62] = {'0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P' ,'Q','R','S' ,'T','U','V','W','X','Y','Z',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p' , 'q','r','s' ,'t','u','v','w','x','y','z'};
return corr_digit[digit];
}
この関数は 1 から 61 までの数字を取り、対応する文字を返します: 0-9 -> 0-9; 10-35 -> AZ; 36-61 a->z.
プログラムは次のように関数を使用します。
//on a button click
//base is an integer got from the user
String^ number_base_n = "";
if(base == 10)
number_base_n = value.ToString();
else if(base==0)
number_base_n = "0";
else
{
int digit, power, copy_value;
bool number_started = false;
copy_value = value;
if(copy_value > (int)pow(float(base), MAX_DIGITS)) //cmath was included
number_base_n = "Number too big";
else
{
for(int i = MAX_DIGITS; i >= 0; i--)
{
power = (int)pow(float(base), i);
if(copy_value >= power)
{
digit = copy_value/power;
copy_value -= digit*power;
number_started = true;
number_base_n += corresponding_digit(digit);
}
else if (number_started || i==0)
{
number_base_n += "0";
}
}
}
}
textBox6->Text = number_base_n;
少しデバッグした後、式で「1」を返すはずの数字値「1」で関数対応する桁が呼び出されたときに問題が発生することに気付きました
//number base_n equals ""
number_base_n += String(corresponding_digit(digit));
//number_base_n equals "49"
"" で始まる number_base_n は、実際には 1 の ASCII 値である "49" で終わります。できない
number_base_n += corresponding_digit(digit).ToString();
補助変数を使用してみました:
aux = corresponding_digit(digit);
number_base_n += aux.ToString();
しかし、まったく同じ(間違った)結果が得られました...( String(value) と同じこと)
私はもう少し手探りしましたが、言及する価値のあるものは何もないと思います. それで...何か助けて?
また、ベース10とベース0は完全に機能しています
編集:反対票を投じた人がコメントして、反対票を投じた理由を説明したい場合は... 建設的な批判、という用語だと思います。