3

だから私はここにこのコードを持っています、それは(今のところ)基数1の数を基数10の数に変えるだけです

/**
 * This function is supposed to convert 'number' from base1 to a number in base2.
 * It isn't fully implemented yet, and I've only converted base1 to a base 10 number.
 */
void base1_base2(int base1, int base2, int number) {

    int num, place = 0;
    int rem = number;
    int i;
    for (i = 0; i < num_digits(number); i++) {

        int mod = rem % 10;
        rem = floor(rem / 10);

        int powerResult = pow(base1, place++);
        num = num + mod * powerResult;  
    }

    int base10_num = num;

    printf("The number %i(base%i) in base 10 is: %i\n", number, base1, base10_num);
}

そして、これは正しい base10 数値を計算します。つまり、関数呼び出し base1_convert(2, 5, 100) は予想どおり 4 を返します。

The number 100(base2) in base 10 is: 4

このコードをその関数の最後の printf のすぐ下に追加すると、問題が発生します。

int base2_num = 0;
printf("The number %i(base%i) is: %d\n", number, base1, base2_num);

上記のコードを追加すると、最初の printf の結果が完全に変更され、以下が返されます。

The number 100(base2) in base 10 is: 4196784.
The number 100(base2) is: 0

なぜこれが起こっているのか、一生理解できません。私はそれがいくつかのポインターに関係していると推測していますが、実際には何も使用していません。一見独立した変数を追加するint base2_num = 0;と、そのすべてが変わる理由がわかりません。

上記の行を追加した後の完全な変更コードを次に示します。

void base1_base2(int base1, int base2, int number) {

    int num, place = 0;
    int rem = number;
    int i;
    for (i = 0; i < num_digits(number); i++) {

        int mod = rem % 10;
        rem = floor(rem / 10);

        int powerResult = pow(base1, place++);
        num = num + mod * powerResult;  
    }

    int base10_num = num;

    printf("The number %i(base%i) in base 10 is: %i\n", number, base1, base10_num);

    int base2_num = 0;
    printf("The number %i(base%i) is: %d\n", number, base1, base2_num);

    return;
} 

編集: そして、これが私が使用した唯一の他の関数、num_digits です。整数の桁数を返します。

int num_digits(int integer) {

    char int_string[100];
    int str_length;
    sprintf(int_string, "%i", integer);
    str_length = strlen(int_string);

    return str_length;
}

そして、ここで関数を呼び出します。

int main() {
    printf("Hello World\n");
    base1_base2(2, 5, 100);

    return 0;
}
4

2 に答える 2

7

書くことだけに気をつけてください:

int num = 0, place = 0;

そして、あなたは必ず成し遂げられます。

そのため、1 行ごとに 1 つの変数を宣言することをお勧めします。

于 2012-10-09T08:21:04.613 に答える