Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 634

 

есть у кого нибудь кусочек  кода для примера  в котором элементы массива string группируются в алфавитном порядке?

заранее благодарю.

 
Hobu:

Вот здесь

https://docs.mql4.com/ru/basis/operators/return

написано:

"Можно возвращать простые типы, простые  структуры, указатели объектов. При помощи оператора return нельзя возвращать любые массивы, объекты классов, переменные типа сложных структур.

"

Это похоже на то, что нужно?

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

#property strict

/******************************************************************************/
struct ОфигеннаяСтруктура {
private:
  int значение;

public:
  ОфигеннаяСтруктура(int значение = 0): значение(значение) { }
  int выдатьЗначение() const { return значение; }
};

/******************************************************************************/
ОфигеннаяСтруктура Функа(int значение) {
  ОфигеннаяСтруктура местная(значение);

  return местная; // Возвращаем структуру из функции
}

/******************************************************************************/
void OnStart() {
  Print("Начинаем безобразничать...");

  ОфигеннаяСтруктура штукаРаз = Функа(5);

  Print("Значение штукиРаз = ", штукаРаз.выдатьЗначение());

  ОфигеннаяСтруктура штукаДва;

  Print("Значение штукиДва первое = ", штукаДва.выдатьЗначение());
  штукаДва = Функа(7);
  Print("Значение штукиДва второе = ", штукаДва.выдатьЗначение());

  Print("Заканчиваем безобразничать...");
}

Результат прогона этого - следующий:

23:55:39 Script 1 EURUSDm,H1: loaded successfully
23:55:39 1 EURUSDm,H1: initialized
23:55:39 1 EURUSDm,H1: Начинаем безобразничать...
23:55:39 1 EURUSDm,H1: Значение штукиРаз = 5
23:55:39 1 EURUSDm,H1: Значение штукиДва первое = 0
23:55:39 1 EURUSDm,H1: Значение штукиДва второе = 7
23:55:39 1 EURUSDm,H1: Заканчиваем безобразничать...
23:55:39 1 EURUSDm,H1: uninit reason 0
23:55:39 Script 1 EURUSDm,H1: removed
Объект штукаРаз инициализируется объектом (структурой), возвращённым из функции Функа, а объект штукаДва инициализируется значением по умолчанию, но затем выполняется присвоение ему объекта (структуры), также возвращённого из функции Функа.
 
simpleton:

Это похоже на то, что нужно?

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

Результат прогона этого - следующий:

Объект штукаРаз инициализируется объектом (структурой), возвращённым из функции Функа, а объект штукаДва инициализируется значением по умолчанию, но затем выполняется присвоение ему объекта (структуры), также возвращённого из функции Функа.

 

Пожалуйста, а можно подробно закомментировать тот способ, который описал simpleton, каждую строчку включая синтаксис? А то мне пока непонятно что там что означает. Необязательно на пальцах, можно и с терминами, но построчно.

1)То иссть функция Функа возвращает именно обьект, а не какое-то заурядное значение, как это делают более заурядные функции? Иче это за зверь такой у нее получается, почему он именно обьект?

2)Можно проинициализировать как обьектом, возвращенным из функции так и значением по умолчанию? То есть функция Функа, хоть она и часть той же структуры , не имеет отношения к обьекту Штука 2, или я чего-то недопоняла? Кстати, оно там так и называется обьектом, т.е у структуры тоже получается обьект? Че-то мне казалось как-то проще. И еще вопрос, а как именно копировать одну структуру в другую, если они одного типа? Вот эта вот незамысловатая строчка

ОфигеннаяСтруктура штукаДва;

и есть пресловутое копирование? И отдельно обьявлять структуру Штука 2 не надо, и это вообще не структура, а обьект, созданный структурой?

Я как-то не владею вообще никакими языками программирования(но не против научиться) и тем более имею достаточно смутное представление об ООП, так что не удивляйтесь если вопросы глупые.

Упс, я только что углядела, что там скобки фигурные  закрываются раньше, т. е. эта Функа описана вне структуры, а , собственно что она из себя представляет по отношению к структуре Офигенная?

 
Hobu:

Пожалуйста, а можно подробно закомментировать тот способ, который описал simpleton, каждую строчку включая синтаксис? А то мне пока непонятно что там что означает. Необязательно на пальцах, можно и с терминами, но построчно.

1)То иссть функция Функа возвращает именно обьект, а не какое-то заурядное значение, как это делают более заурядные функции? Иче это за зверь такой у нее получается, почему он именно обьект?

