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

[SOLUCIONADO] ¿Se puede hacer un apuntador estático?

Estas en el tema de ¿Se puede hacer un apuntador estático? en el foro de C/C++ en Foros del Web. Bueno estoy haciendo un programa en el que tengo que hacer mi propia versión, de la función strtok de la librería string, y pues se ...
  #1 (permalink)  
Antiguo 17/04/2016, 04:50
 
Fecha de Ingreso: febrero-2015
Mensajes: 20
Antigüedad: 9 años, 9 meses
Puntos: 0
Pregunta ¿Se puede hacer un apuntador estático?

Bueno estoy haciendo un programa en el que tengo que hacer mi propia versión, de la función strtok de la librería string, y pues se sabe que solo la primera llamada a esa función recibe como primer parámetro la cadena que se descompondrá, ya las llamadas subsiguientes reciben NULL, y pues mi conflicto es ese.
Lo primero que se me ocurrio es crear un apuntador doble estático en la función para que guarde en la primera llamada a la función la cadena en cuestión y así prescindir del primer parámetro en las llamadas subsiguientes, manipulando el apuntador estático.

Código:
char *tokens(char *s1, const char *s2) ///Una secuencia de llamadas separa la cadena s1 en tokens, separados por caracteres contenidos en la cadena s2.
{
  static char **palabra = &s1;
  static int i = 0;
  
  	while(*(s1+i) != '\0' && *(s1+i) != *s2) ///recorre la cadena hasta encontrar la cadena s2 o el carácter nulo
  	  ++i;
  	if (*(s1+i) != '\0'){ ///si se encontró con la cadena de separación
  		*(s1+i) = '\0';
  		++i;
  	}
  
}
El código aun no esta completo, solo compile para ver si era posible hacerlo de esa forma, pero me tira el siguiente error en la línea de la declaración de la variable estática:

[Error] initializer element is not constant

¿No es posible hacerlo de la forma que pretendo?
Podría hacerlo si en todas las llamadas se pasará la cadena, ya que podría usar una variable estática como subíndice de la cadena e ir recorriendola en las llamadas subsiguientes, pero quiero que sea lo más parecida a la función original.

¿Alguna recomendación?
Gracias de antemano.
  #2 (permalink)  
Antiguo 17/04/2016, 12:02
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: ¿Se puede hacer un apuntador estático?

No te hace falta un puntero doble sino un puntero simple, ya que únicamente quieres memorizar una posición dentro del string.

Por otro lado, fíjate que los dos parámetros son const y tus punteros internos no son const... Deberían ser const también para respetar las propiedades de los parámetros.

La forma correcta de usar la variable estática es comprobar si el puntero s1 apunta a algo diferente de null. Si es así entonces haces que tú variable interna apunte a s1. En caso contrario evitas la inicialización. El resto del algoritmo es el mismo en ambos casos y se basa en trabajar con tu variable interna en vez de con s1.
__________________
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.
  #3 (permalink)  
Antiguo 17/04/2016, 14:24
 
Fecha de Ingreso: febrero-2015
Mensajes: 20
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: ¿Se puede hacer un apuntador estático?

He removido los const de los parámetros y me sigue saliendo el mismo error:

Código:
char *tokens(char *s1, char *s2) ///Una secuencia de llamadas separa la cadena s1 en tokens, separados por caracteres contenidos en la cadena s2.
{
  static char *palabra = s1;
Sin el modificador static, se compila sin ningún problema.
  #4 (permalink)  
Antiguo 17/04/2016, 15:29
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 9 meses
Puntos: 3
Respuesta: ¿Se puede hacer un apuntador estático?

Para inicializar un char* de ese modo más que quitar el const tendrías que ponerlo en los parámetros ya que tienes que inicializar lo con una constante. O eso o haces:
Código C++:
Ver original
  1. static char *palabra = (const char*) s1;
  #5 (permalink)  
Antiguo 17/04/2016, 18:45
 
Fecha de Ingreso: febrero-2015
Mensajes: 20
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: ¿Se puede hacer un apuntador estático?

No, tambien me siguio tirando el mismo error, lo hice de la siguiente forma y me funciono:

Código:
char *tokens(char *s1,const  char *s2) ///Una secuencia de llamadas separa la cadena s1 en tokens, separados por caracteres contenidos en la cadena s2.
{
  static char *palabra;
  static int i = 0;
  if (i == 0) ///primera llamada
    palabra = s1;
  else if (i == -1){ ///ultima llamada
    i = 0;
    return NULL;
  }
  char *cadena = (palabra+i);
  	while(*(palabra+i) != '\0' && *(palabra+i) != *s2) ///recorre la cadena hasta encontrar la cadena s2 o el caracter nulo
  	  ++i;
  	if (*(palabra+i) == *s2){ ///si se encontro con la cadena de separacion
  		*(palabra+i) = '\0'; ///convierte el caracter de separacion en caracter nulo
  		++i; ///y recorre subindice
  		return cadena;
  	}
  	else{
      i = -1;
  	  return cadena;
  	}
}
Aunque si inicializo el apuntador estático en su declaración me tira error el devc++, con codeblocks el programa compila y se ejecuta sin problemas, independientemente de si esté o no inicializada en la declaración.
Nose si sera culpa del devc++ o el codeblocks es mas flexible...
  #6 (permalink)  
Antiguo 17/04/2016, 19:40
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 9 meses
Puntos: 3
Respuesta: ¿Se puede hacer un apuntador estático?

Sinceramente para esas cosas no hace falta static para nada.
  #7 (permalink)  
Antiguo 17/04/2016, 20:39
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 22 años
Puntos: 52
Respuesta: ¿Se puede hacer un apuntador estático?

Cita:
Iniciado por braedu555 Ver Mensaje
Aunque si inicializo el apuntador estático en su declaración me tira error el devc++, con codeblocks el programa compila y se ejecuta sin problemas, independientemente de si esté o no inicializada en la declaración.
Nose si sera culpa del devc++ o el codeblocks es mas flexible...
Devcpp y codeblock son IDES, en nada tiene que ver con la compilacion del código.
Deberías revisar que compilador usas en cada caso.



Código C++:
Ver original
  1. static char *palabra = (const char*) s1;

Esto debería funcionar pero sin el const. Ya que técnicamente una variable no constante no puede almacenar una constante a menos que se haga un cast. Sin embargo, aquí el cast es al revés.

Cita:
Sinceramente para esas cosas no hace falta static para nada.
Tienes razón. Técnicamente una variable static es muy similar a una variable global, pero con acceso restringido y con una inicialización mas controlada. Sin embargo, en general conlleva la gran mayoría de los problemas que ocasiona el abusod e las variables globales.
  #8 (permalink)  
Antiguo 17/04/2016, 23:59
 
Fecha de Ingreso: febrero-2015
Mensajes: 20
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: ¿Se puede hacer un apuntador estático?

Bueno, el programa ya funciona sin necesidad de hacer ningún cast, No entiendo para que deberiá usar un cast, si en este caso no tengo ningún apuntador constante, tanto como el apuntador estático local como el primer parámetro de la función son de tipo char *, no comprendo de donde salio eso de hacer un cast a const, si aqui el unico apuntador constante es el del segundo parámetro...

Etiquetas: cadena, char, int, programa, string
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 11:37.