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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


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

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Duda sobre punteros
« en: 17 Noviembre 2012, 21:48 pm »

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:

Código:
#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!


« Última modificación: 17 Noviembre 2012, 22:40 pm por adissenys » En línea

Ferno


Desconectado Desconectado

Mensajes: 375


Ver Perfil
Re: Duda sobre punteros
« Respuesta #1 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:

Código
  1. int* A;

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

Código
  1. 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:

Código
  1. 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!


« Última modificación: 17 Noviembre 2012, 22:02 pm por Ferno » En línea

adissenys

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: Duda sobre punteros
« Respuesta #2 en: 17 Noviembre 2012, 22:42 pm »

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

Hago lo que me indica pero sigue sin funcionar:

Código:
#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.

Veo algunas cosas que me hacen ruido.

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

Código
  1. int* A;

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

Código
  1. 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:

Código
  1. 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!
En línea

Ferno


Desconectado Desconectado

Mensajes: 375


Ver Perfil
Re: Duda sobre punteros
« Respuesta #3 en: 17 Noviembre 2012, 22:59 pm »

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
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
duda sobre punteros
Ejercicios
maryrisas 1 4,120 Último mensaje 23 Febrero 2006, 17:59 pm
por [[JONAS]]
[AYUDA] Sobre APIs y Punteros [VB.NET]
.NET (C#, VB.NET, ASP)
Grave 1 4,151 Último mensaje 11 Enero 2009, 19:33 pm
por Mace Windu
[C] - Duda punteros
Programación C/C++
h0oke 2 2,594 Último mensaje 23 Mayo 2010, 02:19 am
por h0oke
[duda] sobre punteros y signed
Programación C/C++
AlxSpy 6 3,570 Último mensaje 9 Enero 2011, 20:13 pm
por AlxSpy
Duda, Sobre mi code de vector de punteros
Programación C/C++
anonimo12121 2 2,043 Último mensaje 21 Febrero 2013, 11:19 am
por anonimo12121
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines