2016-09-10 7 views
0

次のコードでは、2つの高調波発振器について説明します。それらは当初、結合されておらず、独立しており、機械的な振動子であるそれらの1つを見るだけです。他のオシレータの変数は宣言され、強制的に0になっています。最初に300,000回の繰り返しを行い、wdm(機械式ドライブw)の80の異なる周波数に対してこれを行います。次のコードのメモリが不足しているのはなぜですか?

//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:

私は40個の周波数毎の2部でコードを実行し、一緒にファイルを追加する場合は不思議なこと、それが正常に動作します。また

Resonance peak in frequency domain

、私は3にV0のサイズを小さくする場合、コードが正しくに動作します。しかし、私は後に他の変数が必要になります。時間の反復の終わりに

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); 

、私は、ファイルの[2]周波数WDMの値と変位xの= V1の最後の値を保存し、他の周波数と時間の繰り返しを行うために移動します。したがって、私のファイルには周波数応答が含まれています。

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

Iはpeople.sc.fsu.edu/~jburkardt/c_src/rk4/rk4.htmlからルンゲクッタの(rk4.c)を使用し、

#include <complex.h> 

を使用して、複雑なデータ型のためにそれを変更しましたmalloc関数の私の使用量は()メモリ不足のために責任がある場合

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

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); 
} 

が親切に任意のソリューションを提案します。functionされ、次のルンゲクッタ-4は、解決しなければなりません。

+0

あなたのサンプルを関連するコードに切り詰めて、関数として表示する必要があります。無関係なブロックではなく、どのように関係しているかわかりません。あなたがコメントアウトしたすべてを削除し、コードがどこに問題を与えているかだけに注目してください。 http://stackoverflow.com/help/mcve –

+0

私はコードを減らしました – Ameya

答えて

0

明白な問題の1つはuprimeから返された後にから返された後、到達不能なコードの警告が表示されることが予想されます。また、uprimeと同じサイズのため、なぜmallocを使用しますか?それをサイズ7の配列にすると、mallocに問題はなくなり、コードはおそらくより速く実行されます。

+0

uprimeを解放する必要はありますか? – Ameya

+0

@Ameya、関数rk4vec_f_ameya_complex_1が関数の終わりに解放されない限り、メモリリークが発生しない限り、関数rk4vec_f_ameya_complex_1が呼び出されるたびに、複素数の新しい配列がmallocされます。 mallocによって割り当てられたメモリーの自動整理はありません。 – Jackson

+0

私はhttp://www.tutorialspoint.com/cprogramming/c_return_arrays_from_function.htmに従って静的配列としてuprimeを宣言しました。それでも58回の反復で停止します。 – Ameya

関連する問題