¿Cómo puedo obtener lo que ha devuelto mi función principal?

6 minutos de lectura

¿Como puedo obtener lo que ha devuelto mi funcion principal
Jeegar Patel

En un programa C, si queremos dar alguna entrada desde la terminal, podemos darla de la siguiente manera:

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

De la misma manera, si queremos obtener el valor de retorno de main() función entonces, ¿cómo podemos conseguirlo?

En cada main() nosotros escribimos return 1 o return 0; como puedo saber cual es mi main() ha vuelto a la terminal?

Editar: 1

entiendo que por echo $? podemos obtener el valor de retorno de main() pero solo me permite devolver un valor inferior a 125 (en Linux) con éxito. Un valor de retorno mayor que ese no puede ser recibido con éxito por el $ variable entonces

por que es int el tipo de retorno de main()? ¿Por qué no mantenerlo? short int?

editar2

¿Dónde puedo averiguar el significado del código de error si main() devuelve un valor mayor que 125?

  • No hay ninguna ventaja real en elegir short sobre int a menos que tenga muchos de ellos en el mismo lugar (matriz o estructura). No es más rápido tener un short y en los ABI modernos, a menudo ni siquiera ahorra espacio al elegirlo. En algunos lugares short es más lento porque tienes que firmar la extensión al cargarlo.

    -Dietrich Epp

    25 de diciembre de 2011 a las 6:05


  • sorprendido por un voto negativo..!!!

    – Jeegar Patel

    28 de diciembre de 2011 a las 5:10


  • @Jeegar Patel… debes entender que algunas personas siempre odian

    – Mayukh Sarkar

    3 oct 2015 a las 16:58

  • Creo que eso está relacionado con el tamaño de los registros de la CPU.

    –Leonardo Hernandez

    hace 4 horas

¿Como puedo obtener lo que ha devuelto mi funcion principal
CB Bailey

La mayoría de los shells almacenan el código de salida del comando de ejecución anterior en $? para que pueda almacenarlo o exhibirlo.

$ ./a.out
$ echo $?     # note - after this command $? contains the exit code of echo!

o

$ ./a.out
$ exit_code=$?    # save the exit code in another shell variable.

Tenga en cuenta que en Linux, aunque devuelve un int, por lo general, solo los valores inferiores a 126 son seguros de usar. Los valores más altos se reservan para registrar otros errores que pueden ocurrir al intentar ejecutar un comando o para registrar qué señal, si la hay, finalizó su programa.

  • No conozco un sabor de UNIX que conserve más de los 8 bits más bajos.

    – Mike DeSimone

    24 de diciembre de 2011 a las 18:17

  • @MikeDeSimone: Acabo de revisar la página de manual de bash y en realidad es menos de lo que recordaba. Si intenta usar >125, puede chocar con los valores que usa el shell. No estoy seguro acerca de otras conchas.

    –CB Bailey

    24 de diciembre de 2011 a las 18:22

  • Buen punto. Unix permite hasta 255 en el nivel del sistema operativo, pero no dicta que el shell conserve todos esos…

    – Mike DeSimone

    24 de diciembre de 2011 a las 20:01

Su shell probablemente tenga una variable especial $?, que contiene el último valor devuelto por el programa. Entonces, poco después de que finalice su programa, puede ejecutar:

echo $?

para ver el valor devuelto.

  • Solo se interpretan los 8 bits bajos (es por eso que el valor devuelto debe estar en el rango 0-255). El 127 proviene de la representación de números enteros negativos que luego se interpretan como sin signo.

    – sidilio

    24 de diciembre de 2011 a las 18:27

  • @sidyll: Creo que te refieres a 7 bits, no a 8 bits. Los 8 bits bajos de -1 serían 255, los 7 bits bajos son 127.

    –CB Bailey

    24 de diciembre de 2011 a las 19:13

  • @eharvest: No entiendo tu trabajo. -1 es un montón de unos, trunque eso a 8 bits y trátelo como firmado y todavía tiene -1, trátelo como sin firmar y tiene 255.

    –CB Bailey

    24 de diciembre de 2011 a las 23:40


En DOS/Windows puede usar errorlevel dentro de un archivo por lotes

