c - 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);
}
}
解决方案
您在函数中定义的任何变量,如R_a
,R_b
和R_c
在您的GetRValues()
函数中都是local,这意味着在处理器上执行此函数后,这些值将被删除。要在另一个函数中使用它们,您必须声明R_a
,R_b
并且R_c
作为global
外部,GetRValues()
或者您可以定义 astruct
R
在其中存储R_a
,并在内部填充此结构R_b
,然后通过将相同的结构提供给as 参数来访问它,如如何共享 a C中两个函数之间的变量? (全局变量是不好的做法,如果你使用结构R_c
GetRValues()
ConvertValues()
结合使用多个线程的方法,您必须通过互斥锁/信号量来保护结构)
如果你想使用指针,你必须在ConvertValues()
Grady Player的How to share a variable between two functions in C? ,因为在函数内部定义的变量只是局部的GetRValues()
推荐阅读
- c# - 当从其他类实现函数而不是直接在单个函数中工作时,Json 数据返回非常混乱
- laravel - Lumen 应用程序在 Web 中访问时 API 消息无效
- javascript - 如何使用 html 和 javascript 创建可拖动和可调整大小的 div
- scala - 为什么在 for 表达式中设置多个 val 不会导致异常?
- python - pyplot figure only updating after second call to ginput()
- sass - 媒体查询 scss 断点最佳实践
- c# - 如何在 PDFsharp 中将流转换为 PdfDocument
- virtualbox - VirtualBox 导入错误:代码 NS_ERROR_INVALID_ARG (0x80070057) - 参数值无效
- javascript - Angular 9 如何删除具有用户指定的索引范围的数组内的一系列对象?
- selenium - 使用 Selenium 的 POM 中 @By 和 @FindBy 之间的区别