在C中调用外部函数

时间:2014-02-24 12:05:48

标签: c area

所以我正在尝试制作一个计算曲线下面积的主函数。我有三个单独的函数,每个函数以不同的方式计算区域:函数1使用梯形规则计算,函数2使用辛普森计算计算,函数3使用高斯求积法计算。我让每个程序都运行良好,现在我正在尝试将它们从main更改为函数,从一个名为“numericIntegration”的单独主程中调用。

到目前为止,我的主要内容是:

#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) 是梯形规则和simpson规则都使用它们中的一个小函数将度数转换为弧度,我猜想在numericIntegration中没有正确调用。

所以这是我的具体问题:

  1. 这个方法对于调用main中的函数是否正确?
  2. 我应该让弧度的度数功能一个头文件包含在主?我不知道怎么做......
  3. 更新:我得到的错误说: 第一个错误:“'degtorad'的多重定义” 第二个错误:首先在此定义

    我想我明白我需要将函数degtorad作为头文件,但我不知道该怎么做?

4 个答案:

答案 0 :(得分:2)

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

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

通常这些都在包含文件中,但C include与包含文件的复制粘贴内容基本相同,因此最终结果相同。一旦你有更多的功能,或者你需要在很多地方使用它们,你真的想要包含文件。

如果您有一些实用程序功能,它只在您的一个文件中定义,但在很多文件中使用,那么请将它放在一个地方,并且只需在您使用它的地方进行声明,与上面类似。或者,如果在具有相同名称的许多文件中都有实用程序功能,请将其设为static,这样链接器就不会抱怨相同符号的多个定义(但如果它们是相同的功能,那么这是个坏主意,因为现在你有许多相同功能的副本,你可能需要稍后更改它们。)

答案 1 :(得分:0)

您可能忘记与数学库libm.a建立链接。通过将-lm添加到执行最终链接步骤的编译器调用来执行此操作。

答案 2 :(得分:0)

你必须编译包含“小函数...将度数转换为弧度”的c源。

如果type fun() { ... }fun.c中,则必须将其包含在编译命令字符串中:

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

答案 3 :(得分:0)

如果要在新文件中定义这些函数,则需要编写一个头文件(.h)来告诉编译器函数的样子,并在文件的顶部有

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

然后在头文件中,您(可能)只需要输入:

void TrapezoidRule(float area);