elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Matriz estática
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Matriz estática  (Leído 2,221 veces)
ricardo2013

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Matriz estática
« 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


En línea

NeoB

Desconectado Desconectado

Mensajes: 69


Ver Perfil
Re: Matriz estática
« Respuesta #1 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.


« Última modificación: 24 Octubre 2012, 21:49 pm por NeoB » En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: Matriz estática
« Respuesta #2 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
En línea

ricardo2013

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Matriz estática
« Respuesta #3 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

En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: Matriz estática
« Respuesta #4 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 )

« Última modificación: 25 Octubre 2012, 00:47 am por RHL » En línea

naderST


Desconectado Desconectado

Mensajes: 625



Ver Perfil WWW
Re: Matriz estática
« Respuesta #5 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.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda - Buscar si existe una matriz dentro de otra matriz
Programación Visual Basic
EddyW 2 5,843 Último mensaje 14 Agosto 2010, 06:18 am
por EddyW
Matriz Dentro de otra matriz
Programación Visual Basic
moba741120 3 6,763 Último mensaje 13 Abril 2011, 18:29 pm
por raul338
MATRIZ que imprima como una matriz en forma de cuadrado... ayudaaaaa!! help
Programación C/C++
oscarpy 3 8,531 Último mensaje 9 Abril 2012, 16:23 pm
por Xandrete
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines