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.
#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.
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
double u[20][20];
y
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
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.
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
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.