Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: josephb401 en 27 Abril 2016, 03:39 am



Título: Pointers
Publicado por: josephb401 en 27 Abril 2016, 03:39 am
Hola! creen que alguien que sepa mucho de pointers me podria decir que estoy hasiendo mal en esta funcion creo que esta cojiendo la memoria de donde no deviera espero alguien puda ayudarme solo voy a poner la function aqui si quieren el codigo completo dejenme saber

Código:
void reverse(int *arrayPtr, int size)
{
// Complete this function
int *arrayPtr2 = nullptr;

arrayPtr2 = new int[size];

for (int i = 0; i < size; i++)
{
// when the loop starts put the arrayPtr in the last spot
if (i == 0)
for (int j = 0; j < size; j++)
arrayPtr++;

*arrayPtr2 = *arrayPtr;

arrayPtr--;
arrayPtr2++;

if (i == (size - 1) )
{

for (int k = 0; k < size; k++)
arrayPtr2--;

for (int l = 0; l < size; l++)
{
*arrayPtr = *arrayPtr2;

arrayPtr++;
arrayPtr2++;
}
}
}

delete arrayPtr2;
}


Título: Re: Pointers
Publicado por: crack81 en 27 Abril 2016, 04:38 am
Hola no entiendo que quieres hacer, detalla mejor tu pregunta ya que tu codigo no es muy claro.

Si lo que quieres es invertir un arreglo de enteros una forma podria ser esta:

Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. void reverseArray(int *arreglo, int tamano){
  5.    int *temp=new int[tamano];
  6.    int pos=0;
  7.  
  8.    for(int i=0;i<tamano;i++) //Copiamos el arreglo
  9.        temp[i]=arreglo[i];
  10.  
  11.    for(int j=tamano-1;j>=0;j--, pos++)  //Lo invertimos
  12.        arreglo[pos]=temp[j];
  13.  
  14.    delete[] temp;  //Liberamos la memoria
  15. }
  16.  
  17. void imprimirArreglo(int *arreglo,int tamano){
  18.    for(int i=0;i<tamano;i++)
  19.        cout<<arreglo[i]<<" ";
  20.    cout<<endl;
  21. }
  22.  
  23.  
  24. int main()
  25. {
  26.    int arreglo[]={1,2,3,4,5,6,7,8,9,10,12,13};      //Definiamos el arreglo
  27.    int tamano=sizeof(arreglo)/sizeof(int); //Tamano del arreglo
  28.  
  29.    imprimirArreglo(arreglo,tamano);
  30.    reverseArray(arreglo,tamano);
  31.    imprimirArreglo(arreglo,tamano);
  32.  
  33.    return 0;
  34. }
  35.  

Saludos...


Título: Re: Pointers
Publicado por: HardForo en 27 Abril 2016, 05:09 am
Otra forma es intercambiar el ultimo por el primero, el 2 por el N-2,.... el i por el N-i hasta que se crucen los punteros.

Creo intentó hacer eso pero en tal caso es innecesario crear otro arreglo


Título: Re: Pointers
Publicado por: MAFUS en 27 Abril 2016, 15:33 pm
La idea es buena, pero vamos a ver los fallos.
Creas un array dinámico para alojar la inversa del array que pasas y te mueves en él mediante aritmética de punteros, haciendo que el puntero mismo vaya variando. Cuándo lo quieres liberar con delete has perdido el puntero original que apunta al inicio de bloque con lo que fallas. La solución es crear un puntero permanente que guarde esa posición y usar otro para moverte por el array, tal que así:

Código
  1. arrayPtr2 = new int[size];
  2. arrayPtr2pointer = arrayPtr2;

Ahora usas uno para moverte como te movías y el otro para liberar con delete.

Para llevar arrayPtr hasta el final hazlo con una simple operación, así quitas código y tiempo de proceso:
En vez de
Código
  1. if (i == 0)
  2.    for (int j = 0; j < size; j++)
  3.        arrayPtr++;
usa
Código
  1. arrayPtr += size-1;

La orden para eliminar un array es mediante
Código
  1. delete [] identificardor_de_array
y no con
Código
  1. delete identificador_de_array

Las órdenes para preparar el array arrayPtr y para realizar la copia del arrayPtr2 al arrayPtr sácalas del bucle de generación del arrayPtr2. Son trabajos diferentes.

La función debería quedarte algo como esto:
Código
  1. void reverse(int *arrayPtr, int size) {
  2.    int *arrayPtr2pointer = new int[size];
  3.    int *arrayPtr2 = arrayPtr2pointer;
  4.  
  5.    arrayPtr += size - 1;
  6.    for (int i = 0; i < size; i++) {                
  7.        *arrayPtr2 = *arrayPtr;
  8.        arrayPtr--;
  9.        arrayPtr2++;
  10.    }
  11.  
  12.    arrayPtr++;  // Necesario porque en el último bucle se actualizan estos dos punteros
  13.    arrayPtr2--;  // y sobrepasan los limites. Hay que regresarlos a su lugar.
  14.  
  15.    arrayPtr2 = arrayPtr2pointer;
  16.    for (int i = 0; i < size; i++) {
  17.        *arrayPtr = *arrayPtr2;
  18.        arrayPtr++;
  19.        arrayPtr2++;
  20.    }
  21.    delete [] arrayPtr2pointer;
  22. }

Si la función no es para estudiar punteros, ni memoria dinámica y es solamente para invertir un array puedes dejar a un lado todo esto y usar código más normal.

Incluye en tu código lo siguiente:
Código
  1. #define SWAP(X,Y) { \
  2.     (X) ^= (Y); \
  3.     (Y) ^= (X); \
  4.     (X) ^= (Y); \
  5. }
  6.  
  7. #define ARRAY_LENGTH(X) sizeof(X)/sizeof(X[0])
  8.  
  9. void reverse(int array[], size_t size) {
  10.    int i;
  11.    for(i = 0; i < size / 2; ++i) {
  12.        SWAP(array[i], array[size - i - 1]);
  13.    }
  14. }


Título: Re: Pointers
Publicado por: HardForo en 27 Abril 2016, 19:59 pm
En cuanto al tema de la funcion swap, se puede lograr lo mismo con sumas y restas.


Título: Re: Pointers
Publicado por: josephb401 en 27 Abril 2016, 21:56 pm
muchas gracias a todos por ayudarme a resolver el problema