Как я могу вернуть 2 числа из функции - PullRequest
0 голосов
/ 13 мая 2018

Мне нужно скопировать и вставить этот точный код ниже в 3 отдельные функции (функция сока, функция молока и функция покупки).Поэтому я подумал, почему бы не создать другую функцию с именем array_checker и вызвать ее в функции toe juice, milk и buy вместо копии, вставляющей код.Однако функция (скопировать вставленный код) должна вернуть 2 вещи.int item_used и int buy_now.Как я могу это сделать?

Это код, который я копирую вставить:

if (item_sale == 1) {
    item_used = TRUE;
    buy_now = legal_cards[0];
} else {
    item_used = FALSE; 
}

Ответы [ 4 ]

0 голосов
/ 13 мая 2018

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

typedef struct buy_fun_info {
   int  item_used;
   int buy_now;
}BUY;

В функции array_checker() создайте переменную вышеуказанной структуры, заполните элементы и верните их.например,

BUY array_checker() { /*array_checker() function */
   BUY obj;
   obj.buy_now = legal_cards[0];
   obj.item_used = FALSE;

   return obj;/* return structure variable */   
}

Выше я попытался объяснить на примере примера, вам нужно изменить соответственно.

0 голосов
/ 13 мая 2018

Существует два основных подхода к этому:

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

Вот пример первого подхода:

struct buy_decision {
    int item_used;
    int buy_now;
};

buy_decision milk(...) {
    buy_decision res;
    if (item_sale == 1) {
        res.item_used = TRUE;
        res.buy_now = legal_cards[0];
    } else {
        res.item_used = FALSE; 
        res.buy_now = 0;
    }
    return res;
}

Вот пример второго подхода с buy_now, взятым указателем:

int milk(..., int* buy_now_ptr) {
    if (item_sale == 1) {
        *buy_now_ptr = legal_cards[0];
        return TRUE;
    }
    return FALSE;
}
0 голосов
/ 13 мая 2018

Вы должны либо определить структуру для возврата:

struct itemStuff {
    int itemUsed;
    int buy_now;
}

тогда

struct itemStuff myItemFunction(...) {
    struct itemStuff myItem;

    (...)

    if (item_sale == 1) {
        myItem.item_used = TRUE;
        myItem.buy_now = legal_cards[0];
    } else {
        myItem.item_used = FALSE; 
    }

    return myItem;
}

Вызывающая функция должна будет создать ту же структуру для получения возвращаемых данных

struct itemStuff thisItem = myItemFunction(...);

или используйте обходную ссылку для передачи изменяемых аргументов

void myItemFunction(..., int *item_used, int *buy_noe) {
    if (item_sale == 1) {
        *item_used = TRUE;
        *buy_now = legal_cards[0];
    } else {
        *item_used = FALSE; 
    }
}

Здесь вызывающий должен передать адрес двух целых чисел, которые должны быть установлены:

int used;
int buy;

myItemFunction(..., &used, &buy);
0 голосов
/ 13 мая 2018

Ну, вы можете вернуть массив с обоими числами.

...