• Sábado 20 de Abril de 2024, 06:12

Autor Tema:  Declaraciones C++  (Leído 2711 veces)

Carlota

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Declaraciones C++
« en: Jueves 19 de Agosto de 2010, 20:29 »
0
Hola! Soy nueva en el foro... dejo este ejercicio bastante corto que consiste en realizar declaraciones, pero me he quedadado atrapada >.<

a) Un tipo enumerado que se llame logico y tenga como posibles valores las constantes V y F
int logico(int V, int F);

b) Una variable f como un puntero a funcion, (funcion que recibe un puntero a un entero y una matriz de caracteres de 2 filas y 3 columnas y no devuelva nada).
void *(pf)(*int, m[2][3]);

c) Una variable v como un vector de 10 punteros a entero.
int *v[10];

d) Una variable p-v como un puntero a un vector de 8 punteros a float.
float *( *(p-v)[8] );

e) Una variable c como una cadena de caracteres que pueda contener una cadena de longitud 10.
char cad[10], c[cad];

No se si esta regular o muy mal, pero me gustaria saber resolverlo para aclarar mis dudas.

Gracias de antemano!

czealt

  • Miembro activo
  • **
  • Mensajes: 28
    • Ver Perfil
Re: Declaraciones C++
« Respuesta #1 en: Viernes 20 de Agosto de 2010, 08:36 »
0
Hola, bueno las respuestas correctas

EI: NO SE HACEN TAREAS

Carlota

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Declaraciones C++
« Respuesta #2 en: Sábado 21 de Agosto de 2010, 01:23 »
0
Como va a ser una tarea si no estan las facultades abiertas en verano??... es un ejercicio que no se resolver :S

EI: no en todo el mundo es verano  :rolleyes:

Tan solo queria que me dijerais si las soluciones se encaminan a lo que he escrito y que me dierais alguna aclaracion de como habeis llegado a las soluciones para saber hacer mas ejercicios como este...

czealt

  • Miembro activo
  • **
  • Mensajes: 28
    • Ver Perfil
Re: Declaraciones C++
« Respuesta #3 en: Sábado 21 de Agosto de 2010, 02:24 »
0
Citar
La regla del derecha-izquierda
Esta regla les puede servir para interpretar declaraciones de punteros complejas. La regla dice lo siguiente:
Comenzá leyendo la declaración desde nombre que está en el parentesis más interno, despues leé a la derecha y despues a la izquierda. Luego, cuando termines de leer el parentesis,
saltar hacia afuera y comenzar leyendo de derecha a izquierda nuevamente. Continuar hasta que toda la declaración haya sido leida.

Vamos con un ejemplo:

int * (* (*fp1) (int) ) [10];
Esto puede ser interpretado de la siguiente manera:

1.Comienzo por el nombre de la variable --------------------------- fp1
2.Nada a la derecha, voy a la izquierda y leo * ------------------- es un puntero
3.Salto fuera del parentesis y encuentro (int) --------------------- a una función que recibe un entero
4.Voy a la izquierda y leo * ---------------------------------------------- y retorna un puntero
5.Salto fuera del parentesis, voy a la derecha y leo [10] ----- a un array de 10
6.Voy a la izquierda y leo * --------------------------------------------- punteros
7.Voy a la izquierda y leo int ------------------------------------------- a enteros.
Aca hay otro ejemplo más complicado:

int *( *( *arr[5])())();
1.Comienzo por el nombre de la variable --------------------- arr
2.Voy a la derecha y encuentro un array --------------------- es un array de 5
3.Voy a la izquierda y encuentro * ------------------------------ punteros
4.Salta fuera del parentesis, a la derecha leo () ----------- a funciones
5.A la izquierda leo * ------------------------------------------------ que retornan punteros
6.Fuera del parentesis, a la derecha encuentro () --------- a funciones
7.A la izquierda encuentro * --------------------------------------- que retornan punteros
8.A la izquierda leo int --------------------------------------------- a int's.

Fuente: Wikipedia

Carlota

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Declaraciones C++
« Respuesta #4 en: Jueves 26 de Agosto de 2010, 22:08 »
0
Le he estado dando muchas vueltas al mensaje que has dejado aqui sobre wikipedia y la verdad esque a lo unico que he podido llegar es a esto:

a) int logico (int v, int f);

b) void *(fp)(int *, m[2][3]);

c) int * v[10]

d) float * (*(p-v) v) [8]

e) char c[10]

Me diras que no lo he cambiado mucho, pero esque con lo que me has dejado no soy capaz de hacer mas nada... no se donde encontrar informacion sobre declaraciones asi con tipos enumerados, vectores o cadenas :(
Al menos espero que haya alguna declaracion bien T_T

czealt

  • Miembro activo
  • **
  • Mensajes: 28
    • Ver Perfil
Re: Declaraciones C++
« Respuesta #5 en: Viernes 27 de Agosto de 2010, 02:21 »
0
mmmm ya, pondre varios ejemplos similares a los ejercicios que pusiste al principio de modo que puedas resolverlos más facilmente.

1. tipos enumerados

// Declaración del tipo enumerado 'Color' con los valores posibles 'Amarillo', 'Azul', 'Rojo', 'Blanco' y 'Verde'.
typedef enum{Amarillo, Azul, Rojo, Blanco, Verde} Color;

// Declaración del tipo enumerado 'Día'
typedef enum{Domingo, Lunes, Martes, Miercoles, Jueves, Viernes, Sabado} Dia;

2. punteros a funciones

 Para comenzar, de nuevo la regla:

 "Comenzar leyendo la declaración desde el nombre que esta en el parentesis mas interno, despues lee a la derecha y despues a la izquierda. Luego cuando termines de leer el parentesis, saltar hacia afuera y comenzar leyendo de derecha a izquierda nuevamente. Continuar hasta que toda la declaración haya sido leida".

faltaria agregar que durante la lectura cada vez que se encuentre un:
* significa que se tiene un puntero.
( significa que se tiene una funcion.
[ significa que se tiene un arreglo.


Ejemplo:  Declaración de un puntero 'pf' a una función que no toma argumentos y devuelve un int

 int (*pf)();

Apliquemos la regla anterior para comprobar si es lo que se pidio:
Primero empezamos por el elemento que este dentro de los parentesis más internos. En este caso ese elemento es 'pf'. Vemos qué hay a su derecha, encontramos el parentesis de cierre osea que no hay nada a su derecha. Seguidamente vemos qué hay a la izquierda, encontramos un '*' osea que pf es un puntero. Luego, saliendo de dentro de los parentesis (*pf), a la derecha encontramos un '(' entonces tenemos que pf es un puntero a una función. Como inmediatamente encontramos un ')', la función a la que apunta 'pf' no toma argumentos. Hasta aqui tenemos que pf es un puntero a una función que no toma argumentos. Luego nos toca ver a la izquierda, encontramos un 'int' con lo que concluimos que pf es un puntero a una función que no toma argumentos y devuelve un int.

Ejemplo:  Un puntero 'func1' a una función que toma dos argumentos uno int y otro float y no devuelve nada

 void (*func1)(int, float);

Empezamos con el identificador 'func1'. Nada a la derecha; a la izquierda un '*' lo cual nos indica que 'func1' es un puntero. Seguimos, a la derecha esta un '(', entonces tenemos que 'func1' es un puntero a una función. Continuamos hasta encontrar el correspondiente ')' y tenemos que 'func1' es un puntero a una funcion que toma como argumentos un int y un float. Finalmente vemos que a la izquierda se encuentra un 'void' con lo que nuestra lectura quedaria como:'func1' es un puntero a una función que toma como argumentos un int y un float y no devuelve valores


En fin, si aun no se entendio, puedes buscar el google poniendo "Declaraciones complejas en C" o algo similar. Aunque si estas comenzando con el lenguaje C (o C++) es mejor que le prestes atención a otros temas más importantes ya que este tipo de declaraciones complejas no se ven mucho cuando uno programa de manera rutinaria.

Saludos  ^_^
« última modificación: Sábado 28 de Agosto de 2010, 02:27 por czealt »

Carlota

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Declaraciones C++
« Respuesta #6 en: Sábado 28 de Agosto de 2010, 01:35 »
0
Ahhhhh! vale... ahora entendi lo de tipo enumerado.
Es decir, realmente no tenia nada que ver con lo que puse al principio xDDDD

a) typedef enum{v,f} logico;
Creo que ahora si esta bien.

Una cosa, por ejemplo en este: Una variable p-v como un puntero a un vector de 8 punteros a float.
Me dice que una variable p-v se encuentra como un puntero --- [es decir, seria: * (p-v) ], a un vector de 8 [aqui tengo dudas... cuando se refiere a un vector habria que poner *(p-v) v[8] no?? punteros [ahora seria *(*(p-v) v[8]) ] a float. [y terminaria float *(*(p-v) v[8]) ]

Supongo que tienes razon con lo de que no se encuentran declaraciones como esta de forma rutinaria, pero me gustaria encontrar las pequeñas diferencias que hay al hablar de punteros, arrays y funciones en este tipo de declaraciones (tambien es porque este ejercicio me llamo la atencion)... muchas gracias por la explicacion que me has dado, te lo agradezco mucho!

czealt

  • Miembro activo
  • **
  • Mensajes: 28
    • Ver Perfil
Re: Declaraciones C++
« Respuesta #7 en: Sábado 28 de Agosto de 2010, 02:22 »
0
Antes que nada un par de aclaraciones:
1. p-v no es un nombre de variable válido; seguramente es p_v.
2. vector es sinónimo de arreglo unidimensional (si es que no se está refiriendo al tipo vector del C++).

Ahora, la manera correcta seria:

float *(*p_v)[8];

Saludos.  ^_^

Carlota

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Declaraciones C++
« Respuesta #8 en: Sábado 28 de Agosto de 2010, 03:02 »
0
Ahora entendi ^_^, cuando habla de vectores se referia a la dimension que tenia y no habia que poner v[DIM] ni nada por el estilo.

Bueno, creo que las demas estan bien... Gracias por tu paciencia! :D