Problema codigo en C

Iniciado por DGoz, 23 Febrero 2015, 02:16 AM

0 Miembros y 1 Visitante están viendo este tema.

DGoz

Hola a todos.

Soy nuevo programando y estoy tratando de desarrollar una herramienta para resolver una EDP hiperbólica. El caso es que me compila, pero al correr me da un error y se queda colgada. Dejo aquí el código.

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>

int main()
{
printf("********************************\n");
printf("********************************\n");
printf("*                              *\n");
printf("*           LW Solver          *\n");
printf("*                              *\n");
printf("********************************\n");

printf("This program solves the hyperbolic EDP of a bar vibration\n");
printf("The dimensions of the bar are L=1 m, D= 0,3 m. The material of the\n");
printf("bar is steel, with E=200 GPa and rho=7850 kg/m^3. dx=0.05 m\n");
printf("dt=0.05 s. The solution will be write in a .dat file\n\n");

/* Variables */

int i,j;
double u[20][20];

FILE *fp;

/* Escritura del fichero solucion */
fp = fopen("Solution_LW-Solver_005.dat","w");

/*----------------------------------------------------------------------------*/

fprintf(fp,"********************************\n");
fprintf(fp,"********************************\n");
fprintf(fp,"*                              *\n");
fprintf(fp,"*           LW Solver          *\n");
fprintf(fp,"*                              *\n");
fprintf(fp,"********************************\n");

fprintf(fp,"This program solves the hyperbolic EDP of a bar vibration\n");
fprintf(fp,"The dimensions of the bar are L=1 m, D= 0,3 m. The material of\n");
fprintf(fp,"bar is steel, with E=200 GPa and rho=7850 kg/m^3. dx=0.05 m,\n");
fprintf(fp,"dt=0.05 s.\n\n");


/*----------------------------------------------------------------------------*/

printf("Solving...\n");
fprintf(fp, "Solution for dt=0.05m\n\n");
fprintf(fp,"*************************************************************\n\n");
fprintf(fp,"Calculated values are:\n\n");
/* Condiciones de contorno e iniciales */

/* Condicion de desplazamiento nulo en el origen */
for (j=0; j<=20; j++) {
   u[0][j]=0;
}
printf("\n\n1....");
/* Condicion de desplazamiento inicial nulo */
for (i=0; i<=20; i++) {
   u[i][0]=0;
}
printf("\n\n2....");
/* Ecuaciones iniciales */

/* Ecuacion inicial para todos los nodos salvo para el primero y el ultimo */
for (i=1; i <=19; i++) {
   u[i][1]=1;
}
printf("\n\n3....");
/* Ecuacion del nodo del extremo */
u[20][1]=0;
printf("\n\n4....");
/* Resolucion iterativa */
/* Step 1 par; Step 2 impar */

for (j=2; j<=20; j++) {
   if (j%2 == 0)
   {
       for (i=1; i<=19; i++) {
         u[i][j]=0.5*(u[i+1][j-1]+u[i-1][j-1])-0.08*(u[i+1][j-1]-u[i-1][j-1]);
       }
           u[20][j]=u[19][j-1];        
   }
   else if (j%2 !=0)
   {
       for (i=1; i<=19; i++) {
         u[i][j]=u[i][j-2]-0.16*(u[i+1][j-1]-u[i-1][j-1]);
       }
         u[20][j]=u[20][j-2];
   }
}
     
printf("\n\n5....");

for (i=0; i<=20; i++) {
   for (j=0; j<=20; j++) {
       fprintf(fp,"U%d%d= %12.4e C\n", i, j, u[i][j]);
   }
}

printf("\n\nSolved!");

fprintf(fp,"\n\nEND DATA");
fclose(fp);
 
 printf("\n\nPress enter to continue ...");
 getchar();
 return 0;
}


Espero que alguien pueda ayudarme. Asimismo agradecería todo tipo de consejos.

Muchas gracias.

Saludos.

engel lex

normalmente es bueno que indiques los errores... la corrí y da una violacion de segmento... que no se porque no lo reporta antes... pero es por la matriz desbordada, es decir

Código (cpp) [Seleccionar]
double u[20][20];
y
Código (cpp) [Seleccionar]
for (j=0; j<=20; j++)

cuando declaras u[20][20] estás creando una matriz de 20x20 es decir de 0 al 19, por otro lado el ciclo recorre 21 valores (el 0 se cuenta)... el error es que intentó acceder a un especio de memoria no permitido, lo dejó pasar y avisó al final
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

DGoz

Muchas gracias por tu respuesta.

Tendré en cuenta para el futuro, que al declarar [20][20] estoy declarando 0 al 19.

Por mi parte queda cerrado el tema.

Un saludo.

vangodp

si declaras double u[20][20]; no puedes ir en los bucles de a 20 como lo haces en for (j=0; j<=20; j++). si tienes claro que en C/C++ si inicias j= 0 de 0 a 19 tienes 20,  j<=20 es como decir < o == y va parar en == seguro.

Otra cosa que vi es que si quieres un archivo binario .dat debes poner wb en el modo de apertura: fp = fopen("Solution_LW-Solver_005.dat","wb");. La b de binario.

Arregla esas cosas y ya nos cuentas como ha ido. Quizas haya mas cosas pero no veo mas nada. =(

Suerte

DGoz

Ya esta solucionado y el programa corre correctamente. Realmente necesitaba una matriz de 21x21. Así que cambié a u[21][21]. También he implementado el resto de recomendaciones (en los bucles j == 20)

Gracias por vuestra ayuda y consejos.

Saludos.