2)Можно проинициализировать как обьектом, возвращенным из функции так и значением по умолчанию? То есть функция Функа, хоть она и часть той же структуры , не имеет отношения к обьекту Штука 2, или я чего-то недопоняла? Кстати, оно там так и называется обьектом, т.е у структуры тоже получается обьект? Че-то мне казалось как-то проще. И еще вопрос, а как именно копировать одну структуру в другую, если они одного типа? Вот эта вот незамысловатая строчка

и есть пресловутое копирование? И отдельно обьявлять структуру Штука 2 не надо, и это вообще не структура, а обьект, созданный структурой?

Я как-то не владею вообще никакими языками программирования(но не против научиться) и тем более имею достаточно смутное представление об ООП, так что не удивляйтесь если вопросы глупые.

Упс, я только что углядела, что там скобки фигурные  закрываются раньше, т. е. эта Функа описана вне структуры, а , собственно что она из себя представляет по отношению к структуре Офигенная?

Как-то так, в сравнении с тем же самым, но для переменной одного из встроенных типов:
#property strict

/******************************************************************************/
struct ОфигеннаяСтруктура { // Заводим структуру
private: // Просто так извне к следующим элементам нельзя обратиться
  int значение; // Поле данных для хранения в структуре

public: // К следующим элементам можно просто так обратиться извне
  ОфигеннаяСтруктура(int значение = 0): значение(значение) { } // Конструктор: инициализирует поле значением переданного параметра; если параметр не передан, используется значение по умолчанию, равное 0
  int выдатьЗначение() const { return значение; } // Метод: возвращает значение поля, может вызываться для структур, переменные для которых объявленных как константные
};

/******************************************************************************/
ОфигеннаяСтруктура Функа1(int значение) { // Функция, возвращающая структуру
  ОфигеннаяСтруктура местная(значение); // Создание локальной переменной, в данном случае, судя по типу, это - структура

  // Если структура посложнее, чем в этом примере, то тут можно выполнить над ней какие-то дополнительные действия

  return местная; // Возвращаем структуру из функции
}

/******************************************************************************/
string Функа2(int значение) { // Функция, возвращающая один из встроенных типов
  string Таблица[] = {"Ноль", "Один", "Два"};

  /* Никакого особого смысла тут нет, просто имитация деятельности */
  return Таблица[значение % 3]; // Возвращаем строку из функции (остаток от деления параметра на три словами)
}

/******************************************************************************/
void OnStart() {
  Print("Начинаем безобразничать...");

  ОфигеннаяСтруктура штукаРаз = Функа1(5); // Заводим переменную (структуру) с одновременной инициализацией
  string строкаРаз = Функа2(5); // Заводим переменную (один из встроенных типов) также с инициализацией

  Print("Значение штукиРаз = ", штукаРаз.выдатьЗначение()); // Для получения значения поля структуры вызывается специально под это написанный метод
  Print("Значение строкиРаз = ", строкаРаз);

  ОфигеннаяСтруктура штукаДва; // Заводим переменную (структуру) без явной инициализации (конструктор получает в качестве значения параметра значение, указанное по умолчанию, и структура инициализируется им)
  string строкаДва; // Заводим переменную (один из встроенных типов) без инициализации (переменные типа string, объявленные таким образом, инициализируются пустой строкой)

  Print("Значение штукиДва первое = ", штукаДва.выдатьЗначение());
  Print("Значение строкиРаз первое = '", строкаРаз, "'");

  штукаДва = Функа1(7); // Присвоение переменной штукаДва типа структура значения типа структура, возвращённого функцией Функа1
  строкаДва = Функа2(7); // Присвоение переменной строкаДва одного из встроенных типов (строка) значения того же типа, возвращённого функцией Функа2

  Print("Значение штукиДва второе = ", штукаДва.выдатьЗначение());
  Print("Значение строкиРаз второе = '", строкаРаз, "'");

  Print("Заканчиваем безобразничать...");
}

Результат прогона - следующий:

21:16:29 Script 1 EURUSDm,H1: loaded successfully
21:16:29 1 EURUSDm,H1: initialized
21:16:29 1 EURUSDm,H1: Начинаем безобразничать...
21:16:29 1 EURUSDm,H1: Значение штукиРаз = 5
21:16:29 1 EURUSDm,H1: Значение строкиРаз = Два
21:16:29 1 EURUSDm,H1: Значение штукиДва первое = 0
21:16:29 1 EURUSDm,H1: Значение строкиРаз первое = ''
21:16:29 1 EURUSDm,H1: Значение штукиДва второе = 7
21:16:29 1 EURUSDm,H1: Значение строкиРаз второе = 'Один'
21:16:29 1 EURUSDm,H1: Заканчиваем безобразничать...
21:16:29 1 EURUSDm,H1: uninit reason 0
21:16:29 Script 1 EURUSDm,H1: removed

