首页 > 解决方案 > C 函数指针不工作 - 提前结束程序

问题描述

我有一个在 main 之外有两个函数的代码。我需要将多个值从一个函数传递到下一个函数。我试过使用指针,编译时没有错误,但程序只是过早结束。我认为这是通过引用调用,但我不太了解。

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

int GetRValues (char prompt[70]);

//start main
int main()
{
    char prompt[70]="Please enter a value in the range 1000 to 1000000\0";
    float R_a,R_b,R_c;
    GetRValues(prompt[70]);
    printf("%f, %f, %f", &R_a, &R_b, &R_c);
}
//function for receiving inputs
int GetRValues(char prompt[70])
{
    //declare input variables
    float *R_a;

    //display prompt
    printf("%s\n", prompt);

    //force user to input values for R_a
    printf("R_a = ");
    scanf("%f",&*R_a);

    return 0;
}

这是使用指针的完整程序:

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

int GetRValues (char prompt[70], float Rmin, float Rmax);      //declare input function
void ConvertValues(char input,float Ptr_a, float Ptr_b, float Ptr_c);    //declare conversion function
char input;
float Ptr_a, Ptr_b, Ptr_c;

int main()
{
    float Rmin = 1000;
    float Rmax = 1000000;
    char prompt[70]="Please enter a value in the range 1000 to 1000000\0";



    do
    {
        printf("Select operation:\n");
        printf("__________________________\n");
        printf("s: Star to Delta Transformation\n");
        printf("d: Delta to Star Transformation\n");
        printf("q: Exit\n");
        printf("__________________________\n");
        printf("Select: ");
        scanf("%c",&input);


        if (input == 's' || input == 'd')
        {
            GetRValues(prompt,Rmin,Rmax) ==0;
            do
            {
                ConvertValues(input, Ptr_a, Ptr_b, Ptr_c);
                break;
            }

            while (GetRValues(prompt,Rmin,Rmax) ==1);

        }

    }
    while(input != 'q');

    return 0;
}

int GetRValues(char prompt[70], float Rmin, float Rmax)
{
    //declare input variables
    float R_a,R_b,R_c,*Ptr_a,*Ptr_b,*Ptr_c;
    void ConvertValues(char input,float Ptr_a, float Ptr_b, float Ptr_c);
    //display prompt
    printf("%s\n", prompt);

    //force user to input valid values for R_a, R_b and R_c
    printf("R_a = ");
    scanf("%f",&R_a);
    while(R_a>Rmax)
    {
        printf("Please enter a value below %f\n",&Rmax);
        scanf("%f",&R_a);
    }
    while(R_a<Rmin)
    {
        printf("Please enter a value above %f\n",&Rmin);
        scanf("%f",&R_a);
    }


    printf("R_b = ");
    scanf("%f",&R_b);
    while(R_b>Rmax)
    {
        printf("Please enter a value below %f\n",&Rmax);
        scanf("%f",&R_b);
    }
    while(R_b<Rmin)
    {
        printf("Please enter a value above %f\n",&Rmin);
        scanf("%f",&R_b);
    }

    printf("R_c = ");
    scanf("%f",&R_c);
    while(R_c>Rmax)
    {
        printf("Please enter a value below %f\n",&Rmax);
        scanf("%f",&R_c);
    }
    while(R_c<Rmin)
    {
        printf("Please enter a value above %f\n",&Rmin);
        scanf("%f",&R_c);
    }
    //transferring values to pointers
    *Ptr_a = R_a;
    *Ptr_b = R_b;
    *Ptr_c = R_c;
    printf("%f",&Ptr_a);
    return 1;
}
void ConvertValues(char input, float Ptr_a, float Ptr_b, float Ptr_c)
{
 float R_a,R_b,R_c,R_1,R_2,R_3;
    if (input ==  's')
    {
        R_1=(Ptr_a*Ptr_b)+(Ptr_b*Ptr_c)+(Ptr_a*Ptr_c)/Ptr_c;
        R_2=(Ptr_a*Ptr_b)+(Ptr_b*Ptr_c)+(Ptr_a*Ptr_c)/Ptr_b;
        R_3=(Ptr_a*Ptr_b)+(Ptr_b*Ptr_c)+(Ptr_a*Ptr_c)/Ptr_a;

        printf("The resistance values in Delta: \n");
        printf("Ptr_a = %.2f Ohms\n",R_1);
        printf("Ptr_b = %.2f Ohms\n",R_2);
        printf("Ptr_c = %.2f Ohms\n",R_3);
    }
 else
    {
        R_1=(Ptr_a*Ptr_b)/Ptr_a+Ptr_b+Ptr_c;
        R_2=(Ptr_a*Ptr_c)/Ptr_a+Ptr_b+Ptr_c;
        R_3=(Ptr_b*Ptr_c)/Ptr_a+Ptr_b+Ptr_c;

        printf("The resistance values in Star: \n");
        printf("Ptr_a = %.2f Ohms\n",R_1);
        printf("Ptr_b = %.2f Ohms\n",R_2);
        printf("Ptr_c = %.2f Ohms\n",R_3);


    }
    }

标签: cfunctionpass-by-referencefunction-pointers

解决方案


您在函数中定义的任何变量,如R_a,R_bR_c在您的GetRValues()函数中都是local,这意味着在处理器上执行此函数后,这些值将被删除。要在另一个函数中使用它们,您必须声明R_aR_b并且R_c作为global外部,GetRValues()或者您可以定义 astruct R在其中存储R_a,并在内部填充此结构R_b,然后通过将相同的结构提供给as 参数来访问它,如如何共享 a C中两个函数之间的变量? (全局变量是不好的做法,如果你使用结构R_cGetRValues()ConvertValues()结合使用多个线程的方法,您必须通过互斥锁/信号量来保护结构)

如果你想使用指针,你必须在ConvertValues()Grady PlayerHow to share a variable between two functions in C? ,因为在函数内部定义的变量只是局部的GetRValues()


推荐阅读