Ver Mensaje Individual
  #2 (permalink)  
Antiguo 19/09/2013, 01:22
Fw190
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 11 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,