Ver Mensaje Individual
  #4 (permalink)  
Antiguo 10/06/2013, 15:37
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Infraccion en acceso

El main funciona sin que retorne nada porque te lo autocompleta el compilador. El retorno de main es un valor referente a la ejecucion, y se toma por defecto 0 para indicar que la aplicacion terminó correctamente. Si p.ej. tu aplicacion necesita bloquear memoria pero no hay suficiente, en vez de retornar 0 retornas 1 para indicar que no termino correctamente (es decir, terminó sin fallos pero no pudo iniciar o no pudo completar la tarea que se esperaba), luego en el manual de tu aplicacion indicas que retorna 1 cuando no encuentra memoria disponible. Cuando A llama a B para que manipule los datos C, si B retorna !=0 es que A no puede retomar los datos C porque en B se produjo algun error. Si siempre retornas 0 implicará que tu aplicacion siempre funciona correctamente. Seguramente habras visto la funcion 'exit(1)', lo que hace es salir retornando 1, si la aplicacion fue ejecutada directamente por el usuario al salir con 1 se notifica al s.o. que esa aplicacion encontro algun problema.

Lo de fflush en el manual de fflush indica que está definida para trabajar con streams de salida (escritura) y para streams nulos, pero para streams de entrada (lectura) depende de la implementacion de la libreria (es decir que no hay un funcionamiento estandar).

El stdin es el standard input stream que normalmente será el teclado (nota: el stdout es el stream de salida estandar que normalmente será la pantalla, y el stderr será el stream de salida estandar de errores que normalmente tambien sará la pantalla; los tres streams estan disponibles de forma automatica desde el inicio de la aplicacion, y se cierran al final). Cualquier tecla que pinches se guardará en ese buffer, luego con las funciones de lectura de teclado (getchar, scanf, etc) se iran leyendo esos datos (hay funciones que los leen hasta encontrar determinado caracter, algunas funciones permiten formatear la entrada, etc...). Cuando quieres vaciar el buffer de entrada por teclado debes usar una funcion que vacia ese stream pero no el fflush porque su funcionamiento no está previsto para stdin:

Código:
//creas tu propia funcion, está en C pero sirve para c++
//simplemente lee todos los caracteres del stdin y los omite
//algunas implementaciones de esta funcion se limitan a comparar solo contra \n
void fflush_stdin() {
    while ((ch = getchar()) != EOF && ch != '\n');
}

//luego en cualquier sitio que tengas fflush(stdin) cambias por fflush_stdin()
add(principio);
fflush_stdin();
printf("\nEl numero es: %d", principio->numero);
Otra cosa, vacias stdin porque scanf deja restos en stdin, luego si el problema viene de scanf lo normal es que vacies el stdin immediatamente despues del scanf (o cuando ya no necesites los datos restantes de esa operacion) en vez de hacerlo fuera de la funcion ok? No es que no funcione, sino que sirve para organizar el codigo. Mientras el usuario entra un numero por teclado y le da al enter, en el stdin se guarda ese numero mas el caracter \n (enter); luego en el scanf lees de stdin el formato %d, es decir que scanf sacará de stdin solo el primer numero y dejara el resto que en este caso es \n; cuando sabes seguro que n ovas a necesitar ese resto limpias el stdin sin esperar a que finalice la funcion.

Saludos
vosk