Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: <<<-Basura->>> en 16 Marzo 2011, 18:30 pm



Título: Estoy Aprendiendo
Publicado por: <<<-Basura->>> en 16 Marzo 2011, 18:30 pm
Alguien me podria ayudar.. estoy aprendiendo c++, apenas estoy en la consola pero tengo mis dudas quiero manejarla a fondo no hacer los programas monotonos que siemper hace la  gente como sumar, restar y esos.

alguien me podria decir como se usa el:

typedef
#define
#ifdef
#endif

creo que se escribian algo asi jeje ayuden..


Título: Re: Estoy Aprendiendo
Publicado por: Akai en 16 Marzo 2011, 18:53 pm
Quizá me deje algo, así que posiblemente luego quieras revisarlo en algun libro o similar.

Typedef: define un tipo. Simple y llanamente. le dice al compilador que un tipo se refiere a otro.
Código
  1. typedef int mis_enteros
  2. mis_enteros a;
  3. //equivalente a
  4. int a;

de esa forma, defino que el tipo mis_enteros es un entero. Sobretodo se usa con estructuras.

#define: Funciona de la siguiente forma:
Código
  1. #define PI 3.14

Entonces, en cada lugar donde en tu código aparezca PI, se sustituirá por un 3.14 (cuidado con los defines, los nombres de lo que defines y demás, son armas de doble filo)

ifdef y endif: Si algo está definido y final de la definición. Suelen ir en conjunción con define, sobretodo se usan para evitar incluir varias veces la misma librería.
Código
  1. #ifdef PI
  2. #define TAU 2*PI
  3. #endif
  4.  

Por otro lado, también verás ifndef, que viene a ser lo mismo, pero si NO está definido.

Espero que resulte útil


Título: Re: Estoy Aprendiendo
Publicado por: anonimo12121 en 16 Marzo 2011, 18:55 pm
Quizá me deje algo, así que posiblemente luego quieras revisarlo en algun libro o similar.

Typedef: define un tipo. Simple y llanamente. le dice al compilador que un tipo se refiere a otro.
Código
  1. typedef int mis_enteros
  2. mis_enteros a;
  3. //equivalente a
  4. int a;

de esa forma, defino que el tipo mis_enteros es un entero. Sobretodo se usa con estructuras.

#define: Funciona de la siguiente forma:
Código
  1. #define PI 3.14

Entonces, en cada lugar donde en tu código aparezca PI, se sustituirá por un 3.14 (cuidado con los defines, los nombres de lo que defines y demás, son armas de doble filo)

ifdef y endif: Si algo está definido y final de la definición. Suelen ir en conjunción con define, sobretodo se usan para evitar incluir varias veces la misma librería.
Código
  1. #ifdef PI
  2. #define TAU 2*PI
  3. #endif
  4.  

Por otro lado, también verás ifndef, que viene a ser lo mismo, pero si NO está definido.

Espero que resulte útil
Podrías hacer una guía XDD


Título: Re: Estoy Aprendiendo
Publicado por: Akai en 16 Marzo 2011, 19:03 pm
Si tuviese tiempo, me plantearía hacerla, pero no hay tiempo últimamente. Aunque visto lo visto, igual el día que me plantee hacerla, únicamente tengo que recopilar posts míos xD


Título: Re: Estoy Aprendiendo
Publicado por: Edu en 17 Marzo 2011, 14:30 pm
Lo del typedef esta bueno pero lo otro para q me sirve? no puedo simplemente usar constantes? o variables simplemente? o que tiene de distinto, en q me beneficia? xD


Título: Re: Estoy Aprendiendo
Publicado por: anonimo12121 en 17 Marzo 2011, 14:59 pm
Lo del typedef esta bueno pero lo otro para q me sirve? no puedo simplemente usar constantes? o variables simplemente? o que tiene de distinto, en q me beneficia? xD
#define MatarZero  If(zero==vivo)matar;



Título: Re: Estoy Aprendiendo
Publicado por: Edu en 17 Marzo 2011, 15:30 pm
Sigo sin entenderlo xD


