登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

一粒浮尘

飘渺虚无

 
 
 

日志

 
 

学习makefile的心得  

2010-11-17 13:48:34|  分类: work |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
近来一直在忙编程,由于是初次编写一个对我来说算是很大的程序,经验不足,因此耗费了大量的时间精力。
在 之前写一些小的测试用法的程序时,所使用的编译方法比较的简陋,而且也没有注意如何合理得去include子程序,只是简单的把子程序的文件名 include到主程序中。。。这样做真是糟糕透顶了!当然,在子程序很少的时候,这样不会带来什么烦恼,可是我现在面对的是一个有近20个子程序的家 伙。。。于是只得学习别的方法了

之前就知道makefile的存在,但是没有去重视,现在遇到困难了,只好回头认真看看并学习一下了
昨天仿造一个对makefile的介绍文档上的做法,写了一个简易的测试程序,尝到了makefile的甜头,不过昨天的那个程序还太简单,需要做稍微复杂点的测试,于是就有了今天这个测试程序:用欧拉法解微分方程
-----------------------------------------
main.c
-----------------------------------------
#include"stdio.h"
#include"head.h"
#define h 1.0e-2
int main()
{
    double a,b;
    double t,t0,y,y0,f;
    int i,N;
    FILE *fp;
    fp=fopen("test.dat","w");
//    Input a,b, the boundary of t.
    printf("Enter a and b (a<b):\n");
    scanf("%lf %lf",&a,&b);
    printf("Initial value of y:\n");
    scanf("%lf",&y0);

    t0=a;
    y=y0;
    N=(int)(b-a)/h;
    for(i=0;i<=N;i++)
    {
      f=fun(t,y);
      y=y+fun(t,y)*h;
      t=t+h;
      printf("t=%e y=%e f=%e\n",t,y,f);     
      fprintf(fp,"%e %e %e\n",t,y,f);
    }
    fclose(fp);
}
/////////////////////////////////////////////////////
head.h
------------------------------------------------------
#ifndef _HEAD_H_
#define _HEAD_H_
double fun(double x,double y);
double param1(double p);
double param2(double p);
#endif
/////////////////////////////////////////////////////
function1.c
-----------------------------------------------------
#include"head.h"
double fun(double x,double y)
{
    double z,s,l;
    s=param1(x);
    l=param2(x);
    z=s*y-l*x*x+1;
    return z;
}
//////////////////////////////////////////////////////
function2.c
------------------------------------------------------
#include"math.h"
double param1(double p)
{
    return sin(p);
}

double param2(double p)
{
    return cos(p);
}
//////////////////////////////////////////////////////
Makefile
------------------------------------------------------
main: main.o function1.o function2.o
    cc -o main main.o function1.o function2.o -lm
main.o:main.c head.h
    cc -c main.c
function1.o:function1.c head.h
    cc -c function1.c
function2.o:function2.c head.h
    cc -c function2.c
clean:
    rm main main.o function1.o function2.o

/////////////////////////////////////////////////////////
通过两次测试,还去除了我之前的一些错误的想法。之前我总是习惯将要被调用的子程序的函数名和文件名写成一致的,测试后发现,那样根本不需要。。。。。。
现在想来,其实原因很简单:那些文件(存放子程序)只是保存这程序的一部分,编译只是和文件里面的内容有关,与它自身的文件名无关,文件只是方便在编译时编译器能够找到对应(正确的)的子程序代码。。。

还是实战来得实在啊!
  评论这张
 
阅读(501)| 评论(1)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018