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

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


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

Desconectado Desconectado

Mensajes: 15


Ver Perfil
Pointers
« 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;
}


En línea

crack81

Desconectado Desconectado

Mensajes: 222



Ver Perfil
Re: Pointers
« Respuesta #1 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...


En línea

Si C/C++ es el padre de los lenguajes entonces ASM es dios.
HardForo

Desconectado Desconectado

Mensajes: 219


HardForo.com


Ver Perfil WWW
Re: Pointers
« Respuesta #2 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
En línea

HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Pointers
« Respuesta #3 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. }
En línea

HardForo

Desconectado Desconectado

Mensajes: 219


HardForo.com


Ver Perfil WWW
Re: Pointers
« Respuesta #4 en: 27 Abril 2016, 19:59 pm »

En cuanto al tema de la funcion swap, se puede lograr lo mismo con sumas y restas.
« Última modificación: 28 Abril 2016, 00:53 am por boctulus » En línea

HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *
josephb401

Desconectado Desconectado

Mensajes: 15


Ver Perfil
Re: Pointers
« Respuesta #5 en: 27 Abril 2016, 21:56 pm »

muchas gracias a todos por ayudarme a resolver el problema
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Pointers & Offsets
Ingeniería Inversa
calk9 8 12,519 Último mensaje 13 Diciembre 2011, 04:40 am
por calk9
frame pointers?
Programación General
aixeiger 2 2,457 Último mensaje 21 Marzo 2013, 17:55 pm
por aixeiger
VB.NET PointerWrite pointers LVL4
Programación Visual Basic
jonnyHS 6 5,969 Último mensaje 9 Octubre 2013, 23:45 pm
por jonnyHS
4 pointers?
Ingeniería Inversa
nevachana 4 2,615 Último mensaje 26 Diciembre 2015, 18:02 pm
por nevachana
Pointers.duda
Programación C/C++
astroman20 1 1,895 Último mensaje 11 Agosto 2017, 12:25 pm
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines