Как передать массив структур в функцию
Перейти к содержимому

Как передать массив структур в функцию

  • автор:

Передача массива структур в функцию

VS ругается на присвоение внутри функции полю name значения. Ошибка: «выражение должно быть допустимым для изменения левосторонним значением». Подскажите, как в этом случае нужно передавать массив структур? Код:

#include "stdafx.h" #include using namespace std; const int SIZE = 10; struct sub < char name[10]; int marks[5]; >; struct students < char name[20], sername[20], fatherName[20]; int course; char speciality[25]; sub subject; >; void SetDefaultInformation(students* mas) < mas[0].name = "Иван"; mas[0].sername = "Петров"; mas[0].subject.marks[0] = 2; >int main()

Отслеживать
23.8k 3 3 золотых знака 46 46 серебряных знаков 61 61 бронзовый знак
задан 15 окт 2015 в 16:54
13 2 2 серебряных знака 5 5 бронзовых знаков
данная ошибка происходит из-за неправильного копирования строк. прочитайте про функцию strcpy().
15 окт 2015 в 17:25
а еще лучше читать не про strcpy , а про std::string
15 окт 2015 в 17:32

Если вы пишете на C++, не пользуйтесь сишными структурами данных. Берите std::string вместо char[] и std::vector вместо массива.

15 окт 2015 в 19:39

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

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

В вашем случае следует использовать стандартную C функцию std::strcpy (или можно использовать std::strncpy ), которая объявлена в заголовке .

#include "stdafx.h" #include #include using namespace std; //;;; void SetDefaultInformation(students* mas)

Для работы со строками переменной длины в C++ есть стандартный класс std::string , объявленный в заголовке

Передать массив структур в функцию

