2014-02-24 221 views
0

所以我试图做一个主函数来计算曲线下的面积。我有三个独立的函数,每个函数都以不同的方式计算区域:函数1使用梯形法则计算,函数2使用Simpsons法则计算,函数3使用Gauss Quadrature计算。我有每个单独的程序运行良好,现在正在尝试将它们从主要功能更改为从称为“数字整合”的单独主程序调用。调用外部函数C

到目前为止,我有我的主:

#include <math.h> 
#include <stdlib.h> 

#define pi 3.1415927; 

void TrapezoidRule(float area); 
void SimpsonsRule(float area); 
void GaussQuadrature(float area); 

int main() { 

int userInput, N; 
float area, error; 

    printf("Choose which method to use to calculate the area of the function sin(x) from 0 to pi:\n"); 
    printf("Enter 1 to use the Trapezoid Rule, enter 2 to use Simpson's Rule, enter 3 to use Gauss' Quadrature.\n"); 
     scanf("%d", &userInput); 
     printf("\nEnter the number of intervals to use to calculate the area.\n"); 
     scanf("%d", &N); 

     if (userInput == 1) {    //Call Trapezoid rule function 
      TrapezoidRule(area); 
      } 
     if (userInput == 2) { 
      SimpsonsRule(area); 
      } 
     if (userInput == 3) { 
      GaussQuadrature(area); 
     } 

     //Print the area calculated using the chosen method  
return 0; 

} 

如果需要的话,我会包括三个独立的功能,但会保持这个贴子短,我会排除他们现在。他们是各自称为:

void TrapezoidRule(float area) { 
void GaussQuadrature(float area) { 
void SimpsonsRule(float area) { 

一个错误,当我尝试编译 我得到(使用icc -o num numericalIntegration.c GaussQuadrature.c TrapezoidRule.c SimpsonsRule.c) 是梯形规则和辛普森的规则都使用一个小功能在他们度转换为弧度,其我猜在数值积分中没有被正确调用。

因此,这里有我的具体问题:

  1. 这是正确的方法为在主调用函数?
  2. 我应该让度数为弧度函数头文件包含在主?我不知道如何做到这一点...

更新:我得到的错误说: 1错误: 第二次错误“‘degtorad’的多个定义”:这里首先定义

我想我明白我需要使功能degtorad头文件,但我不知道如何做到这一点?

+1

不要在散文描述的错误消息。将其剪切并粘贴为编译器生成的100%。它是否说像*未解决的符号*? – Jens

+0

不需要定义'pi',''已经有'M_PI' - 至少它应该。 – drahnr

+0

'M_PI'不是标准的。 –

回答

0

您可能忘记了链接到数学库libm.a。通过将-lm添加到执行最终链接步骤的编译器调用中来实现。

0

您必须编译包含的c源代码,即“小函数...将度转换为弧度”

如果type fun() { ... }fun.c必须包括它变成你的编译的命令字符串:

icc -o num fun.c numericalIntegration.c GaussQuadrature.c TrapezoidRule.c SimpsonsRule.c 
0

如果要定义一个新的文件的功能,你需要编写一个头文件(.h)告诉编译器有什么功能样子,并在文件的顶部,有

#include "GaussQuadrature.h" 
#include "TrapezoidRule.h" 
#include "SimpsonsRule.h" 

然后在头文件,你会(可能)只需要提出:

void TrapezoidRule(float area); 
2

首先,要正确调用函数,您需要声明它们,以获得它们的原型。通常它们来自包含文件,但您也可以在使用它们之前声明它们。要做到这一点,main()前添加这些行:

void TrapezoidRule(float area); 
void GaussQuadrature(float area); 
void SimpsonsRule(float area); 

通常这些将是包括文件,但是C包括作为复制粘贴内容基本相同的包含文件,所以最终的结果是一样的。一旦你有更多的功能,或者当你需要从很多地方使用它们时,你会真的需要包含文件。

如果你有一定的效用函数,这是在短短一个你文件中定义的,但在许多使用,然后把它在一个地方,只是有在您使用它声明,类似于以上。另外,如果你在具有相同名称的多个文件实用功能,使其static,所以链接器不会抱怨(但如果它们是相同的功能,这是个坏主意相同符号的多个定义,因为现在你有很多副本功能相同,您可能需要稍后更改它们)。