Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: APOKLIPTICO en 21 Diciembre 2010, 03:36 am



Título: [SOLUCIONADO] Problema con punteros como argumentos.
Publicado por: APOKLIPTICO en 21 Diciembre 2010, 03:36 am
Hola gente, como anda todo?
Miren, tengo un problema que le vengo dando vueltas hace bastante y no se como hacer para resolverlo.

Declaré un puntero tipo unsigned long, y lo pasé a una función. En esa función, utilizando el operador new, cree un array de unsigned longs y los llené de ceros con ZeroMemory.
Luego trabajé con dicho puntero, ahora, cuando quiero utilizar el array inicial (utilizando el puntero), no me deja, parece como si la memoria jamás hubiese sido allocada.

Este es el código en cuestión:
Código
  1. int main()
  2. {
  3.    unsigned long *Arg1= 0, *Arg2= 0;
  4.    Precalc(24,20, Arg1, Arg2);
  5.    cout << (int) Arg1<< endl << (int) Arg1<< endl;
  6.    return 0;
  7. }
  8.  
  9. void Precalc(unsigned int inbits, unsigned int outbits, unsigned long *Arg1, unsigned long *Arg2)
  10. {
  11.    unsigned long iSpace = pow(2, inbits);
  12.    unsigned long ideSpace = pow(2, outbits);
  13.    unsigned long nModulus = pow(2, inbits);
  14.    Arg1= new unsigned long[iSpace];
  15.    Arg2= new unsigned long[ideSpace];
  16.    if(!Arg1|| !Arg2) return;
  17.    ZeroMemory(Arg1, iSpace*4);
  18.    ZeroMemory(Arg2, ideSpace*4);
  19.    //Más código donde se modifican los arrays Arg1 y Arg2
  20. }
  21.  

Esto devuelve "0" y "0". Si trato de trabajar con los arrays afuera de las funciones, me da un error de segmentación (Null pointer).

Alguien sabe que sucede??
Muchas gracias!
APOKLIPTICO


Título: Re: Problema con punteros como argumentos.
Publicado por: pucheto en 21 Diciembre 2010, 03:53 am
Código
  1. void Precalc(unsigned int inbits, unsigned int outbits, unsigned long* &Arg1, unsigned long* &Arg2)
  2. {
  3.    unsigned long iSpace = pow(2, inbits);
  4.    unsigned long ideSpace = pow(2, outbits);
  5.    unsigned long nModulus = pow(2, inbits);
  6.    Arg1= new unsigned long[iSpace];
  7.    Arg2= new unsigned long[ideSpace];
  8.    if(!Arg1|| !Arg2) return;
  9.    ZeroMemory(Arg1, iSpace*4);
  10.    ZeroMemory(Arg2, ideSpace*4);
  11.    //Más código donde se modifican los arrays Arg1 y Arg2
  12. }
  13.  
Lo que vos queres pasarle a tu funcion es una referencia a puntero o un puntero a puntero... estas pasando el puntero por copia, entonces cuando sale de la funcion la copia (que es lo q modificaste) desaparece.