2015-06-09 18 views
0

我是用C語言編寫的新程序。由於垃圾值存儲在矢量中,因此我有一個781行的主代碼不受控制。主代碼的一小部分顯示在稱爲diff_conv_intermedia1的子程序的位置。Garbage storage,programming in C

diff_conv_intermedia1(&factorteta,&N,ID,DIFF,X1_intermedia,Y1_intermedia,X1C_intermedia,Y1C_intermedia,CU1_intermedia,CV1_intermedia,AW1_intermedia,AE1_intermedia,AS1_intermedia,AN1_intermedia,AP1_intermedia,Q1_intermedia,FXI1,FYI1,FI_intermedia1,1,2,1,1); 

int q,w; 
for(q=1;q<(*factorteta_Ptr)*2+1;q++) 
{ 
    for(w=1;w<(*N_Ptr)+1;w++) 
{ 
    printf("%lf\n",AP1_intermedia[q][w]); 
} 
} 

所以子程序顯示波紋管。當我在子程序中打印結果時,一切正常,但是當我在子程序之外打印結果時,在主代碼中,垃圾作爲AP1_intermedia存儲在向量中。我不知道什麼可能是錯的。我重複與其他子程序相同的過程,我沒有任何錯誤。

int diff_conv_intermedia1(int *factorteta_Ptr, 
          int *N_Ptr, 
          int ID, 
          double DIFF, 
          double X[(*factorteta_Ptr)*2+1][*N_Ptr+1], 
          double Y[(*factorteta_Ptr)*2+1][*N_Ptr+1], 
          double XC[(*factorteta_Ptr)*2+2][*N_Ptr+2], 
          double YC[(*factorteta_Ptr)*2+2][*N_Ptr+2], 
          double CU[(*factorteta_Ptr)*2+1][*N_Ptr+1], 
          double CV[(*factorteta_Ptr)*2+1][*N_Ptr+1], 
          double AW[(*factorteta_Ptr)*2+1][*N_Ptr+1], 
          double AE[(*factorteta_Ptr)*2+1][*N_Ptr+1], 
          double AS[(*factorteta_Ptr)*2+1][*N_Ptr+1], 
          double AN[(*factorteta_Ptr)*2+1][*N_Ptr+1], 
          double AP[(*factorteta_Ptr)*2+1][*N_Ptr+1], 
          double Q[(*factorteta_Ptr)*2+1][*N_Ptr+1], 
          double FX[(*factorteta_Ptr)*2+1][*N_Ptr+1], 
          double FY[(*factorteta_Ptr)*2+1][*N_Ptr+1], 
          double FI[(*factorteta_Ptr)*2+1][*N_Ptr+1], 
          int WBC,int EBC,int SBC,int NBC) 
{ 
int i,j; 
double value,* valuePtr; 
double AED, AWD, AND, ASD; 
double AEC, AWC, ANC, ASC; 
valuePtr = &value; 

// Diffusive coefficients 

for(i=1;i<(*factorteta_Ptr)*2+1;i++) 
{ 
    for(j=1;j<*N_Ptr+1;j++) 
{ 
    AWD = -DIFF*(Y[i][j-1]-Y[i-1][j-1])/(XC[i][j]-XC[i][j-1]); 
    AED = -DIFF*(Y[i][j]-Y[i-1][j])/(XC[i][j+1]-XC[i][j]); 
    AND = -DIFF*(X[i][j]-X[i][j-1])/(YC[i+1][j]-YC[i][j]); 
    ASD = -DIFF*(X[i-1][j]-X[i-1][j-1])/(YC[i][j]-YC[i-1][j]); 

    // Convection term 
    if(ID==2) 
    { 
     max1_or_min2(CU[i][j-1],1,&value); 
     AWC=-*valuePtr; 
     max1_or_min2(CU[i][j],2,&value); 
     AEC=*valuePtr; 
     max1_or_min2(CV[i-1][j],1,&value); 
     ASC=-*valuePtr; 
     max1_or_min2(CV[i][j],2,&value); 
     ANC=*valuePtr; 
    } 
    if(ID==1) 
    { 
     AWC =-CU[i][j-1]*(1.0-FX[i][j-1]); 
     AEC =CU[i][j]*FX[i][j]; 
     ASC =-CV[i-1][j]*(1.0-FY[i-1][j]); 
     ANC =CV[i][j]*FY[i][j]; 
    } 

    // Set Coefficients matrix 
    AW[i][j] = AWD+AWC; 
    AE[i][j] = AED+AEC; 
    AS[i][j] = ASD+ASC; 
    AN[i][j] = AND+ANC; 
    AP[i][j] = -(AE[i][j]+AW[i][j]+AN[i][j]+AS[i][j]); 
    Q[i][j] = 0.0; 

} 
} 
// West Boundary - Inlet B.C 
for(i=1;i<(*factorteta_Ptr)*2+1;i++) 
{ 
    if(WBC==1) Q[i][1] = Q[i][1]-AW[i][1]*FI[i][0]; 
    if(WBC==2) AP[i][1] = AP[i][1] + AW[i][1]; 
    AW[i][1] = 0.0; 

// East Boundary - (1)Dirichlet (2)ZERP-GRAD Outflow B.C 
    if(EBC==1) Q[i][*N_Ptr] = Q[i][*N_Ptr] - AE[i][*N_Ptr]*FI[i][*N_Ptr+1]; 
    if(EBC==2) AP[i][*N_Ptr] = AP[i][*N_Ptr] + AE[i][*N_Ptr]; 
    AE[i][*N_Ptr] = 0.0; 
} 

// South Boundary - (1)Dirichlet (2)ZERO-GRAD 
for(j=1;j<*N_Ptr+1;j++) 
{ 
    if(SBC==1) Q[1][j] = Q[1][j] - AS[1][j]*FI[0][j]; 
    if(SBC==2) AP[1][j] = AP[1][j] + AS[1][j]; 
    AS[1][j] = 0.0; 

// North Boundary - (1)Dirichlet (2)ZERO-GRAD 
    if(NBC==1) Q[(*factorteta_Ptr)*2][j] = Q[(*factorteta_Ptr)*2][j] - AN[(*factorteta_Ptr)*2][j]*FI[(*factorteta_Ptr)*2+1][j]; 
    if(NBC==2) AP[(*factorteta_Ptr)*2][j] = AP[(*factorteta_Ptr)*2][j] + AN[(*factorteta_Ptr)*2][j]; 
    AN[(*factorteta_Ptr)*2][j] = 0.0; 
} 

// Print 
int l,k; 
for(l=1;l<(*factorteta_Ptr)*2+1;l++) 
{ 
    for(k=1;k<*N_Ptr+1;k++) 
{ 
    printf("%lf %lf %lf %lf\n",AP[l][k],AS[l][k],AN[l][k],FI[l][k]); 
} 
} 

return 0; 
} 

