Autor Tema: Función Void main void en C++

0 Usuarios y 1 Visitante están viendo este tema.

22 Agosto, 2010, 05:16 am
Leído 21040 veces

Seras Victoria

  • Sore wa...
  • Nuevo Usuario
  • Mensajes: 9
  • Karma: +0/-0
  • Sexo: Femenino
  • "la fisica es el pensamiento de Dios"
    • Koneko chan. el lugar de dibujos anime
Muy Buenas nuevamente.
Implementando el programa que realiza una suma, llamando su funcion desde cierto punto, me aparece un error. Tengo la Clara sospecha de que el error esta en el Void;
para mas entendimiento, Agrego lo que he hecho hasta ahora

#include<stdio.h>
#include<conio.h>
int a,b;
//void sumar (void)Funcion
void sumar(void){
     int r;
     r=a+b;
     printf("el resultado de %d + %d = %d",a,b,r);
     }
     void main(void){
          printf("ingrese un digito: ");
          scanf("%d",&a);
          printf("ingrese el 2 digito: ");
          scanf("%d",&b);
          sumar();
          getch();
          }

podrian colaborarme ustedes en donde puede estar el error?
"No hay carcel mas Horrible, que la Ignorancia"--Pitagoras

22 Agosto, 2010, 05:50 am
Respuesta #1

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,292
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
  • Vean mis posts activos en mi página personal
    • Mis posts activos (click aquí)
El estilo de programación es muy malo,
pero el programa debiera compilar y ejecutar dando el resultado esperado.

No entiendo el problema.

¿Qué error te tira, con qué valores, en qué situación?

22 Agosto, 2010, 05:55 am
Respuesta #2

Seras Victoria

  • Sore wa...
  • Nuevo Usuario
  • Mensajes: 9
  • Karma: +0/-0
  • Sexo: Femenino
  • "la fisica es el pensamiento de Dios"
    • Koneko chan. el lugar de dibujos anime
O.o bueno en cuanto a la programacion mala, solo estoy empezando
estoy en II semestre de Tecnologia en Sistemas, y lo anterior fue un ejemplo
dado por el profesor sin terminar.

