Перейти к содержимому

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

  • автор:

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

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 золотых знака 47 47 серебряных знаков 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 , объявленный в заголовке

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

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

Имеется некая структура console_menu :

Она используется в двух следующих функциях:

// Функция принимает одну структуру по указателю

// Функция принимает массив структур

sprintf(menu[0].text,»One item in array»);

sprintf(menu[1].text,»Two item in array»);

Вызов этих функция выглядит так:

// Передача по указателю одной структуры (передается адрес структуры)

// Передача массива структур

printf(«%s %d\n»,omnu.text, omnu.value);

  • Стандарт языка программирования Си
  • Передача параметра в функцию по указателю в C стиле
  • Передача параметров в функцию по указателю (C стиль) и по ссылке (C++ стиль)
  • Передача структуры в функцию и изменение значений элементов структуры
  • В чем разница объявления строки как массива и как указателя
  • Использование очень больших чисел
  • getch() в Linux
  • Аргументы функции main()
  • Как побайтно считать файл
  • Реализация циклического сдвига ROR и ROL
  • Динамическая загрузка библиотек в Linux
  • Функция fmemopen() — открытие набора байт как файла в памяти с получением файлового дескриптора
  • Подмена дефайнов (#define)
  • Успешной отладки, шутка
  • Как описывать функции с аргументами по-умолчанию в C/C++
  • Форматированный вывод через функцию printf
  • Создание и удаления двухмерного и трехмерного динамического массива
  • Как передать в функцию двумерный массив, размер которого известен
  • Как передать в функцию динамический двумерный массив
  • Как правильно читать объявления в Си
  • Вычисление pbkdf2 на языке C
  • Определение разрядности платформы 32 или 64 бит
  • Функции getuid() и geteuid()
  • Указатели и символьные строки в языке C
  • Практическое применение LD_PRELOAD или замещение функций в Linux
  • Проблемы C-подобных языков. Где находиться типу: справа или слева? (Теория)
  • Откуда в языке Си появился синтаксис указателей, и для чего он предназначался изначально
  • Как в языке Си вызвать функцию, для которой известен адрес вызова в виде числа
  • Вызов функции по известному адресу в языке Си — абстрактный тип данных указателя на функцию
  • Структуры в языке Си. Определения структур в сравнении с языком C++
  • Структуры в языке Си. Указатели на структуры
  • Структуры в языке Си. Массивы структур
  • Операция запятая «,» в языке Си и Си++
  • Самый быстрый и оптимальный способ копирования строк в Cи и C++
  • Стоит запомнить: цикл for в языке Си/Си++ — это цикл с предусловием
  • Как происходит компиляция C/C++ кода. Единица трансляции

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

В mql5/mql4 есть возможность передавать массивы по ссылке в функцию в качестве параметров, например:

int SizeArr(int &arr[]) < int size = ArraySize(arr); return(size) >

Так вот вопрос — есть массив структур

struct MyST < int i; double d; datetime t; >; MyST st[];

есть ли такая же возможность передавать массив структур в функцию , по аналогии с массивами?

Проблема в том что есть несколько массивов структур, и их поочерёдно должна использовать одна функция. Неохота городить несколько одинаковых по работе функций для этого , по логике проще обойтись одной. Полистал справку , но решения так и не нашёл (может плохо искал?).

Буду благодарен если кто на простом примере покажет как такое можно реализовать , если это конечно вообще возможно.

  • Передача объектов структуры по ссылке в качестве параметров функции
  • Обработка нескольких массивов одной функцией
  • Новый клиентский терминал MetaTrader 4 build 204

Sofiia Butenko 2018.03.15 14:47 #1
В чем проблема? почему не попробовали передать?
Alexey Viktorov 2018.03.15 14:55 #2

Структура это всего-лишь пользовательский тип данных . Соответственно массив структур ничто иное как массив пользовательского типа.

Alexey Valeev 2018.03.15 15:00 #3

int SizeArr(MyST &arr[]) < int size = ArraySize(arr); return(size) >

Sergey Kolemanov 2018.03.15 16:39 #4
Alexey Valeev :

Такой вариант подходит когда есть 1 массив структур , а если их например 3 , и каждый нужно передать в одну и туже функцию. Вот пример:

#property copyright "Copyright 2015, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict struct MyST_1 < int i_1; double d_1; datetime t_1; >; MyST_1 st_1[10]; //--- struct MyST_2 < int i_2; double d_2; datetime t_2; >; MyST_2 st_2[10]; //--- struct MyST_3 < int i_3; double d_3; datetime t_3; >; MyST_3 st_3[10]; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() < //--- create timer EventSetTimer(1); //--- return(INIT_SUCCEEDED); > //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) < //--- destroy timer EventKillTimer(); Comment(""); > //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() < //--- > //+------------------------------------------------------------------+ //| Timer function | //+------------------------------------------------------------------+ void OnTimer() < Comment(SizeArr(st_1)); > //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int SizeArr(MyST_1 &arr[]) < int size = ArraySize(arr); return(size); >

Здесь передаётся st_1 , а как передать st_2 и st_3 ? Писать функции SizeArr_2(MyST_2 &arr[]) и SizeArr_3(MyST_3 &arr[]) ? Хотелось бы обойтись одной функцией.

Передача членов структур в функции

При передаче членов структур в функции фактически передается значение члена. Следовательно, передается обычная переменная. Рассмотрим для примера следующую структуру:
struct fred char x;
int y;
float z;
char s[10];
> mike;

Ниже приведены примеры передачи каждого члена в функцию:

func(mike.х); /* передача символьного значения х */
func2(mike.у); /* передача целочисленного значения у */
func3(mike.z); /* передача вещественного значения z */
func4(mike.s); /* передача адреса строки s */
func(mike.s[2]); /* передача символьного значения s [2] */

Тем не менее, если необходимо передать адрес отдельного члена структуры, следует поместить оператор & перед именем структуры. Например, для передачи адреса элементов структуры mike следует написать:

func(&mxke.x) ; /* передача адреса символа x */
func2(&mike.у); /* передача адреса целого у */
func3(&mike.z); /* передача адреса вещественного z */
func4(mike.s) ; /* передача адреса строки s */
func(&mike.s [2]); /* передача адреса символа s[2] */

Обратим внимание, что оператор & стоит перед именем структуры, а не перед именем члена. Помимо этого, массив s сам по себе является адресом, поэтому не требуется оператора &. Тем не менее, когда осуществляется доступ к отдельному символу строки s, как показано в последнем примере, оператор & необходим.

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

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