• Martes 21 de Mayo de 2024, 02:48

Autor Tema:  Re: Duda con las variables STATIC y la función FindText  (Leído 2513 veces)

NEXTOR

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Duda con las variables STATIC y la función FindText
« en: Domingo 7 de Septiembre de 2003, 14:18 »
0
Hola.

Acabo de encontrarme con algo que no sabía. :question: A ver qué pensáis vosotros.

Dentro de una función de mi programa llamo a la función FindText para que aparezca el cuadro de diálogo no modal "Buscar". La función toma como argumento un puntero a una estructura FINDREPLACE. P.ej:

void miFuncion(){
...
       FindText(&findreplace);
}

Dado que el cuadro es no modal, la función FindText devuelve el control al programa inmediatamente y mi función también finaliza, y el cuadro de diálogo necesita seguir accediendo a la estructura por lo que, a mi parecer, lo más lógico es que la variable estructura debería ser GLOBAL. Sin embargo, me he encontrado en un libro que definen esta variable como STATIC dentro de la función:

void miFuncion(){

       static FINDREPLACE findreplace;
        ...
       FindText(&findreplace);
}

Ya se que la vida de una variable estática dura durante todo el programa, pero ¿no se supone que su alcance está confinado a mi función? ¿No se producirán errores al manipular la estructura desde fuera?

Por favor, si alguien lo sabe...

Gracias.
Néxtor

eduskan2002

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Duda con las variables STATIC y la función FindText
« Respuesta #1 en: Jueves 16 de Octubre de 2003, 16:54 »
0
Vamos a ver:excl:

   El codigo que propones es correcto porque como tu bien dices la variable estática dura durante tuda la vida del programa, de modo que el cuadro de dialogo puede serguir accediendo a la estructura una vez finalizada la funcion, porque tu le has pasado el puntero a la estructura.
Es decir, el cuadro de dialogo accede a una zona de memoria (que permanece) no accede a traves de la variable cuyo ambito a terminado

De todas formas esto no te serviría si tu quieres acceder a la estructura a no ser que pongas la variable como global.

Espero a verte aclarado el tema.:bravo:

NEXTOR

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Duda con las variables STATIC y la función FindText
« Respuesta #2 en: Jueves 12 de Febrero de 2004, 12:31 »
0
Muchas gracias por aclararme.

Y siento el retraso al contestar, hace que no entro en este foro... ¡Al final resulta que hay gente que sí que contesta :D ! :gracias:
Néxtor

shephiroth

  • Miembro activo
  • **
  • Mensajes: 30
    • Ver Perfil
Re: Duda con las variables STATIC y la función FindText
« Respuesta #3 en: Viernes 13 de Febrero de 2004, 00:01 »
0
Buenas. Otra solucion que puedes utilizar es hacer que la funcion te devuelva el puntero a la estructura en cuestion, de esta forma nunca perderías el acceso.

El codigo podría ser algo como:
Código: Text
  1.  
  2. FINDREPLACE* miFuncion(){
  3.  
  4. FINDREPLACE findreplace;
  5. ...
  6. FindText(&findreplace);
  7. return &findreplace;
  8. }
  9.  
  10.  

Respecto ha si hay gente que responde, tiendo a pensar que cuando la gente lo sabe responde, si nadie responde es pq nadie sabe xDD.

NEXTOR

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Duda con las variables STATIC y la función FindText
« Respuesta #4 en: Viernes 13 de Febrero de 2004, 11:36 »
0
:hola: Hola Sephi, gracias por contestar.

En el código que propones habría que añadir STATIC a la variable estructura, de lo contrario al salir de la función el espacio en memoria se reutilizaría para otras variables y el programa fallaría :blink: . De todas formas mi dudilla era si Windows podría seguir usando esa estructura para su cuadro de diálogo no modal de Buscar Texto, a mí no me haría falta la estructura.

Y volviendo al tema de si la gente responde, supongo que también hay mucha gente que sabe las cosas pero por pereza (a veces justificada, cuando se contesta siempre a la misma pregunta) no responde.

Saludines.
Néxtor

shephiroth

  • Miembro activo
  • **
  • Mensajes: 30
    • Ver Perfil
Re: Duda con las variables STATIC y la función FindText
« Respuesta #5 en: Viernes 13 de Febrero de 2004, 23:18 »
0
Buenas. Lo de la pereza no lo habia pensado xDD.

Lo que me comentas, en ningun caso esa memoria se reutilizaría, puesto que la funcion devuelve la estructura. En todo caso habría que adaptar el principal para que recoja la estructura de forma que no se pierda. Pero bueno, lo que quieras.

En todo caso, si como comentas no quieres acceder a ella para nada, no hace falta que guardes la estructura. Ten encuenta que en C no existe recolector de basura como en java (para quienes no sepan de lo que hablo, en java hay un recolector que elimina las zonas de memoria usadas A LAS QUE NO SE HACE REFERENCIA), por lo que la estructura en cuestion no desaparecería de memoria hasta que ella misma se elimine.

NEXTOR

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Duda con las variables STATIC y la función FindText
« Respuesta #6 en: Sábado 14 de Febrero de 2004, 10:41 »
0
Hola, Sephi.

Gracias por tu ayuda pero... ¿estás seguro de lo que dices? :huh:

Según mis conocimientos de toda la vida de C, cuando en una función se declara una variable LOCAL (o sea, que no es static), en este caso la estructura "findreplace", la vida de esta variable (y por lo tanto su espacio en memoria) termina cuando acaba la función. Nosotros, antes de terminar pasamos un puntero a ese espacio en memoria, si, pero desde fuera si accedemos a ese espacio a través de este puntero podemos obtener cualquier cosa ya que cualquier otra función ha podido disponer de ese espacio para establecer sus variables en un momento dado. Otra cosa muy distinta es que, en un programa en particular y por casualidad, ese espacio en memoria no llegue a ser alterado hasta el momento de usar el puntero, pero no dejaría de ser un programa imprevisible.

De hecho, el libro de donde saqué el ejemplo ("Programación en Windows 95" de Charles Petzold) define la variable como static (vida de la variable hasta que finaliza el programa).

Un saludo. :hola:
Néxtor