C/C++

Не могу разобраться с кодом преподавателя struck c++

Не могу разобраться с кодом преподавателя с использованием stuck с++,

Указание в методичке по лабораторной работе с stuck и возвращением из нее нескольких переменных.

Сам код:
#include <stdio.h>

typedef struct array_info //(Почему название структуры с нижним регистром, а чуть дальше уже с верхнем?)
{
int max, min, sum;
} // Почему в этой строчке отсутствует ";" ?

ARRAY_INFO; // (Что происходит на этом моменте ?)
ARRAY_INFO GetArrayInfo(int*, int); // (Как мы передаем и что мы передаем в структуру ? )

ARRAY_INFO GetArrayInfo(int* array, int len) //Что это , это функция или структура ?
{
ARRAY_INFO info = { array[0], array[0], array[0] };
int i = 1;
while (i < len)
{
if (array[i] > info.max) info.max = array[i];
if (array[i] < info.min) info.min = array[i];
info.sum += array[i]; //что такое info ?
i++;
}
return info;
}


int main()
{
int mass[6] = { 1, 22, 3, -4, 5, 6 };
int len = 6;

ARRAY_INFO s = GetArrayInfo(mass, len); //Каким образом мы передаем массив и его длину в структуру ?

printf("min=%d max=%d sum=%d", s.min, s.max, s.sum);
return 0;
}

// комментарии указал я, и указал на тем места, которые не понял.
Буду благодарен, если объясните на простом языке.
По пунктам:
 //(Почему название структуры с нижним регистром, а чуть дальше уже с верхнем?) 
Это разные идентификаторы.

Структура определяется не сама по себе, а внутри конструкции typedef с таким синтаксисом:
 typedef определение-типа псевдоним-типа; 
struct array_info с описанием полей - это определение структуры, а ARRAY_INFO - псевдоним типа, назначаемый через typedef.
Поэтому нет и точки с запятой после определения структуры, ведь typedef ещё не окончен.
Дальше можно использовать в коде "struct array_info" и "ARRAY_INFO" - эти названия соответствуют одному и тому же типу, но второе название короче. Такой приём часто применяется в C (без плюсов), т.к. C требует писать struct везде, где используется название типа. В C++ этот typedef не нужен, C++ не требует писать struct или class перед названиями структур/классов.

 ARRAY_INFO GetArrayInfo(int*, int); // (Как мы передаем и что мы передаем в структуру ? ) 
В структуру мы ничего не передаём. Структура - это тип данных. Здесь объявляется функция GetArrayInfo, принимающая два параметра типов указатель на int и сам int и возвращающая структуру ARRAY_INFO.

 ARRAY_INFO GetArrayInfo(int* array, int len) //Что это , это функция или структура ? 
Здесь приводится определение функции GetArrayInfo. Как видим, параметрам назначены имена, и приведено тело функции в фигурных скобках.
Обычно объявления функций делаются в заголовках (.h), а определения - в файлах реализации (.c), а в данном случае объявление - лишнее (непосредственно за ним следует определение), и объявление можно убрать.

 info.sum += array[i]; //что такое info ? 
info - это локальная переменная типа ARRAY_INFO, объявленная шестью строками выше.

 ARRAY_INFO s = GetArrayInfo(mass, len); //Каким образом мы передаем массив и его длину в структуру ? 
Не в структуру, а в функцию. Функция выполняет обработку и возвращает структуру ARRAY_INFO. Структура сохраняется в переменной s, которая объявляется в этой же строке кода. С тех пор, как в C разрешили объявлять переменные в любом месте блока, многие так и делают, т.к. это освобождает программиста от необходимости отслеживать неинициализированные переменные и сужает область их видимости - код становится проще читать.
Серж Дмитриев
Серж Дмитриев
87 571
Лучший ответ
Я кое-что написал, как я сам эту си понимаю.
Если не понял, почитай Риччи. Древний учебник, но там всё это есть.

 #include   

typedef struct array_info //(Почему название структуры
с нижним регистром, а чуть дальше уже с верхнем?)
{
int max, min, sum;
} // Почему в этой строчке отсутствует ";" ?

ARRAY_INFO; // (Что происходит на этом моменте ?)

/*
раз точку с запятой после структуры не поствили,
значит читаем код дальше.
В СИ, в отличае от СИ++, можно после закрывающейся
фигурной скобки писать ещё имя струтуры, через
которое оно вызывается.
Препод сделал это имя капсом, чтобы логически
связать со структурой.
Далее идёт вызов структуры по этому имени.
*/
ARRAY_INFO GetArrayInfo(int*, int); // (Как мы
//передаем и что мы передаем в структуру ? )
/*
это прототип функции.
Древние программисты использовали их, так как
раньше было принято писать пользовательские функции
ниже майна, а компилятор требовал их имена, тип
функции и типы принимаемых значений ещё до майна.
*/

ARRAY_INFO GetArrayInfo(int* array, int len) //Что
//это , это функция или структура ?
/*
прототип функции выше
сюда подаётся из майна массив типа инт и указана
длина массива
потому что sizeof(array) / sizeof(int) не всегда
работает правильно
*/
{
ARRAY_INFO info = { array[0], array[0], array[0] };
int i = 1;
while (i < len)
{
if (array[i] > info.max) info.max = array[i];
if (array[i] < info.min) info.min = array[i];
info.sum += array[i]; //что такое info ?
i++;
}
return info;
}


int main()
{
int mass[6] = { 1, 22, 3, -4, 5, 6 };
int len = 6;

ARRAY_INFO s = GetArrayInfo(mass, len); //Каким
//образом мы передаем массив и его длину в структуру ?
/*
посмотри функцию выше.
Там объявлена переменная типа структуры.
В конце функции через ретурн идёт её выгрузка.
В данном случае в переменную типа структуры с именем эс.
*/

printf("min=%d max=%d sum=%d", s.min, s.max, s.sum);
return 0;
}
Oleg Sotnik
Oleg Sotnik
4 129
Oleg Sotnik также прототипы функций используют при написании тел функций в других сишных файлах, главное, чтобы компилятор их прочитал до майна.
А там в main.c их пихать или хэдэры *.h -- не важно.
Серж Дмитриев "через которое оно вызывается"? Что за ахинея?