好的,我正在尝试编写一个程序,使用Simpson的3/8规则对积分进行数值计算。我有问题将值从Integral * newintegral传递给simpson()函数。我对结构和指针的理解并不是很有信心,而且我一直在查阅讲义和在线查看信息,我仍然无法理解为什么它不起作用。
在我尝试构建程序的那一刻,它出现了许多错误,特别是:在第46行“Integral之前的预期表达式”和55-63“无效类型的参数” - >> “ (有'积分')我不明白为什么第一个正在发生,因为所有我的讲师这类事情的例子,当一个结构传递给一个函数时只有语法func(Struct_define_name individual_struct_name)。我认为这是什么我是在做心灵(Integral是结构类型的名称,我是特定的结构),但显然不是。
我认为这两个问题是相互关联的,所以我将所有代码都包含在上下文中,但实际上有错误的行是46和55-63,如上所述。我可能首先将结构定义为错误的。
(顺便说一句,simpson()函数中的数学实际上现在无法正常工作,但这不是我关心的事情)
此外,我尝试查看其他类似的问题,但我不明白其他代码在做什么,所以我无法推断如何修复我的代码。我知道这与其他人不太相关,但我真的不懂编程,试图在一般意义上说出我的问题......
'#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct integral {
double result, limits[2];
int degree;
double coefficients[];
} Integral;
// Prototype of function that calculates integral using Simpson's 3/8 rule
double simpson(Integral i);
// function (?) which initialises structure
Integral *newintegral() {
Integral *i = malloc(sizeof *i);
double lim1_in, lim2_in;
int degree_input, n;
printf("Please enter the degree of the polynomial.\n");
scanf("%d", °ree_input);
i->degree = degree_input;
printf("Please enter the %d coefficients of the polynomial, starting\n"
"from the highest power term in the polynomial.\n", (i->degree+1));
for (n=i->degree+1; n>0; n=n-1) {
scanf("%lg", &i->coefficients[n-1]);
}
printf("Please enter the upper limit of the integral.\n");
scanf("%lg", &lim1_in);
i->limits[0] = lim1_in;
printf("Please enter the lower limit of the integral.\n");
scanf("%lg", &lim2_in);
i->limits[1] = lim2_in;
return i;
}
int main() {
Integral *i = newintegral();
simpson(Integral i);
return 0;
}
double simpson(Integral i) {
int n;
double term1, term2, term3, term4;
for (n=(i->degree); n>0; n=n-1) {
term1=(pow(i->limits[1],n)*(i->coefficients[n]))+term1;
term2=(pow(((((2*(i->limits[1]))+(i->limits[0])))/3),n)*(i->coefficients[n]))+term2;
term3=(pow(((((2*(i->limits[0]))+(i->limits[1])))/3),n)*(i->coefficients[n]))+term3;
term4=(pow(i->limits[0],n)*(i->coefficients[n]))+term4;
}
i->result = (((i->limits[0])-(i->limits[1]))/8)*(term1+(3*term2)+(3*term3)+term4);
printf("The integral is %lg\n", i->result);
return 0;
}'
答案 0 :(得分:1)
两个明显的问题: -
Line 46 : simpson(Integral i);
......应该只是simpson(i);
。设置类型只是一个错误。
这个,后来:
double simpson(Integral i)
..告诉编译器传入Integral object 但是你使用了间接运算符,即i->limits
,就好像你已经传递了一个指针一样。最简单的解决方法是使函数期望一个指针,如下所示:
double simpson(Integral *i)
答案 1 :(得分:1)
您当前正在传递指向一个带有Integral
个参数的函数的指针。
您的原型double simpson(Integral i);
告诉编译器“声明一个名为simpson
的函数,该函数返回double
并且使用标识符Integral
引用的单个i
在函数内部。
然而,在main()
中你说:
int main() {
//declare a pointer to an Integral and assign it to the return of 'i'
Integral *i = newintegral();
//call the function simpson with i.
//However, you are redeclaring the type of the function argument, so the compiler will complain.
simpson(Integral i);
return 0;
}
您的呼叫simpson(Integral i);
将无效,因为您正在重新声明函数参数的类型。编译器将声明:
:46:13: error: expected expression before ‘Integral’
您真正需要的是simpson()
将 指向Integral 的指针作为其参数。实际上你已经在函数内处理了这个(使用i->
),但是你的函数原型告诉编译器你将整个struct Integral
作为函数参数传递。
解决方案:
按如下方式更改您的函数原型:
double simpson(Integral *i); // function returning double taking single pointer to an Integral named i.
...并将main()
更改为如下所示:
int main(void) { //In C main has two valid definitions:
//int main(void), or int main(int argc, char **argv)
Integral *i = newintegral();
simpson(i);
return 0;
}
总而言之,您对指针的理解是正确的,但不是如何将指针传递给函数。
**旁注:
请记住始终在启用所有警告的情况下构建代码。编译器将为您提供非常有用的诊断,帮助您快速找到此类问题的解决方案。对于GCC,至少使用gcc -Wall myprogram.c