Возврат нескольких значений из функции

Может ли кто-нибудь сказать мне, как вернуть несколько значений из функции?
Пожалуйста, уточните в каком-то примере?

Ответы

Ответ 1

Ваш выбор здесь - либо вернуть структуру с элементами по своему вкусу, либо заставить функцию обрабатывать аргументы с указателями.

/* 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;
}

Ответ 2

Вы не можете сделать это напрямую. Ваши параметры состоят в том, чтобы обернуть несколько значений в структуру или передать их в качестве аргументов указателя функции.

например.

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;
}

или

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

Ответ 3

Прежде всего, сделайте шаг назад и спросите, почему вам нужно вернуть несколько значений. Если эти значения не связаны каким-либо образом друг с другом (функционально или оперативно), вам необходимо прекратить и переосмыслить то, что вы делаете.

Если различные элементы данных являются частью более крупного составного типа данных (такого как почтовый адрес или позиция в заказе клиента или какой-либо другой тип, описываемый несколькими атрибутами), затем определите тип структуры для представления одно значение этого составного типа:

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) {...}

Do not определить структуру для сбора случайных элементов, которые не так или иначе связаны друг с другом; что просто вызовет путаницу для вас и любого, кто должен поддерживать ваш код в будущем.

Если элементы данных не являются функционально связанными, но каким-то образом связаны с операциями (например, данные плюс флаг состояния плюс метаданные об операции или элементах как часть одной операции ввода), затем используйте несколько параметров для записи. Наиболее очевидными примерами являются функции *scanf() в стандартной библиотеке. Существуют также функции strtod() и strtol(), которые преобразуют строковое представление числа; они возвращают преобразованное значение, но они также записывают первый символ, который не был преобразован в отдельный параметр:

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);

Вы можете комбинировать эти подходы; вот пример, вдохновленный некоторой работой, которую я сейчас делаю:

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);

Служба, запрашивающая данные о высоте, возвращает 1-мерную последовательность значений; размеры массива возвращаются как часть метаданных.

Ответ 4

Вы можете сделать это с помощью структур:

#include <stdio.h>

struct dont { int x; double y; };

struct dont fred(void)
{
        struct dont b;
        b.x = 1;
        b.y = 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;
}

Ответ 5

Вы не можете вернуть несколько значений из функции C. Вы можете либо

  • Возвращает структуру данных с несколькими значениями, такими как структура или массив.
  • Переместите указатели на функцию и измените значения указателей внутри функции. Вам нужно передать x число указателей, где x - количество возвращаемых значений, которое вам нужно

Ответ 6

Чтобы вернуть несколько значений из функции, мы должны использовать указатель. Вот пример, по которому вы можете лучше понять его

int* twoSum(int* nums, int numsSize, int target) {

int i,j,*a;
a=(int*)malloc(2*sizeof(int));
for(i=0;i<numsSize;i++)
for(j=i+1;j<numsSize;j++)
if(nums[i]+nums[j]==target)
 {
     a[0]=i;
     a[1]=j;
 return a;
 }

}

Ответ 7

Я начинаю на C, поэтому у меня нет опыта с массивом, указателем, структурой. Чтобы получить более одного значения от моей функции, я просто использовал глобальную переменную.

Вот мой код:

#include <stdio.h>

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;

}

Ответ 8

В способе 1 используется массив

В способе 2 используется указатель

Метод 3 использует структуру