2012-04-02 5 views
2

Как передать обратно локальную переменную из функции в main, если указанная функция уже имеет возвращаемое значение? Извините за вопрос, я стараюсь сделать его максимально объективным для всех, а не только для моего случая.Как передать несколько переменных из функций в main в C?

В частности: У меня есть функция, называемая subtotal. Есть две переменные счета. Один из них я вернулся с return. Другой, который я должен сделать доступным для использования моей функцией main().

редактировать: Для уточнения:

function something() { 
    float counter = 0.0; 
    int someOtherVar = 0; 

    // the work 

    return someOtherVar; 
} 

То, что я хочу сделать, это пройти counter поплавок main.

ответ

9

Передайте указатель на дополнительное возвращаемое значение в качестве параметра функция.

int foo(int *anotherOutParam) 
{ 
    *anotherOutParam = 1; 
    return 2; 
} 

И называть его:

int ret1, ret2; 
ret1 = foo(&ret2); 
//do something with ret2 

Oftentimes, предложение @ Мэта упаковки все возвращаемые значения в struct является предпочтительным.

+0

Спасибо, понял, я добавил некоторые разъяснения к моему вопросу. – eveo

+0

Код в моем ответе в основном реализует то, что вы описываете в своем разъяснении. Замените 'int * anotherOutParam' на' float * counter', и все готово. –

+0

Проблема в том, что я определил его как 'float * count;', что хорошо, но затем я пытаюсь выполнить 'count + = anotherVar;' и он дает мне эту ошибку: 'invalid operands to binary + (имеют 'float *' и 'двойной') '. – eveo

11

Поместите все свои возвращаемые значения в struct и верните это.

#include <stdio.h> 

struct myret { 
    int total; 
    int count; 
}; 

struct myret foo(void) 
{ 
    struct myret r; 
    r.total = 42; 
    r.count = 2; 
    return r; 
} 

int main(void) 
{ 
    struct myret r = foo(); 
    printf("%d %d\n", r.total, r.count); 
    return 0; 
} 

Или используйте указатели для «других» значений возврата.

int foo(int *other) 
{ 
    if (other) 
    *other=42; 
    return 1; 
} 

int main(void) 
{ 
    int a = 0; 
    int b = foo(&a); 
    ... 
} 

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

#include <stdio.h> 

struct myret { 
    int total; 
    int count; 
}; 

int foo(struct myret *r) 
{ 
    if (r) { 
     r->total = 42; 
     r->count = 2; 
    } 
    return 0; 
} 

int main(void) 
{ 
    struct myret r; 
    int rc = foo(&r); 
    if (rc == 0) { 
     printf("%d %d\n", r.total, r.count); 
    } 
    return rc; 
} 
+0

+1: В то время как «возврат» отдельных параметров через список аргументов работает, инкапсуляция его, как в первом примере, намного более чистая, и поэтому обычно должна быть предпочтительной. –

+0

+1 Я согласен, возврат инкапсулированной структуры - это путь –

+0

Только делайте это, если все элементы структуры логически связаны друг с другом (IOW, они являются атрибутами более крупного составного типа); не создавайте агрегатный тип * для единственной цели * возврата нескольких * несвязанных * элементов из функции. –

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