Título: Re: Estoy Aprendiendo
Publicado por: Don Pollo en 17 Marzo 2011, 15:35 pm
Sigo sin entenderlo xD


Te permite definir expresiones. Si es algo que vas a estar usando muy a menudo y es un poco coñazo tener que escribirlo todo el rato, le pones un #define con un nombre corto y te es más sencillo trabajar con esa expresión.


Título: Re: Estoy Aprendiendo
Publicado por: Edu en 17 Marzo 2011, 15:38 pm
Pero cual es la diferencia con una constante?


Título: Re: Estoy Aprendiendo
Publicado por: Don Pollo en 17 Marzo 2011, 15:44 pm
Pero cual es la diferencia con una constante?

No hay ninguna diferencia, lo que haces con un #define es declarar constantes. Ahora, esas constantes pueden ser un valor o una expresión.

En mi post de antes te he dicho que sirve para definir expresiones, pero me he expresado mal.

Los #define te benefician en ahorro de tiempo picando código, y haces que sea mucho más limpio.


Título: Re: Estoy Aprendiendo
Publicado por: anonimo12121 en 17 Marzo 2011, 16:19 pm
mira mi ejemplo lo que hace es insertar un trozo de codigo


Título: Re: Estoy Aprendiendo
Publicado por: Akai en 17 Marzo 2011, 17:32 pm
No hay ninguna diferencia, lo que haces con un #define es declarar constantes. Ahora, esas constantes pueden ser un valor o una expresión.

ERROR Si la hay, y es ENORME.

define: lo que esté despues de, por así decirlo, la etiqueta, se EMPOTRA directamente en el código, por el preprocesador, no se hace comprobación de tipos ni nada por el estilo, simplemente se sustituye, y ya.
Ejemplo:
Código
  1. #define cuadrado((a)) (a)*(a)
con el siguiente ejemplo:

Código
  1. i=4;
  2. cuadrado(i++)

Resultado? 16, si, valor de la i=5? NO i=6. ¿WTF? Pensarán algunos.

Porque el preprocesador lo sustituye como:
Código
  1. i=4
  2. (i++)*(i++)

Y por precedencia de operadores, se realiza la multiplicación, y luego los post-incrementos

Por otro lado, un define NO ocupa más memoria que la que ocupe el código definido y dicha memoria será ocupada en el espacio dedicado a código, mientras que una constante, es una variable, y que por tanto, ocupará su espacio en el segmento de memoria dedicado a variables.


Por otro lado, utilizando el ejemplo del cuadrado, mirad que pasa si hacéis esto:
Código
  1. cuadrado(cuadrado(i)*cuadrado(i))

Lo ideal sería suponer una implementación de este estilo:
Código
  1. res1=resultado_cuadrado(i)*resultado_cuadrado(i)
  2. cuadrado(res1)

Pero, con los defines, al tratarse de código empotrado, se traduce como(es posible que me deje algo, pero básicamente es un infierno de calculo):
Código
  1. ((i*i)*(i*i))*((i*i)*(i*i))

Por qué? Porque primero, traduce el cuadrado de i en i*i, y luego, la multiplicación de cuadrados en (i*i)*(i*i) PERO como luego eso se lo pasamos como "argumento", y nuestro define, coge dicho argumento y lo multiplica por si mismo, tenemos la tira infernal de arriba.

Los defines (macros) son peligrosos.


Título: Re: Estoy Aprendiendo
Publicado por: chocola en 17 Marzo 2011, 19:07 pm
muy buena explicación Akai  ;-)

nos aconsejas algún guía o libro para seguir que nos haga ejemplos sobre programas con ejercicios para hacer ?=¿


Título: Re: Estoy Aprendiendo
Publicado por: Akai en 17 Marzo 2011, 19:17 pm
Libro... el que utilizo como referencia es:

C++ estándar (Programación con el estándar ISO y la Biblioteca de Plantillas (STL))
Enrique Hernández Orallo, José Hernandez Orallo, Mª Carmen Juan Lizandra
Paraninfo - Thomson Learning
ISBN: 84-9732-040-9

(daría un enlace para descargarlo, pero no he encontrado, la vez que busqué, algún pdf o similar con el libro)

Por otro lado, Littlehorse (moderador del subforo) suele recomendar uno que hay colgado en este post: http://foro.elhacker.net/programacion_cc/librospapers_cc-t296234.0.html

Name: Cómo Programar en C/C++
Author(s): Harvey M. Deitel, Paul J. Deitel
Hardcover: 1072 pages
Publisher: Prentice Hall; 2nd edition (February 1998)
ISBN-10: 9688804711
ISBN-13: 978-9688804711

(hay un enlace para descargarlo)

Yo utilizo el de C++ estándar porque me gustó cuando me lo recomendó un profesor en la facultad y lo saqué una temporada de la bilioteca y al final me lo terminé comprando. Sobre el de Deitel & Deitel, no tengo mayor referencia que el hecho que Littlehorse lo recomiende. (Si vas a buscar el de Deitel & Deitel, intenta buscar una edición más actual, que imagino que la habrá)


Título: Re: Estoy Aprendiendo
Publicado por: chocola en 17 Marzo 2011, 19:30 pm
muxas gracias por su respuesta

pero una duda que tengo :
mi profesor me esta apretando para que en vez de impezar con c++ impezar con el visual studio 2010 express

no se pero yo veo que muxa gente recomienda el c++ .
cuales tu opinion ?=¿ a favor de cual estas ?=¿

ahora yo ya tengo el compilador gcc instalado en windows y me va bien
pero no me importaría nada de nada tener que cambiar
si hay que cambiar se hace, no hay problema

nota : el profesor me da clase de sistemas  actualmente no estoy dando clase de programación es una cosa mía que llevo aparte

muxas gracias .


Título: Re: Estoy Aprendiendo
Publicado por: Akai en 17 Marzo 2011, 19:41 pm
Visual studio 2010 express es un IDE (Entorno de Desarrollo Integrado) que trae entre otras cosas el compilador Visual C++ 2010 de Microsoft. Lo que quizá tu profesor quiera es que usando visual studio tengas mayor facilidad a la hora de utilizar librerías de windows. Eso no lo se.

En principio, si ya tienes algo instalado, y lo otro no supone una gran mejora no veo por qué haya que cambiar, salvo que exista alguna razón en concreto, como por ejemplo el debugger de Visual Studio.

Eso lo tendrías que hablar ya con tu profesor.

Por otro lado, si aprendes C++ estándar, en teoría debería dar igual si lo haces en Visual Studio, en Code::Blocks, en Eclipse con el plugin CDT o usando emacs y compilando con g++ (compilador de C++ de gcc). El problema está cuando, por ejemplo, aprendes en base a usar librerías de windows o de linux mientras aprendes C++ (véase el uso de conio como caso ejemplo de ello)


Título: Re: Estoy Aprendiendo
Publicado por: chocola en 17 Marzo 2011, 21:03 pm
gracias por su respuesta

pero no me has dicho tu opinion personal  :o  :silbar:

que me aconsejas tu seguir el c++ o el visual studio  ?=¿
y cuales tu opinion sobre utilizar las librerias de windows o de linux
es mejor utilizar las librerias de windows o de linux?=¿


muxisimas gracias de antelación .


Título: Re: Estoy Aprendiendo
Publicado por: RyogiShiki en 17 Marzo 2011, 21:08 pm
gracias por su respuesta

pero no me has dicho tu opinion personal  :o  :silbar:

que me aconsejas tu seguir el c++ o el visual studio  ?=¿
y cuales tu opinion sobre utilizar las librerias de windows o de linux
es mejor utilizar las librerias de windows o de linux?=¿


muxisimas gracias de antelación .

Eso solo depende de Tí, quieres que tus programas sean portables? si así es entonces usa solo opciones Multiplataforma, pero en cambio ¿Quieres que tus aplicaciones solo funcionen en Windows? pues concentrate en WinAPI, o Solo en Linux?.

