重新设计一个函数,使其不具有C中的全局变量

时间:2015-03-22 09:42:05

标签: c

我正在尝试在我的程序中重新设计一个简单的函数来摆脱全局变量,我不确定最好/最简单的方法是做什么。

circlefunctions.c

#include "circlefunctions.h"
#define PI 3.14

float   diameter;
double  radius;
double  surface;
double  outline;

void circle_functions()
{
    radius   = diameter / 2;
    surface  = PI * (radius * radius);
    outline  = 2 * PI * radius;
}

circlefunctions.h

extern float  diameter;
extern double radius;
extern double surface;
extern double outline;

void circle_functions();

问题是我目前在程序的其他部分使用这些变量。 我的解决方案是将值传递给数组并在程序中移动数据。

其他人建议将我的功能重新设计为:

double circle_functions(double diameter)
{
  double radius = diameter / 2;
  double surface = PI * (radius * radius);
  double outline = 2 * PI * radius;
  return outline;
}

但是当我这样做时,我得到一个编译错误,即变量:surface未使用。 (并且公平地说我不确定如何正确使用第二种解决方案。

希望有人能指出如何解决这个问题的正确方向。

修改

按要求:

例如,我也有一个名为circlemenu.c的文件(可能应该将其重命名为circleresults.c)

#include <stdio.h>
#include "circlefunctions.h"
#include "circlemenu.h"

void info_top()
{
    system("cls");
    printf(" ----------------------------------------\n");
    printf(" Typ the diameter of the circle: ");
}

void info_bottom()
{
    printf(" ----------------------------------------\n");
    printf(" The radius = %f \n\n" , radius);
    printf(" The surface = %f \n\n" , surface);
    printf(" The outline = %f \n" , outline);
    printf(" ----------------------------------------\n");
}

2 个答案:

答案 0 :(得分:1)

您也可以这样做

   double getRadius(double diameter)
{
  double radius = diameter / 2;
  return radius;
}

double getSurface(double diameter){
   double radius = getRadius(diameter);
   return PI * (radius * radius);
}

double getOutline(double diameter){
    double radius = getRadius(diameter);
    return 2 * PI * radius;
}

您可以在程序中使用这些getter函数。它将使您的代码可读和清洁。

像这样使用:

void someFunction(double diameter){
    //need surface for some calculations.
    double surface = getSurface(diameter);
    //need outline to do something
    double outline = getOutline(diameter);

    //now use these as you want in your function.
}

根据你的例子:

void info_bottom(double diameter)
{

    printf(" ----------------------------------------\n");
    printf(" The radius = %f \n\n" , getRadius(diameter));
    printf(" The surface = %f \n\n" , getSurface(diameter));
    printf(" The outline = %f \n" , getOutline(diameter));
    printf(" ----------------------------------------\n");
}

答案 1 :(得分:1)

另一种流行的方法是使用宏。

e.g 让我们假设你想要一个raduis表面。

 #define SURFACE(x) (PI*(x)*(x))

在代码中你可以使用它,如果半径是int / double / float那么无关紧要...... 这就是这种方式很受欢迎。

一个警告:宏在程序中使用的任何地方都被替换为整体:这可能是大量的代码重复。然而,宏对实际功能的优点是速度。将控制传递给新函数没有时间,因为控制永远不会离开home函数;宏只是使函数更长一点。

第二个警告:函数调用不能用作宏参数。

(GNU C编程教程)