Возвращение массива в c для вычисления числа - PullRequest
0 голосов
/ 23 января 2019

Как я начинающий с программирования. Я пытался вернуть массив в моей программе, но он не работает должным образом. Вот код

#include<stdio.h>
void main()
{
    int x,y,z;
    printf("Enter any three numbers separated with a single space : ");
    scanf("%d %d %d", &x, &y, &z);
    int * result = calc(x,y,z);
    printf("The big number is %d \n The middle number is %d \n The small number is %d", result[0], result[1], result[2]);
}
calc(int x, int y, int z){
    static int * result[3] = {0,0,0};
    if(x>y && x>z){
        result[0] = x;
        if(y<z){
            result[2] = y;
            result[1] = z;
        }
    }else if(y>x && y>z){
        result[0] = y;
        if(x<z){
            result[2] = x;
            result[1] = z;
        }
    }else if(z>x && z>y){
        result[0] = z;
        if(y<x){
            result[2] = y;
            result[1] = x;
        }
    }
    return result;
}

Я много искал, но либо не понимаю, либо код не работает для меня.

Ответы [ 5 ]

0 голосов
/ 23 января 2019

По разным причинам вы не можете вернуть массив из функции. Обычно лучшим вариантом является передача целевого массива в качестве аргумента функции (при условии, что вы знаете, какой размер массива должен быть опережающим):

/**
 * This version of calc doesn't return anything, so it's typed void
 */
void calc( int x, int y, int z, int *result, size_t result_size )
{
  if ( x > y && x > z )
    result[0] = x;
  ...
}

/**
 * Unless your compiler documentation *explicitly* lists void main()
 * as a valid signature, use int main( void ) instead.  
 */
int main( void )
{
  int result[3] = {0, 0, 0};
  ...
  calc( x, y, z, result, sizeof result / sizeof result[0] );
  ...
}

Если ваша функция не связывается со строкой с нулем в конце (или каким-либо другим значением Sentinel в содержимом массива), вам нужно передать размер массива в качестве отдельного параметра. Выражения массива теряют свое «массивность» при передаче в качестве аргумента функции, поэтому вам необходимо отслеживать их размер отдельно (sizeof arr / sizeof arr[0] не будет работать с указателем).

0 голосов
/ 23 января 2019
  1. Не используйте статические, если вы не знаете последствия. Учитывая, что вы новичок, старайтесь придерживаться только локальных переменных
  2. То, что вы пытаетесь сделать, это вернуть массив из 3 целых чисел после того, как он был обработан функцией calc. Здесь у вас есть 2 варианта:
    • Передайте "пустой" массив ( {0,0,0} ) в качестве параметра для функции, поэтому result будет изменен и в области действия main.
    • Возвращает массив, который был инициализирован в функции calc.

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

1) Вы объявляете указатель на желаемый тип данных

int *result;

2) Вы выделяете память для этого указателя (в основном для начинающих, он становится массивом)

result = malloc(3 * sizeof(int));

Вы можете использовать void* malloc(size_t memory_block) (который не инициализирует память) или void* calloc(size_t number_of_blocks, size_t block_size), который устанавливает всю память на 0

3) Ваши данные обрабатываются в функции calc с использованием массива result.

4) В любом случае вы выбираете это (в отношении 2.), ваша функция должна что-то возвращать. Если вы передаете массив в качестве параметра, он должен вернуть void, иначе он должен вернуть int*, что в основном означает, что возвращает указатель на int (и учитывая, что вы выделили память для этого указателя, теперь он в основном возвращает массив)

0 голосов
/ 23 января 2019
#include<stdio.h>

int *calc(int x, int y, int z);
int main()
{
    int x,y,z;
    printf("Enter any three numbers separated with a single space : ");
    scanf("%d %d %d", &x, &y, &z);
    int * result = calc(x,y,z);
    printf("The big number is %d \n The middle number is %d \n The small number is %d", result[0], result[1], result[2]);
}
int *calc(int x, int y, int z){ // first this the right way to declare it
     static  int result[3] = {0,0,0};

    if(x>y && x>z){
        result[0] = x;
        if(y<z){
            result[2] = y;
            result[1] = z;
        } // second you forgot to consider the else case like this :) i 've changed it on the other ifs too
        else{
             result[1] = y;
            result[2] = z;
        }
    }
     if(y>x && y>z){
        result[0] = y;
        if(x<z){
            result[2] = x;
            result[1] = z;
        }else{
         result[1] = x;
            result[2] = z;
        }

    }
     if(z>x && z>y){
        result[0] = z;
        if(y<x){
            result[2] = y;
            result[1] = x;
        }else{
        result[1] = y;
            result[2] = x;}
    }
    return result;
}
0 голосов
/ 23 января 2019

Есть несколько проблем с вашей программой.

  1. int * result = calc(x,y,z); - но calc возвращает int (так как тип возврата не указан)

  2. static int * result[3] = {0,0,0}; - result - массив размером 3 указателей на int. Но вы инициализировали их как 0 каждый. Это не проблема точно, если вы понимаете, что здесь происходит. На самом деле, простой массив был бы просто прекрасен.

  3. return result; вы возвращаете result, но типом возврата функции calc по умолчанию является int.
  4. Прототипа для функции calc не существует.

Вот как должна выглядеть ваша программа:

#include<stdio.h>

int * calc(int, int, int);

void main()
{
    int x,y,z;
    printf("Enter any three numbers separated with a single space : ");
    scanf("%d %d %d", &x, &y, &z);
    int * result = calc(x,y,z);
    printf("The big number is %d \n The middle number is %d \n The small number is %d", result[0], result[1], result[2]);
}
int *calc(int x, int y, int z){
    static int result[3] = {0,0,0};
    if(x>y && x>z){
        result[0] = x;
        if(y<z){
            result[2] = y;
            result[1] = z;
        }
    }else if(y>x && y>z){
        result[0] = y;
        if(x<z){
            result[2] = x;
            result[1] = z;
        }
    }else if(z>x && z>y){
        result[0] = z;
        if(y<x){
            result[2] = y;
            result[1] = x;
        }
    }
    return result;
}

Сказав это, ваша программа, похоже, не работает так, как вы намереваетесь. Посмотрите на выводы ниже:

Enter any three numbers separated with a single space : 12 33 4
The big number is 33 
 The middle number is 0 
 The small number is 0
shell returned 69


Enter any three numbers separated with a single space : 100 3 4
The big number is 100 
 The middle number is 4 
 The small number is 3
shell returned 70

Возможно, вы захотите поработать над логикой.

0 голосов
/ 23 января 2019

в функции calc -

int *result[3] = {0,0,0};

это массив из 3 указателей на целые числа.

Массив целых чисел должен быть объявлен как

int result[3] = {0,0,0};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...