LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: meilan

嵌套循环释放内存为何行不通阿??? 各位大虾救小妹一命阿!!!

[复制链接]
 楼主| 发表于 2005-3-13 11:19:40 | 显示全部楼层
for(j=-100;j<101;j++){
    for(q=0;q<10;q++) { printf("\n");
       for(h=0;h<27;h++){potent[q][h]=energy[q][h]+0.3*j;printf(" %f",potent[q][h]);}} printf("\n");
     xm=0.0;ym=0.0;xs=0.0;ys=0.0;r=0.0;a=0.0;b=0.0;fm=0.0;fzx=0.0;fzy=0.0;
     for(nam=0;nam<28;nam++)
       {
        cl1=(Cluster *)malloc(sizeof(Cluster));cl2=(Cluster *)malloc(sizeof(Cluster));
        strcpy(filename1,name[nam]);strcpy(filename2,name[nam]);
        strcat(filename1,append1);strcat(filename2,append2);
        printf("File is %s %s\n",filename1,filename2);
        ReadPDB(filename1,cl1);ReadPDB(filename2,cl2);
        fre=0.00;occu=0.00;n1=0;n2=0;i=0;
      for(m1=0;m1<cl1->nchain;m1++) {ch1=cl1->Cincluster[m1];
        for(p1=ch1->Astart->next; p1; p1=p1->next) {
          for(m2=0;m2<cl2->nchain;m2++) {ch2=cl2->Cincluster[m2];
                for(p2=ch2->Astart->next; p2; p2=p2->next) {
             if(p1->alt >= 'A' && p1->alt == p2->alt) continue;
                dist=Distance(p1->x, p2->x);
                if(dist<2.6) {
                        printf("Distacne too small: %f\n",dist);
                } else {
                   i=(int)((dist*10-20)/2);
                   if(i<30) {
                     n1=AtomClass(p1->name, p1->res);
                     n2=AtomClass(p2->name, p2->res);
                     k=PairTypes(n1,n2);
                     occu=(p1->q)*(p2->q);
                     fre+=(potent[k][i-3])*(occu);
                   }
                }
           }
        }
     }
  }
  g[nam]=fre;xs+=g[nam];ys+=yy[nam];
  printf("|j-value%d |jiaoer is %f for code %s\n",j,fre,filename1);
  release(cl1);release(cl2);
  free(cl1);free(cl2);
   }
xm=xs/28;ym=ys/28;
  for(li=0;li<28;li++){fm+=(g[li]-xm)*(yy[li]-ym);fzx+=(g[li]-xm)*(g[li]-xm);fzy+=(yy[li]-ym)*(yy[li]-ym);}
  r=fm/sqrt(fzx*fzy);b=fm/fzx;a=ym-b*xm;
  printf("COIEFFICIENT  %6.3f a %f b %f\n",r,a,b);
  if(r>rr){rr=r;jr=j;}
}
  printf("From -100 to 100 largest r is %f in %d",rr,jr);
}


void ReadPDB(char *fname,Cluster *cl)
{
    FILE *f,*fopen();
    Atom *q,*p;
    Chain *ch;
//    Cluster *cl;
    char buf[limit],tmp[15],name[50],chain;
    int i,j,k,n=0;
                                                                                                                                    
                                                                                                                                    
    f=fopen(fname,"r");
/*    Pstart=(Atom *)malloc(sizeof(Atom));
    q=Pstart; q->next=NULL;*/
    j=0;k=0; chain='a';
//    cl=(Cluster *)malloc(sizeof(Cluster));
    cl->next=NULL;
    while(( i=FGetLine(f,buf) ) > -1) {
        if(strncmp(buf,"ATOM",4) == 0) {
            p=ReadATOM(buf);
//            if(ReadATOM(buf)) {
              if(p->chain!=chain){ ch=(Chain *)malloc(sizeof(Chain));ch->next=NULL;
              cl->Cincluster[n]=ch;
              if(n!=0)cl->Cincluster[n-1]->natom=k;n++;k=0;
              ch->Astart=(Atom *)malloc(sizeof(Atom));q=ch->Astart;q->next=NULL;
                                 }
              chain=p->chain;
                q->next=p; q=p; q->next=NULL; j++; k++;
//            }
        }
    }
                                                                                                                                    
    cl->Cincluster[n-1]->natom=k; cl->nchain=n;
    printf("The natom is %d\n",j);
    close(f);
}


void release(Cluster *cl)
{int m1;
Chain *ch1,*chq;
Atom *p1,*p1q;
                                                                                                                                    
for(m1=0;m1<cl->nchain;m1++) {ch1=cl->Cincluster[m1];
    for(p1=ch1->Astart->next; p1; p1=p1q){p1q=p1->next;free(p1);}
       free(ch1);}
}

  1. [CODE]xxxx
复制代码
[/CODE] [CODE]
回复 支持 反对

使用道具 举报

