Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ricardo2013 en 24 Octubre 2012, 20:40 pm



Título: Matriz estática
Publicado por: ricardo2013 en 24 Octubre 2012, 20:40 pm
Código
  1. #include <iostream>
  2.  
  3. int main()
  4. {
  5.    const int i = 2;
  6.    static char cadena[i];
  7.    return 0;
  8. }
  9.  

El error:
Código:
error: storage size of ‘cadena’ isn’t constant

¿Por qué me da este error? Sin embargo si quito el static, no da error.

El motivo de querer que sea static es para hacer algo similar a esto:

Código
  1.    char *Clase::obtenerNombre(char * nombre) const {
  2.        if (m_nombre) {
  3.            const int len = strlen(m_nombre)+1;
  4.            static char nom[len];
  5.            strcpy(nom, m_nombre);
  6.            nombre = nom;
  7.            return nombre;
  8.        }
  9.    }
  10.  

m_nombre es un atributo de la clase "Clase" y que está definido de la siguiente forma:
Código
  1. char *m_nombre;
  2.  

Defino el array nom estático, para que el usuario de la clase no tenga que preocuparse de liberar memoría con delete. Estoy obligado a usar char * y no std::string.

Gracias de antemano


Título: Re: Matriz estática
Publicado por: NeoB en 24 Octubre 2012, 21:38 pm
No entiendo por que hacerlo estático. Es mas, si no lo haces estático, se liberará la memoria al salir de la función automáticamente y no lo tendrás que hacer, no?
Perdona si no he interpretado bien tu mensaje.


Título: Re: Matriz estática
Publicado por: x64core en 24 Octubre 2012, 22:41 pm
Necesitas un valor constante:
Código:
     const int a = 5;
     char b[a];

las variables locales se eliminan automaticamente


Título: Re: Matriz estática
Publicado por: ricardo2013 en 25 Octubre 2012, 00:05 am
Muchas gracias a los dos por la ayuda.

ya he visto el error, me he hecho un lío espantoso,  el problema está que no puedo usar strlen para iniciar el array estático, ya que el tamaño se calcula en tiempo de ejecución (strlen) y hay que fijarlo  en tiempo de compilación, de ahí que precise una constante.

NeoB, el hacerlo static es para no tener que usar new y memoria dinámica, ya que si lo utilizo, fuera del método hay que usar delete explícitamente.

Hay un error en mi primer post, era así el código que compile:
Código
  1. #include <iostream>
  2. #include <cstring>
  3. int main()
  4. {
  5.    const int i = strlen("prueba");
  6.    static char cadena[i];
  7.    return 0;
  8. }
  9.  

Un saludo



Título: Re: Matriz estática
Publicado por: x64core en 25 Octubre 2012, 00:33 am
Declarando como Static no tiene que ver nada con new y delete ni memoria dinamica, si declaras una variable como static
esa variable mantiene su valor entre multiples llamadas y es eliminada solo cuando el programa termina, como dije
las variables locales se eliminan automáticamente cuando de retorna de la funcion a las que pertenecen, estas confundido.

acerca de hacer un array dinamico local es posible, pero no seria portable, algunos compiladores lo permiten pero otros no,
así igual que hacerlo con ensamblador en linea, eso es posible pero tu codigo no seria portable.
pero si te interesa hacer como digo, aquí esta el codigo:


int function(int param1 , int param2)
{
   ULONG l = strlen("test");
   VOID* lps = 0;

   __asm mov eax,l
   __asm sub esp,eax
   __asm mov eax,esp
   __asm mov lps,eax

   // ahora lps apunta a tu array dinamico local


}


PD:
recuerda eliminarlo antes del marco de la pila ( si indicaste al compilador que lo hiciera )



Título: Re: Matriz estática
Publicado por: naderST en 25 Octubre 2012, 03:16 am
El calificador static declara la variable como global, pero solo será visible por el bloque donde se declaró. En C/C++ debes definir un tamaño constante a los arreglos globales.