【问题标题】:Calling external functions in C在 C 中调用外部函数
【发布时间】:2014-02-24 12:05:47
【问题描述】:

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

到目前为止,我的主要工作是:

#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) 是梯形规则和辛普森规则都在其中使用一个小函数将度数转换为弧度,我猜这在 numericIntegration 中没有被正确调用。

以下是我的具体问题:

  1. 此方法在调用主函数时是否正确?
  2. 我应该将弧度角函数作为一个头文件包含在主文件中吗?我不知道该怎么做...

更新:我收到的错误是: 第一个错误:“'degtorad' 的多重定义” 第二个错误:首先在这里定义

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

【问题讨论】:

  • 不要用散文描述错误信息。按照编译器生成的 100% 剪切和粘贴它。它是否说 unresolved symbol 之类的东西?
  • 不需要定义pi&lt;math.h&gt; 已经有M_PI - 至少应该。
  • M_PI 不是标准的。
  • @drahnr M_PI 既不是 C89,也不是 C99,也不是 C11。
  • 你说得对,它不是 ISO C

标签: c area


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        void TrapezoidRule(float area);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-09-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多