elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema codigo en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema codigo en C  (Leído 1,396 veces)
DGoz

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Problema codigo en C
« en: 23 Febrero 2015, 02:16 am »

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
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6. printf("********************************\n");
  7. printf("********************************\n");
  8. printf("*                              *\n");
  9. printf("*           LW Solver          *\n");
  10. printf("*                              *\n");
  11. printf("********************************\n");
  12.  
  13. printf("This program solves the hyperbolic EDP of a bar vibration\n");
  14. printf("The dimensions of the bar are L=1 m, D= 0,3 m. The material of the\n");
  15. printf("bar is steel, with E=200 GPa and rho=7850 kg/m^3. dx=0.05 m\n");
  16. printf("dt=0.05 s. The solution will be write in a .dat file\n\n");
  17.  
  18. /* Variables */
  19.  
  20. int i,j;
  21. double u[20][20];
  22.  
  23. FILE *fp;
  24.  
  25. /* Escritura del fichero solucion */
  26. fp = fopen("Solution_LW-Solver_005.dat","w");
  27.  
  28. /*----------------------------------------------------------------------------*/
  29.  
  30. fprintf(fp,"********************************\n");
  31. fprintf(fp,"********************************\n");
  32. fprintf(fp,"*                              *\n");
  33. fprintf(fp,"*           LW Solver          *\n");
  34. fprintf(fp,"*                              *\n");
  35. fprintf(fp,"********************************\n");
  36.  
  37. fprintf(fp,"This program solves the hyperbolic EDP of a bar vibration\n");
  38. fprintf(fp,"The dimensions of the bar are L=1 m, D= 0,3 m. The material of\n");
  39. fprintf(fp,"bar is steel, with E=200 GPa and rho=7850 kg/m^3. dx=0.05 m,\n");
  40. fprintf(fp,"dt=0.05 s.\n\n");
  41.  
  42.  
  43. /*----------------------------------------------------------------------------*/
  44.  
  45. printf("Solving...\n");
  46. fprintf(fp, "Solution for dt=0.05m\n\n");
  47. fprintf(fp,"*************************************************************\n\n");
  48. fprintf(fp,"Calculated values are:\n\n");
  49. /* Condiciones de contorno e iniciales */
  50.  
  51. /* Condicion de desplazamiento nulo en el origen */
  52. for (j=0; j<=20; j++) {
  53.    u[0][j]=0;
  54. }
  55. printf("\n\n1....");
  56. /* Condicion de desplazamiento inicial nulo */
  57. for (i=0; i<=20; i++) {
  58.    u[i][0]=0;
  59. }
  60. printf("\n\n2....");
  61. /* Ecuaciones iniciales */
  62.  
  63. /* Ecuacion inicial para todos los nodos salvo para el primero y el ultimo */
  64. for (i=1; i <=19; i++) {
  65.    u[i][1]=1;
  66. }
  67. printf("\n\n3....");
  68. /* Ecuacion del nodo del extremo */
  69. u[20][1]=0;
  70. printf("\n\n4....");
  71. /* Resolucion iterativa */
  72. /* Step 1 par; Step 2 impar */
  73.  
  74. for (j=2; j<=20; j++) {
  75.    if (j%2 == 0)
  76.    {
  77.        for (i=1; i<=19; i++) {
  78.          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]);
  79.        }
  80.            u[20][j]=u[19][j-1];        
  81.    }
  82.    else if (j%2 !=0)
  83.    {
  84.        for (i=1; i<=19; i++) {
  85.          u[i][j]=u[i][j-2]-0.16*(u[i+1][j-1]-u[i-1][j-1]);
  86.        }
  87.          u[20][j]=u[20][j-2];
  88.    }
  89. }
  90.  
  91. printf("\n\n5....");
  92.  
  93. for (i=0; i<=20; i++) {
  94.    for (j=0; j<=20; j++) {
  95.        fprintf(fp,"U%d%d= %12.4e C\n", i, j, u[i][j]);
  96.    }
  97. }
  98.  
  99. printf("\n\nSolved!");
  100.  
  101. fprintf(fp,"\n\nEND DATA");
  102. fclose(fp);
  103.  
  104.  printf("\n\nPress enter to continue ...");
  105.  getchar();
  106.  return 0;
  107. }

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

Muchas gracias.

Saludos.


« Última modificación: 23 Febrero 2015, 02:19 am por engel lex » En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Problema codigo en C
« Respuesta #1 en: 23 Febrero 2015, 02:37 am »

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
  1. double u[20][20];
y
Código
  1. 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


En línea

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

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Problema codigo en C
« Respuesta #2 en: 23 Febrero 2015, 02:44 am »

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.
En línea

vangodp


Desconectado Desconectado

Mensajes: 455



Ver Perfil
Re: Problema codigo en C
« Respuesta #3 en: 23 Febrero 2015, 02:44 am »

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
En línea

DGoz

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re:
« Respuesta #4 en: 23 Febrero 2015, 08:59 am »

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.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con código
Programación Visual Basic
z3r0 Bug 7 2,205 Último mensaje 24 Noviembre 2005, 16:51 pm
por NYlOn
¿Cuál es la diferencia entre código objeto, código máquina y código binario?
Programación General
Aikanáro Anário 9 28,929 Último mensaje 23 Diciembre 2010, 15:19 pm
por pucheto
Extrayendo código fuente de una web (Problema con código generado por JS)
PHP
Littl3 4 7,832 Último mensaje 3 Marzo 2011, 04:13 am
por Nakp
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines