【问题标题】:How do I pass values to another functions (call by reference/value)? (C)如何将值传递给另一个函数(通过引用/值调用)? (C)
【发布时间】:2020-10-21 20:01:43
【问题描述】:

我试图了解指针的工作原理,但我不能把它放在一起。 当我再次遇到同样的问题时,我只是想知道如何继续。

这是一个程序,应该加两个不同的时间,但是读入、加和减必须在不同的函数中。

在函数内一切正常,但我无法将所有内容发送到 main()。

我已经尝试在函数的参数中实现指针,但是当我这样做时,一切都变得非常混乱,没有任何效果,所以我向您展示了我的代码的更简洁版本。

如果有人能帮助我理解我的理解,我将非常感激:)

PD:感谢您成为这样一个了不起的社区!

这是我的代码:

#include <stdio.h>
#include <stdlib.h>

void subtracttimes (int hr0,int min0, int sek0, int hr1, int min1, int sek1, char op);
void addtimes ( int hr0, int min0, int sek0, int hr1, int min1, int sek1, char op );
char readin ();

int main( int hr0, int min0, int sek0, int hr1, int min1, int sek1, char op)
{   
    char op1;
    
    op1 = readin ();


    switch(op1){                           
            case '+': addtimes (hr0, min0, sek0, hr1, min1, sek1, op);    
                break;
            case '-': subtracttimes (hr0, min0, sek0, hr1, min1, sek1, op);
                break;
    }

    return 0;
} 



char readin () 
{
    int hr0, min0, sek0;
    int hr1, min1, sek1;
    char c, op, *merker;
    int ok;

    printf("Time Calculator\n");
    printf("================\n\n");

    printf("Start time (hh:mm:ss): ");
    ok = scanf("%d:%d:%d", &hr0, &min0, &sek0);
    while((c = getchar()) != '\n' && c != EOF) {}


    while ( ok != 3 || c != '\n' || hr0 > 23 || min0 > 59 || sek0 > 59) {
    printf("Wrong input!\n");
    printf("Start time (hh:mm:ss): ");
    ok = scanf("%d:%d:%d", &hr0, &min0, &sek0);
    while((c = getchar()) != '\n' && c != EOF) {}
    } 

    printf("Second time (hh:mm:ss): ");
    ok = scanf("%d:%d:%d", &hr1, &min1, &sek1);
    while((c = getchar()) != '\n' && c != EOF) {}

    while (ok != 3 || c != '\n' || hr1 > 23 || min1 > 59 || sek1 > 59) {
    printf("Wrong input!\n");
    printf("Second Time (hh:mm:ss): ");
    ok = scanf("%d:%d:%d", &hr1, &min1, &sek1);
    while((c = getchar()) != '\n' && c != EOF) {}
    } 

    printf("Type of operation (+/-): ");
    ok = scanf("%c", &op);
    while((c = getchar()) != '\n' && c != EOF) {}

    return op;

}

void addtimes ( int hr0, int min0, int sek0, int hr1, int min1, int sek1, char op )
{
    int resultHour;
    int resultMin;
    int resultSec;
    int resultDay = 0;

    resultHour = hr0 + hr1;
    resultMin = min0 + min1;
    resultSec = sek0 + sek1;

    if (resultSec > 59){
        resultMin += 1;
        resultSec -= 60;
    } else if (resultMin > 59){
        resultHour += 1;
        resultMin -= 60;
    } else if (resultHour > 23){
        resultDay += 1;
        resultHour -= 24;
    }

    printf("%02d:%02d:%02d %c %02d:%02d:%02d: = ", hr0, min0, sek0, op, hr1, min1, sek1);

    if(resultDay==0) {
        printf("%02d:%02d:%02d", resultHour, resultMin, resultSec);
    } else if (resultDay>0) {
        printf("%d Tag %02d:%02d:%02d", resultDay, resultHour, resultMin, resultSec);
    }


}

void subtracttimes (int hr0, int min0, int sek0, int hr1, int min1, int sek1, char op)
{
    int resultHour;
    int resultMin;
    int resultSec;
    int resultDay = 0;

    resultHour = hr0 - hr1;
    resultMin = min0 - min1;
    resultSec = sek0 - sek1;

    if (resultSec <= 0){
        resultMin -= 1;
        resultSec = 60 - (sek1 -sek0);
    } else if (resultMin <= 0){
        resultHour -= 1;
        resultMin = 60 - (min1 - min0);
    } else if (resultHour <= 0){
        resultHour = 60 - (hr1 - hr0);
    }

    printf("%02d:%02d:%02d %c %02d:%02d:%02d: = ", hr0, min0, sek0, op, hr1, min1, sek1);
    printf("%02d:%02d:%02d", resultHour, resultMin, resultSec);
}

【问题讨论】:

  • 首先,您不能像在托管环境中那样定义main。它必须是int main(void)int main(int argc, char* argv[])。如果您想通过命令行向应用程序传递值,则需要使用后者。
  • @FelixG 感谢您的回答。后者到底是什么意思?
  • 我的意思是,如果您打算将值作为命令行参数传递给应用程序,您只需要main 的第二个变体。但既然这里似乎不是这样,int main(void) 就足够了。

标签: c function pointers parameters arguments


【解决方案1】:

您可以添加一些输出参数,因为您希望在函数中填充多个输出。例如,您可以修改函数,使其如下所示:

void addtimes ( int hr0, int min0, int sek0, int hr1, int min1, int sek1, char op, int* hr_res, int* min_res, int* sek_res) {
    ...
    *hr_res = your_calculated_hr_res;
    *min_res = your_calculated_min_res;
    *sek_res = your_calculated_sek_res;
    ...
}

在main中,你必须添加一些变量来传递给函数以获得你想要的结果。

int main() {
     int hr_res, min_res, sek_res;
     addtimes(..., &hr_res, &min_res, &sek_res);
}

【讨论】:

  • 感谢您的回答!
【解决方案2】:

在 C 中,所有参数调用都是按值调用的。您可以通过发送指针来模拟按引用调用,但实际上您仍然按值进行调用,因为指针值被复制到函数中。通常,您通过返回一个值从函数中获取值,但在发送指针时,您实际上会更新驻留在函数外部的值,请参阅Does C even have "pass by reference"?

【讨论】:

  • 感谢您的回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
  • 2019-07-25
  • 2018-09-22
  • 2018-01-18
  • 2021-01-12
相关资源
最近更新 更多