Вызов функции, которая хранит целые числа в массиве в C - PullRequest
1 голос
/ 28 мая 2019

У меня есть домашнее задание, с которым мне нужна помощь.

Я написал функцию, которая должна принимать пользовательский ввод с помощью scanf и сохранять его в массиве.Он также будет подсчитывать количество раз, когда вводится целое число (кроме 0, которое завершает программу). У меня возникла проблема с вызовом этой функции в main (). Есть предложения о том, как это исправить?

I 'мы пытались использовать определение функции внизу и использовать различные переменные внутри функции: getVals

#include <stdio.h>

#define ARRAYSIZE 20 //defines the size of the array to 20

int nVals = 0;
int getVals(int myVals[], int maxVals);
int input[ARRAYSIZE+1] = {'0'};

int getVals(int myVals[], int maxVals)
{
  for (maxVals = 0; maxVals < ARRAYSIZE; maxVals++) { //When the row is    less than ten, it will run the loop and increment the row
    printf("Please Enter up to 20 integers "); //which will allow the name to be stored in the next row
    scanf("%d", &myVals[maxVals]);

    if ((myVals[maxVals] <= 0) || (maxVals == ARRAYSIZE -1))
       return nVals;
    if (myVals[maxVals] > 0)
       nVals++;

  }
}

int main() {
  printf("This program will receive up to 20 inputs from you, and sort them from least to greatest\n\n");
  printf("Enter 0 or a negative number to exit the program.\n");

  getVals(int ARRAYSIZE, int input[ARRAYSIZE]);

  printf("You have entered %d numbers\n", nVals);
  printf("%d", input[]);
  printf("\n");
  printf("Now sorting....\n");

  return 0;
}

Ответы [ 3 ]

1 голос
/ 28 мая 2019

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

Первые ошибки.

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

Функция определение содержит код этой функции.Программа должна содержать ровно одно определение для каждой функции.Кстати, определение также является объявлением

В вызове функции используется функция.Это больше не объявление, и объявление для функции должно быть видно перед вызовом.Вы должны передать существующие переменные в соответствии с объявлением.

Здесь вы должны иметь:

int input[ARRAYSIZE];          // declare an int array
getVals(input, ARRAYSIZE);     // call the function

Эта строка printf("%d", input[]); также неверна.Массивы не являются гражданами первого класса на языке Си, и вы можете печатать (или читать) только один элемент за раз.По крайней мере, вы должны написать printf("%d", input); (это как вызов, а не объявление, поэтому для него требуются фактические параметры, а не формальные).Но массив будет преобразован в указатель на его первый элемент (нормально до тех пор), указатель будет преобразован в значение типа int (адрес первого элемента массива), и вы напечатаете это значение.Не то, что вы хотите: - (

Но возможны и другие улучшения.

nVal - это глобальное значение. Следует избегать глобальных значений, если у вас нет веских оснований для их разработки. Лучшийпрактики рекомендуют вместо этого передавать параметры в функцию, поэтому вы должны удалить глобал int nVals = 0, изменить getVals на:

int getVals(int myVals[], int maxVals)
{
    int nVals;
    for (nVals = 0; nVals < maxVals; nVals++) { //When the row is    less than ten, it will run the loop and increment the row
        printf("Please Enter up to 20 integers "); //which will allow the name   to be stored in the next row
        if (1 != scanf("%d", &myVals[nVals])) {    // ALWAYS test scanf return value
            printf("Incorrect input");
            break;
        }
        if (myVals[nVals] <= 0) {
            break;
        }
    }
    return nVals;
}

и вызвать его из main как:

int nVals = getVals(input, ARRAYSIZE);
1 голос
/ 28 мая 2019

Проблема в main()

Как указано Риши в их ответе , одна строка с ошибкой - это строка в main():

getVals(int ARRAYSIZE, int input[ARRAYSIZE]);

Это должно помешать компиляции вашего кода, потому что после завершения препроцессора строка гласит:

getVals(int 20, int input[20]);

Это вообще не является допустимым C - первый 20 является бессмысленной синтаксической ошибкой.

Если у вас есть что-то, что более или менее компилируется, например, одно из следующих:

getVals(int SIZE, int input[ARRAYSIZE]);
getVals(int SIZE, int input[SIZE]);

, тогда у вас есть объявление функции без возвращаемого типа.В соответствии с правилами C90, это не может появляться в середине функции.В соответствии с правилами C99 или более поздними, он может появляться там, где он есть, но он должен иметь тип возвращаемого значения -

int getVals(int SIZE, int input[ARRAYSIZE]);
int getVals(int SIZE, int input[SIZE]);

Первое из объявлений допустимо как в C90, так и в C99, хотя ARRAYSIZE не имеет значения,Второе из объявлений действительно только в C99 или позже, потому что оно использует VLA (массив переменной длины).Они не существовали в C90.

Однако, поскольку это объявление, а не вызов функции, фактическая функция getVals() никогда не вызывается, что является вашей заявленной проблемой.

Вы на самом делехочу:

int num = getVals(ARRAYSIZE, input);

Кроме:

Вы определили getVals(), используя:

int getVals(int myVals[], int maxVals)

, поэтому вам действительно нужно позвонить:

getVals(input, ARRAYSIZE);

Проблемы с getVals()

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

int getVals(int myVals[], int maxVals)
{
    int i;
    for (i = 0; i < maxVals; i++)
    {
        printf("Please Enter up to 20 integers ");
        if (scanf("%d", &myVals[i]) != 1)
            return i;
        if (myVals[i] <= 0)
            return i;
        nVals++;
    }
    return i;
}

Я сохранил nVals в качестве глобальной переменной, но это действительно не нужно.Вы должны по возможности избегать глобальных переменных (переменных, определенных вне какой-либо функции).

0 голосов
/ 28 мая 2019

Ошибка: в этой строке в основной функции

getVals(int ARRAYSIZE, int input[ARRAYSIZE]);

Правильный путь:

getVals(input, input[ARRAYSIZE]);

Во-первых: вы не должны использовать тип данных для вашего атрибута при вызове функции.

Второе: имя вашего массива - "input", так как вы передаете массив, поэтому вы должны использовать имя массива, которое является входным, а не ARRAYSIZE ...

...