Возврат нескольких значений из функции
Может ли кто-нибудь сказать мне, как вернуть несколько значений из функции?
Пожалуйста, уточните в каком-то примере?
Ответы
Ответ 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 использует структуру