0

整数を関数に渡し、関数にそれを編集させてから、整数をメイン関数に戻したいです。私はこれに取り組んでいますが、うまくいきません。

これが私のコードです:

int update_SEG_values(int DIGIT_1, int DIGIT_2) {

    // How many tens in the "TEMP_COUNT".
    DIGIT_2 = ((TEMP_COUNT) / 10);

    // How much is left for us to display.
    TEMP_COUNT = TEMP_COUNT - ((DIGIT_2) * 10);

    // How many ones.
    DIGIT_1 = ((TEMP_COUNT) / 1);

    return(DIGIT_1, DIGIT_2);
}

ここで何が間違っていますか?

4

5 に答える 5

2

C では 1 つの値のみを返すことができます

あなたが与えるとき:

return(DIGIT_1, DIGIT_2);

コンマ演算子DIGIT_2が原因で返されます。詳細については、http://en.wikipedia.org/wiki/Comma_o​​peratorを参照してください。

ポインターまたは構造体を使用して仕事を終わらせることができます (両方の数字が同じ構造体の一部になり、同じものを返します)。

于 2012-12-10T15:58:41.233 に答える
1

C では、複数の値を返すことはできません。関数に渡された値を変更する必要がある場合は、ポインターで渡す必要があります。

void update_SEG_values(int *DIGIT_1, int *DIGIT_2) // Note the void

関数内で、ポインターを逆参照して値を変更します。

*DIGIT_2 = ((TEMP_COUNT) / 10); // Note the asterisk
...
*DIGIT_1 = ((TEMP_COUNT) / 1);

関数を呼び出すときは、次のように変数へのポインターを渡す必要があります。

int digit1 = 5, digit2 = 1;
update_SEG_values(&digit1, &digit2); // Note the ampersands
于 2012-12-10T15:59:05.383 に答える
0

2 つのオプションがあります。参照によって整数を渡し、戻り値を持たないか、返そうとしているタプルの構造体を作成することができます。

最初の方法は次のようになります。

void update_SEG_values(int* DIGIT_1, int* DIGIT_2) {

    /* How many tens in the "TEMP_COUNT". */
    *DIGIT_2 = ((TEMP_COUNT) / 10);

    /* How much is left for us to display. */
    TEMP_COUNT = TEMP_COUNT - ((*DIGIT_2) * 10);

    /* How many ones. */
    *DIGIT_1 = ((TEMP_COUNT) / 1);
}

int main() {
    int x = 111, y = 222;
    int result = update_SEG_values(&x, &y);
    ....

}

2 番目の方法は次のようになります。

struct tuple {
    int DIGIT_1;
    int DIGIT_2;
};

struct tuple update_SEG_values(int DIGIT_1, int DIGIT_2) {

    /* How many tens in the "TEMP_COUNT". */
    DIGIT_2 = ((TEMP_COUNT) / 10);

    /* How much is left for us to display. */
    TEMP_COUNT = TEMP_COUNT - ((DIGIT_2) * 10);

    /* How many ones. */
    DIGIT_1 = ((TEMP_COUNT) / 1);

    struct tuple result;
    result.DIGIT_1 = DIGIT_1;
    result.DIGIT_2 = DIGIT_2;
    return result;
}

また、TEMP_COUNT がどこにも定義されていないことにも気付きました。おそらくその関数の最初の行として、 update_SEG_values で使用する前に初期化する必要があります。

于 2012-12-10T16:03:08.360 に答える
0

一度に 2 つの値を返すことはできません。何も返さずに値自体が変更されるように、ポインターの使用を検討してください。

// note the change to "void" in the function's signature--it will not return anything,
// rather, it will change the information passed in through the pointer parameters
void update_SEG_values(int *DIGIT_1, int *DIGIT_2)
{
    // How many tens in the "TEMP_COUNT".
    *DIGIT_2 = ((TEMP_COUNT) / 10);

    // How much is left for us to display.
    TEMP_COUNT = TEMP_COUNT - ((DIGIT_2) * 10);

    // How many ones.
    *DIGIT_1 = ((TEMP_COUNT) / 1);
    // The variables passed in as params for DIGIT_1 and _2 will be updated
    // in the main function w/o needing to return anything
}

ポインターの詳細情報

于 2012-12-10T15:58:20.200 に答える
0

変数のアドレスを関数に渡します。変更があれば反映されます。

update_SEG_values(int *DIGIT_1, int *DIGIT_2)
{

...
}

次のような int 値のアドレスで関数を呼び出します。

int a, b;
update_SEG_values(&a, &b);

2 つの整数を返すことは目的を果たしません。

変更されたコードを見てください。あなたは TEMP_COUNT の世話をしていると思います。

void update_SEG_values(int *DIGIT_1, int *DIGIT_2) {

    /* How many tens in the "TEMP_COUNT". */
    *DIGIT_2 = ((TEMP_COUNT) / 10);

    /* How much is left for us to display. */
    TEMP_COUNT = TEMP_COUNT - ((*DIGIT_2) * 10);

    /* How many ones. */
    *DIGIT_1 = ((TEMP_COUNT) / 1);

    return; //No use anyway. 
}
于 2012-12-10T15:58:49.980 に答える