пытаюсь прочитать целое число с помощью scanf в массиве

Я сделал код для сравнения температуры недели.

Я сделал две функции: одну для записи в массив, другую для расчета средней температуры. Компилируется без ошибок. Как только я ввожу свой первый номер, приложение падает, и я получаю эту ошибку в stdio.h lib:

Исключение по адресу 0x533C742E (ucrtbased.dll) в 7.3.exe: 0xC0000005: место записи нарушения прав доступа 0xCCCCCCCC.

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

#include <stdio.h>
#define MAX 7
#define _NO_CRT_STDIO_INLINE
void read(int);
float gem(int);

int main(void)
{
    float x = 0;
    int temp[MAX];
    read(temp[MAX]);
    x = gem(temp[MAX]);
    printf("%f", x);
}

void read(int k[MAX])
{
    for (int i = 1; i < 8; i++)
    {
        printf("geef de temp voor dag %d ", i);
        scanf_s("%d%*c", &k[i-1]);
    }
}

float gem(int y[MAX])
{
    int som = 0;
    float gem = 0;
    for (int i = 0; i < 8; i++)
    {
        som += y[i - 1];
        gem = som / 7;
        return gem;
    }
}

person reyntjensm    schedule 25.10.2017    source источник
comment
y[i - 1]; получить доступ y[-1], если i == 0   -  person BLUEPIXY    schedule 25.10.2017
comment
Как и почему вы решили, что void read(int) будет равно void read(int k[MAX])? Возможно, вам следует сделать несколько шагов назад и прочитать пару хороших книг для начинающих< /а>.   -  person Some programmer dude    schedule 25.10.2017
comment
несвязанный: gem = som / 7; return gem; --> gem = som / 7.; return gem; (или gem = (double)som / MAX; return gem;) и перейти после цикла for.   -  person BLUEPIXY    schedule 25.10.2017


Ответы (2)


Если сомневаетесь, проверьте тип данных!!

В вашем коде вызов функции

  read(temp[MAX]);   //trying to pass an int type 

неправильно. Функция принимает int *.

Вам нужно передать указатель на начало массива, например

  read(temp);

Тем не менее, temp[MAX] уже не работает, вызывая неопределенное поведение.

Кроме того, ваше использование переменной контроллера цикла немного странно. Вы можете просто использовать как

  for (int i = 0; i < MAX; i++)

а затем используйте i в качестве итератора (индексация).

person Sourav Ghosh    schedule 25.10.2017

Как правило, параметры всегда передаются по значению в C. Поэтому в приведенном выше коде значение read(temp[MAX]); не изменяется с помощью функции. Так как же нам изменить значение локальной переменной функции внутри другой функции. Pointer является решением таких проблем. Используя указатели, мы можем изменить локальную переменную функции внутри другой функции. Мы получаем эффект передачи по ссылке только с помощью указателей.

person Dadhich Sourav    schedule 25.10.2017