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

[SOLUCIONADO] problema con punteros dobles

Estas en el tema de problema con punteros dobles en el foro de C/C++ en Foros del Web. Bueno seré breve, estoy haciendo un programa que simule la función: double strtod(const char *ptrN, char **ptrFinal); Que lo que hace es devolver el número ...
  #1 (permalink)  
Antiguo 15/04/2016, 18:52
 
Fecha de Ingreso: febrero-2015
Mensajes: 20
Antigüedad: 9 años, 1 mes
Puntos: 0
problema con punteros dobles

Bueno seré breve, estoy haciendo un programa que simule la función:

double strtod(const char *ptrN, char **ptrFinal);

Que lo que hace es devolver el número double que contiene la cadena y asignarle la dirección del resto de la cadena a ptrFinal, bien yo ya he logrado extraer el número de la cadena, pero no hayo como asignarle el resto de la cadena a ptrFinal.

prototipo:
Código:
double aDoubleptr(const char *ptrN, char **ptrFinal); ///convierte la cadena ptrN a double y asigna la direccion del resto a ptrFinal
llamada:

Código:
printf("\"%s\" convertida a double es: %.3f y el resto es \"%s\"\n", cadena, aDoubleptr(cadena,&ptrResto), ptrResto);
Definicion:

Código:
double aDoubleptr(const char *ptrN, char **ptrFinal)
ya he intentado de muchas formas como pasar el resto de la cadena a un apuntador doble pero me salen siempre errores y advertencias relacionados con el puntero como este:

C:\Users\Invitado\Desktop\program[Warning] assignment from incompatible pointer type [enabled by default]

He probado con:
Código:
ptrFinal = &ptrN[i];
*ptrFinal = ptrN[i];
&ptrFinal = &ptrN[i];
Es la primera vez que manejo puntero doble, y pues me estoy quebrando la cabeza con esto.

¿Cual es la forma correcta de lograr que ptrResto termine apuntando a ptrN[i]?
Se que la funcion recibe la direccion de un apuntador que apunta a otro, pero aun tengo conflictos, De preferencia preferiria que me expliquen un poco como la función strtod manipula su segundo argumento. gracias de antemano
  #2 (permalink)  
Antiguo 16/04/2016, 03:14
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 1 mes
Puntos: 3
Respuesta: problema con punteros dobles

¿Para que necesitas que sea un puntero a char*? De por si un char* ya es un puntero a su primera posición. No necesitas para nada retornar un puntero a un char* y además te daría problemas ya que eso significa que el char* lo creas dentro de dicha función y se destruye al salir de esta con lo que podría apuntar a cualquier cosa. Si lo que le pasas es un char* y lo modificas dentro de la función retornará conteniendo lo que le hayas copiado dentro de la funcion. Recuerda que las cadenas no se copian con =, hay que usar strcpy, strncpy, memcpy o similares.
  #3 (permalink)  
Antiguo 16/04/2016, 08:48
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 5 meses
Puntos: 204
Respuesta: problema con punteros dobles

Cita:
Iniciado por aguml Ver Mensaje
¿Para que necesitas que sea un puntero a char*? De por si un char* ya es un puntero a su primera posición. No necesitas para nada retornar un puntero a un char* y además te daría problemas ya que eso significa que el char* lo creas dentro de dicha función y se destruye al salir de esta con lo que podría apuntar a cualquier cosa. Si lo que le pasas es un char* y lo modificas dentro de la función retornará conteniendo lo que le hayas copiado dentro de la funcion. Recuerda que las cadenas no se copian con =, hay que usar strcpy, strncpy, memcpy o similares.
Si para modificar el valor de un int en una función necesitas un int*, para modificar la dirección a la que apunta un puntero necesitas un puntero doble. Con un puntero simple únicamente puedes modificar el contenido de la memoria apuntada pero no que el puntero apunte a otro sitio.

Cita:
Iniciado por braedu555
pero no hayo como asignarle el resto de la cadena a ptrFinal.
Eso es porque te has dejado en el tintero la única posibilidad buena jejeje.

Me explico. Tu has probado con:

Código C:
Ver original
  1. ptrFinal = &ptrN[i];
  2. *ptrFinal = ptrN[i];
  3. &ptrFinal = &ptrN[i];

Si ambos parámetros son del mismo tipo, en este caso punteros dobles, la asignación es directa:

Código C:
Ver original
  1. *ptrFinal=*ptrN;

Como en tu caso necesitas desplazar el puntero un offset dado por I entonces tienes que compensar la indirección:

Código C:
Ver original
  1. *ptrFinal=&((*ptrN)[i]);

