devolver múltiples valores desde una función

¿Alguien puede decirme cómo devolver múltiples valores de una función?
Por favor, elabora con algún ejemplo?

Sus opciones aquí son devolver una estructura con los elementos que le gusten o realizar la función para manejar los argumentos con punteros.

/* method 1 */ struct Bar{ int x; int y; }; struct Bar funct(); struct Bar funct(){ struct Bar result; result.x = 1; result.y = 2; return result; } /* method 2 */ void funct2(int *x, int *y); void funct2(int *x, int *y){ /* dereferencing and setting */ *x = 1; *y = 2; } int main(int argc, char* argv[]) { struct Bar dunno = funct(); int x,y; funct2(&x, &y); // dunno.x == x // dunno.y == y return 0; } 

No puedes hacer eso directamente. Sus opciones son envolver varios valores en una estructura o pasarlos como argumentos de puntero a la función.

p.ej

 typedef struct blah { int a; float b; } blah_t; blah_t my_func() { blah_t blah; blah.a = 1; blah.b = 2.0f; return blah; } 

o:

 void my_func(int *p_a, float *p_b) { *p_a = 1; *p_b = 2.0f; } 

Antes que nada, retroceda un paso y pregunte por qué necesita devolver múltiples valores. Si esos valores no están de alguna manera relacionados entre sí (ya sea funcional u operacionalmente), entonces debe detenerse y reconsiderar lo que está haciendo.

Si los diversos elementos de datos son parte de un tipo de datos compuesto más grande (como una dirección postal o una línea de pedido de venta o algún otro tipo descrito por múltiples atributos), defina un tipo de estructura para representar un valor único de ese tipo compuesto:

 struct addr { // struct type to represent mailing address char *name; int streetNumber; char *streetName; char *unitNumber; char *city; char state[3]; int ZIP; }; struct addr getAddressFor(char *name) {...} struct point2D { int x; int y; }; struct polygon2D { size_t numPoints; struct point2D *points; }; struct point2D getOrigin(struct polygon2D poly) {...} 

No defina una estructura para recostackr elementos aleatorios que de alguna manera no están relacionados entre sí; eso solo causará confusión para ti y para cualquiera que tenga que mantener tu código en el futuro.

Si los elementos de datos no están relacionados funcionalmente, sino que de alguna manera están relacionados operativamente (por ejemplo, datos más un indicador de estado más metadatos sobre la operación o elementos como parte de una única operación de entrada), entonces use múltiples parámetros de escritura. Los ejemplos más obvios son las funciones *scanf() en la biblioteca estándar. También están las funciones strtod() y strtol() , que convierten una representación de cadena de un número; devuelven el valor convertido, pero también escriben el primer carácter que no se convirtió en un parámetro separado:

 char *str = "3.14159"; double value; char *chk; value = strtod(str, &chk); if (!isspace(*chk) && *chk != 0) printf("Non-numeric character found in %s\n", str); 

Puede combinar estos enfoques; aquí hay un ejemplo inspirado por un trabajo que estoy haciendo actualmente:

 typedef enum {SUCCESS, REQ_GARBLED, NO_DATA_OF_TYPE, EMPTY, ERROR} Status; typedef struct bounds {...} Bounds; tyepdef struct metadata { size_t bytesRead; size_t elementsRead; size_t rows; size_t cols; } Metadata; typedef struct elevations { size_t numValues; short *elevations; } Elevations; Elevations elevs; Metadata meta; Bounds b = ...; // set up search boundary Status stat = getElevationsFor(b, &elevs, &meta); 

El servicio del que solicito datos de elevación devuelve una secuencia de valores 1-d; las dimensiones de la matriz se devuelven como parte de los metadatos.

Puedes hacerlo usando estructuras:

 #include  struct dont { int x; double y; }; struct dont fred(void) { struct dont b; bx = 1; by = 91.99919; return b; } int main(int argc, char **argv) { struct dont look = fred(); printf("look.x = %d, look.y = %lf\n", look.x, look.y); return 0; } 

No puede devolver múltiples valores de una función C. Tu también puedes

  1. Devuelve una estructura de datos con valores múltiples, como una estructura o una matriz.
  2. Pase punteros a la función y modifique los valores de los punteros dentro de la función. Necesita pasar x cantidad de punteros donde x es la cantidad de valores de retorno que necesita

Para devolver múltiples valores desde una función, debemos usar un puntero. Aquí hay un ejemplo a través del cual puedes entenderlo mejor

 int* twoSum(int* nums, int numsSize, int target) { int i,j,*a; a=(int*)malloc(2*sizeof(int)); for(i=0;i 

}

Soy un principiante en C, así que no tengo experiencia con array, puntero, estructura. Para obtener más de un valor de mi función, acabo de utilizar una variable global.

Aquí está mi código:

 #include  double calculateCharges( double hourCharges ); // Global variable for totalCharges-function and main-function interaction double totalCharges = 0; int main ( void ) { double car1 = 0; double car2 = 0; double car3 = 0; double totalHours = 0; printf( "%s", "Hours parked for Car #1: "); scanf( "%lf", &car1 ); printf( "%s", "Hours parked for Car #2: "); scanf( "%lf", &car2 ); printf( "%s", "Hours parked for Car #3: "); scanf( "%lf", &car3 ); totalHours = car1 + car2 + car3; printf( "%s", "Car\tHours\tCharge\n"); printf( "#1\t%.1f\t%.2f\n", car1, calculateCharges( car1 )); printf( "#2\t%.1f\t%.2f\n", car2, calculateCharges( car2 )); printf( "#3\t%.1f\t%.2f\n", car3, calculateCharges( car3 )); printf( "TOTAL\t%.1f\t%.2f\n", totalHours, totalCharges); } double calculateCharges( double hourCharges ) { double charges = 0; if( hourCharges <= 3.0 ) { charges = 2; } else if ( hourCharges >= 24.0) { charges = 10.00; } else { charges = ((hourCharges - 3.0)*0.5) + 2.0; } totalCharges += charges; return charges; } 

El método 1 está usando array

El método 2 está usando puntero

El método 3 está usando la estructura