2016-09-10 2 views
0

다음 코드는 2 개의 고조파 발진기를 설명합니다. 그것들은 처음에는 연결되지 않고 독립되어 있으며 기계식 오실레이터 인 그 중 하나만보고 있습니다. 다른 오실레이터의 변수가 선언되어 강제로 0이됩니다. 먼저 300,000 회 반복을 수행하고 wdm (기계식 드라이브 w)의 80 가지 다른 주파수에 대해이 작업을 수행합니다. 내가 함께 파일을 40 개 주파수 각각의 2 개 부분에서 코드를 실행하고 추가 할 경우 왜 다음 코드에 메모리가 부족합니까?

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

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

는 이상하게도, 그것을 잘 작동합니다. 내가 3 V0의 크기를 줄일 때 또한

Resonance peak in frequency domain는 코드가 제대로 작동합니다. 그러나 나중에 다른 변수가 필요할 것입니다. 시간 반복의 끝에서

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

는, I는 파일의 주파수 WDM 값 변위 X = V1 [2]의 마지막 값을 저장하고 다른 주파수와 시간의 반복을 수행하는 이동. 따라서 내 파일에는 주파수 응답이 포함되어 있습니다.

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

이 친절하게 모든 솔루션을 제안 : 함수입니다 다음 룽 - 쿠타-4는 해결해야한다.

+0

예제를 관련 코드로 잘라내어 함수로 표시해야합니다. 익명 블록이 아닌 관련 함수를 표시해야합니다. 주석 처리 한 모든 것을 제거하고 코드가 문제를 일으키는 부분에만 집중하십시오. http://stackoverflow.com/help/mcve –

+0

코드를 줄였습니다 – Ameya

답변

0

하나의 명백한 문제 - 에서 반환 한 후에 uprime을 무료로 사용하면 도달 할 수없는 코드 경고가 표시 될 것으로 예상됩니다. 또한 uprime은 항상 같은 크기이기 때문에 왜 malloc을 사용합니까? 크기를 7 배열로하면 malloc에 ​​문제가 없으며 코드가 더 빨리 실행됩니다.

+0

uprime을 해제해야합니까? – Ameya

+0

@Ameya, 함수 rk4vec_f_ameya_complex_1이 호출 될 때마다 함수는 메모리 누수가있는 함수의 끝에서 해제하지 않는 한 새로운 복소수 배열을 mallocs라고 부릅니다. malloc에 ​​의해 할당 된 메모리는 자동으로 정리되지 않습니다. – Jackson

+0

나는 uprime을 http://www.tutorialspoint.com/cprogramming/c_return_arrays_from_function.htm에 따라 정적 배열로 선언했습니다. 58 회 반복하여 멈 춥니 다. – Ameya

관련 문제