2016-09-10 32 views
0

以下代碼描述2個諧波振盪器。他們最初是獨立的,獨立的,他們只看着其中一個,這是一個機械振盪器。另一個振盪器的變量已被聲明並被強制爲0.我首先做了300,000次迭代,併爲80個不同頻率的wdm(機械驅動w)做了這個。爲什麼下面的代碼內存不足?

//find frequency response 
int index_A; 
double wdm_1; 
wdm_1=wm-2*3.142*2e5; 
double wdm_2; 
wdm_2=wm+2*3.142*2e5; 
double wdm_prec=2*3.142*5e3; 
index_A=(wdm_2-wdm_1)/wdm_prec; 
printf("%d \n", index_A); 

However, my code runs till 58 frequencies and gives this error:

奇怪的是,如果用完在2份各40次的頻率的代碼和附加的文件一起,它工作正常。

Resonance peak in frequency domain

此外,當我減少V0的大小爲3,代碼工作正常。不過,我稍後需要其他變量。

int j=0; 
    for (j=0; j<= index_A ; j++){ 
     wdm=wdm_1+j*wdm_prec; 
     printf("%d \n",j); 
     v0[0] = 0; 
     v0[1] = 0; 
     v0[2] = 0; 
     v0[3] = 0; 
     v0[4] = 0; 
     v0[5] = 0; 
     v0[6]= wdm; 

      for (i=0; i< n ; i++){ 
       if (cabs(xa)>=1){ 
         printf("Breaking Loop \n"); 
         break; 
         } 

       v1 = rk4vec_ameya_complex_1 (tau, 7, v0, dtau, rk4vec_f_ameya_complex_1); 
       memcpy(v0, v1, 4 * sizeof (double complex)); 
       tau=tau+dtau; 
      } 

     fprintf(f1, "%g, %g \n", wdm/(2*3.142), cabs(v1[2])); 
    } 
printf("Completed"); 
fclose(f1); 

在時間迭代結束時,我保存的頻率WDM的值和位移x = V1 [2]的最後一個值在一個文件中並移動到做時間迭代與另一頻率。因此,我的文件包含頻率響應。

fprintf(f1, "%g, %g \n", wdm/(2*3.142), cabs(v1[2])); 

我已經從people.sc.fsu.edu/~jburkardt/c_src/rk4/rk4.html使用龍格庫塔(rk4.c)和改性它用於使用

#include <complex.h> 

複雜數據類型以下是該函數龍格 - 庫塔-4有解決:

/******************************************************************************/ 

double complex *rk4vec_f_ameya_complex_1 (double t, int n, double complex u[]) 

/******************************************************************************/ 

{ 
    double complex drive_m; 
    double complex drive_c; 
    double x; 
    double xrf0_1; 
    double complex *uprime; 
    uprime = (double *) malloc (7 * sizeof (double complex)); 

    //Check if memory unavailable 
    if(uprime==NULL){ 
     printf("No memory available \n"); 
     return 0; 
    } 

    ///////////////////Second Order//////////////////////// 
    xrf0_1=xrf0*(1-exp(-0.2*t)); 
    drive_m=(xrf0*cexp(I*((u[6]-wm)/gammac)*t)/(2*wm*gammac)); 
    uprime[2]=u[3]; 
    uprime[3]=(wm/gammac)*(drive_m-u[3]*(2*I+2*gammam/wm)-u[2]*(2*I*gammam/gammac)); 

    return uprime; 
    free(uprime); 
} 

請提出任何解決方案,如果我的malloc的使用()負責運行內存。

+0

您需要將您的示例切換到相關代碼並將其顯示爲函數,而不是匿名塊,我們不知道它們之間的關係。刪除所有註釋掉的內容,並專注於代碼給你帶來問題的地方。 http://stackoverflow.com/help/mcve –

+0

我減少了代碼 – Ameya

回答

0

一個明顯的問題 - 你從rk4vec_f_ameya_complex_1返回後自由uprime,我希望你得到一個無法訪問的代碼警告。也作爲uprime始終是相同的大小爲什麼你使用malloc?如果你只是將它設置爲7的數組,那麼你將不會遇到malloc問題,並且你的代碼可能運行得更快。

+0

是否有必要免費升級? – Ameya

+0

@Ameya,每當函數rk4vec_f_ameya_complex_1被調用時,malloc都會返回一個新的複數數組,除非在函數結束時釋放這些函數,否則會出現內存泄漏。沒有自動清理由malloc分配的內存。 – Jackson

+0

我按照http://www.tutorialspoint.com/cprogramming/c_return_arrays_from_function.htm聲明爲靜態數組。仍然停留在58次迭代。 – Ameya

相關問題