Foros del Web » Programación para mayores de 30 ;) » C/C++ »

problema con punteros en c++

Estas en el tema de problema con punteros en c++ en el foro de C/C++ en Foros del Web. tengo mi main @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C: Ver original int main ( void ) {     int  dato ;       /* elemento ...
  #1 (permalink)  
Antiguo 17/09/2013, 19:56
 
Fecha de Ingreso: septiembre-2010
Mensajes: 101
Antigüedad: 13 años, 7 meses
Puntos: 0
problema con punteros en c++

tengo mi main

Código C:
Ver original
  1. int main (void){
  2.     int  dato;       /* elemento a ingresar en la pila               */
  3.     int  pila [TAM]; /* vector donde se almacena los elem.de la pila */
  4.     int *tope=pila+TAM;  /* dir. del próximo elem. a ingresar en la pila */
  5.     /* Carga la pila hasta que se llene o ingrese un cero */
  6.    
  7.     printf("ingrese un número distinto a 0: ");
  8.     scanf("%d",&dato);
  9.     while(dato!=0 && !pilallena(tope, pila)){
  10.         apilar(dato,tope);
  11.         printf("ingrese un número distinto a 0: ");
  12.        
  13.         scanf("%d",&dato);
  14.  
  15.        
  16.     }
  17.  
  18. }




el problema esta en la condicion del main
no puedo modifciarlo al programa, solo tuve que sacar las variables globles

el error esta en pila llena
que aca la dejo
Código C:
Ver original
  1. int pilallena(int *tope , int pila[]){
  2.    
  3.  
  4.     return(tope==pila)?1:0;
  5. }


ese return siempre me trae 0 y no entiendo porque si las direcciones de memoria son iguales

le muestro apilar por las dudas

Código C:
Ver original
  1. void apilar(int dat, int *tope){   
  2.     tope--;
  3.     *tope=dat;
  4. }
  #2 (permalink)  
Antiguo 19/09/2013, 01:22
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 10 meses
Puntos: 73
Respuesta: problema con punteros en c++

El problema lo tienes, precisamente, en la función apilar. En C, cuando llamas a una función pasando parámetros, lo que ocurre es que esa función va a trabajar con una copia del valor del parámetro original. Así, si necesitas modificar el valor de una variable dentro de la función, no pasas la variable (dentro de la función se modificaría la copia, y el nuevo valor se perderá al salir de la función). Lo que pasas es la dirección de esa variable, y a través de ella puedes modificar su contenido. Con el parámetro tope (puntero a entero) ocurre lo mismo: La función ha recibido una copia del puntero tope, lo que modificas dentro de esa función realmente es la copia del puntero, y la modificación se pierde al finalizar la función. Por eso la función pilallena siempre devuelve cero. Para solucionarlo, tienes dos opciones:

1. Pasar la dirección del puntero (es decir, con un puntero a puntero).
2. Eliminar tope de la lista de parámetros y trabajar con tope como variable global.

Así, la función apilar quedaría (para el primer caso):

Código C:
Ver original
  1. void apilar(int dat, int **ptrTope)
  2. {    
  3.     *ptrTope--;     // Decrementas lo apuntado por ptrTope, que es el puntero tope
  4.     **ptrTope=dat;  // Asignas valor a lo apuntado por lo apuntado por ptrTope
  5. }

Por cierto, que en tu función pilallena bastaría con poner return (tope == pila), y para ello no necesitas llamar a una función, simplemente comprueba en la condición del bucle while si tope y pila son distintos:

while( (dato != 0) && (tope != pila) )

y, cuando hagas comparaciones entre condiciones lógicas (como es este caso), conviene poner cada condición entre paréntesis, si no puede haber ocasiones en que el orden de precedencia de las operaciones te juegue malas pasadas.

Saludos,
  #3 (permalink)  
Antiguo 19/09/2013, 02:31
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 11 años, 9 meses
Puntos: 28
Respuesta: problema con punteros en c++

Código C++:
Ver original
  1. int pilallena(int *tope , int pila[])
  2. {
  3.     return(tope==pila)?1:0;
  4. }

Esto se puede resumir a:

Código C++:
Ver original
  1. bool pilallena(int *tope , int pila[])
  2. {
  3.     return tope==pila;
  4. }

Etiquetas: int, programa, punteros
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:44.