gpt4 book ai didi

c - 为什么这两个 C 程序不会产生相同的结果?

转载 作者:太空狗 更新时间:2023-10-29 16:00:56 26 4
gpt4 key购买 nike

这个程序是我先写的,它递归计算pi,当误差值足够小时停止。

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

int threads=1;
double error=0.000001;
double func(double);


struct args{
double l;
double r;
double fl;
double fr;
double area;};

double quad(struct args*);

int main(int argc, char *argv[]) {

struct args* res = (struct args*)malloc(sizeof(struct args));
res->l=0;
res->r=1;
res->fl=1;
res->fr=0;
res->area=0;

double ans=quad(res);
free(res);

ans=ans*4;

printf("pi=%f\n",ans);


}


double func(double x){
x=(1-(x*x));
x=sqrt(x);
return x;
}


double quad(struct args* arg){
double m=(arg->l+arg->r)/2;
double fm=func(m);
double larea=(arg->fl+fm)*(m-arg->l)/2;
double rarea = (fm+arg->fr)*(arg->r-m)/2;

struct args* arg1 = (struct args*)malloc(sizeof(struct args));
arg1->l=arg->l;
arg1->r=m;
arg1->fl=arg->fl;
arg1->fr=fm;
arg1->area=larea;

struct args* arg2 = (struct args*)malloc(sizeof(struct args));
arg2->l=m;
arg2->r=arg->r;
arg2->fl=fm;
arg2->fr=arg->fl;
arg2->area=rarea;
if(fabs((larea+rarea)-arg->area)>error){
if(threads<=1){
larea=quad(arg1);
rarea=quad(arg2);

free(arg1);
free(arg2);
}

}

return(larea+rarea);
}

这个可以正常工作,但后来我试图让 quad 函数返回一个 void pointer 而不是 double 它看起来像这个。

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

int threads=1;
double error=0.000001;
double func(double);
struct args{
double l;
double r;
double fl;
double fr;
double area;};

void* quad(struct args*);

int main(int argc, char *argv[]) {

struct args* res = (struct args*)malloc(sizeof(struct args));
res->l=0;
res->r=1;
res->fl=1;
res->fr=0;
res->area=0;
void* ans=quad(res);

double val=*(double*)ans;
val=val*4;

free(res);


printf("pi=%f\n",val);
}

double func(double x){
x=(1-(x*x));
x=sqrt(x);
return x;
}

void* quad(struct args* arg){
double m=(arg->l+arg->r)/2;
double fm=func(m);
double larea=(arg->fl+fm)*(m-arg->l)/2;
double rarea = (fm+arg->fr)*(arg->r-m)/2;

struct args* arg1 = (struct args*)malloc(sizeof(struct args));
arg1->l=arg->l;
arg1->r=m;
arg1->fl=arg->fl;
arg1->fr=fm;
arg1->area=larea;

struct args* arg2 = (struct args*)malloc(sizeof(struct args));
arg2->l=m;
arg2->r=arg->r;
arg2->fl=fm;
arg2->fr=arg->fl;
arg2->area=rarea;
if(fabs((larea+rarea)-arg->area)>error){
if(threads<=1){
void* p1=quad(arg1);
void* p2=quad(arg2);
larea=*((double*)p1);
rarea=*((double*)p2);

free(arg1);
free(arg2);
}
}


double ret= (larea+rarea);
void*poin=&ret;

return poin;
}

这个程序在编译时给出了一个完全不同的结果,0.042298 而不是 3.14159。我对 C 和使用指针还很陌生,所以我确定我在转换时搞砸了一些东西,但我终究无法弄清楚在哪里。

如果您能帮助我们找出为什么这两个程序会产生不同的结果,我们将不胜感激。谢谢。

最佳答案

您正在返回指向 ret 的指针。 quad() 的局部变量。当您查看它时,它已被替换。

取消引用无效指针也是未定义的行为。这意味着您的编译器可以自由地做任何事情,例如格式化您的硬盘或启动 WW3。

关于c - 为什么这两个 C 程序不会产生相同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41882586/

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