이것은 며칠 동안 매우 혼란 스러웠습니다. 나는 C 언어에 다소 익숙하지만 일반적으로 인터넷 검색으로 상황을 파악할 수는 있지만 이것은 저를 곤혹스럽게합니다. 나는 몇몇 사람들에게 물었고 그들은 나를 도울 수 없었다.호출 함수는 두 가지 다른 출력 값을 제공합니다.
문제점은 코드 (48 및 49)에 표시된 행을 포함 시키면 수학적으로 같아야하지만 f1은 output2와 다른 출력을 계산한다는 것입니다. 그러나, 내가 다른 방식으로 그것을 부르면, 나는이 문제를 가지지 않는다. 나는 우분투 12.04에서 gcc 나 g ++로 컴파일하고있다. 둘 다 같은 문제를 안고있다.
코드도 pastebin에 업로드했습니다. 문제는 48 번과 49 번 라인을 참조하십시오.
미리 도움을 주셔서 감사합니다. 하드의
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define PARAMETER1 100
#define nx1 5
#define nx2 10
#define nx3 10
#define ny1 4
#define ny2 5
#define ny3 10
#define Nx nx1+nx2+nx3+1
#define Ny ny1+ny2+ny3+1
#define X1_LENGTH 5.0
#define X2_LENGTH 10.0
#define X3_LENGTH 50.0
#define Y1_LENGTH 0.04
#define Y2_LENGTH 5.0
#define Y3_LENGTH 20.0
double f(int j,int i);
double g(int j,int i);
double dx(int i);
double calc_value_pos(int i);
double calc_value_neg(int i);
double **matrix;
double f1(int j,int i);
double calc_value2_pos(int i);
double calc_value2_neg(int i);
double f2(int j,int i);
int main(void){
matrix=(double **)malloc((size_t) ((Ny+1)*(Nx+1)+1)*sizeof(double *));
for (int j=1; j<=(Ny+1)*(Nx+1); j++) {
matrix[j] = (double *)malloc((size_t) ((Ny+1)*(Nx+1)+1)* sizeof(double));
}
for (int j=1; j<=Ny+1; j++){
for (int i=1; i<=Nx+1; i++){
matrix[j][i]=0.0;
}
}
for (int i=0; i<=Nx; i++){
for (int j=0; j<=Ny; j++){
int k=i+(j)*(Nx+1)+1;
matrix[k][k] = f(j,i); /*including this line causes the problem*/
//matrix[k][k] = f1(j,i); /* including this line does not cause the problem*/
}
}
return 1;
}
double f(int j, int i){
double output=f1(j,i)+f2(j,i);
return output;
}
double f1(int j, int i){
double output;
if (i==0 || j==0 || i==Nx || j==Ny) output=0.0;
if (i!=0 && j!= 0 && i!= Nx && j!=Ny) {
output = (g(j,i)*g(j,i+1))/(g(j,i)*calc_value_pos(i)+g(j,i+1)*calc_value_neg(i));
double output2;
output2=1.0/((calc_value_neg(i)/g(j,i)) + (calc_value_pos(i)/g(j,i+1)));
/*if (output2!=output2) printf("output2: %lf\n",output2);*/
if (output != output2 && output==output) printf("(j%d,i%d) output:%lf \toutput2:%lf\n",j,i,output,output2);
}
if (output!=output) output=0.0;
return output;
}
double f2(int j,int i){
/* calculates f2 for (j,i) */
double output;
if (j==0 || i==0) output=0.0;
else output = g(j,i)*g(j,i-1)/(g(j,i)*calc_value2_neg(i)+g(j,i-1)*calc_value2_pos(i));
if (output!=output) output=0.0;
return output;
}
double calc_value2_pos(int i){
/* calculates calc_value2_pos for X=i */
double output= dx(i)/2.0;
return output;
}
double calc_value2_neg(int i){
/* calculates calc_value2_neg for X=i */
if (i==0) printf("Warning off grid\n");
double output= dx(i-1)/2.0;
return output;
}
double g(int j,int i){
double output=PARAMETER1;
if (j==0 || i==0) output=0.0;
if (j>=ny1+1 && j<=ny1+ny2 && i>=1 && i<=nx1) output=0.0;
if (output!=output) printf("calc_D(%d,%d) error: output==nan\n",j,i);
return output;
}
double calc_value_pos(int i){
if (i==Nx) printf("Warning east pos\n");
double output;
output = dx(i+1)/2.0;
if (output!=output) printf("calc_delta_e_pos(%d) error: output==nan\n",i);
return output;
}
double calc_value_neg(int i){
double output=dx(i)/2.0;
if (output!=output) printf("calc_delta_e_neg(%d) error: output==nan\n",i);
return output;
}
double dx(int i){
double output;
if (i<=nx1) output=1.0*X1_LENGTH/nx1;
if (i<=nx1+nx2 && i>=nx1+1) output=1.0*X2_LENGTH/nx2;
if (i<=nx1+nx2+nx3 && i>=nx1+nx2+1) output=1.0*X3_LENGTH/nx3;
if (output!=output) printf("delta_x(%d) error: output==nan\n",i);
return output;
}
이것이 C++ 태그가 지정된 이유가 있습니까? –
중요한 경우, C 또는 C++ 컴파일러를 사용하고 있습니까? – pmg
C와 C++ 둘 다 사용하여 C++로 태그를 붙였습니다. – Ben