Autor |
Mensaje |
mafalda
Nivel 4
Edad: 33
Registrado: 15 Dic 2011
Mensajes: 114
Carrera: Informática
|
|
Buenas, quería dejarles una consulta. Estoy haciendo el primer tp de algo II y hay que armarlos con cabeceras, pero no se bien como armarlas.
Se que por cada función tengo que tener un archivo .h pero en ese archivo va solo la declaración?? individual?
las declaración de contantes también iría en una cabecera o en un .cpp?
y por ultimo.. cuando hago el archivo .h solo pongo la declaración sin nada adicional??
Gracias!
|
|
|
|
|
|
|
|
|
Hache
Nivel 8
Registrado: 13 May 2010
Mensajes: 574
Carrera: Informática
|
|
mafalda escribió:
|
Se que por cada función tengo que tener un archivo .h
|
No.
Bah, si queres si.
Generalmente agrupas todo un conjunto de funciones que proveen cierta funcionalidad en un solo '.h'. Por ejemplo, si necesitas proveer funciones para trabajar con imagenes (por decir algo), agrupas todas las funciones en un '.h' (cargar, guardar, conversion de colores, escalado, filtrado, etc). Podrías separarlo mas y dejar solo cargar/guardar y crear otro '.h' para las transformaciones (escalado, filtrado,etc). Eso lo vas viendo vos.
mafalda escribió:
|
pero en ese archivo va solo la declaración??
|
soloDeclaracion: Si.
A menos que uses templates (que no usas)
mafalda escribió:
|
individual?
|
Si.
mafalda escribió:
|
las declaración de contantes también iría en una cabecera
|
Si.
Fijate que en tus programas vos haces #include de archivos '.h' (nunca incluyas c/cc/cxx/cpp por favor ).
¿Te das cuenta qué pasaría si las constantes estuviesen en el '.cpp' en vez del '.h'?
mafalda escribió:
|
o en un .cpp?
|
No. Lee arriba.
mafalda escribió:
|
y por ultimo.. cuando hago el archivo .h solo pongo la declaración sin nada adicional??
|
goto soloDeclaracion;
mafalda escribió:
|
Gracias!
|
De nada.
Si no se entiende, volve a preguntar.
|
|
|
|
_________________
|
|
|
|
|
mafalda
Nivel 4
Edad: 33
Registrado: 15 Dic 2011
Mensajes: 114
Carrera: Informática
|
|
si, va queriendo.. ahora cuando hago el .h de las constantes me salen errores como estos:
Cita:
|
-declaration of 'char matriz[10][30]
-declaration of 'int inicial' shadow a parameter
-cout was not declared in this cope. ( aca agregue el unusing namespace std pero sigue igual)
-unused variable 'codo'
-unuses variable 'columna'
|
y esta todo el codigo arriba con eso:
Cita:
|
* Declaracion de constantes */
const int alto=10;
const int ancho=30;
const int cero=0;
const char codo = 'c';
const char pared= '+';
/*declaracion de tipos */
int fila;
int columna;
char matriz[alto][ancho];
char posicion_inicial;
char posicion_final;
int inicial;
int final;
|
no entiendo en esta parte porque saldrian esos errores.
|
|
|
|
|
|
|
|
|
fer90
Nivel 9
Edad: 33
Registrado: 14 Sep 2009
Mensajes: 1117
Ubicación: San Martín
Carrera: Informática y Sistemas
|
|
Generalmente para crear constantes en C/C++ se usa la directiva "define" al comienzo de tu programa (donde por ejemplo, usas #include para incluir las librerías que quieras). Ejemplo:
#define PI 3.14
Es decir:
#define NOMBRE_CONSTANTE VALOR
En tu code, al utilizar NOMBRE_CONSTANTE, al momento de compilar ya se reemplazó por el valor que le otorgaste
(tanto define, como include se les llama directivas al pre-compilador, podés indagar un poco más en esto).
Por lo demás, no estás declarando tipos, sino que, como indica el error al compilar, estás declarando variables de tipo int, char, y char[][] !!!
Para declarar tipos, se utiliza la palabra reservada "typedef".
|
|
|
|
_________________ ¿Y quién te va a tirar las postas y truquitos para cada materia?
Nosotros...Chat-Fiuba. Somos más grandes que Jesús.
Cumple sus sueños quien resiste!!!
|
|
|
|
|
mafalda
Nivel 4
Edad: 33
Registrado: 15 Dic 2011
Mensajes: 114
Carrera: Informática
|
|
si pero cuando hago todo eso me pone que por ejemplo aca:
Cita:
|
void creando_caminos(char matriz[alto][ancho], int inicial, int final);
|
antes del ; final me falta una coma o 3 puntos suspensivos (?)
aca,
Cita:
|
typedef char matriz[alto][ancho];
|
que me falta un ] antes del ; (??) y mas cosas asi
|
|
|
|
|
|
|
|
|
fer90
Nivel 9
Edad: 33
Registrado: 14 Sep 2009
Mensajes: 1117
Ubicación: San Martín
Carrera: Informática y Sistemas
|
|
mafalda escribió:
|
si pero cuando hago todo eso me pone que por ejemplo aca:
Cita:
|
void creando_caminos(char matriz[alto][ancho], int inicial, int final);
|
antes del ; final me falta una coma o 3 puntos suspensivos (?)
|
Sobre esto, borrale el "alto" y "ancho". Es una declaración. En una declaración sólo tenés que pasarle el TIPO de parámetro que va a recibir y el nombre de la variable a usar en la función. Si "alto" y "ancho" son variables, no podés declararlas ahí. A lo sumo podés reemplazar alto y ancho por números o constantes predefinidas.
mafalda escribió:
|
aca,
Cita:
|
typedef char matriz[alto][ancho];
|
que me falta un ] antes del ; (??) y mas cosas asi
|
Lo mismo, si alto y ancho son variables eso nunca va a funcionar. Podés hacer:
typedef char tipo_matriz[10][10];
Para declarar un nuevo tipo llamado "tipo_matriz" que es una matriz de 10 por 10 de caracteres. Se utilizaría de la siguiente manera al declarar una variable:
tipo_matriz matriz;
Ahí tendrías una variable llamada "matriz" que es de tipo char[10][10].
Y si hacés esto último, tu declaración de la función de más arriba puede ser:
void creando_caminos(tipo_matriz matriz, int inicial, int final);
OJO: Si vos no sabés cuantas filas o columnas va a tener la matriz a priori, no te sirve declarar todo con números o constantes definidas, en todo caso, usá [][].
|
|
|
|
_________________ ¿Y quién te va a tirar las postas y truquitos para cada materia?
Nosotros...Chat-Fiuba. Somos más grandes que Jesús.
Cumple sus sueños quien resiste!!!
|
|
|
|
|
mafalda
Nivel 4
Edad: 33
Registrado: 15 Dic 2011
Mensajes: 114
Carrera: Informática
|
|
Ahi salio!
Muchas Gracias Chicos!
|
|
|
|
|
|
|
|
|
koreano
Nivel 9
Registrado: 15 Jul 2010
Mensajes: 1796
Carrera: No especificada
|
|
En general es mala práctica usar #define para constantes:
- Perdés la oportunidad de usar distintos tipos de datos explícitamente (por ejemplo para polimorfismo o para tener mas control)
- Los defines son simples reemplazos por parte del preprocesador. Puede tener resultados inesperados, por ejemplo reemplazando donde no querías o pisando lo que reemplazó con otra cosa
- Los defines no tienen scope, solo se definen cuando se los encuentra en un #define y viven de ahi en adelante (o hasta encontrarse con un #undef). También puede tener resultados inesperados
Todos estos problemas se resuelven usando constantes. En tu caso, como estás haciendo un proyecto chico es muy raro que tengas alguno de estos problemas pero es un buen dato a tener en cuenta. Ah, y a los que les preocupa la velocidad del código, cualquier compilador puede optimizar las constantes
|
|
|
|
|
|
|
|
|
Sebastian Santisi
Administrador Técnico
Edad: 42
Registrado: 23 Ago 2005
Mensajes: 17451
|
|
Adhiero al koreano.
Los #define se usan asiduamente en C, y es herencia en C++, no una herramienta nativa.
Stroustrup es clarísimo al respecto de que no deben usarse en C++.
|
|
|
|
_________________
|
|
|
|
|
fernandodanko
Nivel 8
Edad: 34
Registrado: 16 May 2009
Mensajes: 859
Ubicación: Berazategui - BS.AS
Carrera: Electrónica
|
|
Un clásico problema de los #define:
Código:
|
#define SUMA(X, Y) X + Y
printf("(3+5)/2 = %d\n", SUMA(3,5) / 2);
|
|
|
|
|
|
|
|
|
|
Sebastian Santisi
Administrador Técnico
Edad: 42
Registrado: 23 Ago 2005
Mensajes: 17451
|
|
Nah, no es por eso.
Tu ejemplo es rápidamente fixeable con paréntesis y además no había que irse a macros de función; en C++ se desrecomiendan incluso cosas del estilo de "#define PI 3.14".
El tema es que en C por lo general te chupa bastante un huevo de qué tipo son las cosas (y si sí, usás los sufijos que correspondan cuando declarás el literal), y por otro lado, los errores de compilación de C son bastante livianitos y fáciles de seguir.
La diferencia entre macros y constantes es que unas pasan por el preprocesador y las otras por el compilador. Los reemplazos del prepro son invisibles para el compilador, por lo que la identificación de los errores se hace complicada. Por el otro lado, las constantes, tienen tipo asociado, lo que habilita un montón de cosas a nivel compilador para entender qué están haciendo. A nivel eficiencia es lo mismo, el compilador probablemente vuele al carajo una variable constante al optimizar; lo importante es que sepa unívocamente de qué tipo es, cuál es el scope, cuál el namespace, etc. (No da con complicar con ejemplos, pero por ejemplo, en C, "#define A 'a'", ¿de qué tipo es A?, ¿de qué tipo sería si hubiera hecho "const char a = 'a'"?)
Al respecto de C, es natural el uso del prepro como asistente para la compilación. Por lejos de estar desrecomendadas, las macros de función son fundamentales y ahora tomaron bastante fuerza en el último estándar como estructura para hacer sobrecarga de funciones.
|
|
|
|
_________________
|
|
|
|
|
|
|
Ver tema siguiente
Ver tema anterior
Podés publicar nuevos temas en este foro No podés responder a temas en este foro No podés editar tus mensajes en este foro No podés borrar tus mensajes en este foro No podés votar en encuestas en este foro No Podéspostear archivos en este foro No Podés bajar archivos de este foro
|
Todas las horas son ART, ARST (GMT - 3, GMT - 2 Horas)
Protected by CBACK CrackerTracker365 Attacks blocked.
|