2015-05-20 34 views
-2

我有我的計劃分割故障 - 兩個功能不同時運行

int main(void) 
{ 
    int i,size; 
    float vel_x[size],vel_y[size],vel_x0[size],vel_y0[size],rho[size],rho0[size]; 
    float *ux, *vy, *ux0, *vy0; 
    float *r, *r0; 
    struct fdparam fdparam_1; 

    printf("Enter the number of grid points: \t"); 
    scanf("%d", &fdparam_1.N); 
    printf("Enter the maximum number of iterations: \t"); 
    scanf("%d", &fdparam_1.MAXIT); 
    printf("Enter the value for time domain: \t"); 
    scanf("%f", &fdparam_1.t_domain); 
    printf("Enter the time step and density of the fluid: \t \t"); 
    scanf("%f\t%f", &fdparam_1.Dt, &fdparam_1.dens); 
    printf("Enter the diffusion coefficient and viscosity: \t \t"); 
    scanf("%f\t%f",&fdparam_1.diff, &fdparam_1.mu); 
    printf("The parameters are N=%d, MAXIT=%d, t_domain=%f, Dt=%f, diff=%e, mu=%e, dens=%f \n",fdparam_1.N, fdparam_1.MAXIT, fdparam_1.t_domain, fdparam_1.Dt, fdparam_1.diff, fdparam_1.mu, fdparam_1.dens); 

    size=(fdparam_1.N+2)*(fdparam_1.N+2); 
    printf("The size is %d \n",size); 

    r = (float*) calloc (size,sizeof(float)); 
    r0 = (float*) calloc (size,sizeof(float)); 
    ux = (float*) calloc (size,sizeof(float)); 
    vy = (float*) calloc (size,sizeof(float)); 
    ux0 = (float*)calloc (size,sizeof(float)); 
    vy0 = (float*)calloc (size,sizeof(float)); 

    var_init(fdparam_1.N,r0,ux0,vy0,fdparam_1.dens); 

//  t=0;  
//  Solver functions 
//  while (t<fdparam_1.t_domain){ 
     velocity_solve(fdparam_1.N,ux,vy,ux0,vy0,fdparam_1.Dt,fdparam_1.mu,fdparam_1.MAXIT); //calculates ux and vy to be used in the density solver 
    density_solve(fdparam_1.N,r,r0,ux,vy,fdparam_1.Dt,fdparam_1.diff,fdparam_1.MAXIT);  //uses ux and vy calculated from Navier Stokes in the velocity solver to calculate density r 
//  t+=fdparam_1.Dt 
//  } 
} 

    //velocity solver function 

    void velocity_solve(int n, float *u, float *v, float *u0, float *v0, float dt, float m, int MAXITER) 
{ 
    int i,j; 

    add_source(n,u,u0,dt);   add_source(n,v,v0,dt); 
    swap(u0,u);  swap(v0,v); 
    diffusion(n,u,u0,dt,m,MAXITER);   diffusion(n,v,v0,dt,m,MAXITER); 
    projection(n,u,v,u0,v0,MAXITER); 
    swap(u0,u);  swap(v0,v); 
    advection(n,u,u0,u0,v0,dt);  advection(n,v,v0,u0,v0,dt); 
    projection(n,u,v,u0,v0,MAXITER); 

    printf("Printing velocities now \n"); 
    for (i=0; i<=n+1; i++){ 
      for (j=0;j<=n+1;j++){ 
        printf("%f \t %f \n",u[ix(i,j)],v[ix(i,j)]); 
      } 
    } 
} 

// density solver function 

void density_solve(int n, float *x, float *x0, float *u, float *v, float dt, float diff, int MAXITER) 
{ 
    int i,j; 

    add_source(n,x,x0,dt); 
    swap(x0,x); 
    diffusion(n,x,x0,dt,diff,MAXITER); 
    swap(x0,x); 
    advection(n,x,x0,u,v,dt); 

    printf("Printing density now \n"); 
    for (i=0;i<=n+1;i++){ 
      for (j=0; j<=n+1;j++){ 
        printf("%f \t",x[ix(i,j)]); 
      } 
    } 
    printf("\n"); 

} 

同時執行此代碼,我面臨的主要問題,下面的代碼是,我得到一個分段錯誤,當我嘗試將功能velocity_solvedensity_solve一起運行。這兩個功能在單獨運行時正確執行,即當我評論velocity_solve時,density_solve運行正常,反之亦然。

我很確定在velocity_solvedensity_solve例程中使用的函數沒有什麼問題,因爲這兩個例程都不會給出單獨的輸出。我懷疑當兩個功能應該相互作用時出現問題,即需要在density_solve中使用velocity_solve的輸出。

我試圖初始化大小變量,但它根本沒有任何區別。但後來我意識到,我不使用定義的數組,因此我將它們評論出來,而是使用已經分配內存的指針,那麼爲什麼當我嘗試調用這兩個函數時仍會出現分段錯誤一起在主要功能?

有人可以建議代碼中出了什麼問題嗎?

回答

6

你不初始化size,因此它的價值將是不確定,你將有未定義行爲當您使用它來創建陣列。

未定義的行爲會使整個程序不合格。

3

在您的代碼中,sizeauto類型的局部變量存儲。除非明確初始化,它就會有垃圾或不確定價值,利用其喜歡

float vel_x[size]; 

調用undefined behaviour

相關:從C11標準,章節6.2.4,「對象的存儲持續時間」

第5段:

一個對象,其識別符被聲明沒有連鎖和沒有存儲-class符static自動存儲時間, ...

和帕拉圖6:

...該對象的初始值是不確定的。 ...

此外,來自同一文檔,第§6.7章。9,「初始化」,第10段

如果具有自動存儲持續時間的對象沒有被明確初始化,它的值是不確定的。

,最後,從附錄J.2,「未定義行爲」

具有自動存儲持續時間的對象的值被使用,而這是 不確定

+0

好。 ..我明白了......現在我該如何初始化這個變量大小?因爲尺寸是我以後定義的。 –

+0

@SnehaChoudhury在計算'size'後,只需移動你的'float'數組定義。這將解決問題。 –

+0

仍然無法使用! velocity_solve執行後,仍然會出現分段故障......這意味着它不再執行density_solve。我意識到我不會在任何地方使用數組,但我使用的是指針,所以我嘗試了註釋數組聲明以及...也沒有幫助。任何想法還有什麼可能會出錯? –