Функции возвращают объекты того типа, что указан при её декларации. Под объектами здесь понимаются не только структуры, но и встроенные типы.

Если для функции Функа1 в качестве типа возвращаемого значения указан тип ОфигеннаяСтруктура, который является структурой, то это значит, что эта функция возвращает значения структур, причём, только типа ОфигеннаяСтруктура. Она это делает так именно потому и только поэтому, что в её декларации/определении указан именно такой возвращаемый тип.

Можно инициализировать таким значением или значениями, как и принимает один из конструкторов. Можно обходиться и без конструкторов, но там несколько другой синтаксис инициализации и есть свои ограничения.

В данном случае конструктор принимает значение типа int, поэтому переменную типа ОфигеннаяСтруктура следует инициализировать значением типа int, или другого типа, но неявно приводимого к int.

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

Та незамысловатая строка - всего лишь объявление переменной штукаДва типа ОфигеннаяСтруктура. Копировать структуры одного типа друг в друга чрезвычайно просто - точно так же, как и "копировать" значения переменных встроенного типа. Нужно выполнить присвоение значения одной переменной другой. Например, "штукаРаз = штукаДва;". Выполните сами и распечатайте значение, которое стало у переменной штукаРаз после этого присвоения.

Функа1 не имеет никакого отношения к структурам типа ОфигеннаяСтруктура кроме того, что она возвращает значения этого типа.

Вам нужна общая подготовка, вы "утонете" без неё. Посоветовать что либо почитать не готов.

Кратко по тому, что вижу, можно дать следующее (самые основы):

1. Данные в программе хранятся в именованных областях памяти, называемых переменными.

2. Тип переменной задаёт способ интерпретации хранимых данных и, в подавляющем большинстве случаев, их размер. Способ интерпретации подразумевает набор операций, которые можно выполнить над данными.

3. Встроенные и структурные типы концептуально с этой точки зрения не отличаются.

Пункт 2 самый важный и фундаментальный для понимания. В С++ и MQL понятие типа очень важно.

Совсем на пальцах: тип - это "шаблон" данных, а переменная - единица этого шаблона. Котик или собачка - это "шаблоны", а конкретные котики, типа Мурзика, или собачки, типа Шарика, - это единицы котиков и собачек. Так же и с типами и переменными.

 
Hobu:

Пожалуйста, а можно подробно закомментировать тот способ, который описал simpleton, каждую строчку включая синтаксис? А то мне пока непонятно что там что означает. Необязательно на пальцах, можно и с терминами, но построчно.

1)То иссть функция Функа возвращает именно обьект, а не какое-то заурядное значение, как это делают более заурядные функции? Иче это за зверь такой у нее получается, почему он именно обьект?

2)Можно проинициализировать как обьектом, возвращенным из функции так и значением по умолчанию? То есть функция Функа, хоть она и часть той же структуры , не имеет отношения к обьекту Штука 2, или я чего-то недопоняла? Кстати, оно там так и называется обьектом, т.е у структуры тоже получается обьект? Че-то мне казалось как-то проще. И еще вопрос, а как именно копировать одну структуру в другую, если они одного типа? Вот эта вот незамысловатая строчка

и есть пресловутое копирование? И отдельно обьявлять структуру Штука 2 не надо, и это вообще не структура, а обьект, созданный структурой?

Я как-то не владею вообще никакими языками программирования(но не против научиться) и тем более имею достаточно смутное представление об ООП, так что не удивляйтесь если вопросы глупые.

Упс, я только что углядела, что там скобки фигурные  закрываются раньше, т. е. эта Функа описана вне структуры, а , собственно что она из себя представляет по отношению к структуре Офигенная?


Тарту? Тыугу... 
 

Старички, подскажите, как посчитать количество заполненных ячеек в двумерном массиве.

 for(int i=0;i<ObjectsTotal();i++) 
{
  mas[0][i]-количество заполненных ячеек?
  mas[1][i]-//-//-//-//-//-//-//-//-//-
}
 

Помогите пожалуйста кодом вывести на графике всего одну цифру уровень слива. если не трудно.

Вот в этом расширении хорошем https://www.mql5.com/ru/code/8873 она есть и так и называется уровень слива, красным цветом отображается, хотя еще и уровень маржи нормальная тема но хотя бы что одно для начала добыть, в остальном, расширение классное но там много всего что мне не надо, а понять не могу, как там она получается. 

 
Top2n:

Старички, подскажите, как посчитать количество заполненных ячеек в двумерном массиве.

 


ArrayRange
 
r772ra:

ArrayRange


Эта функция возвращает кол-во ячеек массива, а не заполненных ячеек.

Может кто скажет как для одномерного?))