Lunes 16 de Diciembre de 2024, 14:53
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
atof
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: atof (Leído 1415 veces)
RossaRamos
Nuevo Miembro
Mensajes: 5
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++
void
secondline
(
struct
ORB
*
punt_sat,string data
)
{
char
*
conv
;
char
*
conv1
=
{
"0.000000"
}
;
double
M
=
ZERO
;
double
E
=
ZERO
;
double
v
=
ZERO
;
double
rpd
=
ZERO
;
double
cons
=
ZERO
;
int
n
=
ZERO
;
int
i
=
ZERO
;
ldiv_t
ld
;
string copy
=
data
;
for
(
n
=
43
;
n
<=
50
;
n
++
)
//AQUI ME EMPEIZAN LOS PROBLEMAS
{
conv
[
i
]
=
data
[
n
]
;
data
=
copy
;
i
++
;
}
M
=
atof
(
conv
)
;
i
=
TWO
;
for
(
n
=
26
;
n
<=
32
;
n
++
)
{
conv1
[
i
]
=
data
[
n
]
;
data
=
copy
;
i
++
;
}
i
=
ZERO
;
punt_sat
-
>
e
=
atof
(
conv1
)
;
E
=
root_Kepler
(
M,punt_sat
-
>
e,
0
)
;
v
=
atan2
(
sqrt
(
1
-
pow
(
punt_sat
-
>
e,
2
)
)
*
sin
(
E
)
,
(
cos
(
E
)
-
E
)
)
;
for
(
n
=
52
;
n
<=
62
;
n
++
)
{
conv
[
i
]
=
data
[
n
]
;
i
++
;
}
i
=
ZERO
;
rpd
=
atof
(
conv
)
;
punt_sat
-
>
a
=
pow
(
GM
*
pow
(
spd
/
rpd
/
2
/
PI,
2
)
,
1.0
/
3
)
;
for
(
n
=
8
;
n
<=
15
;
n
++
)
{
conv
[
i
]
=
data
[
n
]
;
i
++
;
}
i
=
ZERO
;
punt_sat
-
>
in
=
atof
(
conv
)
;
for
(
n
=
17
;
n
<=
24
;
n
++
)
{
conv
[
i
]
=
data
[
n
]
;
i
++
;
}
i
=
ZERO
;
punt_sat
-
>
o
=
atof
(
conv
)
;
for
(
n
=
34
;
n
<=
41
;
n
++
)
{
conv
[
i
]
=
data
[
n
]
;
i
++
;
}
punt_sat
-
>
w
=
atof
(
conv
)
;
punt_sat
-
>
u
=
punt_sat
-
>
w
+
v
;
return
;
}
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!
Tweet
ProfesorX
Moderador
Mensajes: 796
Nacionalidad:
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++
// Aqui estas definiendo tus punteros, pero no le dices a que porcion de la
// memoria va a apuntar por lo tanto, apuntara a una seccion no valida de
// la memoria, que probablemente en el mejor de los casos
// sea la direccion de otra variable, y en el peor, codigo de tu programa
char
*
conv
;
char
*
conv1
=
{
"0.000000"
}
;
y luego aqui.
Código: C++
// estas encimando la memoria, ya que como dije antes, el puntero conv
//no apunta a una zona valida de la memoria.
conv
[
i
]
=
data
[
n
]
;
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++
// Reservas 10 posiciones de memoria para tus arreglo de char
char
*
conv
=
new
char
[
10
]
;
char
*
conv1
=
new
char
[
10
]
;
// Copia el valor a tu memoria reservada.
strcpy
(
conv1,
"0.000000"
)
;
cuando termines de usar la memoria debes liberarla con delete
Código: C++
delete
conv1
;
delete
conv
;
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
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++
void
secondline
(
struct
ORB
*
punt_sat,string data
)
{
char
conv
[
11
]
;
double
M
=
ZERO
;
double
E
=
ZERO
;
double
v
=
ZERO
;
double
rpd
=
ZERO
;
double
cons
=
ZERO
;
int
n
=
ZERO
;
int
i
=
ZERO
;
ldiv_t
ld
;
string copy
=
data
;
data.
copy
(
conv,
8
,
43
)
;
conv
=
NULL
;
M
=
atof
(
conv
)
;
//y asi con todos...
return
;
}
}
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
atof