Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.10.2018, 09:33   #1
Sinli
Пользователь
 
Регистрация: 10.09.2018
Сообщений: 43
По умолчанию Передача массива структур в функцию

Добрый день, пытаюсь одолеть структуры.
Подскажите, пожалуйста, что я делаю не так.
Код:
#include <stdio.h>
#define LEN 41
struct person
{
        long long socialcard;
        struct {char surname[LEN]; char name[LEN]; char patronymic[LEN];};
};
void show_Johnsons(struct person (*)[], int);
int main (void)
{
        struct person Johnsons[5] =
        {
                {4698569834, {"Johnson", "Peter", "Mardok"}},
                {4987438950, {"Johnson", "Meg", "Alisha"}},
                {8745368994, {"Johnson", "Gilbert", "Brian"}},
                {7843578384, {"Johnson", "Ross", "Bruse"}},
                {7487936723, {"Johnson", "Ivan", "Chester"}}
        };

        show_Johnsons(&Johnsons, 5);
}
void show_Johnson(struct person * pst[], int n)
{
        for (int i = 0; i < n; i++)
        {
                printf("%s, %s", pst[i]->surname, pst[i]->name);
                if (pst[i]->patronymic[0] != '\0')
                        printf(" %1s.", pst[i]->patronymic);
                printf("%lld\n", pst[i]->socialcard);
                putchar('\n');
        }
}
При компилировании выпадает предупреждение
Скриншот 2018-10-30 09_31_11.png

Спасибо.

Последний раз редактировалось Sinli; 30.10.2018 в 09:39.
Sinli вне форума Ответить с цитированием
Старый 30.10.2018, 09:44   #2
Sinli
Пользователь
 
Регистрация: 10.09.2018
Сообщений: 43
По умолчанию

Так, у меня функции с разными именами. Исправил, но все равно.
Скриншот 2018-10-30 09_43_23.png
Побороть это не получается. Массивы структур вообще можно передавать как обычные массивы?
Sinli вне форума Ответить с цитированием
Старый 30.10.2018, 09:57   #3
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

В объявлении зачем звёздочка в скобках? Скобки убрать, как в определении.
Black Fregat вне форума Ответить с цитированием
Старый 30.10.2018, 10:27   #4
Sinli
Пользователь
 
Регистрация: 10.09.2018
Сообщений: 43
По умолчанию

Убрал. Компилятор пишет
Скриншот 2018-10-30 10_05_05.png
Я уже и так попробовал сделать
Код:
#include <stdio.h>
#define LEN 41
#define SIZE 5
struct person
{
        long long socialcard;
        struct {char surname[LEN]; char name[LEN]; char patronymic[LEN];};
};
void show_Johnsons(struct person *pst[SIZE], int);
int main (void)
{
        struct person Johnsons[SIZE] =
        {
                {4698569834, {"Johnson", "Peter", "Mardok"}},
                {4987438950, {"Johnson", "Meg", "Alisha"}},
                {8745368994, {"Johnson", "Gilbert", "Brian"}},
                {7843578384, {"Johnson", "Ross", "Bruse"}},
                {7487936723, {"Johnson", "Ivan", "Chester"}}
        };

        show_Johnsons(&Johnsons, 5);
}
void show_Johnsons(struct person *pst[SIZE], int n)
{
        for (int i = 0; i < n; i++)
        {
                printf("%s, %s", pst[i]->surname, pst[i]->name);
                if (pst[i]->patronymic[0] != '\0')
                        printf(" %1s.", pst[i]->patronymic);
                printf("%lld\n", pst[i]->socialcard);
                putchar('\n');
        }
}
Почему он пишет, аргумент имеет тип struct person (*)[5]? Я же пытаюсь передать одномерный массив структур. Было б дело с обычным массивом, я б передал один указатель на него и все сработало.
Sinli вне форума Ответить с цитированием
Старый 30.10.2018, 11:01   #5
Sinli
Пользователь
 
Регистрация: 10.09.2018
Сообщений: 43
По умолчанию

Рандомно перебрал разные варианты. И заработал тот, который казалось вообще не должен.
Код:
#include <stdio.h>
#define LEN 41
#define SIZE 5
struct person
{
        long long socialcard;
        struct {char surname[LEN]; char name[LEN]; char patronymic[LEN];};
};
void show_Johnsons(struct person * pst, int);
int main (void)
{
        struct person Johnsons[SIZE] =
        {
                {4698569834, {"Johnson", "Peter", "Mardok"}},
                {4987438950, {"Johnson", "Meg", "Alisha"}},
                {8745368994, {"Johnson", "Gilbert", "Brian"}},
                {7843578384, {"Johnson", "Ross", "Bruse"}},
                {7487936723, {"Johnson", "Ivan", "Chester"}}
        };

        show_Johnsons(Johnsons, SIZE);
}
void show_Johnsons(struct person * pst, int n)
{
        for (int i = 0; i < n; i++)
        {
                printf("%s, %s", pst[i].surname, pst[i].name);
                if (pst[i].patronymic[0] != '\0')
                        printf(" %1s.", pst[i].patronymic);
                printf("%lld\n", pst[i].socialcard);
                putchar('\n');
        }
}
Но как? Во-первых, я читал, что структуру можно передать в функцию только со взятием адреса:
Код:
show_Johnsons(&Johnsons, SIZE);
Во-вторых, я не понимаю, почему работает вот это:
Код:
pst[i].surname
если мы имеет дело с указателями на структуры:
Код:
pst[i]->surname
или
(*pst)[i].surname
Можете, пожалуйста прояснить эти моменты?
Sinli вне форума Ответить с цитированием
Старый 30.10.2018, 11:05   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
Сообщение от Sinli Посмотреть сообщение
И заработал тот, который казалось вообще не должен.
Почему это не должен? Имя массива кастуется к указателю нормально.

Цитата:
Сообщение от Sinli Посмотреть сообщение
Во-первых, я читал, что структуру можно передать в функцию только со взятие адреса
1. С какого перепугу?
2. Вы же не структуру передаете.

Цитата:
Сообщение от Sinli Посмотреть сообщение
Во-вторых, я не понимаю, почему работает вот это
У вас же не указатели внутри массива. Или вы не про точку?

Цитата:
Сообщение от Sinli Посмотреть сообщение
если мы имеет дело с указателями на структуры:
А у вас в массиве указатели на структуры?
p51x вне форума Ответить с цитированием
Старый 30.10.2018, 12:11   #7
Sinli
Пользователь
 
Регистрация: 10.09.2018
Сообщений: 43
По умолчанию

Кажется, я понял.
Получается, структуры работают также как и обычные переменные. Если структура одна, то передать можно ее адрес, если массив структур, то передаем имя массива, а имя массива является адрес его первого элемента.
тогда ясно почему это не работало
Код:
pst[i]->surname
или
(*pst)[i].surname
Данный код сработал бы, если б у меня был массив указателей и каждый из этих этих указателей указывал на одну структуру поотдельности.
Sinli вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача массива структур в функцию (С++) nubak Помощь студентам 2 24.02.2013 13:03
Передача массива в функцию и возврат массива из функции Gstar C# (си шарп) 6 14.10.2012 00:38
Произведение элементов массива в функции (передача массива в функцию) (Delphi) Toxa16 Помощь студентам 1 23.04.2011 04:42
Передача в функцию двумерного массива структур Spandei Общие вопросы C/C++ 1 21.05.2010 01:11
Передача массива структур в функцию, conio.h, и графика. jojahti Общие вопросы C/C++ 1 01.08.2009 21:35