2015-05-06 2 views
-2

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

struct num { 
    int min; 
    int max; 
}; 

struct num Some(int Array[]) { 
    int i; 
    struct num result; 
    result.max = Array[0]; 
    result.min = Array[0]; 
    for(i = 0; i<=3; i++) { 
     if(result.min > Array[i]) { 
      result.min = Array[i]; 
     } else if(result.max < Array[i]) { 
      result.max = Array[i]; 
     } 
    } 
    return result; 
} 

int main() 
{ 
    int Array[] = {7,8,3}; 
    struct num something; 
    something = Some(Array); 
    printf("Total is %d and max is %d",something.min,something.max); 
} 

Программа печатает правильное минимальное значение массива, но максимальное значение дает 4200784.

+0

В общем, функция должна возвращать только что-то простое: float, int или указатель. В этом случае вы должны передать указатель на struct minmax в качестве аргумента и не иметь возвращаемого значения. – stark

+0

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

+1

Возвращение небольшой структуры, такой как это отличный способ сделать функцию, которая возвращает несколько значений, и вы делаете это точно, за исключением для ошибки '<='. –

ответ

8
for(i = 0;i<=3;i++){ 
//  ^^^^ 

Вы цикл в четыре раза.

Над массивом, который имеет три элемента.

+3

@shekharsuman: Почему? –

+0

Омг спасибо, что даже не заметил этого. Я даже шаг за шагом отлаживал и не замечал :(. – Max

+4

@shekharsuman: Я иду по модели Stack Exchange, а не по правилам Shekar's make-up. Это ответ на вопрос, поэтому я разместил его в качестве ответа. Ответы на вопросы в разделе комментариев: _bad_ и _wrong_, к сожалению, это тенденция к росту. Это Q & A, а не Q & C. –

0
sizeof 

Для надлежащего разрешения вы должны использовать выше, чтобы получить точный размер массива использовать вместо I < = 3.

+0

Вы ошибаетесь, когда объявляете функцию типа '' void foo (int array []) '' это почти то же самое, что и указатель pass '' void foo (int * array) ''.Таким образом, '' sizeof'' вернет размер указателя, а не массива. См. [Ideone] (http://ideone.com/birncE). – NikolayKondratyev

1

Вы используете неправильный диапазон индексов. Поскольку исходный массив имеет только 3 элемента, то допустимый диапазон индексов равен [0, 2]. Таким образом, в цикле внутри функции

for(i = 0; i<=3; i++) { 

вы пытаетесь получить доступ к памяти за пределами массива, когда я равно 3.

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

Лучше подход заключается в следующем

typedef struct minmax 
{ 
    size_t min; 
    size_t max; 
} minmax_t; 

minmax_t minmax_element(const int a[], size_t n) 
{ 
    minmax_t result = { 0, 0 }; 

    for (size_t i = 0; i < n; i++) 
    { 
     if (a[i] < a[result.min]) 
     { 
      result.min = i; 
     } 
     else if (a[result.max] < a[i]) 
     { 
      result.max = i; 
     } 
    } 

    return result; 
} 

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

int main() 
{ 
    int a[] = { 7, 8, 3 }; 
    minmax_t something; 

    something = minmax_element(a, sizeof(a)/sizeof(*a)); 

    printf("Minimum is %d and max is %d\n", a[something.min], a[something.max]); 

    int b[] = { 7, 8, 3, 0, 1, 5, 9 }; 

    something = minmax_element(b, sizeof(b)/sizeof(*b)); 

    printf("Minimum is %d and max is %d\n", b[something.min], b[something.max]); 
} 

Примите во внимание, что в C++ существует соответствующий алгоритм std::minmax_element, объявленная в заголовке <algorithm> Он возвращает пару указателей (итераторов) первого минимального элемента и последнего максимального элемента. Вы можете изменить функцию, которую я показал таким образом, чтобы она также возвращала индекс последнего максимального элемента в массиве вместо первого максимального элемента.

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