2014-10-27 3 views
0

Как бы я мог принять, скажем 2 значения, а затем вывести его через одну функцию (которая должна выполнять два разных типа вычислений с одинаковыми входными значениями), чтобы я мог выводить два разных значения?Как отправить несколько значений из одной функции?

В качестве примера у меня есть 2 входа (например: int a = 2 и int b = 5), а затем я буду делать с ними некоторые вычисления (1-й: (a + b) * 2, 2nd один: (ab)/2). Обычно я использовал две функции для этого, но как я могу заставить их быть под одной функцией и все же дать мне два разных значения?

Редактировать: Я заметил, что часть ответа заключалась в использовании указателей, но как бы я мог распечатать несколько ответов от одной и той же функции в основной программе (на самом деле я хочу специально напечатать из основного)?

+2

прочитайте что-нибудь о передаче аргументов с помощью 'call by reference' или' call by address.' –

+1

Вы рассматривали использование массивов как возвращаемых типов, где вы можете вернуть два разных значения? Если ваши значения не относятся к одному типу, следует работать с 'struct'? – ha9u63ar

+1

@jetuas не делайте _edit_ ваш вопрос ** добавить ** другой. использовать комментарии. –

ответ

3

Вы можете сделать что-то вроде этого

int main() 
{ 
    int a=2, b= 5; 
    int result1 =0, result2 =0; 

    call_your_func(a,b, &result1 , &result2); 

} 

void call_your_func(int p, int q, int * res1, int * res2) 
{ 
//do the first calculcation on a and b, store in *res1 

//do the second calculcation on a and b, store in *res2 

} 

Если вам нужно возвратить большее количество результатов, вы можете cosider с использованием массива для возврата значений.

EDIT


Внутри main() просто напечатать значения result1 и result2 после вызова call_your_func(). Он распечатает желаемые результаты.

+0

Ой, подождите, поэтому, если я сохраню его в этом указателе, мне не нужно возвращать «call_your_function»? – Jetuas

+1

Да, вы правы. См. Мой предыдущий комментарий. –

1

Используйте указатели:

float value1, value2; 
// ... 

    your_function(4, 3, &value1, &value2); 
// ... 



void your_function(int a, int b, float *value1, float *value2) 
{ 
    *value1 = (a+b)*2; 
    *value2 = (a+b)/2; 
} 
2
struct two_results { 
    double x; 
    double y; 
} 

struct two_results add_sub(double a, double b) { 
    struct two_results ret; 
    ret.x = a + b; 
    ret.y = a - b; 
    return ret; 
} 

Это позволяет сделать

struct two_results res1 = add_sub(4, 3); 
sum2 = add_sub(6, 3).x; 
diff3 = add_sub(12, 3).y; 
1

Вы говорите: «Но как бы я смог распечатать несколько ответов из одной и той же функции?»

sprintf(fout,"%d, %d", c, myFunc(a,b,&c)); 

напечатает значение c, рассчитанное myFunc, за которым следует возвращаемое значение myFunc. Что вы здесь делаете, использует порядок, в котором C толкает параметры в стек, а именно, самым правым нажатым первым. Этот самый правый параметр включает выполнение myFunc, который устанавливает переменную c. Когда myFunc возвращается, его возвращаемое значение помещается в стек. Затем вызывается следующий аргумент, который равен c, поэтому значение c, которое только что было вычислено, вставляется в стек. Теперь вызывается sprintf, который аккуратно находит два значения, которые он печатает.

Смежные вопросы