Duda sobre punteros

Iniciado por adissenys, 17 Noviembre 2012, 21:48 PM

0 Miembros y 1 Visitante están viendo este tema.

adissenys

Hola muy buenas,

Estoy trabajando en desarrollo de un juego y me encuentro con un problema de punteros el cual he simplificado en el siguiente ejemplo:

#include <stdio.h>
/**#include"Punter.h"**/

void Mvelocitats(int *A){
int tecla;

printf("1. Avanzado\n");

printf("2. Intermedio \n");

printf("3. Principiante \n");

printf("4. Salir\n");

printf("opcion: ");
       scanf("%d", &tecla);
       switch(tecla)
{
                   case 1: *A=1000;
       menu();
break;

   case 2: *A=2000;
menu();
break;
                   case 3: *A=3000;
menu();
break;
                   case 4:
menu();
break;

}
}
int main(){

menu();

}


int menu(){
int *A;
int tecla;

printf("1. Velocidad \n");

printf("2. Imprimir \n");

printf("opcion: ");
       scanf("%d", &tecla);
        switch(tecla)
{
                   case 1: Mvelocitats(&A);
break;


   case 2: Jugar(&A);
break;

}
}

int Jugar(int *A)
{
infolevel(A);
}

int infolevel(int *A){
printf("%d",*A);
getchar();
}


He pues el mismo numero de funciones y una estructura muy similar... y mi pregunta es: porque en la función INFOLEVEL no recibo el valor de A que nos establece MVELOCITATS, evidentemente no estoy aplicando bien las propiedades de los punteros, agradecería muchísimo si alguien pudiese echarme una mano.


Saludos compañeros!

Ferno

#1
Veo algunas cosas que me hacen ruido.

Primero que nada, en la función "menu" vos declaras un:

int* A;

Y está perfecto, pero lo que vos estás pasando a las demás funciones es, por ejemplo:

Mvelocitats(&A);

Por ende, estás pasando en realidad un int** (ya que le estás pasando la dirección de memoria donde se aloja el puntero, y NO la dirección de memoria donde se aloja el "int" al que hace referencia ese puntero. Es decir, estarías usando un puntero doble, y lo que en realidad cambias en esas funciones es la dirección de memoria donde apunta A).
Espero que eso se haya entendido, lo que debes hacer es pasar simplemente:

Mvelocitats(A);

Debido a que A ya es un PUNTERO (es decir, guarda una dirección de memoria) funcionarán las funciones anteriores.

Sin embargo, hay algo que no me cierra, y es que al llamar a Mvelocitats, en cada case lo que haces es llamar a la funcion menu() nuevamente. Y lo que haces con esto es que se te declare una variable "A" diferente cada vez, por ende, nunca podrás utilizar los valores que le asignaste a *A en, por ejemplo, la función Mvelocitats().
Una solución a esto sería declarar ese puntero a int en el main y pasarselo como parámetro a menu(), luego, utiliza la forma de llamar que te indiqué al principio.

Espero que haya quedado claro y se solucione!
Salúd!

adissenys

Hola, gracias en primer lugar por responderme tan rapidamente :D

Hago lo que me indica pero sigue sin funcionar:

#include <stdio.h>
/**#include"Punter.h"**/

void Mvelocitats(int *A){
int tecla;

printf("1. Avanzado\n");

printf("2. Intermedio \n");

printf("3. Principiante \n");

printf("4. Salir\n");

printf("opcion: ");
       scanf("%d", &tecla);
       switch(tecla)
{
                   case 1: *A=1000;
       menu();
break;

   case 2: *A=2000;
menu();
break;
                   case 3: *A=3000;
menu();
break;
                   case 4:
menu();
break;

}
}
int main(){
int *A;
menu(A);

}


int menu(int *A){

int tecla;

printf("1. Velocidad \n");

printf("2. Imprimir \n");

printf("opcion: ");
       scanf("%d", &tecla);
        switch(tecla)
{
                   case 1: Mvelocitats(A);
break;


   case 2: Jugar(A);
break;

}
}

int Jugar(int *A)
{
infolevel(A);
}

int infolevel(int *A){
printf("%d",*A);
getchar();
}


¿Lo estoy aplicando bien?

Saludos y gracias de nuevo.

Cita de: Ferno en 17 Noviembre 2012, 22:00 PM
Veo algunas cosas que me hacen ruido.

Primero que nada, en la función "menu" vos declaras un:

int* A;

Y está perfecto, pero lo que vos estás pasando a las demás funciones es, por ejemplo:

Mvelocitats(&A);

Por ende, estás pasando en realidad un int** (ya que le estás pasando la dirección de memoria donde se aloja el puntero, y NO la dirección de memoria donde se aloja el "int" al que hace referencia ese puntero. Es decir, estarías usando un puntero doble, y lo que en realidad cambias en esas funciones es la dirección de memoria donde apunta A).
Espero que eso se haya entendido, lo que debes hacer es pasar simplemente:

Mvelocitats(A);

Debido a que A ya es un PUNTERO (es decir, guarda una dirección de memoria) funcionarán las funciones anteriores.

Sin embargo, hay algo que no me cierra, y es que al llamar a Mvelocitats, en cada case lo que haces es llamar a la funcion menu() nuevamente. Y lo que haces con esto es que se te declare una variable "A" diferente cada vez, por ende, nunca podrás utilizar los valores que le asignaste a *A en, por ejemplo, la función Mvelocitats().
Una solución a esto sería declarar ese puntero a int en el main y pasarselo como parámetro a menu(), luego, utiliza la forma de llamar que te indiqué al principio.

Espero que haya quedado claro y se solucione!
Salúd!

Ferno

Claro, porque faltan algunas cosas que las pasé por encima por considerarlas implícitas :P

Cuando vos utilizas un puntero, como en este caso, debes asignarle algún espacio en la memoria para poder alojar lo que quieras almacenar. En este caso, como es un puntero a int, necesitas tener 4 bytes para dicho puntero.
Es decir, necesitás inicializar el puntero, y se hace con la función malloc(). Si no sabes lo que es memoria dinámica, te recomiendo que busques información sobre eso, porque va de la mano con el uso de punteros en la gran mayoría de los casos.

Una vez que le asignes memoria a dicho puntero (con la función malloc() como te dije, puedes buscar información en cualquier lado, hay demasiada), también te falta pasarle el parámetro a cada una de las llamadas a menu() en la función Mvelocitats(). (Llamas a menu() pero no le pasas la A como parámetro).

Nota: para usar malloc() tienes que incluir la librería standard stdlib.h