gpt4 book ai didi

c - 将结构(指向结构的指针?)传递给函数

转载 作者:太空宇宙 更新时间:2023-11-03 23:28:39 25 4
gpt4 key购买 nike

好的,我正在尝试编写一个程序,使用辛普森的 3/8 法则对积分进行数值计算。我在将值从 Integral *newintegral 传递到 simpson() 函数时遇到问题。我对自己对结构和指针的理解不是很有信心,而且我整天都在复习讲义并在线查找信息,但我仍然不明白为什么它不起作用。

在我尝试构建我的程序时出现了一些错误,特别是:第 46 行“Integral 之前的预期表达式”和第 55-63 行的大部分“'->' 的参数类型无效” (有'Integral')我不明白为什么第一个会发生,因为我所有讲师的例子都是这种类型的东西,当将结构传递给函数时只有语法 func(Struct_define_name individual_struct_name)。我认为这就是我是用心去做的(Integral 是结构类型的名称,而 i 是特定结构)但显然不是。

我认为这两个问题是相关联的,所以我包含了我所有的上下文代码,但是实际上有错误的行是 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", &degree_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;
}'

最佳答案

您当前正在传递一个指向函数的指针,该函数采用单个 Integral 参数。

您的原型(prototype) double simpson(Integral i); 告诉编译器“声明一个名为 simpson 的函数,该函数返回一个 double 并接受一个由函数内部的标识符 i 引用的单个 Integral

但是,在 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->)但是您的函数原型(prototype)告诉编译器您正在将整个 struct Integral 作为函数参数传递.

解决方法:

如下更改您的函数原型(prototype):

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

关于c - 将结构(指向结构的指针?)传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20600823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com