El error que aparece dice que en la linea que dice
--void main(void){
el error que aparece dice lo siguiente
""`main must return `int"".....eso es lo que no entiendo
"No hay carcel mas Horrible, que la Ignorancia"--Pitagoras

22 Agosto, 2010, 06:02 am
Respuesta #3

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,292
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
  • Vean mis posts activos en mi página personal
    • Mis posts activos (click aquí)
Ah, bien.

Lo que pasa es que la función main es muy especial,
y cada compilador la trata de modo diferente.

Algunos te dan más libertad que otros para "hacerle cositas" a main.

De todas maneras, creería que en todo compilador estándar la función main debe retornar un entero.

O sea, se trata de algo más o menos estándarizado.

En vez de void main(...) tendrías que poner

int main(...)



La función main es , como sabrás, obligatoria en C++,
y tiene un formato que seguramente es obligatorio.

Puede haber diferencias entre C y C++, yo no me acuerdo qué es lo estándar, y además eso va cambiando...
Como sea, el C++ es más exigente.

El valor de retorno de main es un entero que le indica al sistema operativo el código de error que se produjo al terminar el programa.

Si el código de error es 0, significa que no ha habido error alguno.

Ese código puede servir para enviar información de otro tipo.

En cuanto a los argumentos de main, a lo mejor tampoco se pone void,
porque main trabaja con dos punteros a char.

A lo mejor si corregís lo que te dije, siga dando error por ese motivo.

El formato estándar de main es:

int main(int argc, char *argv[] )

Eso es preferible no cambiarlo.
Hay compiladores que seguramente ni te dejan hacerlo.


-----------------------

en cuanto al estilo de programación, lo malo es el uso de variables globales como tus int a, b;

Conviene programar de forma más modular.
Pero eso te lo cuento si te interesa ahora, si no, lo aprenderás luego, da igual.

Saludos

22 Agosto, 2010, 06:09 am
Respuesta #4

Seras Victoria

  • Sore wa...
  • Nuevo Usuario
  • Mensajes: 9
  • Karma: +0/-0
  • Sexo: Femenino
  • "la fisica es el pensamiento de Dios"
    • Koneko chan. el lugar de dibujos anime
""en cuanto al estilo de programación, lo malo es el uso de variables globales como tus int a, b;

Conviene programar de forma más modular.
Pero eso te lo cuento si te interesa ahora, si no, lo aprenderás luego, da igual.""

como ya te dije, apenas estoy aprendiendo. Igual Muchas gracias por tu aporte, Pero Explicame algo, que hago entonces con las Variables, las cambio? que tecnica hay en ella? es malo? por que que yo tengo entendido para poder "introducir los digitos" estos deben tener su "variable para guardarlos" o no?
"No hay carcel mas Horrible, que la Ignorancia"--Pitagoras

22 Agosto, 2010, 06:16 am
Respuesta #5

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,292
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
  • Vean mis posts activos en mi página personal
    • Mis posts activos (click aquí)
Las variables usadas en una función, es conveniente que se definan adentro de esa función.
Porque si no, se embarra y confunde mucho la lógica del programa.

claro que esto se nota recién cuando hacés programas grandes, que se hace mucho lío con las variables.

Así que a, b, deben estar definidas adentro de main.

El problema es que después que hagas eso, la función de suma quedará "ciega" para las variables a, b, porque no las podrá ver.
Y justamente no las verá porque las funciones son bloques cerrados de código, y lo que pongas adentro de una función no se verá desde dentro de la otra.

Así que al definir a, b, dentro de main, ya no se verán dentro de "sumar".

Para poder sumar esos números, hay que "pasarle la información" a la función "sumar" de manera explícita.
Esto se hace mediante parámetros.
En vez de poner sumar(void), se pone sumar(int a, int b);

Y después todo lo demás quedaría igual...


Sin embargo, los parámetros int a, int b, definen variables a, b, que son internas al bloque "sumar", y aunque tengan el mismo nombre que las variables a, b, de "main", en realidad son distintas, porque están en bloques de memoria RAM diferentes,

Esto complica las cosas, pero permite que tengas más control y orden en la lógica de los programas.

Claro que, si tu profesor te está enseñando las cosas de otra manera, es porque quiere ir de a poco, y estas cosas te las explicará luego.

Saludos

22 Agosto, 2010, 06:18 am
Respuesta #6

Seras Victoria

  • Sore wa...
  • Nuevo Usuario
  • Mensajes: 9
  • Karma: +0/-0
  • Sexo: Femenino
  • "la fisica es el pensamiento de Dios"
    • Koneko chan. el lugar de dibujos anime
OHHHHH siiii eso es lo que estamos viendo,Funciones y Bloques....mmmm Interesante n.n Muchas Graciaassss!!! n.n  te agregare a mi correo n.n de verdad necesito inspiracion y ayuda...
"No hay carcel mas Horrible, que la Ignorancia"--Pitagoras

22 Agosto, 2010, 01:54 pm
Respuesta #7

cheroky

  • Novato
  • Mensajes: 143
  • Karma: +0/-0
  • Sexo: Masculino
  • Un globo, dos globos, tres globos...
Hola Seras Victoria.

Debes concretar en que lenguaje programas ya que todo indica que es C, no C++.

En C89/90 (el estándar de facto) la función main se define como:
Código: [Seleccionar]
int main(void)
{
/* --- */
return N;
}
donde N es un entero que usualmente es capturado por el entorno para detectar si la función se ejecuto con éxito. En el encabezado stdlib.h dispones de las macros EXIT_SUCCESS y EXIT_FAILURE para este propósito.

Solo en el caso de que main reciba una lista de argumentos debe tener la siguiente definición:
Código: [Seleccionar]
int main(int argc, char* argv[]) donde argv es un puntero a un array de punteros a "cadena" y argc es el numero de argumentos introducidos. Esto solo para que te "suene", seguramente lo veras más adelante.

Por otra parte salvo que se tenga una buena razón se debe evitar el uso de variables "globales" por varios motivos, se compromete (como ya te comentó argentinator) la modularidad, se desaprovecha memoria debido a su persistencia, obliga a implementar funciones que solo se acoplan a estas variables perdiendo por tanto generacidad y reutilización, son propensas a generar errores de lógica ya que el compilador evita la colisión de nombres dando preferencia a los nombres idénticos que tienen scope local (variables locales).

A titulo personal, considero un error como vuestro profesor os esta enseñando.

Una forma de desarrollar el ejercicio correctamente seria con el paso de variables por copia, ver ejemplo:
Se omite la [CENSORED] conio, no es una librería estándar, no esta soportada por todos los compiladores y no la necesitas para generar una pausa, en su lugar aunque no es de mi devoción puedes utilizar una llamada al shell, o mejor aún ejecutar el programa desde el mismo y no tener que utilizar pausa alguna (¿consola de windows?)   

Ejemplo:
Código: [Seleccionar]
#include<stdio.h>
#include<stdlib.h>

void sumar(int a, int b); /* prototipo */

     
int main(void)
{
int a;
int b;

    printf("ingrese un digito: ");
    scanf("%d", &a);
         
    printf("ingrese el 2 digito: ");
    scanf("%d", &b);

    sumar(a, b);

    system("pause");

return EXIT_SUCCESS;
}


void sumar(int a, int b)
{

    printf("el resultado de %d + %d = %d\n", a, b, a + b);

return;
}

Otro punto que considero importante: a la hora de invocar el compilador se debe hacer en su modo mas estricto posible. Por ejemplo con el compilador gcc para un fuente en C sería: gcc -ansi -Wall -pedantic fuente.c -o binario donde  binario es el nombre que le he dado al ejecutable. Este modo estricto genera avisos o errores si la codificación no se adecua al estándar C89/90 también llamado ansi-C.

Un saludo. 
\( \color{black} \overrightarrow{\mathbb{C} h\exists \mathbb{R} \varnothing k Y} \)

22 Agosto, 2010, 07:29 pm
Respuesta #8

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,292
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
  • Vean mis posts activos en mi página personal
    • Mis posts activos (click aquí)
Para evitar el uso de la librería conio, se puede usar la librería stdlib, que es estándar, y en ella está la función system.

Una llamada como

system("PAUSE");

haría el trabajo.

Pero aún es posible "frenar" el final del programa sin necesidad de usar librería alguna, salvo la que ya incluiste: stdio.h

Basta agregar las líneas:

printf("Presione ENTER para terminar.\n");
scanf(" ");

22 Agosto, 2010, 09:11 pm
Respuesta #9

Seras Victoria

  • Sore wa...
  • Nuevo Usuario
  • Mensajes: 9
  • Karma: +0/-0
  • Sexo: Femenino
  • "la fisica es el pensamiento de Dios"
    • Koneko chan. el lugar de dibujos anime
wow es muy bueno sus aportes..pero jejejeje, los guardare jejejej pues lo que me han dicho mi conocimiento no entiende un poco lo que dicen. n.n pero le pondre entusiasmo, se lo preguntare al profesor. Gracias
"No hay carcel mas Horrible, que la Ignorancia"--Pitagoras