2015-05-20 4 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_solve и density_solve вместе. Две функции выполняются должным образом, когда они запускаются индивидуально, т. Е. Когда я комментирую velocity_solve, density_solve работает нормально и наоборот.

Я уверен, что нет ничего плохого в том, что функции используются в процедурах velocity_solve и density_solve, потому что ни одна из двух подпрограмм не даст отдельных выходов. Я подозреваю, что что-то происходит неправильно, когда две функции должны взаимодействовать, т. Е. Вывод velocity_solve должен использоваться в density_solve.

Я попытался инициализировать переменную размера, но тогда это не имеет никакого значения. Но потом я понял, что я не использую массивы, которые определены, поэтому я их прокомментировал, вместо этого я использую указатели, для которых я уже выделил память, а затем почему она все еще дает ошибку сегментации, когда я пытаюсь вызвать обе функции вместе в основной функции?

Может кто-нибудь сказать, что происходит в коде?

ответ

6

Вы не инициализировать size, поэтому его значение будет неопределенной и вы будете иметь неопределенное поведение когда вы используете его для создания массивов.

Неопределенное поведение делает вашу программу плохо сформированной.

3

В вашем коде size является локальной переменной типа auto. Если не инициализированы явно, он будет иметь мусор или неопределенной значения, используя которые хотели

float vel_x[size]; 

вызывает undefined behaviour.

Связанный: От C11 стандарта, глава 6.2.4, «хранения длительности объектов»,

Пункт 5:

Объект, идентификатор объявляется без каких-либо связи и без хранения -класс спецификатор static имеет автоматический срок хранения, ...

и Para график 6:

... Начальное значение объекта является неопределенным. ...

Кроме того, из того же документа, глава §6.7.9, «Инициализация», пункт 10

Если объект, который имеет автоматическую продолжительность хранения не инициализирована явно, его значение является неопределенным.

и, наконец, от добавления J.2, "Неопределенное поведение"

Значение объекта с автоматической продолжительности хранения используется во время его неопределенными

+0

Хорошо. .. Я понял ... Итак, как мне инициализировать этот размер переменной? Потому что позже размер определяется тем, что я определил. –

+0

@SnehaChoudhury просто перемещает ваши определения массива 'float' после вычисления' size'. Это решит проблему. –

+0

не работает еще !! Я все еще получаю ошибку сегментации после выполнения функции velocity_solve ... что означает, что он больше не выполняет значение плотности_solve. Я понимаю, что я не использую массивы в любом месте, но я использую указатели, поэтому я также попытался прокомментировать объявление массива ... это тоже не помогает. Любая идея, что еще может пойти не так? –

Смежные вопросы