Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
|
highlevel:c [2008/05/28 17:53] alfred |
highlevel:c [2020/05/09 09:25] (actual) |
||
|---|---|---|---|
| Línea 8: | Línea 8: | ||
| Podemos definir variables sin signo, por ejemplo integers, incluyendo ''unsigned'' antes del tipo de variable: | Podemos definir variables sin signo, por ejemplo integers, incluyendo ''unsigned'' antes del tipo de variable: | ||
| <code c>unsigned int iNum;</code> | <code c>unsigned int iNum;</code> | ||
| + | |||
| + | |||
| + | |||
| Línea 25: | Línea 28: | ||
| } | } | ||
| ... | ... | ||
| - | Suma (3); // Devolvería 3 | + | Suma (3); // Devolvería 3 |
| + | Suma (3, 2); // Devolvería 5 | ||
| + | </code> | ||
| + | Cuando crees una función con parámetros por defecto en una librería, estos deberán de ser indicados en el código (archivo .cpp) cuando la compiles y no en la cabecera (archivo .h). Pero cuando utilices la cabecera en el código que utiliza la librería, entonces sí que deberás indicar los parámetros por defecto en esta: | ||
| + | <code cpp> | ||
| + | // Archivo .cpp -------------------------------------------- | ||
| + | void Message::Error (char* txt, char* title = "Error!") { ... | ||
| + | |||
| + | // Archivo .h ---------------------------------------------- | ||
| + | #ifdef _USRDLL | ||
| + | static void Error (char* txt, char* title); | ||
| + | #else | ||
| + | static void Error (char* txt, char* title = "Error!"); | ||
| + | #endif | ||
| </code> | </code> | ||
| Línea 150: | Línea 166: | ||
| * Podemos declarar arrays de dos dimensiones: | * Podemos declarar arrays de dos dimensiones: | ||
| <code cpp>int array[2][2];</code> | <code cpp>int array[2][2];</code> | ||
| + | |||
| + | |||
| + | |||
| + | |||
| ==== La función main ==== | ==== La función main ==== | ||
| Línea 396: | Línea 416: | ||
| Podemos concatenar strings mediante el operador '+'. | Podemos concatenar strings mediante el operador '+'. | ||
| + | |||
| Línea 414: | Línea 435: | ||
| <code cpp>vector<int> Sumar (vector<double>) {...}</code> | <code cpp>vector<int> Sumar (vector<double>) {...}</code> | ||
| * También podemos pasarlos por referencia: ''vector<double>& v'' | * También podemos pasarlos por referencia: ''vector<double>& v'' | ||
| + | * Podemos recorrer un vector con un iterador: | ||
| + | <code cpp> | ||
| + | for (vector<point>::iterator it = points.begin(); it!=points.end(); ++it) { | ||
| + | cout << it->x << endl; | ||
| + | } | ||
| + | </code> | ||
| ===== ANSI C ===== | ===== ANSI C ===== | ||
| Línea 425: | Línea 452: | ||
| * ''fmod'' calcula el resto de coma flotante de dos doubles. | * ''fmod'' calcula el resto de coma flotante de dos doubles. | ||
| * ''exp'' calcula la función exponencial. | * ''exp'' calcula la función exponencial. | ||
| + | |||
| + | |||
| ==== time ==== | ==== time ==== | ||
| Línea 430: | Línea 459: | ||
| * ''time'', esta función devuelve el tiempo de la máquina; el tipo devuelto es un ''time_t'' y el que se le pasa como parámetro una referencia a una variable de este tipo, si esta que se le pasa por parámetro no es NULL colocará en ella tambiénen el resultado. | * ''time'', esta función devuelve el tiempo de la máquina; el tipo devuelto es un ''time_t'' y el que se le pasa como parámetro una referencia a una variable de este tipo, si esta que se le pasa por parámetro no es NULL colocará en ella tambiénen el resultado. | ||
| * ''localtime'' convierte un ''time_t'' en un ''tm'', otra estructura de tiempo más legible en la que se especifican los segundos, minutos... | * ''localtime'' convierte un ''time_t'' en un ''tm'', otra estructura de tiempo más legible en la que se especifican los segundos, minutos... | ||
| + | <code c> | ||
| + | time_t t; | ||
| + | time(&t); | ||
| + | tm hora = *localtime(&t); | ||
| + | int hour = hora.tm_hour; | ||
| + | int min = hora.tm_min; | ||
| + | int sec = hora.tm_sec; | ||
| + | </code> | ||
| * ''mktime'' hace lo contrario a localtime, convierte un ''tm'' en ''time_t''. | * ''mktime'' hace lo contrario a localtime, convierte un ''tm'' en ''time_t''. | ||
| * ''difftime'' calcula la diferencia entre dos ''time_t'' en segundos expresada en double. | * ''difftime'' calcula la diferencia entre dos ''time_t'' en segundos expresada en double. | ||
| Línea 557: | Línea 594: | ||
| #endif | #endif | ||
| </code> | </code> | ||
| + | |||
| Línea 567: | Línea 605: | ||
| * **once**, indica que el fichero de código que sigue a dicha directiva no se compilará más de una vez, algo parecido a utilizar el ''#ifndef''. | * **once**, indica que el fichero de código que sigue a dicha directiva no se compilará más de una vez, algo parecido a utilizar el ''#ifndef''. | ||
| * **comment**, coloca un comentario en el resultado de la compilación. | * **comment**, coloca un comentario en el resultado de la compilación. | ||
| + | * **warning(disable: xxxx)**, siendo //xxxx// el número de warning, desactiva ese warning. | ||
| ===== Otras cualidades del lenguaje ===== | ===== Otras cualidades del lenguaje ===== | ||
| Línea 573: | Línea 612: | ||
| * La función system nos sirve para enviar comandos de consola al sistema, por ejemplo "dir", "pause"... | * La función system nos sirve para enviar comandos de consola al sistema, por ejemplo "dir", "pause"... | ||
| * Para usarla debemos incluir "stdlib". | * Para usarla debemos incluir "stdlib". | ||
| + | |||
| ==== extern ==== | ==== extern ==== | ||
| Línea 580: | Línea 620: | ||
| y en el .cpp: | y en el .cpp: | ||
| <code cpp>int iVal = 33;</code> | <code cpp>int iVal = 33;</code> | ||
| + | Y es que la palabra clave ''extern'' indica al compilador que el dato que se está definiendo existe en algún lugar del código (más abajo, en un fichero externo...), pero que es posible que todavía no se haya compilado esa parte. | ||
| + | <code cpp> | ||
| + | extern int i; | ||
| + | extern void func(); | ||
| + | int main() { | ||
| + | i = 0; | ||
| + | func(); | ||
| + | } | ||
| + | int i; | ||
| + | void func() { | ||
| + | i++; | ||
| + | cout << i; | ||
| + | } | ||
| + | </code> | ||
| + | |||
| ==== Asserts ==== | ==== Asserts ==== | ||
| - | * Para usarlas deberás hacer ''#include<cassert>'' en unos compiladores, en otros ''#include <assert.h>'' | + | * Para usarlas deberás hacer ''#include<cassert>'' en compiladores de C++, en los de C ''#include <assert.h>'' |
| * La idea se basa en una línea de código que ha de cumplirse para que el programa pueda seguirse ejecutando, si no se cumpliese debería dar error. | * La idea se basa en una línea de código que ha de cumplirse para que el programa pueda seguirse ejecutando, si no se cumpliese debería dar error. | ||
| - | * Ej. ''assert (i > 3);'' <- si i no es mayor que 3 el compilador actúa. \\ | + | * Ej. ''assert (i > 3);'' <- si i es menor que 3 el compilador actúa. (Comprueba si la expresión pasada por parámetro no es cero, si lo es envia lanza un error) \\ |
| //Por qué frases tan abstractas como "el compilador actúa" o "debería dar error"?// Porque esto va según la config del compilador. Algunos, en código release no hacen caso de los asserts, otros ni en debug. Aún así son muy útiles, ya que generalmente hacen que el programa se pare indicando un error de aserción, donde se encuentra y el por qué. \\ | //Por qué frases tan abstractas como "el compilador actúa" o "debería dar error"?// Porque esto va según la config del compilador. Algunos, en código release no hacen caso de los asserts, otros ni en debug. Aún así son muy útiles, ya que generalmente hacen que el programa se pare indicando un error de aserción, donde se encuentra y el por qué. \\ | ||
| Si quieres desactivar los assert añade ''#define NDEBUG''. | Si quieres desactivar los assert añade ''#define NDEBUG''. | ||
| Línea 861: | Línea 916: | ||
| - | ==== Bibliotecas (libraries) ==== | ||
| - | Una biblioteca es una colección de código que permite hacer dicho código independiente del programa en el que se añaden, esto hace que el código pueda ser estructurado y reutilzado de forma modular. Existen dos tipos de bibliotecas: | ||
| - | * Estáticas, se añaden al programa, en el mismo archivo, en tiempo de compilación. | ||
| - | * Dinámicas, se cargan y se enlazan al programa en el momento en el que este lo necesita, durante el tiempo de ejecución. En sistemas Windows son llamadas DLL y pueden tener como extensión .dll, .ocx (si incluyen un control ActiveX) o .drv (si pertenecen a un driver). | ||
| - | [[code:tools#tips_creando_bibliotecas|Tips para crear bibliotecas desde Visual Studio]] | ||
| - | === Crear una biblioteca (Windows) === | ||
| - | Cuando se va a utilizar una librería dinámica en un programa es necesario que se proporcionen dos archivos, un .h (mediante un #include) y un .lib (esta debe ser vinculada desde el compilador), en el primero estará el código de dicha biblioteca y en el segundo un mapeo al archivo .dll. \\ | ||
| - | Al crear la librería hay que tener en cuenta las siguientes cosas: | ||
| - | * En el archivo .h del código correspondiente a la biblioteca añadiremos ''<nowiki>extern "C" _declspec(dllexport)</nowiki>'' antes de cada función que queramos que sea utilizable en la biblioteca. | ||
| - | * El archivo .h que se añadirá al código del programa debe de contener ''<nowiki>extern "C" _declspec(dllimport)</nowiki>'' delante de cada declaración de función. | ||
| - | <code> | ||
| - | /*************** Proyecto Librería **********************/ | ||
| - | // lib.h | ||
| - | extern "C" _declspec(dllexport) int suma (int); | ||
| - | // lib.cpp | ||
| - | #include "lib.h" | ||
| - | int suma (int a) { | ||
| - | return a + 4; | ||
| - | } | ||
| - | /*************** Proyecto Ejecutable **********************/ | ||
| - | // bin.h | ||
| - | extern "C" _declspec(dllimport) int suma (int); | ||
| - | // bin.cpp | ||
| - | #include <iostream> | ||
| - | #include <stdlib.h> | ||
| - | #include "lib.h" | ||
| - | |||
| - | void main () { | ||
| - | std::cout << suma(33) << std::endl; | ||
| - | system("pause"); | ||
| - | } | ||
| - | </code> | ||
| - | * La parte del **''<nowiki>extern "C"</nowiki>''** no es necesaria en algunos compiladores. | ||
| - | === Palabra clave extern === | ||
| - | La palabra clave ''extern'' indica al compilador que el dato que se está definiendo existe en algún lugar del código (más abajo, en un fichero externo...), pero que es posible que todavía no se haya compilado esa parte. | ||
| - | <code cpp> | ||
| - | extern int i; | ||
| - | extern void func(); | ||
| - | int main() { | ||
| - | i = 0; | ||
| - | func(); | ||
| - | } | ||
| - | int i; | ||
| - | void func() { | ||
| - | i++; | ||
| - | cout << i; | ||
| - | } | ||
| - | </code> | ||