| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2487 人关注过本帖
标题:函数调用数组
只看楼主 加入收藏
兔兔宝宝
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-12-2
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:6 
函数调用数组
我编了一个计算三角形面积的函数:
double S_triangle(double ax,double ay,double bx,double by,double cx,double cy)  //计算面积函数
{
    double mx=by-cy,my=cy-ay,nx=cx-bx,ny=ax-cx;
    double S_tri=0.5*(mx*ny-my*nx);
    if(S_tri>=0)
        return S_tri;
    else
        return (-1*S_tri);
}

调用的时候实参用的是数组:*(area+i)=S_triangle(px[ERT[i*3]],py[ERT[i*3]],px[ERT[i*3+1]],py[ERT[i*3+1]],px[ERT[i*3+2]],py[ERT[i*3+2]]);
因为三角形是连在一起的,所以计算不同三角形的面积会用到同样的点,当我第二次用这个点的时候,发现这个点的值变化了,比如原来px[9]=20,后来变成px[9]=10,有的甚至直接变为没有数据了,这个原因是什么?应该怎么修改?

 
搜索更多相关主题的帖子: 三角形 return double 
2011-12-02 11:47
B李庚
Rank: 2
等 级:论坛游民
帖 子:15
专家分:24
注 册:2011-12-1
收藏
得分:10 
看你设的变量就晕。况且刚卸了软件,不能验证。再说吧哈哈哈
2011-12-02 14:22
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:10 
你的函数绝对没有更改你的实参。问题肯定不在这里。

重剑无锋,大巧不工
2011-12-02 15:14
兔兔宝宝
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-12-2
收藏
得分:0 
回复 3楼 beyondyf
可是我看运行结果是之前调用的还是正常的,第二次调用后,值就发生变化了;还有就是我之前得出的数据,输出后都是比较正常的数据,一经调用就发生变化了
2011-12-02 15:55
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
注意是不是area赋值过程中越界覆盖了px等。
愿意的话把完整的代码发上来帮你看看,希望别太长。