如果有人願意,我可以發送所有代碼,但有很多擴展名。 感謝

+4

你的程序產生垃圾的事實並不合理'garbage-collection'標籤。 –

+1

這是不太可能的,你會得到一個令人滿意的答案寫在它的形式的問題。這是一堆無法讀取的代碼,沒有明確的問題定義,也沒有明確的測試用例。 –

+1

@Catalina V你是否意識到數組索引從0開始? –

回答

1

在你的函數聲明: double AP[(*factorteta_Ptr)*2+1][*N_Ptr+1]

我不太認爲這是做什麼你認爲它在做什麼。雖然我以前沒有見過這樣的東西,但我相信這是告訴編譯器根據其他給定參數爲您創建一個可變長度的二維數組。然後,你在你的函數中填入這些值。但是,因爲您不會返回該值,也不會將其聲明爲通過引用,所以在您返回時它會被丟棄,因此工作將會丟失,並且您的數組中有垃圾,其位置爲main()。更好的形式是在main()中創建這個數組,然後通過引用像double *AP[][]那樣傳遞它,或者在退出時返回這個數組,或者破解比這個函數更糟的事情,並且使其成爲全局的,以便您可以在任何地方看到它。

+0

我明白你說什麼,並會考慮你的建議。我想我必須多研究一下這個話題。 –

相關問題