Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Pregunta facil

Estas en el tema de Pregunta facil en el foro de C/C++ en Foros del Web. Hola!! Llevo sólo una semana aprendido el lenguaje C++ y he llegado al tema de punteros. Hay que decir que me he saturado un poco ...
  #1 (permalink)  
Antiguo 11/09/2008, 12:40
 
Fecha de Ingreso: septiembre-2008
Mensajes: 22
Antigüedad: 15 años, 7 meses
Puntos: 0
Pregunta facil

Hola!! Llevo sólo una semana aprendido el lenguaje C++ y he llegado al tema de punteros. Hay que decir que me he saturado un poco xDD.

Mi duda es la siguiente.

Para la lectura de cadenas (arrays de caracteres) empleo cin.getline(Nombre, 8) , sin embargo al definir una cadena de caracteres mediante un puntero en lugar de con un array la función cin.getline me da error. Es decir:

Puedo compilar :

int main (void){
char fecha1[10];
cout << "introduzca la primera fecha en formato dd/mm/aa " << endl;
cin.getline(fecha1, 10);
cout << fecha1 << endl;
}



Pero no:
int main (void){
char *fecha1;
cout << "introduzca la primera fecha en formato dd/mm/aa " << endl;
cin.getline(fecha1, 10);
}



Entonces, cómo leo por teclado un puntero con dirección a una cadena de caracteres??

Gracias de antemano!
  #2 (permalink)  
Antiguo 11/09/2008, 13:13
 
Fecha de Ingreso: abril-2008
Mensajes: 264
Antigüedad: 16 años
Puntos: 2
Respuesta: Pregunta facil

Te falta reservar la memoria a la que va a apuntar el puntero. No se como será en C++, en c es con la funcion malloc.
__________________
Saludoss
Guille
  #3 (permalink)  
Antiguo 11/09/2008, 13:19
Avatar de Mort20  
Fecha de Ingreso: junio-2008
Ubicación: Roca Casterly
Mensajes: 141
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Pregunta facil

Tu error es de concepto, que como dices que acabas de llegar a punteros es normal. Para que lo entiendas te explico un poco resumido el concepto de la forma con la que yo lo entendí en su momento.

Supongamos que en nuestra memoria tenemos 2 espacios (pongo sólo 2 para simplificar) para almacenar cosas del mismo tamaño (2 bytes, por ejemplo).
Vale, hacemos el puntero que tu haces. Fecha1 se almacena en el primer espacio, y su contenido esta indefinido porque aún no le hemos asignado nada. El esquema sería así:
Código:
+------+
|Fecha1| //Espacio reservado, pero fecha 1 aún no contiene información
| null | //nada almacenado
+------+
Luego hacemos string p (en C++ esto es como un char[], tiene el mismo efecto). Tenemos:
Código:
+------+
|Fecha1| //sin información
|   p  | //reservado, pero sin información
+------+
Finalmente hacemos fecha1 = p; (o fecha1 = &p; es equivalente). Entonces el espacio de fecha1 pasa a contener la dirección de p. Es decir, dónde está ubicado p en la memoria, pero no su valor. Si hacemos *fecha1 estaríamos cargando el valor contenido en fecha1, es decir, el valor contenido en la dirección dónde tenemos p, dónde obviamente, tneemos el valor de p, actualmente nulo.
Si hicieramos p="30"; *fecha1 contendría la cadena de carácteres "30". Y si hacemos *fecha1="30", sería lo mismo que guardar en la dirección de memoria perteneciente a p la cadena "30".
En resumen, p="30" y *fecha1="30" es lo mismo.
Sin embargo, si hubieramos hecho *fecha1="30" antes de asignarle una dirección de memoria a fecha1, eso daría un error puesto que no sabe dónde debe guardarlo, no hay ninguna dirección almacenada en fecha1.

Espero que con esto hayas entendido tu error, en resumen en C++, y usando memoria dinámica (que es el uso principal de los punteros, sería):
Código:
int main (void){
char *fecha1 = new char(10); //alternativa: char *fecha1 = new string();
cout << "introduzca la primera fecha en formato dd/mm/aa " << endl;
cin.getline(fecha1, 10);
delete fecha1;
}
Sin memoria dinámica:
Código:
int main (void){
char *fecha1;
char espacio[10]; //alternativa: string espacio;
fecha1 = espacio; //fehca1 apunta a espacio, vector de 10 carácteres
cout << "introduzca la primera fecha en formato dd/mm/aa " << endl;
cin.getline(fecha1, 10);
}
Como ves, sin memoria dinámica la aplicación es algo absurda pues para eso no necesitamos usar un puntero. Con la memoria dinámica, estamos generando el espacio para la variable, pero cuando acabemos de usarla la vamos a destruir (delete).
__________________
Un Lannister siempre cumple sus promesas
  #4 (permalink)  
Antiguo 11/09/2008, 15:06
 
Fecha de Ingreso: septiembre-2008
Mensajes: 22
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Pregunta facil

Muchas gracias por la ayuda!!

Ya he comprendido mi error, menudo despiste.

Me ha hecho gracia recordar a los Lannister. Oye mi rugido! jaja.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:00.