重剑无锋,大巧不工
2011-12-02 16:02
兔兔宝宝
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-12-2
收藏
得分:0 
回复 5楼 beyondyf
#include "iostream.h"
#include "math.h"
#include "stdio.h"
#include "stdlib.h"
#define  N 5     //分割圈数
float power(float a,int b)   //计算平方项的函数
{
    float ss=1;
    int i;
    if (b==0)
    {

        return(1);
    }
    else
    {
        for (i=0;i<b;i++)
        {
            ss*=a;
        }
        return(ss);
    }
}
double S_triangle(double ax,double ay,double bx,double by,double cx,double cy)  //计算面积函数
{
    double mx=by-cy,my=cy-ay,nx=cx-bx,ny=ax-cx;
    double S_tri=0.5*(mx*ny-my*nx);
    if(S_tri>=0)
        return S_tri;
    else
        return (-1*S_tri);
}
void main()
{
    // UpdateData(TRUE);
    int i,j,s,m,k=0;
    int Q=6*N*N; // 单元数
    int QQ=3*N*(N+1)+1;//节点总数
    int *ERT;
    double *area;
    double *Y,*YY;
    YY=(double*)malloc(9*sizeof(double));
    Y=(double*)malloc(Q*9*sizeof(double));
    area=(double*)malloc(Q*sizeof(int));
    ERT=(int*)malloc(Q*3*sizeof(int));
    int EI=0;
    int ZEN;//区节点
    int eq=0;//每区的节点数
    int qj;//每圈的节点总数
    for (i=1;i<=N;i++)
    {
        eq=2*i-1;
        qj=6*i;
        if (i==1)
        {
            for (j=0;j<5;j++)
            {
                *(ERT+j*3)=0;
                *(ERT+j*3+1)=j+1;
                *(ERT+j*3+2)=j+2;
            }
            *(ERT+15)=0;
            *(ERT+16)=6;
            *(ERT+17)=1;
        }
        else
        {
            *(ERT+EI*3)=3*(i-1)*(i-2)+1; //第i圈第一单元编号
            *(ERT+EI*3+1)=3*i*(i-1)+1;
            *(ERT+EI*3+2)=3*i*(i-1)+2;
            *(ERT+(EI+1)*3)=3*(i-1)*(i-2)+1; //第i圈第二单元编号
            *(ERT+(EI+1)*3+1)=3*i*(i-1)+2;
            *(ERT+(EI+1)*3+2)=3*(i-1)*(i-2)+2;
            for (j=2;j<eq;j++)
            {
                *(ERT+(EI+j)*3)=*(ERT+(EI+j-2)*3)+1;   //第i圈剩余单元编号
                *(ERT+(EI+j)*3+1)=*(ERT+(EI+j-2)*3+1)+1;
                *(ERT+(EI+j)*3+2)=*(ERT+(EI+j-2)*3+2)+1;
            }
            for (s=1;s<6;s++)                       //第i圈其余区间的单元编号
            {
                ZEN=s*eq;
                for (m=0;m<eq;m++)
                {
                    if (m%2!=0)
                    {
                        *(ERT+(EI+ZEN+m)*3)=*(ERT+(EI+m)*3)+s*(i-1);
                        *(ERT+(EI+ZEN+m)*3+1)=*(ERT+(EI+m)*3+1)+s*i;
                        *(ERT+(EI+ZEN+m)*3+2)=*(ERT+(EI+m)*3+2)+s*(i-1);
                    }
                    else
                    {
                        *(ERT+(EI+ZEN+m)*3)=*(ERT+(EI+m)*3)+s*(i-1);
                        *(ERT+(EI+ZEN+m)*3+1)=*(ERT+(EI+m)*3+1)+s*i;
                        *(ERT+(EI+ZEN+m)*3+2)=*(ERT+(EI+m)*3+2)+s*i;
                    }
                }
            }
            *(ERT+(EI+6*eq-1)*3)=3*(i-1)*(i-2)+1;
            *(ERT+(EI+6*eq-1)*3+1)=3*(i+1)*i;
            *(ERT+(EI+6*eq-1)*3+2)=3*(i-1)*i+1;
            *(ERT+(EI+6*eq-2)*3)=3*i*(i-1);
            *(ERT+(EI+6*eq-2)*3+1)=3*(i+1)*i;
            *(ERT+(EI+6*eq-2)*3+2)=3*(i-1)*(i-2)+1;
        }
        EI+=6*eq;
    }
    int t=1;
    float R=100;
    double pi=3.1415926;
    int pn=0;//每圈的节点个数
    float *px;
    float *py;
    px=(float*)malloc((3*N*(N+1)+1)*sizeof(float));
    py=(float*)malloc((3*N*(N+1)+1)*sizeof(float));
    *(px)=0;
    *(py)=0;
    for(i=0;i<=QQ;i++)
    {
        *(px+i)=0;
        *(px+i)=0;
    }
    for( i=0;i<=N;i++)
    {
        pn=6*i;
        for(int w=0;w<pn;w++)
        {
            *(px+w+t)=float(i*R*cos(2*pi*w/pn)/N);
            *(py+w+t)=float(i*R*sin(2*pi*w/pn)/N);
//            printf("PX[%d]=%f,PY[%d]=%f\n",w+t,*(px+w+t),w+t,*(py+w+t));
        }
        t=t+pn;
    }
    for (i=0;i<6*(N)*(N);i++)   //计算面积
    {
        printf("%d:%f,%f\n%d:%f,%f\n%d:%f,%f\n",ERT[i*3],px[ERT[i*3]],py[ERT[i*3]],ERT[i*3+1],px[ERT[i*3+1]],py[ERT[i*3+1]],ERT[i*3+2],px[ERT[i*3+2]],py[ERT[i*3+2]]);
        *(area+i)=S_triangle(px[ERT[i*3]],py[ERT[i*3]],px[ERT[i*3+1]],py[ERT[i*3+1]],px[ERT[i*3+2]],py[ERT[i*3+2]]);
        printf("area[%d]=%f\n",i,area[i]);
    }
/*
        for (j=0;j<6*(N)*(N);j++)
        {
            printf("area[%d]=%f\n",j,area[j]);
        }*/
   
}
2011-12-05 09:24
兔兔宝宝
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-12-2
收藏
得分:0 
回复 5楼 beyondyf
麻烦您帮我看看
for( i=0;i<=N;i++)
    {
        pn=6*i;
        for(int w=0;w<pn;w++)
        {
            *(px+w+t)=float(i*R*cos(2*pi*w/pn)/N);
            *(py+w+t)=float(i*R*sin(2*pi*w/pn)/N);
//            printf("PX[%d]=%f,PY[%d]=%f\n",w+t,*(px+w+t),w+t,*(py+w+t));
        }
        t=t+pn;
    }

这个计算的都是正确的,但是后面调用函数的时候就错了
2011-12-05 09:25
快速回复:函数调用数组
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.053847 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved