-1

Kochan's Programming in C に取り組んでいます。これは演習 9-5 です。プログラムは時間を 1 秒ずつ増やします。コードは正常にコンパイルされますが、時刻が期待どおりに更新されません。timeUpdate 関数のコードを次のように置き換えると、

printf("Test");

「Test」と出力されるため、関数の呼び出しに問題があるようには見えません。ただし、コードを次のように置き換えると

now.seconds = 2; 

または何か、秒が 2 に更新されていません。コードのデバッグを手伝ってください。本当に明らかな間違いを犯している場合は、お詫び申し上げます。残念ながら、私は本当に初心者です。

#include <stdio.h>

struct dateAndTime
{
    int days;
        int hours;
    int minutes;
    int seconds;
};

// Updates the time by one second
struct dateAndTime timeUpdate(struct dateAndTime now)
{   
    now.seconds++; 
    if (now.seconds == 60) // One minute
    {
        now.seconds = 0; 
        now.minutes++; 
        if (now.minutes == 60) // One hour
        {
            now.minutes = 0;
            now.hours++; 
        }
    }


    return now; 
}


// Increments days by one when hours reaches 24
struct dateAndTime dateUpdate(struct dateAndTime now)
{
    now.days++;
    now.hours = 0; 
    return now; 
}

// Calls timeUpdate to increment time by one second
struct dateAndTime clockKeeper(struct dateAndTime now)
{
    timeUpdate(now); 

    // If hours reaches 24, increments dys by one
    if (now.hours == 24)
    {
        dateUpdate(now); 
    }

    return now; 
}

int main(void)
{
    struct dateAndTime clockKeeper(struct dateAndTime now); 
    struct dateAndTime present, future; 

    // Prompts and accepts user input
    printf("Enter a time (dd:hh:mm:ss): "); 
    scanf("%i:%i:%i:%i", &present.days, &present.hours,
        &present.minutes, &present.seconds); 

    future = clockKeeper(present); 

    // Prints updated time
    printf("The updated time is: %.2i:%.2i:%.2i:%.2i\n", future.days, future.hours,
        future.minutes, future.seconds); 

    return 0; 
}
4

1 に答える 1

3

これは、すべての関数で構造体をで渡し、で返すためです。したがって、を呼び出すときに、変更されるコピーを渡しますが、実際にはコピー ローカルを に更新しません。clockKeepertimeUpdateclockKeeper

呼び出しを行うたびに、それを自分自身に割り当てることを忘れないでください。たとえば、次のようになります。

struct dateAndTime clockKeeper(struct dateAndTime now)
{
    now = timeUpdate(now); 
    // Note assignment back to `now`

    // If hours reaches 24, increments dys by one
    if (now.hours == 24)
    {
        now = dateUpdate(now); 
        // Note assignment back to `now`
    }

    return now; 
}

または、構造体へのポインターを使用して、構造体を参照渡しすることもできます。

このような:

struct dateAndTime *dateUpdate(struct dateAndTime *now)
{
    now->days++;
    now->hours = 0; 
    return now; 
}

次に、ポインターを受け取るようにすべての関数を変更する必要があり、戻り値を破棄できます。

于 2013-07-02T18:20:08.123 に答える