Soy nuevo en C y tengo una función que calcula un par de variables. Pero por ahora vamos a simplificar las cosas. Lo que yo quiero es tener una función que «devuelve» múltiples variables. Aunque, a mi entender, sólo puede devolver una variable en C. Así que me dijeron que puede pasar la dirección de una variable y hacerlo de esa manera. Esta es la distancia que tengo y me preguntaba que podría tener una mano. Me estoy poniendo un poco justo de errores sobre el C90 prohibido cosas, etc. Estoy casi seguro de que es mi sintaxis.

Decir que este es mi función principal:

void func(int*, int*);

int main()
{
    int x, y;
    func(&x, &y);

    printf("Value of x is: %d\n", x);
    printf("Value of y is: %d\n", y);

    return 0;
}

void func(int* x, int* y)
{
    x = 5;
    y = 5;
}

Esta es esencialmente la estructura de la que estoy trabajando. Podría alguien darme una mano aquí?

  • Por el camino, quiero que los valores de x e y para imprimir «5». La esperanza de que fue indirectamente entendido.
  • Gracias por todos los grandes respuestas, podría alguien por favor la dirección de mi comentario a @Mehrdad con respecto a la asignación de valores a un pasado variable
InformationsquelleAutor Amit | 2011-04-10

5 Comentarios

  1. 9

    Debe utilizar *variable para referirse a lo que es un puntero que señala a:

    *x = 5;
    *y = 5;

    Qué es lo que está haciendo es establecer el puntero a la dirección 5. Usted puede salirse con la mierda viejo compiladores, pero un buen compilador detectará un tipo de desajuste en la asignación de un int a un int* variable y no te deja hacer sin una conversión explícita.

    • Lo que yo veo. Voy a probar, gracias.
    • Una pregunta más, ¿qué pasa si en mi función, en realidad yo soy de averiguar lo que una variable es de un archivo. Aka tengo fscanf(file, "%d", &x), sería fscanf(file, "%d", &*x); ?
    • Sí, sería &*x. Sin embargo, & es esencialmente la inversa de * en este contexto. Así que usted puede simplemente decir x y va a ser la misma cosa. &x está definitivamente mal, aunque.
    • Perfecto. Muchas gracias por tu ayuda.
    • Nunca vas a llevarme de tipo escayola, compilador! Ahahahahaha!!!
    • Tengo una última pregunta, lo siento! Es una buena práctica para trabajar con variables como el que, mientras se pasa la dirección a la función y cambiar el valor de la variable dentro de la función en sí, o es menospreciado y no debería utilizarse? Pensé que probablemente una de las ventajas de C, de lo contrario «regreso» de múltiples variables sería un dolor en el cuello, ¿no?
    • Es muy común el uso de este estilo. Pero no debería ser usado cuando una simple no-variable de puntero sería suficiente. Además, en general, suele ser una buena idea para el diseño de sus procedimientos para mantener los cambios locales a sí mismos en lugar de hacer cambios globales en todo el programa. Facilita la depuración y mejora de la capacidad de mantenimiento.
    • Gracias! +1 🙂 [espacio]

  2. 3
    void function(int *x, int* y) {
        *x = 5; 
        *y = 5; 
    }

    cambia los valores de los parámetros.

  3. 0

    Además de los cambios que la de otros carteles han sugerido para el cuerpo de la función, cambiar su prototipo para void func(int *,int *), y cambiar su definición de la función (por debajo principal) para reflejar vacío así. Cuando no se especifica un tipo de retorno, el compilador cree que usted está tratando de implicar un int retorno.

    • a la derecha de curso, lo siento, me olvidé de eso, yo simplemente escribí el código en TAN.
  4. 0

    Usted no puede declarar hacia delante func(int,int) cuando en realidad se trata de func(int*, int*). Por otra parte, cuál debería ser el tipo de retorno de func ser? Ya que no uso retorno, me gustaría sugerir el uso de void func(int*, int*).

    • Originalmente fue void func(int *, int*);, pero sin las etiquetas de código, que se representa como: void func(int , int);.
  5. 0

    Puede devolver una única variable de tipo struct.

    #include <stdio.h>
    #include <string.h>
    
    struct Multi {
      int anint;
      double adouble;
      char astring[200];
    };
    
    struct Multi fxfoo(int parm) {
      struct Multi retval = {0};
      if (parm != 0) {
        retval.anint = parm;
        retval.adouble = parm;
        retval.astring[0] = parm;
      }
      return retval;
    }
    
    int main(void) {
      struct Multi xx;
      if (fxfoo(0).adouble <= 0) printf("ok\n");
      xx = fxfoo(42);
      if (strcmp(xx.astring, "\x2a") == 0) printf("ok\n");
      return 0;
    }

Dejar respuesta

Please enter your comment!
Please enter your name here