【问题标题】:Don't get value for variable out of function不要从函数中获取变量的值
【发布时间】:2019-04-11 22:54:57
【问题描述】:

我必须创建一个 C 程序来计算对象的高度,其中输入 alpha、beta 和它们之间的长度。

我认为我的程序运行良好,我还有一个函数可以计算 rad 中的 deg 以用于 sinus 函数。

我需要在我的主函数中输出角 phi。当我尝试在我的双 h() 函数中打印 phi 时,我得到了 phi 的值,但该值没有出现在我的主函数中。

我希望你能帮助我。

#include <stdio.h>
#include <math.h>

double bogen(double x){         /*Umrechnung Winkelmaß in Bogenmaß*/
double rad;

rad = (M_PI/180) * x;

return rad;         /*Return Wert in Radius*/
}


double phiWinkel(double a, double b){           /*Funktion für Berechnung Winkel phi*/
double phi;

phi = b - a;

return phi;                 /*Return Wert für h()*/
}

double uLaenge(double a, double p, double s){       /*Funktion für Berechnung u Länge*/
double u;

a = bogen(a);                   /*Umrechnung Winkelmaß in Bogenmaß*/
p = bogen(p);                   /*Umrechnung Winkelmaß in Bogenmaß*/

u = s * sin(a) / sin(p);

return u;                   /*Return Wert für h()*/
}

double h(double a, double b, double p, double s){   /*Funktion für Berechnung der Höhe*/
double h;
double u;

p = phiWinkel(a, b);                /*Aufruf Phi Funktion mit Parameter*/

u = uLaenge(a, p, s);               /*Aufruf u Funktion mit Parameter*/

b = bogen(b);                   /*Umrechnung Winkelmaß in Bogenmaß*/

h = u * sin(b);                 /*Berechnung Höhe*/

return h;                   /*Return Wert für main()*/
}

int main(){
double alpha;                   /*Initialisierung der Variablen*/
double beta;
double phi;
double strecke;
double hoehe;

printf("\n\n\t\t+++ Landvermessung - Höhenbestimmung +++\n");               /*Einleitung in das Programm mit Aufforderung zur Nutzereingabe*/
printf("\n\t+++ Dieses Programm berechnet die Höhe eines Objektes +++");
printf("\n+++ Benötigt werden Werte für Strecke zwischen den Winkeln, alpha und beta in Grad +++");
printf("\n\t+++ Bestätigen Sie Ihre Eingabe mit der Eingabe-Taste +++\n");
printf("\nBitte geben Sie den Wert für die Strecke - s - ein: ");
scanf("%lf", &strecke);
printf("\nBitte geben Sie den Wert für den Winkel Alpha - a - ein: ");
scanf("%lf", &alpha);
printf("\nBitte geben Sie den Wert für den Winkel Beta - b - ein: ");
scanf("%lf", &beta);


hoehe = h(alpha, beta, phi, strecke);                   /*Aufruf h() mit Parameter*/

printf("\nDer Turm hat eine Höhe von:\t%.2lf Metern.\n", hoehe);    /*Ausgabe*/
printf("Die Strecke - s - beträgt:\t%.2lf Meter.\n", strecke);
printf("Der Winkel alpha beträgt:\t%.2lf Grad.\n", alpha);
printf("Der Winkel beta beträgt:\t%.2lf Grad.\n", beta);
printf("Der Winkel phi beträgt:\t\t%.2lf Grad.\n", phi);

return 0;
}

非常感谢 Liamcomp。 这是工作代码:

#include <stdio.h>
#include <math.h>

double bogen(double x){         /*Umrechnung Winkelmaß in Bogenmaß*/
    double rad;

    rad = (M_PI/180) * x;

    return rad;         /*Return Wert in Radius*/
}

double winkel(double rad){
    double x;

    x = (rad/M_PI)*180;

    return x;
}

double phiWinkel(double a, double b){           /*Funktion für Berechnung Winkel phi*/
    double phi;
    double tmp;                 /*Zwischenspeicher für if*/

    if(a > b){                  /*Falls alpha größer als beta um negativ Wert zu verhindern*/
        tmp = b;
        b = a;
        a = tmp;    

    }

    phi = b - a;

    return phi;                 /*Return Wert für h()*/
}