Не получается передать в функцию массив(одномерный, не динамический) из структур, ругается(. Без разницы по указателю, ссылке, значению.

Лучшие ответы ( 2 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

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

Передать массив структур в функцию
#include <iostream> #include <cstring> using namespace std; typedef struct < char fname;.

Передать двухмерный массив структур в функцию
Всем привет. Есть такой код — struct Array < float a; float b; >; void wr()
419 / 418 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
код покажите

Эксперт С++

13663 / 10580 / 6322
Регистрация: 18.12.2011
Сообщений: 28,248

Лучший ответ

Сообщение было отмечено phtnr как решение

Решение

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
struct A { int n; }; void F(A* pA) { pA[0].n=0; } int main() { A a[2]; F(a); system("pause"); return 0; }

Что не понятно?
Заблокирован

Автор FAQ

Лучший ответ

Сообщение было отмечено phtnr как решение

Решение

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
#include using namespace std; struct sData{ int val; }; sData * MakeAdd(sData * Arr, int N, int val); int main() { int i; sData * Arr = new sData[256]; cout"\tINPUT : "endl; for( i = 0; i  16; i++ ) cout"STRUCT # "i + 1" VAL : "(Arr[i].val = i)endl; Arr = MakeAdd(Arr, 8, -8); cout"\tOUTPUT : "endl; for( i = 0; i  16; i++ ) cout"STRUCT # "i + 1" VAL : "Arr[i].valendl; return 0; } sData * MakeAdd(sData * Arr, int N, int val) { for( int i = 0; i  N; i++ ) Arr[i].val += val; return Arr; }

INPUT :
STRUCT # 1 VAL : 0
STRUCT # 2 VAL : 1
STRUCT # 3 VAL : 2
STRUCT # 4 VAL : 3
STRUCT # 5 VAL : 4
STRUCT # 6 VAL : 5
STRUCT # 7 VAL : 6
STRUCT # 8 VAL : 7
STRUCT # 9 VAL : 8
STRUCT # 10 VAL : 9
STRUCT # 11 VAL : 10
STRUCT # 12 VAL : 11
STRUCT # 13 VAL : 12
STRUCT # 14 VAL : 13
STRUCT # 15 VAL : 14
STRUCT # 16 VAL : 15
OUTPUT :
STRUCT # 1 VAL : -8
STRUCT # 2 VAL : -7
STRUCT # 3 VAL : -6
STRUCT # 4 VAL : -5
STRUCT # 5 VAL : -4
STRUCT # 6 VAL : -3
STRUCT # 7 VAL : -2
STRUCT # 8 VAL : -1
STRUCT # 9 VAL : 8
STRUCT # 10 VAL : 9
STRUCT # 11 VAL : 10
STRUCT # 12 VAL : 11
STRUCT # 13 VAL : 12
STRUCT # 14 VAL : 13
STRUCT # 15 VAL : 14
STRUCT # 16 VAL : 15

Регистрация: 31.03.2014
Сообщений: 62

Действительно, по значению достаточно просто. Но сейчас смотрю, большая идет на вход структура, хочу всеж через указатель.
-=ЮрА=- Спс, а почему с такими сложностями? То есть почему функция теперь возвращать должна поле структуры? Почему не получается сделать по аналогии с массивами, ведь как я понимаю структура в памяти размещается так же последовательно. Т.е. техническая часть вопроса тоже интересна

Заблокирован

Автор FAQ

ЦитатаСообщение от phtnr Посмотреть сообщение

То есть почему функция теперь возвращать должна поле структуры? Почему не получается сделать по аналогии с массивами, ведь как я понимаю структура в памяти размещается так же последовательно. Т.е. техническая часть вопроса тоже интересна

— Мне показалось что модификация массива структур по указателю будет не столь очевидна как с явным возвратом из функции, поэтому сделал с возвратом. Конечно же с массивом структур можно работать как с обычным массивом.

Добавлено через 3 минуты
phtnr, вот вариант с работой через указатель

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
#include using namespace std; struct sData{ int val; }; void MakeAdd(sData * Arr, int N, int val); int main() { int i; sData * Arr = new sData[256]; cout"\tINPUT : "endl; for( i = 0; i  16; i++ ) cout"STRUCT # "i + 1" VAL : "(Arr[i].val = i)endl; MakeAdd(Arr, 8, -8); cout"\tOUTPUT : "endl; for( i = 0; i  16; i++ ) cout"STRUCT # "i + 1" VAL : "Arr[i].valendl; return 0; } void MakeAdd(sData * Arr, int N, int val) { for( int i = 0; i  N; i++ ) Arr[i].val += val; }

INPUT :
STRUCT # 1 VAL : 0
STRUCT # 2 VAL : 1
STRUCT # 3 VAL : 2
STRUCT # 4 VAL : 3
STRUCT # 5 VAL : 4
STRUCT # 6 VAL : 5
STRUCT # 7 VAL : 6
STRUCT # 8 VAL : 7
STRUCT # 9 VAL : 8
STRUCT # 10 VAL : 9
STRUCT # 11 VAL : 10
STRUCT # 12 VAL : 11
STRUCT # 13 VAL : 12
STRUCT # 14 VAL : 13
STRUCT # 15 VAL : 14
STRUCT # 16 VAL : 15
OUTPUT :
STRUCT # 1 VAL : -8
STRUCT # 2 VAL : -7
STRUCT # 3 VAL : -6
STRUCT # 4 VAL : -5
STRUCT # 5 VAL : -4
STRUCT # 6 VAL : -3
STRUCT # 7 VAL : -2
STRUCT # 8 VAL : -1
STRUCT # 9 VAL : 8
STRUCT # 10 VAL : 9
STRUCT # 11 VAL : 10
STRUCT # 12 VAL : 11
STRUCT # 13 VAL : 12
STRUCT # 14 VAL : 13
STRUCT # 15 VAL : 14
STRUCT # 16 VAL : 15

Как передать массив структур в функцию

При компилировании выпадает предупреждение
Скриншот 2018-10-30 09_31_11.png

Последний раз редактировалось Sinli; 30.10.2018 в 09:39 .
Пользователь
Регистрация: 10.09.2018
Сообщений: 43

Так, у меня функции с разными именами. Исправил, но все равно.
Скриншот 2018-10-30 09_43_23.png
Побороть это не получается. Массивы структур вообще можно передавать как обычные массивы?

Программист
Участник клуба
Регистрация: 23.06.2009
Сообщений: 1,772
В объявлении зачем звёздочка в скобках? Скобки убрать, как в определении.

Black Fregat
Посмотреть профиль
Найти ещё сообщения от Black Fregat

Пользователь
Регистрация: 10.09.2018
Сообщений: 43
Убрал. Компилятор пишет
Скриншот 2018-10-30 10_05_05.png
Я уже и так попробовал сделать

#include #define LEN 41 #define SIZE 5 struct person < long long socialcard; struct ; >; void show_Johnsons(struct person *pst[SIZE], int); int main (void) < struct person Johnsons[SIZE] = < >, >, >, >, > >; 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]? Я же пытаюсь передать одномерный массив структур. Было б дело с обычным массивом, я б передал один указатель на него и все сработало.

Пользователь
Регистрация: 10.09.2018
Сообщений: 43
Рандомно перебрал разные варианты. И заработал тот, который казалось вообще не должен.

#include #define LEN 41 #define SIZE 5 struct person < long long socialcard; struct ; >; void show_Johnsons(struct person * pst, int); int main (void) < struct person Johnsons[SIZE] = < >, >, >, >, > >; 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

Можете, пожалуйста прояснить эти моменты?

Передача информации о структурах функциям. Использование массива.

Имя массива можно использовать для передачи в функцию указателя на первую структуру в массиве.

Затем можно использовать арифметическую операцию над указателем, чтобы передвигать его на последующие структуры в массиве. Заметим, что вызов функции

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

Структуры внутри структур.

Допускаются объявления вложенных структур. Это означает, что структура может содержать один или несколько элементов структурного типа. Предположим, что следующая структура может быть включена в другую:

int ioilchange; // замененное масло

int iplugs; // втулки

int lairfilter; // воздушный фильтр

int ibarnacle_cleaning; // ветошь для чистки

Структуру strepair можно включить в главную структуру следующим образом:

char sztype [iSTRING15 + iNULL_CHAR];

char szmodel[iSTRING15 + iNULL_CHAR];

char sztitle[iSTRING20 + iNULL_CHAR];

struct strepair strepair_record;

long int lmotor_hours;

Для доступа к некоторому элементу структуры strepair_record можно использовать такой оператор:

  1. Структуры и битовые поля. Структуры. Их дальнейшее использование.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *