Páginas: [1] 2
|
 |
|
Autor
|
Tema: ***********FAQ************ Preguntas Frecuentes y Errores comunes en C (Leído 8265 veces)
|
zheo
Desconectado
Mensajes: 707
|
Bueno pues este mensaje es una especie de mini-FAQ con los errores más comunes o las preguntas más frecuentes que se dan al empezar a pogramar C o C++ Si quereis proponer algun añadido al FAQ ponedlo en este hilo. Preguntas y Errores más Frecuentes1.- Valores de retorno y parámetros de la función main()Según el estándar, la función main sólo tiene un posible valor de retorno: int. Ni void, ni un valor indeterminado (es decir, no poner nada) ni ningún otro. Si te fastidia tener que escribir un return al final de la ejecución de la función main(), te alegrará saber que, al menos en C++, no es necesario escribir una instrucción return de forma explícita, ya que el compilador asume por defecto un return 0, que se considera que la ejecución ha finalizado correctamente. Por el momento no tengo información acerca de lo que dice el estándar de C, así que si quieres estár seguro de que sigues el estándar tendrás que poner un return 0 en la función main() (venga, que no son tantos caracteres  ) Adicionalmente los únicos parámetros estándar a la función main son, o bien ninguno: int main () {} (para los programadores de C, no hay que poner void) o bien: int main (int argc, char * argv[]) {} En este link está la opinión de Bjarne Stroustrup - creador del lenguaje C++ - al respecto: http://www.research.att.com/~bs/bs_faq2.html#void-main2.- Uso de la biblioteca conio.hLa biblioteca conio.h no es estándar sino que es propiedad de Borland, y está incluida en sus compiladores. Es una biblioteca de manejo de entrada y salida de datos en la consola para el sistema DOS. Que no sea estandar significa que no la encontrarás implementada -o al menos totalmente- en muchos compiladores, y más importante, en otros sistemas, lo que reduce la portabilidad de tu código. Por otro lado la biblioteca se considera obsoleta, y es posible que algunas de las funciones que incluye no funcionen o lo hagan incorrectamente. Pero lo más importante es darse cuenta de que esta biblioteca no es estrictamente necesaria para programar. Por experiencia las funciones más usadas de esta biblioteca son, con diferencia, clrscr() gotoxy() y getch(). clrscr() borra la pantalla, algo que por lo general no es necesario; si estás ejecutando un programa en línea de comandos es fácil y rápido teclear un comando (cls, clear) que borre la pantalla en cuestión si lo necesitas. Por contra puede que sea molesto que un programa tome la iniciativa y borre la pantalla, ya que quizá tenga datos que el usuario quiera conservar. Es decir que no pasa nada si no borras la pantalla. Normalmente la persona que usa un programa de línea de comandos no espera que eso ocurra. gotoxy() el cursor en una determinada posición de la pantalla. Esto puede resultar útil en ocasiones, pero seamos sinceros: no suele ser muy necesario mover el cursor por la pantalla, o al menos no extrictamente necesario. Por ejemplo si estás aprendiendo a programar, eso es completamente supérfluo. Si programas una aplicación avanzada es casi seguro que tendrá un interface Gráfico. En último caso, si estás programando una aplicación avanzada en consola, prosiblemente a esas alturas ya sabrás cómo hacer tú mismo esta función utilizando llamadas al sistema, lo que tiene el beneficio de que puedes encapsular esa función de cara a la portabilidad, en vez de confiar en una función de biblioteca dependiente del sistema. getch() recoge un carácter de la entrada estándar. Para eso tienes cerca de miles de funciones estándar que lo hacen. Vale, quizá no tantas, pero tienes al menos una en C getchar() y otra en C++ std::cin.get() ¿Porque usar getch() que NO es estándar cuando puedes usar una función estándar que hace exactamente lo mismo? Antes de que me llameis mentiroso, hay que reconocer que getch() no hace exactamente lo mismo que las otras dos funciones. getch() NO presenta el caracter capturado por la pantalla y la entrada es sin buffer (lo que viene a decir que no hace falta pulsar enter) Sin embargo no creo que eso por lo general sea un grave problema, es más, una entrada sin buffer puede ser incluso un problema: no puedes corregir la entrada si te equivocas.
|
|
|
|
« Última modificación: 21 Febrero 2005, 00:53 por zheo »
|
En línea
|
|
|
|
|
Ragnarok
|
3.- ¿Cómo aprendo a programar en C/C++?Aquí tienes dos buenos manuales, uno para C: http://mec21.etsii.upm.es/ayudainf/aprendainf/AnsiC/leng_c.pdfy otro para C++. http://mec21.etsii.upm.es/ayudainf/aprendainf/Cpp/manualcpp.pdf4.- ¿Y qué hago para programar?Para poder llevar a la práctica lo que aprendas necesitarás un editor para escribir el código, como puede ser el bloc de notas o emacs. Un compilador para construir los ejecutables. Si además quieres depurar tus programas necesitarás un depurador. A menudo el editor, el compilador y el depurador vienen en un sólo programa conocido como Entorno de Desarrollo Integrado o IDE (Integrated Development Environment) 5.- Quiero un IDE ¿qué IDE puedo usar?Deberías haber mirado el tema pegado en el que puedes encontrar entornos de programación y compiladores para todos los lenguajes, pero ya que no lo has hecho puedes descargar el dev cpp de la siguiente página: http://www.bloodshed.net/devcpp.htmlTienes además un manual de instalación y primeros pasos con dev cpp hecho por el mismísimo Zheo en: http://www.hispabyte.com/biblioteca/index.php?action=file&id=319Editado: No hace falta aprender C para saber C++ (de hecho puede crear malos vicios  ) Por otro lado IDE estaba bien escrito  Muchas gracias por la colaboración jefe
|
|
|
|
« Última modificación: 29 Abril 2004, 08:21 por zheo »
|
En línea
|
|
|
|
|
Griph
|
Algo que cabe acotar este hilo es lo siguiente: Que a veces cuando se trabaja con Matrices (Arrays o Arreglos, lo tres nombres son sinónimos) puede ocurrir que se escriba en un elemento que no está disponible. Por consiguiente estaríamos escribiendo en una dirección en memoria no reservada para tal variable; por lo tanto escribiríamos en un sector de la memoria que no conocemos, y podríamos dañar la aplicación que se encuentre en esa dirección de memoria aleatoria (porque puede ser cualquiera, aunque será la que le sigue al elemento anterior). Veamos un ejemplo de este tipo de error (no lo pruebes, puede bloquear el ordenador): #include <stdio.h>
int main() { //Declaración de las variables: int temp[24]; float promedio; int hora;
//Utilización de un Bucle: "For". for(hora=0; [b]hora<28[/b]; hora++) { printf("La Temperatura de las %i: ", hora); scanf("%i", &temp[hora]); promedio += temp[hora]; } //Se obtiene el promedio de temperaturas de todo un día. promedio = promedio / 24;
//Se imprimen los resultados en pantalla (salida estándar). printf("\nLa temperatura promedio es %f\n", promedio); }
int temp[24]; .......... .......... for( hora=0; hora<28; hora++ ) .......... ..........
Aquí podemos observar que el bucle for nos da la posibilidad de seguir escribiendo en memoria aun cuando se han acabado las variables del arreglo de enteros ya declarado. Todo por un simple error en la condición del bucle usado. Saludos.
PD: tal vez este no sea un error frecuente en la programación en lenguaje C, pero puede suceder si el programador se equivoca al contar el número de elementos. En fin nadie esta libre de error: nadie.
|
|
|
|
|
En línea
|
|
|
|
Juancito
Desconectado
Mensajes: 9
|
Errores Comunes: *Olvidarse poner el & referenciando un lugar de memoria:... //Mal scanf ("%d", numero);
//Bien scanf ("%d", &numero); ... *No Abrir/Cerrar correctamente Parentesis:
//MAL !!
Void main () { ... for (...) { .... while (...) { .... }} //dos parentesis, falta uno de cierre !!!
//Bien :D
Void main () { ... for (...) { .... while (...) { .... } } }
Si se tiene una indentación adecuada, no surgen este tipo de error. *Mal uso de operadores:Un ejemplo tipico es usar el operador unario ++ en cualquier lado y no poner bien los parentesis. si a =1, b = 4, c = 5 -->
resultado = a + b / --c; //Total --> 2
resultado = (a + b) / (c - 1); //Total --> 5/4 > 2 Hay que saber bien las Precedencias de los operadores. Y poner parentesis es un segundo de vida que les cuesta, pero es un minuto ganado en cuando a la legibilidad del programa. Todo por hoy... c-you Juan
|
|
|
|
« Última modificación: 08 Mayo 2005, 15:19 por Juancito »
|
En línea
|
|
|
|
--]SpideR[--
Desconectado
Mensajes: 24
No Sufro de locura, la disfruto dia a dia
|
Uno de los errores muy comunes al momento de compilar es que nos aparezca el mensaje: Lvalue required in functiony sucede en estos casos: int ConvierteMayuscula (char *cad1, const char *cad2, int *n) { int i, j, k, u=0; for (i=0; cad2[i]!= '\0'; i++) { if((0<=cad2[i]) || (cad2[i]<=9)) k++; else { j=1; cad1[u]=toupper(cad2[i]); u++; } } (int)n=k; if (j==0) return 0; else return 1; } En esta funcion se intenta castear la variable n que es de tipo (INT *) a una variable de tipo (INT), el compilador nos muestra el erro que haciamos mencion antes. Este error es muy comun y lo que nos esta indicando es que necesitamos un valor del lado izquierdo de la operacion. Suele darse mucho cuando se trabaja con punteros, queriendole asignar un "valor" a un puntero y este valor no es una direccion de memoria o cuando se quiere hacer una operacion del lado "izquierdo" de la asignacion. Espero que les sirva. SalHugos Skiel
|
|
|
|
« Última modificación: 27 Julio 2005, 03:09 por --]SpideR[-- »
|
En línea
|
-Libera tu mente que tu culo la va a seguir!!!!
-Quieren al picho y no a sus pulgas!!!!
|
|
|
Kanny
Desconectado
Mensajes: 45
No hay camino hacia la libertad.... la libertad es
|
(disculpen si aparece varias veces mi respuesta.. pero es que me da error al publicar :-)
Para evitar esos errores de asignamiento de memoria en los arrays, lo mas comodo y "limpio" es usar constantes a traves de los #defines Con programas pequeños es una tonteria.. pero en cuanto se empieza a hacer programas un poco mas largos te das cuenta de la gran utilidad que tienen :shocked:
weno.. ahí va un ejemplo simple:
#include <stdio.h>
#define LONGITUD 24 //ajustamos la longitud de la cadena
main () { int cadena [LONGITUD]; //declaramos la cadena int index; //declaramos contador
for (index=0;index<LONGITUD;index++) { printf ("\nIntroduce el numero %d : ",index+1); scanf ("%d",&cadena[index]); } return 0; }
|
|
|
|
|
En línea
|
|
|
|
X.Cyclop
Desconectado
Mensajes: 2.721
Interests: Programming & OS (Windows & GNU/Linux)
|
Emular gotoxy() con el Dev-C++Si usas esto: #include <stdio.h> #include <conio.h>
int main() { clrscr(); gotoxy( 20, 10 ); printf( "Estoy aqui" );
return 0; } El Dev-C++ te dará error de que gotoxy no está definido. Esto es porque necesita la librería conio y no es estándar, es de Borland. Para eso, solo tienes una solución, usar un FOR: for(int y=0;y<10;y++) printf("\n");
for(int x=0;x<20;x++) printf(" ");
printf("Hello World"); 
|
|
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 50
|
Como se indica en uno de los primeros mensajes es mejor utilizar las facilidades del SO que se este utilizando.
En el caso de MS Windows se puede utilizar la funcion SetConsoleCursorPosition.
Un saludo
|
|
|
|
|
En línea
|
|
|
|
X.Cyclop
Desconectado
Mensajes: 2.721
Interests: Programming & OS (Windows & GNU/Linux)
|
Manuales de CEspañolInglés
|
|
|
|
« Última modificación: 18 Abril 2006, 05:16 por X.Cyclop »
|
En línea
|
|
|
|
X.Cyclop
Desconectado
Mensajes: 2.721
Interests: Programming & OS (Windows & GNU/Linux)
|
Manuales de C++EspañolInglésNota: Si buscas algún e-book en inglés (de C++ y/o Asm), pídelo por privado. No voy a subirlos porque son como 38, más de 120Mb. 
|
|
|
|
« Última modificación: 18 Abril 2006, 05:18 por X.Cyclop »
|
En línea
|
|
|
|
|
H@T
|
Editado: No hace falta aprender C para saber C++ (de hecho puede crear malos vicios
Entonces no entiendo porque en la facultad primero me enseñan C y luego C++??? Es cierto eso de los malos vicios, pq a veces te dicen en C hagalo asi, despues en C++ te dicen ahora es asi, olvidense de C, no los entiendo.
|
|
|
|
|
En línea
|
|
|
|
De@th
TROLL
Desconectado
Mensajes: 170
|
Y Que Hay Del Comando System??? Como Pasarle Argumentos O Usar Otra Funcion Con El Mismo Fin Que Lo Permita ??
|
|
|
|
|
En línea
|
(8) REPENT, that's what I'm talking about Whose mistake am I anyway? (8) (8) You can't kill me motherfuckers ! (8)
Marilyn Manson - Antichrist Superstar
|
|
|
X.Cyclop
Desconectado
Mensajes: 2.721
Interests: Programming & OS (Windows & GNU/Linux)
|
Entonces no entiendo porque en la facultad primero me enseñan C y luego C++???
Es cierto eso de los malos vicios, pq a veces te dicen en C hagalo asi, despues en C++ te dicen ahora es asi, olvidense de C, no los entiendo.
Porque te enseñan los 2 tipos de programación: Estructurada y Orientada a objetos. Por eso es mejor aprender los 2. 
|
|
|
|
|
En línea
|
|
|
|
X.Cyclop
Desconectado
Mensajes: 2.721
Interests: Programming & OS (Windows & GNU/Linux)
|
Entonces no entiendo porque en la facultad primero me enseñan C y luego C++???
Es cierto eso de los malos vicios, pq a veces te dicen en C hagalo asi, despues en C++ te dicen ahora es asi, olvidense de C, no los entiendo.
Porque te enseñan los 2 tipos de programación: Estructurada (C) y Orientada a Objetos (C++).
|
|
|
|
|
En línea
|
|
|
|
X.Cyclop
Desconectado
Mensajes: 2.721
Interests: Programming & OS (Windows & GNU/Linux)
|
|
|
|
|
|
En línea
|
|
|
|
|
Páginas: [1] 2
|
|
|
|