2010-03-22 11 views
5

Estoy editando un código, que es parte de un proyecto grande, que usa "const" para inicializar un conjunto de matrices. Como quiero parametrizar estos const, tengo que adaptar el código para usar "malloc" para asignar la memoria. Desafortunadamente hay un problema con las estructuras: no puedo asignar memoria dinámica en la estructura misma. Hacerlo afuera causaría mucha modificación del código original.Memoria dinámica dentro de una estructura

Aquí hay un pequeño ejemplo:

int globalx,globaly; 
struct bigStruct{ 
    struct subStruct{ 
      double info1; 
      double info2; 
      bool valid; 
    }; 
    double data; 

    //subStruct bar[globalx][globaly]; 
    subStruct ** bar=(subStruct**)malloc(globalx*sizeof(subStruct*)); 
    for(int i=0;i<globalx;i++) 
      bar[i]=(*subStruct)malloc(globaly*sizeof(subStruct)); 


}; 
int main(){ 
    globalx=2; 
    globaly=3; 
    bigStruct foo; 
    for(int i=0;i<globalx;i++) 
      for(int j=0;j<globaly;j++){ 
        foo.bar[i][j].info1=i+j; 
        foo.bar[i][j].info2=i*j; 
        foo.bar[i][j].valid=(i==j); 
      } 

    return 0; 
} 

Nota: en el código del programa estoy editando globalx y globaly eran de const en un espacio de nombres especificado. Ahora eliminé el "const" para que puedan actuar como parámetros que se establecen exactamente una vez.

Resumido: ¿Cómo puedo asignar correctamente la memoria para el substruct dentro de la estructura? ¡Muchas gracias!

Max

+3

¿Estás seguro de que esto es 'C++' y no 'c'? –

+2

** No ** utilice 'malloc' o' free' en los objetos. El constructor y el destructor no serán llamados. Use 'new' y' delete' – Yacoby

+0

Eso es lo que se llama mal estilo C++. Niños, nunca lo hagan –

Respuesta

4

Es este código C o C++. Las etiquetas dicen C++ pero el código se ve exactamente como C. ¿Por qué estás usando malloc en lugar de new?

Para responder a su pregunta. Dale a la estructura un constructor para asignar la memoria y un destructor para eliminarla.

Recuerde, en C++ la única diferencia entre clases y estructuras es que los miembros son privados por defecto en una clase y públicos por defecto en una estructura.

+0

Ustedes están en lo cierto . Cambiar la estructura a una clase y usar un constructor hace el truco. De esta manera tengo que agregar cambios mínimos al código. – Maximilien

+0

@Maximilien, ni siquiera tiene que cambiarlo a una clase. las estructuras pueden tener constructores y destructores. Solo agregar un constructor/destructor a su estructura funcionará. (siempre que esto sea C++ y no código C, obviamente) – Glen

1

Use constructores para hacer toda la inicialización (incluyendo la asignación de memoria), y destructores para liberar memoria. Y no use malloc ya que ha etiquetado su pregunta con la etiqueta C++. malloc solo asigna la memoria, no inicializa los objetos. El siguiente ejemplo muestra cómo podría verse en C++:

struct bigStruct{ 
    struct subStruct{ 
      double info1; 
      double info2; 
      bool valid; 
    }; 

    // constructor 
    bigStruct(size_t num_of_subs) : bar(num_of_subs) 
    { 
    } 
    // destructor 
    ~bigStruct() 
    { 
    }   


protected: 
    double data;  
    std::vector<subStruct> bar; 
}; 
+0

Esto se ve bien, pero como no quiero modificar una gran cantidad de código no puedo usar vectores, así que tengo que usar una matriz bidimensional .. – Maximilien

6

Sospecho que tiene poca experiencia con C++. La solución lógica es asignar la memoria en el constructor . Sería bastante complejo comenzar a enseñar C++ desde ese nivel aquí.

0

Puede hacer una función initialize_bigStruct() y usarla después de cada definición de bigStruct. Deberá modificar su código con simple búsqueda/reemplazo.

Agregar funciones no está permitido en C, sin embargo, si está usando C++ es una historia completamente diferente.

0
int globalx,globaly; 
typedef struct subStruct{ 
     double info1; 
     double info2; 
     char valid; 
}subStruct; 
struct bigStruct{ 
    struct subStruct ** bar; 
    double data; 
}; 
/*Don't bother sending gl.. var since they are global*/ 
void alloc_struct(struct bigStruct *foo) 
{ 
    int i; 
    foo->bar=(subStruct**)malloc(globalx*sizeof(subStruct*)); 
    for(i=0; i<globalx; i++) 
    { 
     foo->bar[i]=(subStruct*)malloc(globaly*sizeof(subStruct)); 
    } 
} 
int main(){ 
    int i,j; 
    globalx=2; 
    globaly=3; 
    struct bigStruct foo; 
    alloc_struct(&foo); 
    for(i=0;i<globalx;i++) 
      for(j=0;j<globaly;j++){ 
        foo.bar[i][j].info1=i+j; 
        foo.bar[i][j].info2=i*j; 
        foo.bar[i][j].valid=(i==j); 
      } 
    return 0; 
} 

Sólo una sugerencia en C donde tiene que llamar a una función ya que no puede utilizar malloc dentro de una estruc como tú, donde intentar.

Cuestiones relacionadas