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";
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("%sn", 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";

do
{
printf("Select operation:n");
printf("__________________________n");
printf("s: Star to Delta Transformationn");
printf("d: Delta to Star Transformationn");
printf("q: Exitn");
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("%sn", 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 %fn",&Rmax);
scanf("%f",&R_a);
}
while(R_a<Rmin)
{
printf("Please enter a value above %fn",&Rmin);
scanf("%f",&R_a);
}

printf("R_b = ");
scanf("%f",&R_b);
while(R_b>Rmax)
{
printf("Please enter a value below %fn",&Rmax);
scanf("%f",&R_b);
}
while(R_b<Rmin)
{
printf("Please enter a value above %fn",&Rmin);
scanf("%f",&R_b);
}
printf("R_c = ");
scanf("%f",&R_c);
while(R_c>Rmax)
{
printf("Please enter a value below %fn",&Rmax);
scanf("%f",&R_c);
}
while(R_c<Rmin)
{
printf("Please enter a value above %fn",&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 Ohmsn",R_1);
printf("Ptr_b = %.2f Ohmsn",R_2);
printf("Ptr_c = %.2f Ohmsn",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 Ohmsn",R_1);
printf("Ptr_b = %.2f Ohmsn",R_2);
printf("Ptr_c = %.2f Ohmsn",R_3);

}
}

在函数中定义的任何变量,如GetRValues()函数中的R_aR_bR_c,都是本地,这意味着在处理器上执行此函数后,这些值将被删除。要在另一个函数中使用它们,您必须在GetRValues()之外将R_aR_bR_c声明为global,或者您可以定义一个structR,其中存储R_aR_bR_c并在GetRValues()内部填充此结构,然后通过向ConvertValues()提供相同的结构作为参数来访问它,如如何在C中的两个函数之间共享变量?(全局变量是一种糟糕的做法,如果将结构方法与使用多个线程结合使用,则必须通过互斥/信号量来保护结构(

如果你想使用指针,你必须在GetRValues()内部调用ConvertValues(),就像Grady Player在C中如何在两个函数之间共享变量中的回答一样,因为函数内部定义的变量只是局部

ypu需要学习如何使用指针将值传递到函数中。在C语言中,指针是将值传递给函数的标准方法,函数可以对其进行修改。换句话说,如果您打算编写一个函数,从用户那里读取一些值,然后将它们发送到程序中的其他地方,那么C中的正常方法是使用指针。

我在StackOverflow上没有发现任何关于这个绝对基本问题的相关信息。你可以在互联网上搜索";C语言函数参数指针传递";等等。以下是这样一个发现:https://beginnersbook.com/2014/01/c-passing-pointers-to-functions/

在您的情况下,想要将值传递给外部世界的函数必须通过指针获取值,例如:

int GetRValues(char prompt[70], float* Rmin, float* Rmax)

这需要对函数的主体进行充分的更改,因为现在您有指向浮点的指针,而不是浮点。为此,更换Rmin*Rmin以及Rmax*Rmax的出现。然而,只要有&Rmin,就足以写入Rmin(用*抵消(。当然,只在这个函数内部进行转换。

现在您有了一个函数,它接受指针作为参数。这需要改变它的调用方式。例如,哦,不,你刚刚编辑了你的代码,你让它变得更糟了,我不能给你举个例子!好的,我试试。

代替

GetRValues(prompt[70]);

使用

GetRValues(prompt, &R_a, &R_b, &R_c);

这是行不通的,嗯,因为你一直在编辑你的代码,没有人知道你想要实现什么。几分钟前你想读2个数字,现在是3。请决定。请阅读C中的指针,以及如何使用它们向传递值,尤其是FROM函数。

最新更新