发表于 2005-3-13 11:26:38 | 显示全部楼层
昏!还是一片混乱,保持代码缩进的方法在置顶的论坛索引中有。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-13 12:45:21 | 显示全部楼层

  1.   for(j=-100;j<101;j++){
  2.     for(q=0;q<10;q++) { printf("\n");
  3.        for(h=0;h<27;h++){potent[q][h]=energy[q][h]+0.3*j;printf(" %f",potent[q][h]);}} printf("\n");
  4.      xm=0.0;ym=0.0;xs=0.0;ys=0.0;r=0.0;a=0.0;b=0.0;fm=0.0;fzx=0.0;fzy=0.0;
  5.      for(nam=0;nam<28;nam++)
  6.        {
  7.         cl1=(Cluster *)malloc(sizeof(Cluster));cl2=(Cluster *)malloc(sizeof(Cluster));
  8.         strcpy(filename1,name[nam]);strcpy(filename2,name[nam]);
  9.         strcat(filename1,append1);strcat(filename2,append2);
  10.         printf("File is %s %s\n",filename1,filename2);
  11.         ReadPDB(filename1,cl1);ReadPDB(filename2,cl2);
  12.         fre=0.00;occu=0.00;n1=0;n2=0;i=0;
  13.       for(m1=0;m1<cl1->nchain;m1++) {ch1=cl1->Cincluster[m1];
  14.         for(p1=ch1->Astart->next; p1; p1=p1->next) {
  15.           for(m2=0;m2<cl2->nchain;m2++) {ch2=cl2->Cincluster[m2];
  16.                 for(p2=ch2->Astart->next; p2; p2=p2->next) {
  17.              if(p1->alt >= 'A' && p1->alt == p2->alt) continue;
  18.                 dist=Distance(p1->x, p2->x);
  19.                 if(dist<2.6) {
  20.                         printf("Distacne too small: %f\n",dist);
  21.                 } else {
  22.                    i=(int)((dist*10-20)/2);
  23.                    if(i<30) {
  24.                      n1=AtomClass(p1->name, p1->res);
  25.                      n2=AtomClass(p2->name, p2->res);
  26.                      k=PairTypes(n1,n2);
  27.                      occu=(p1->q)*(p2->q);
  28.                      fre+=(potent[k][i-3])*(occu);
  29.                    }
  30.                 }
  31.            }
  32.         }
  33.      }
  34.   }
  35.   g[nam]=fre;xs+=g[nam];ys+=yy[nam];
  36.   printf("|j-value%d |jiaoer is %f for code %s\n",j,fre,filename1);
  37.   release(cl1);release(cl2);
  38.   free(cl1);free(cl2);
  39.    }
  40. xm=xs/28;ym=ys/28;
  41.   for(li=0;li<28;li++){fm+=(g[li]-xm)*(yy[li]-ym);fzx+=(g[li]-xm)*(g[li]-xm);fzy+=(yy[li]-ym)*(yy[li]-ym);}
  42.   r=fm/sqrt(fzx*fzy);b=fm/fzx;a=ym-b*xm;
  43.   printf("COIEFFICIENT  %6.3f a %f b %f\n",r,a,b);
  44.   if(r>rr){rr=r;jr=j;}
  45. }
  46.   printf("From -100 to 100 largest r is %f in %d",rr,jr);


  47. 关键函数:
  48. void ReadPDB(char *fname,Cluster *cl)
  49. {
  50.     FILE *f,*fopen();
  51.     Atom *q,*p;
  52.     Chain *ch;
  53. //    Cluster *cl;
  54.     char buf[limit],tmp[15],name[50],chain;
  55.     int i,j,k,n=0;
  56.                                                                                                                  
  57.                                                                                                                  
  58.     f=fopen(fname,"r");
  59. /*    Pstart=(Atom *)malloc(sizeof(Atom));
  60.     q=Pstart; q->next=NULL;*/
  61.     j=0;k=0; chain='a';
  62. //    cl=(Cluster *)malloc(sizeof(Cluster));
  63.     cl->next=NULL;
  64.     while(( i=FGetLine(f,buf) ) > -1) {
  65.         if(strncmp(buf,"ATOM",4) == 0) {
  66.             p=ReadATOM(buf);
  67. //            if(ReadATOM(buf)) {
  68.               if(p->chain!=chain){ ch=(Chain *)malloc(sizeof(Chain));ch->next=NULL;
  69.               cl->Cincluster[n]=ch;
  70.               if(n!=0)cl->Cincluster[n-1]->natom=k;n++;k=0;
  71.               ch->Astart=(Atom *)malloc(sizeof(Atom));q=ch->Astart;q->next=NULL;
  72.                                  }
  73.               chain=p->chain;
  74.                 q->next=p; q=p; q->next=NULL; j++; k++;
  75. //            }
  76.         }
  77.     }
  78.                                                                                                                  
  79.     cl->Cincluster[n-1]->natom=k; cl->nchain=n;
  80.     printf("The natom is %d\n",j);
  81.     close(f);
  82. }


  83. void release(Cluster *cl)
  84. {int m1;
  85. Chain *ch1,*chq;
  86. Atom *p1,*p1q;
  87.                                                                                                                  
  88. for(m1=0;m1<cl->nchain;m1++) {ch1=cl->Cincluster[m1];
  89.     for(p1=ch1->Astart->next; p1; p1=p1q){p1q=p1->next;free(p1);}
  90.        free(ch1);}
  91. }

复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-13 12:47:05 | 显示全部楼层
这下可以了,
多谢各位,帮我看看吧!
回复 支持 反对

使用道具 举报

发表于 2005-3-14 00:55:13 | 显示全部楼层
看了,晕了……:)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表