double uLaenge(double a, double p, double s){       /*Funktion für Berechnung u Länge*/
    double u;

    a = bogen(a);                   /*Umrechnung Winkelmaß in Bogenmaß*/
    p = bogen(p);                   /*Umrechnung Winkelmaß in Bogenmaß*/

    u = s * sin(a) / sin(p);

    return u;                   /*Return Wert für h()*/
}

double h(double *a, double *b, double *p, double *s){   /*Funktion für Berechnung der Höhe*/
    double h;
    double u;

    *p = phiWinkel(*a, *b);             /*Aufruf Phi Funktion mit Parameter*/

    u = uLaenge(*a, *p, *s);                /*Aufruf u Funktion mit Parameter*/

    *b = bogen(*b);                 /*Umrechnung Winkelmaß in Bogenmaß*/

    h = u * sin(*b);                    /*Berechnung Höhe*/

    *b = winkel(*b);                /*Rückrechnung Bogenmaß in Winkelmaß*/

    return h;                   /*Return Wert für main()*/
}

int main(){
    double alpha;                   /*Initialisierung der Variablen*/
    double beta;
    double phi;
    double strecke;
    double hoehe;

    printf("\n\n\t\t+++ Landvermessung - Höhenbestimmung +++\n");               /*Einleitung in das Programm mit Aufforderung zur Nutzereingabe*/
    printf("\n\t+++ Dieses Programm berechnet die Höhe eines Objektes +++");
    printf("\n+++ Benötigt werden Werte für Strecke zwischen den Winkeln, alpha und beta in Grad +++");
    printf("\n\t+++ Bestätigen Sie Ihre Eingabe mit der Eingabe-Taste +++\n");
    printf("\nBitte geben Sie den Wert für die Strecke - s - ein: ");
    scanf("%lf", &strecke);
    printf("\nBitte geben Sie den Wert für den Winkel Alpha - a - ein: ");
    scanf("%lf", &alpha);
    printf("\nBitte geben Sie den Wert für den Winkel Beta - b - ein: ");
    scanf("%lf", &beta);


    hoehe = h(&alpha, &beta, &phi, &strecke);                   /*Aufruf h() mit Parameter*/

    printf("\nDer Turm hat eine Höhe von:\t%.2lf Metern.\n", hoehe);    /*Ausgabe*/
    printf("Die Strecke - s - beträgt:\t%.2lf Meter.\n", strecke);
    printf("Der Winkel alpha beträgt:\t%.2lf Grad.\n", alpha);
    printf("Der Winkel beta beträgt:\t%.2lf Grad.\n", beta);
    printf("Der Winkel phi beträgt:\t\t%.2lf Grad.\n", phi);

    return 0;
}

【问题讨论】:

  • 请在此处添加您的代码,图片不行。您应该能够粘贴您的代码,突出显示它并按下代码示例按钮,看起来像 {}
  • @liamcomp 我试过了,但是编辑器多次中止代码
  • @liamcomp 现在我明白了。我必须在代码中添加一些空格。
  • 太棒了。我添加了一些 cmets 作为答案
  • 您介意改进格式吗?阅读起来相当困难。

标签: c variables trigonometry


【解决方案1】:

当您将参数传递给 C 中的函数时,参数会被复制,因此如果您更改函数中的参数,则从函数返回后参数确实不会更改。如果你传递某个东西的地址,那么函数可以改变它。

所以你需要更改h:

double h(double *a, double *b, double *p, double *s);

现在你有了地址,当你想访问a的数据时,你需要使用*a

所以你的函数现在看起来像这样:

double h(double *a, double *b, double *p, double *s){   /*Funktion für Berechnung der Höhe*/
    double h;
    double u;

    *p = phiWinkel(*a, *b);                /*Aufruf Phi Funktion mit Parameter*/

    u = uLaenge(*a, *p, *s);               /*Aufruf u Funktion mit Parameter*/

    *b = bogen(*b);                   /*Umrechnung Winkelmaß in Bogenmaß*/

    h = u * sin(*b);                 /*Berechnung Höhe*/

    return h;                   /*Return Wert für main()*/
}

你可以通过传递这样的地址来调用它:

hoehe = h(&alpha, &beta, &phi, &strecke);

如果您不想使用指针,那么您可以摆脱 h 函数并执行以下操作:

double h;
double u;

p = phiWinkel(a, b);                /*Aufruf Phi Funktion mit Parameter*/

u = uLaenge(a, p, s);               /*Aufruf u Funktion mit Parameter*/

b = bogen(b);                   /*Umrechnung Winkelmaß in Bogenmaß*/

h = u * sin(b);                 /*Berechnung Höhe*/

直接在main

【讨论】:

  • 谢谢。我认为这行得通。现在我在我的 printf 中得到了 phi。我不明白你向我解释了什么以及我做了什么,但它有效。 :D 我只需要将我的测试版从 rad 转回 deg 然后我认为我完成了。非常感谢你。 PS:我会尽快学习数组和指针
  • 乐于助人。希望您能在不久的将来对指针有所了解。
【解决方案2】:

如果您通过引用传递值(传递指针),那么您会将值的任何修改返回给main,例如,像这样声明h

double h(double* a, double* b, double* p, double* s)

您可能不需要将所有值都作为指针传递。

h 中,您需要使用 * 取消引用这些变量,例如:

    *p = phiWinkel(a, b);           

main 中,您可以通过传递带有 & 的指针来调用:

hoehe = h(&alpha, &beta, &phi, &strecke);

您可能不需要通过引用传递所有值,但您可以判断是否需要。如果您只需要通过引用传递p,那么您的h 函数应如下所示:

double h(double a, double b, double* p, double s) {   /*Funktion für Berechnung der Höhe*/
    double h;
    double u;

    *p = phiWinkel(a, b);                /*Aufruf Phi Funktion mit Parameter*/

    u = uLaenge(a, *p, s);               /*Aufruf u Funktion mit Parameter*/

    b = bogen(b);                   /*Umrechnung Winkelmaß in Bogenmaß*/

    h = u * sin(b);                 /*Berechnung Höhe*/

    return h;                   /*Return Wert für main()*/
}

有电话

hoehe = h(alpha, beta, &phi, strecke); 

最后,如果您想避免使用指针,那么您可以在 main 中计算 p=phiWinkel(a, b); 而不是在 h 中进行计算,然后只需将 p 作为值传递给 h 就像之前。

【讨论】:

  • 现在我遇到了 double h(double& a, double& b, double& p, double& s) 的错误在'double'之前 hoehe = double h(double& alpha,double& beta,double& phi,double& strecke);使用 h(double& a, double& b, double& p, double& s) u03b_Funktionen_Trigonometrie_Leuchtturm.c:在函数 'main' 中:u03b_Funktionen_Trigonometrie_Leuchtturm.c:69:12:错误:'double' hoehe = h(double& alpha,double& beta 之前的预期表达式,double&phi,double&strecke);
  • @Kevin 哎呀。忽略了我们正在谈论 C。已编辑答案。
  • @J.R.我不学习如何使用指针或数组。我认为这会在学校的下一课中出现。你知道没有指针的方法吗?我试过这个并且不工作。我把 * 放到 p = phiWinkel(a,b);和 & 到 h(alpha, beta, &phi, strecke) 中的 phi u03b_Funktionen_Trigonometrie_Leuchtturm.c:39:2: 错误:一元“*”的类型参数无效(有“双”)*p = phiWinkel(a, b); u03b_Funktionen_Trigonometrie_Leuchtturm.c:在函数“main”中:u03b_Funktionen_Trigonometrie_Leuchtturm.c:69:25:错误:“h”hoehe = h(alpha, beta, &phi, strecke) 的参数 3 的类型不兼容;
  • @SefaSimsek 我添加了更多细节。请注意在计算 u 时对 p 的额外取消引用。
  • 感谢您的帮助。我像 liamcomp 一样尝试过。这很好用。
猜你喜欢
  • 1970-01-01
  • 2018-12-23
  • 1970-01-01
  • 1970-01-01
  • 2021-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多