Los paréntesis ayudan a leer el código: ptrN es un puntero doble, luego (*ptrN) es un puntero a char. (*ptrN)[i] apunta al carácter en cuestión y &((*ptrN)[i]) devuelve la dirección de memoria donde se encuentra dicho carácter.

O también puedes hacer uso de la aritmética de punteros:
Código C:
Ver original
  1. *ptrFinal=(*ptrN)+i;

Un saludo
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #4 (permalink)  
Antiguo 16/04/2016, 13:52
 
Fecha de Ingreso: febrero-2015
Mensajes: 20
Antigüedad: 9 años, 1 mes
Puntos: 0
Respuesta: problema con punteros dobles

Muchas gracias eferrion, por la aclaracion ya logre comprender un poco cómo es que se maneja el puntero doble.

Aunque la instrucción:

Código:
*ptrFinal=&((*ptrN)[i]);
me tira el siguiente error:

[Error] subscripted value is neither array nor pointer nor vector

me funciono metiendo dentro del paréntesis interno al subíndice [i]

Ahora el programa se ejecuta bien y funciona aunque me tira el siguiente aviso:

[Warning] assignment discards 'const' qualifier from pointer target type [enabled by default]

Me deja de aparecer si descarto el calificador de tipo del primer parámetro, aunque no entiendo porque aparece ese aviso, si en ningún momento se intenta manipular el dato de ptrN, y pues la función original de la libreria stdlib "strtod", tambien recibe el primer parámetro como const, y se ejecuta sin ninguna advertencia...
Gracias de nuevo, un saludo
  #5 (permalink)  
Antiguo 16/04/2016, 14:22
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 5 meses
Puntos: 204
Respuesta: problema con punteros dobles

Cita:
Iniciado por braedu555 Ver Mensaje
me funciono metiendo dentro del paréntesis interno al subíndice [i]
Los fines de semana suelo contestar desde el movil y no puedo probar los códigos que pongo y te pido disculpas por ponerte una solución con errores.

Cita:
Iniciado por braedu555 Ver Mensaje
Ahora el programa se ejecuta bien y funciona aunque me tira el siguiente aviso:
Si la función está recibiendo una cadena constante ese aviso te previene de que el programa puede no funcionar como esperas.

Aun así con el poco código que has puesto es complicado darte una respuesta más concreta.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #6 (permalink)  
Antiguo 16/04/2016, 16:53
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 1 mes
Puntos: 3
Respuesta: problema con punteros dobles

Sigo pensando que para hacer lo que quiere no necesita para nada un puntero doble ya que es un parámetro de salida donde se obtendrá una cadena y con un puntero simple en este caso tendría suficiente.
  #7 (permalink)  
Antiguo 16/04/2016, 16:58
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 5 meses
Puntos: 204
Respuesta: problema con punteros dobles

Código C:
Ver original
  1. void func(char* ptr);

Implementa la función de tal forma que al finalizar, ptr haya avanzado al primer punto que encuentre o, en su defecto, al final de la cadena.

Test:

Código C:
Ver original
  1. int main()
  2. {
  3.   char* cadena = "una.prueba";
  4.   char* ptr = cadena;
  5.  
  6.   printf("%s\n",ptr);
  7.   func(ptr);
  8.   printf("%s\n",ptr);
  9.   func(ptr);
  10.   printf("%s\n",ptr);
  11.   printf("%s\n",cadena);
  12. }

Salida:
Código bash:
Ver original
  1. una.prueba
  2. .prueba
  3.  
  4. una.prueba
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #8 (permalink)  
Antiguo 16/04/2016, 16:59
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 5 meses
Puntos: 204
Respuesta: problema con punteros dobles

Cita:
Iniciado por aguml
Sigo pensando que para hacer lo que quiere no necesita para nada un puntero doble ya que es un parámetro de salida donde se obtendrá una cadena y con un puntero simple en este caso tendría suficiente.
Código C:
Ver original
  1. void func(char* ptr);

Implementa la función de tal forma que al finalizar, ptr haya avanzado al primer punto que encuentre o, en su defecto, al final de la cadena.

Test:

Código C:
Ver original
  1. int main()
  2. {
  3.   char* cadena = "una.prueba";
  4.   char* ptr = cadena;
  5.  
  6.   printf("%s\n",ptr);
  7.   func(ptr);
  8.   printf("%s\n",ptr);
  9.   func(ptr);
  10.   printf("%s\n",ptr);
  11.   printf("%s\n",cadena);
  12. }

Salida:

una.prueba
.prueba

una.prueba
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.

Etiquetas: cadena, char, dobles, funcion, int, programa, punteros
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 18:21.