Не получить значение для переменной вне функции - PullRequest
0 голосов
/ 12 апреля 2019

Мне нужно создать C-программу для расчета высоты объекта с вводом альфа, бета и расстоянием между ними.

Я думаю, что моя программа работает хорошо, у меня также есть функция для вычисления градуса радиуса для функции синуса.

Мне нужен вывод для угла ph в моей основной функции. Когда я пытаюсь напечатать phi в моей двойной функции h (), я получаю значение для 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;
}

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

Когда вы передаете аргумент функции в 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

0 голосов
/ 12 апреля 2019

Если вы передаете значения по ссылке (передавая указатели), вы получаете любые изменения значения обратно к 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); 

И, наконец, если вы хотите избежать использования указателей, вы можете вычислить p=phiWinkel(a, b); в main вместо того, чтобы делать это в h и просто передать p в качестве значения h, как до этого.

...