Ver Mensaje Individual
  #6 (permalink)  
Antiguo 14/06/2016, 05:38
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Violación de segmento (`core' generado)

Cita:
Iniciado por pguti Ver Mensaje
Ahora probaré a cambiar esos strings por arrays de caracteres. En cuanto al typedef, estoy estudiando Ing. Informática y me han dicho que así se pone en C++ en la asignatura de Programación, por eso lo había puesto.
Primero la explicación y luego la crítica.

typedef sirve para definir alias. ¿Para qué sirven los alias? Por un lado para facilitar la configuración del programa y por otro para conseguir código más legible.

En C es muy fácil entender el tema de la legibilidad:
Código C:
Ver original
  1. struct _mistruct
  2. {
  3.   ...
  4. };
  5.  
  6. typedef struct _mistruct mistruct;
  7.  
  8. // ¿Qué opción es más legible?
  9. struct _mistruct estructura;
  10. mistruct estructura;
  11.  
  12. // Ahora imagínatelo a la hora de declarar funciones
  13. void func( struct _mistruct* a, struct _otrastruct* b, struct _otramas *c);
  14. void func( mistruct* a, otrastruct* b, otramas *c);

¿Cómo es eso de facilitar la configuración de un programa?

Bueno, imagínate que tienes que hacer un programa que va a funcionar en ARM,Raspberry y "nosecuantas" otras arquitecturas. Imagino que no te agradaría la idea de hacer un programa específico para cada sistema y que prefieres reutilizar la mayor cantidad de código posible.

Si resulta que en una arquitectura el tipo de dato que has de usar para un determinado fin (por ejemplo por temas de rendimiento) es int y en otra arquitectura es short podrías optar por varios caminos, yo te muestro tres opciones:

1. Controlar el tipo con macros

Código C:
Ver original
  1. #ifdef _USAR_INT_
  2. int
  3. #else
  4. short
  5. #endif
  6. func()
  7. { return 4; }

Si está la macro _USAR_INT_ definida, entonces el código quedará tal que:

Código C:
Ver original
  1. int func()
  2. { return 4; }

mientras que si no lo está el programa compilará lo siguiente:

Código C:
Ver original
  1. short func()
  2. { return 4; }

2. Definir el tipo en una macro.
Código C:
Ver original
  1. #ifdef _USAR_INT_
  2. #define MITIPO int
  3. #else
  4. #define MITIPO short
  5. #endif
  6.  
  7. MITIPO func()
  8. { return 4; }

3. Definir un alias
Código C:
Ver original
  1. #ifdef _USAR_INT_
  2. typedef int mitipo
  3. #else
  4. typedef short mitipo
  5. #endif
  6.  
  7. mitipo func()
  8. { return 4; }

Las dos últimas opciones son bastante parecidas. ¿Qué sentido tiene entonces typedef si ya puedo conseguir lo mismo con directivas del preprocesador?

Bueno, resulta que typedef es bastante más potente que el preprocesador para estas cosas. Los mejores ejemplos se encuentran en los templates, donde muchas veces se hace necesario heredar el tipo para conseguir que el código sea compatible.

Código C++:
Ver original
  1. struct TipoInt
  2. {
  3.   typedef int tipo;
  4. };
  5.  
  6. struct TipoShort
  7. {
  8.   typedef short tipo;
  9. };
  10.  
  11. template<class T>
  12. struct mitemplate
  13. {
  14.   // aqui es necesario usar typename para que funcione el programa
  15.   // no es necesario que entiendas el motivo (paso a paso)
  16.   typedef typename T::tipo tipo;
  17.  
  18.   tipo func()
  19.   { return 4; }
  20. };
  21.  
  22. int main()
  23. {
  24.     mitemplate<TipoInt> t1;
  25.     mitemplate<TipoShort> t2;
  26.  
  27.     std::cout << sizeof(t1.func()) << std::endl;
  28.     std::cout << sizeof(t2.func()) << std::endl;
  29. }

Dicho esto queda claro que en C se usa typedef para no tener que escribir struct cada dos por tres, pero en C++ esto no es necesario, luego solo gente que se ha reciclado malamente de C a C++ seguirá usando el diseño que propone tu profesor.

Y bueno, ahora la crítica:

Seguramente tu profesor no tendrá tampoco ni idea de que en lo que llevamos de siglo han salido 3 estándares nuevos del lenguaje (C++03, C++11 y C++14) y que hay otros dos a punto de ver la luz (c++17 y C++20).

Es hasta posible que no entienda demasiado de templates, e incluso que se pierda al hablar de polimorfismo y herencia.

Ser profesor no le otorga a nadie un halo de inmortalidad o de superioridad. No es más que alguien que te intenta inculcar una serie de conocimientos y ya depende de la propia persona que dichos conocimientos sean más o menos fiables.

Yo te recomendaría buscar tutoriales de c++ por Internet y verás como lo que te cuento representa la forma normal de trabajar.

Si realmente te gusta la programación, que un profesor incompetente no te lleve por el mal camino. Una vez se han adquirido malos hábitos es complicado remontar el vuelo.

Una cosa es que en esa clase en cuestión tengas que pasar por el aro para aprobar y otra muy distinta es que seas consciente de que eso que haces no es lo correcto y que hay mucho mundo por recorrer fuera del contenido de las clases.

Un saludo
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.

Última edición por eferion; 14/06/2016 a las 06:52