Por otro lado como partidario de las tecnologías libres siempre recomiendo GCC por la gran flexibilidad en las configuraciones y el basto soporte que tiene en la red. Pero entonces deberías usar los dos y analisar y definir en cual de los dos te sientes cómodo.

Saludos


Título: Re: Estoy Aprendiendo
Publicado por: Akai en 17 Marzo 2011, 21:27 pm


que me aconsejas tu seguir el c++ o el visual studio  ?=¿
y cuales tu opinion sobre utilizar las librerias de windows o de linux
es mejor utilizar las librerias de windows o de linux?=¿

Vamos por partes (en principio, cada párrafo, respuesta a una de tus lineas):
Te recalco, C++ es un lenguaje de programación, Visual Studio es un entorno de desarrollo, nada que ver una cosa con la otra. Puedes "seguir el c++" en Visual Studio., o utilizar otros IDEs (Code::Blocks, Eclipse...). De la misma forma que en visual studio se pueden utilizar varios lenguajes, no únicamente C++

Mi opinión es que no se deberían utilizar librerías dependientes del Sistema Operativo cuando se enseña un lenguaje o se está empezando a enseñar programación.

Ver párrafo anterior. Una vez está eso claro... Yo únicamente he trabajo con las bibliotecas de Linux, y no tengo queja al respecto. Así que no puedo comparar unas y otras. En cualquier caso, si utilizas librerías de sistema, has de tener en cuenta que ya no la puedes utilizar en otro SO (Si usas las librerías de Windows, tu aplicación sólo podrá correr en windows. Si usas las de Linux, en sistemas compatibles con el estándar de Linux, y así)


Título: Re: Estoy Aprendiendo
Publicado por: anonimo12121 en 17 Marzo 2011, 23:23 pm
Que asco dais me habeis quemado mi circuito con ese define y el incremento.


Título: Re: Estoy Aprendiendo
Publicado por: Akai en 17 Marzo 2011, 23:38 pm
Si, Xafi, pues a mi me pasó algo así creando dos macros (defines) para sacar el valor absoluto de un valor y el mínimo de dos valores para reducir el overhead (de forma que no se usase tiempo llamando a la función, apilando parámetros bla bla bla, y luego desapilando), te encuentras con que en vez de reducir el tiempo, estás tardando más, y no entiendes por qué, al final ves que son cosas de ese estilo

caso 1:
Código
  1. ABS_M((a))((a) < 0) ?  -(a) :(a)
Simple y rápido.
Problema? Llamarla de este modo
Código
  1. s+=ABS_M(6*x-aux->hash(valor))
querías reducir overhead del abs? pues toma, doble overhead del hash

y un caso más del estilo que puse antes:
Código
  1. MIN_M((a),(b)) ((a)<(b)) ? (a) : (b)
y la llamas como
Código
  1. algo=MIN_M(m[i][j],m[i][k]+m[k][j])
otra vez lo mismo, trabajo repetido para nada.

Cosas como estas te enseñan (a fuego xD) a ir con mucho cuidado con lo que #defines


Título: Re: Estoy Aprendiendo
Publicado por: anonimo12121 en 18 Marzo 2011, 00:05 am
Me referia a mi cabeza . xD


Título: Re: Estoy Aprendiendo
Publicado por: chocola en 19 Marzo 2011, 15:52 pm
gracias por vuestras respuestas

una pregunta :
hize un pequeño programa (calculadora) con visual basic 2010
y en windows 7 funciona al pelo pero cuando la pongo en xp no va
me dice que hace falta .net...

que tengo que hacer para que funcione tambien en el xp ?=¿ o es que no se puede


gracias .


Título: Re: Estoy Aprendiendo
Publicado por: Akai en 19 Marzo 2011, 16:02 pm
Este no es el subforo de visual basic, chocola, pero aun así:

instalar la versión del .net framework que hayas usado en tu programa.


Título: Re: Estoy Aprendiendo
Publicado por: chocola en 19 Marzo 2011, 16:05 pm
perdon no era mi entencion