executable optional arguments
if errorlevel 4 goto LABEL4
if errorlevel 3 goto LABEL3
if errorlevel 2 goto LABEL2
if errorlevel 1 goto LABEL1
:SUCCESS
echo SUCCESS; errorlevel 0
goto :eof
:LABEL1
echo FAILURE; errorlevel 1
goto :eof
:LABEL2
echo FAILURE; errorlevel 2
goto :eof
REM ...

Solo recuerda marcar de mayor a menor porque if errorlevel 42 realmente significa “si el nivel de error es 42 o mayor”

  • +1 @Alex: buen punto. En mi defensa, solo noté la etiqueta después de que comencé a escribir la respuesta — y decidí completarla y publicarla.

    – pmg

    25 de diciembre de 2011 a las 0:03

  • +1 Buena respuesta. Estaba buscando un método específico de Windows, que probablemente no necesite una pregunta por separado.

    – AbdullahC

    25 de diciembre de 2011 a las 1:09

  • +1 ya que todavía es bueno poder buscar esto en un lugar en el futuro (aunque casi nunca trabajo en Windows)

    – gnometorule

    25 de diciembre de 2011 a las 4:03

Resumir comentarios y fragmentos para que estén en un solo lugar.

El programa AC siempre tiene un código de salidaque el programa puede decidir por sí mismo si termina normalmente, devolviendo un valor de la main función o llamando al exit función. Si el programa termina de manera anormal, por ejemplo por una falla de segmentación, el sistema operativo decide el código de salida.

En Unix (Posix), el código de salida es un valor de 8 bits: 0-255. Se combina con algunos otros metadatos a un estado: los otros metadatos incluyen información sobre si el programa finalizó normalmente o no, si finalizó debido a una señal y, de ser así, qué señal. Para más detalles, consulte el espera(2) página de manuales.

En Unix, en el shell, se puede acceder al estado del comando anterior como el $? variable especial. Debido a que el código de salida tiene solo 8 bits y se trata como un número entero sin signo, si devuelve un valor negativo, se convierte en uno positivo: -1 se convierte en 255. Del mismo modo, si devuelve un valor mayor que 255, solo el menor Se utilizan 8 bits significativos: 256 se convierte en 0.

El tipo de retorno de main es inten vez de short o char, porque no hay ningún beneficio particular en convertirlo en un tipo más pequeño, particularmente en este momento de la historia, décadas después de que se decidió. Cambiarlo ahora solo causaría complicaciones innecesarias.

Si desea ejecutar un programa desde C, la biblioteca estándar proporciona la system función, que devuelve cómodamente el estado del programa. (Tenga en cuenta que system ejecuta comandos a través del shell, y debe tener mucho cuidado de escapar todo correctamente si le da al comando cualquier nombre de archivo proporcionado externamente u otras cosas en la línea de comando).

Para mayor flexibilidad, puede ejecutar otros programas utilizando las llamadas al sistema fork, execl (o una de sus variantes, ver el ejecutivo(3) página del manual), y wait (ya mencionado anteriormente). Esto es poderoso y flexible, pero también es fácil cometer errores, así que asegúrese de leer la documentación y verifique primero algunos programas de ejemplo. (Por otro lado, es muy divertido aprender estas cosas).

1647566651 480 ¿Como puedo obtener lo que ha devuelto mi funcion principal
Vergonzoso

Puede obtener los valores de salida con el comando basic linux command echo $? Los códigos de error son estándar y los detalles se explican en este
Enlace

Los códigos generales son

**

0- éxito

1- errores generales

126- problema de permiso

127-Comando ilegal

128-Argumentos inválidos y errores fatales

255-Fuera de rango**

¿Problemas con el constructor Move y el operador de asignacion
Melena Abhishek

en la línea de comandos de Windows para leer el valor de retorno del uso principal eco %nivel de error%

(Código) retorno.c

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
    int i;

    printf("Enter a number");
    scanf("%d",&i);

   if(i==2)
        exit(1);
   if(i==3)
        exit(2);
    
   return 0;
}

PRODUCCIÓN

PRODUCCIÓN del programa anterior volver.c

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad