• Lunes 16 de Diciembre de 2024, 17:50

Autor Tema:  atof  (Leído 1416 veces)

RossaRamos

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
atof
« en: Lunes 20 de Abril de 2009, 18:24 »
0
estoy desesperada!! por favor, necesito de otros ojos,para poder ver el problema.

La funcion que os voy a poner la tenia mas que compilada y depurada con CODE::BLOCKS, pero cual ha sido mi sorpresa al ver que no me funciona como quiero con Microsoft Visual C++.

la funcion es:

Código: C++
  1. void secondline(struct ORB *punt_sat,string data)
  2.  
  3. {
  4.     char *conv;
  5.     char *conv1={"0.000000"};
  6.     double M=ZERO;
  7.     double E=ZERO;
  8.     double v=ZERO;
  9.     double rpd=ZERO;
  10.     double cons=ZERO;
  11.     int n=ZERO;
  12.     int i=ZERO;
  13.     ldiv_t ld;
  14.     string copy=data;
  15.  
  16.     for(n=43;n<=50;n++)    //AQUI ME EMPEIZAN LOS PROBLEMAS
  17.     {
  18.         conv[i]=data[n];
  19.         data=copy;
  20.         i++;
  21.     }
  22.     M=atof(conv);
  23.     i=TWO;
  24.     for(n=26;n<=32;n++)
  25.     {
  26.        conv1[i]=data[n];
  27.        data=copy;
  28.        i++;
  29.     }
  30.     i=ZERO;
  31.     punt_sat->e=atof(conv1);
  32.     E=root_Kepler(M,punt_sat->e,0);
  33.    
  34.     v=atan2(sqrt(1-pow(punt_sat->e,2))*sin(E),(cos(E)-E));
  35.     for(n=52;n<=62;n++)
  36.     {
  37.        conv[i]=data[n];
  38.        i++;
  39.     }
  40.     i=ZERO;
  41.     rpd=atof(conv);
  42.     punt_sat->a=pow(GM*pow(spd/rpd/2/PI,2),1.0/3);
  43.     for(n=8;n<=15;n++)
  44.     {
  45.         conv[i]=data[n];
  46.         i++;
  47.     }
  48.     i=ZERO;
  49.     punt_sat->in=atof(conv);
  50.     for(n=17;n<=24;n++)
  51.     {
  52.        conv[i]=data[n];
  53.        i++;
  54.     }
  55.     i=ZERO;
  56.     punt_sat->o=atof(conv);
  57.     for(n=34;n<=41;n++)
  58.     {
  59.        conv[i]=data[n];
  60.        i++;
  61.     }
  62.     punt_sat->w=atof(conv);
  63.     punt_sat->u=punt_sat->w+v;
  64.  
  65.     return;
  66.     }
  67.  

pues bien, os cuento:

en primer lugar, en la funcion original los arrays de caracteres los tenia definidos como char conv[el numero de elementos], dependia de los datos que iba a leer. Y depurando con Visual C++, me los leia bien pero donde tenia como cadena "210.5676" al hacerle el atof, me devolvia "210.0000000", vamos me eliminaba mis decimales. Leyendo en internet, un tipo contesto una vez que en Visual C++ es mejor definir los arrays como punteros, tal y como lo tengo ahora mismo....ahora bien, que me pasa, en la primera lectura (primer for), cuando llega al elemento 47, me cambia e´l valor de data y por tanto, todo lo que hace a continuacion ya no esta bien...a que se puede deber??

gracias!

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: atof
« Respuesta #1 en: Martes 21 de Abril de 2009, 19:50 »
0
Pues no tengo el codigo completo, por lo que no lo pude compilar, y me marcaba errores, pero asi a simple vista te puedo decir, que tu error esta en el uso de punteros.

Aunque hayas leido que es mejor definir los array como punteros (la razon es que los punteros trabajan mas rapido), tambien es cierto que antes de hacerlo debes entender como funciona un puntero, y cuales son las diferencias entre estos y los array.

Tambien debes saber la diferencia entre un array de caracteres y un tipo string de C++, que aunque los dos nos sirven para lo mismo (representacion de "textos" o "cadenas") no son intercambiables, y antes de usarlos, debes saber como funciona cada uno.

El primer error que veo esta aqui:

Código: C++
  1.  
  2.     // Aqui estas definiendo tus punteros, pero no le dices a que porcion de la
  3.     // memoria va a apuntar por lo tanto, apuntara a una seccion no valida de
  4.     // la memoria, que probablemente en el mejor de los casos
  5.     // sea la direccion de otra variable, y en el peor, codigo de tu programa
  6.     char *conv;
  7.     char *conv1={"0.000000"};
  8.  
  9.  

y luego aqui.

Código: C++
  1.  
  2.         // estas encimando la memoria, ya que como dije antes, el puntero conv
  3.         //no apunta a una zona valida de la memoria.
  4.         conv[i]=data[n];
  5.  
  6.  

Cuando estas definiendo tu variable conv de tipo puntero a char, no le estas asignando memoria libre, por lo que el puntero esta apuntando a una porcion no valida de la memoria, que es parte de la razon por la cual tu porgrama no haga lo que tu quieres.

La solucion es asignar memoria dinamica por medio de las funciones malloc() de C o new de C++.

Si usas C++ entonces debes hacer lo siguiente:

Código: C++
  1.  
  2.     // Reservas 10 posiciones de memoria para tus arreglo de char
  3.     char *conv = new char[10];
  4.     char *conv1 = new char[10];
  5.     // Copia el valor a tu memoria reservada.
  6.     strcpy(conv1, "0.000000");
  7.  
  8.  

cuando termines de usar la memoria debes liberarla con delete

Código: C++
  1.  
  2.     delete conv1;
  3.     delete conv;
  4.  
  5.  

Ahora si usas la clase string de C++ en lugar de punteros a char, se hace de otra forma, pero eso ya es cuestion tuya leer, e investigar como se hace. Como dije antes, no es lo mismo usar string que punteros a char, hay diferencias.

Saludos :-)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

RossaRamos

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: atof
« Respuesta #2 en: Martes 21 de Abril de 2009, 20:43 »
0
hola, gracias por tu respuesta. Ayer consegui hacerlo de otra forma y me funciona. Posiblemente el error es el que tu mencionas sobre la asignacion de memoria.

No tengo el programa ahora mismo aqui conmigo pero lo que hice creo que recordar que era algo asi.

Código: C++
  1.   void secondline(struct ORB *punt_sat,string data)
  2.  {
  3.      char conv[11];
  4.      double M=ZERO;
  5.      double E=ZERO;
  6.      double v=ZERO;
  7.      double rpd=ZERO;
  8.     double cons=ZERO;
  9.      int n=ZERO;
  10.      int i=ZERO;
  11.      ldiv_t ld;
  12.      string copy=data;
  13.    
  14.      data.copy(conv,8,43);
  15.     conv=NULL;
  16.      M=atof(conv);
  17.  
  18.     //y asi con todos...
  19.    return;
  20. }
  21.  
}