Перейти к полному стилю
Комментировать

С С++ - Вопросы программирования

18 окт 2016, 02:23

Тоже столкнулся с отсутствием возможности использовать указатели и ссылки в простых типах MQL4.
Например, конструкция в Си:
Код:
unsigned char num = 20;
unsigned char* numPoint = NULL;
numPoint = #
unsigned char result = 0;
result = *numPoint;
*numPoint = 50;

С С++ - Вопросы программирования

18 окт 2016, 04:20

Ссылки на фундаментальные типы частично есть, просто нельзя к ним применить & для получения ссылки на переменную, но это собственно и не нужно %)
Сам я указатели на простые типы в С++ практически не используются кроме char, т.к. тут массивы и без них ни куда. Во всем другом можно обойтись и без них. Кстати если используешь auto из С++`11 то голову вообще можно не ломать насчет этого, единственное, быть внимательнее при работе в дальнейшем.
Вообще я к переменным фундаментальных типов отношусь как к касте которая во всем следует за объектом, а объекты все живут в выделенной памяти, поэтому наверное вопрос и не затрагиваю этот. Указатели и ссылки на фундаментальные типы нужны разве что системщикам, которые пишут ПО на более низком уровне абстракций.
Валера, а зачем тебе указатели и ссылки на фундаментальные типы?
Я что то не пойму, зачем ты используешь не символы, при присвоении значений? Это все вообще можно обернуть в мини-класс и для самого объекта выделяй память и работай с ним как с указателем:
Код:
/*
unsigned char - то же самое что и uchar, в подавляющем числе библиотек используется именно так  :)
*/
class CData
  {
   uchar m_num;
   uchar* m_num_point = NULL;

public:
   CData(const uchar& num,const uchar& npoint,const uchar& res) : m_num(num),m_num_point(NULL),m_result(res) {
      m_num_point = #
      uchar m_result = 0;
      m_result = *m_num_point;
      *m_num_point = 50;
   }
   void Create(const uchar& npoint) { m_num_point = npoint; }
  };

CData *_data = new CData(/*какие то три значения*/);
//...
_data.m_num_point = 50;
//...
_data.

примерный класс написал без анализа твоих ошибок, но их там у тебя не одна:
- как ты собираешься к переменной фундаментального типа присваивать указатель без приведения к типу
- используешь указатели, без распределения под них памяти
- инициализировать указатели константными значениями фундаментальных типов не получится
и т.д.
думаю тебе достаточно пока использовать фундаментальные типы без парадигм указателей и ссылок :) иначе есть шанс выстрелить себе в ногу :D

С С++ - Вопросы программирования

18 окт 2016, 12:06

До классов я пока не дошел, сейчас на уровне осознания работы указателей. По описанным ошибкам я тебя не понимаю. На второй строке я явно инициализирую указатель типа uchar значением NULL, т.е. явно выделяю для него память. На третьей строке присваиваю ему значение адреса переменной. Типы переменной и указателя совпадают. Далее разыменовываю указатель во вторую переменную с типом uchar. Потом меняю значение первой переменной через указатель, и т.д. Конечно такие действия можно сократить, например сразу инициализировать указатель адресом переменной, но это для подробного понимания механизмов.

Сообщение добавлено... спустя 3 минуты 24 секунды:
В том-то и дело, что в MQL только в классах можно использовать всю или почти всю мощь С++.

С С++ - Вопросы программирования

18 окт 2016, 12:23

Kordan писал(а):До классов я пока не дошел, сейчас на уровне осознания работы указателей. По описанным ошибкам я тебя не понимаю. На второй строке я явно инициализирую указатель типа uchar значением NULL, т.е. явно выделяю для него память. На третьей строке присваиваю ему значение адреса переменной. Типы переменной и указателя совпадают. Далее разыменовываю указатель во вторую переменную с типом uchar. Потом меняю значение первой переменной через указатель, и т.д. Конечно такие действия можно сократить, например сразу инициализировать указатель адресом переменной, но это для подробного понимания механизмов.

Сообщение добавлено... спустя 3 минуты 24 секунды:
В том-то и дело, что в MQL только в классах можно использовать всю или почти всю мощь С++.

У тебя в выделенном ошибка в мышлении.
- NULL это ни чего, т.е. ты создал указатель и "занулил" его, но память под него ты не выделил и не распределил, делается это посредством оператора new, а когда указатель не нужен становится, то его удаляют оператором delete.
И что бы не перерасходовать лишний раз память (она ведь нужна иногда :dumaet: , в С++ нужно строго!!! отслеживать работу указателей.
В C# к примеру свой собственный менеджер памяти, который отслеживает за программиста когда нужно удалять указатель, но из-за этого исполнение кода обеспечивает дополнительную нагрузку на ОС, память, процессор и т.д. со всеми вытекающими последствиями. К слову сказать в C# есть режим, когда менеджер памяти отключается и программисту нужно так же самому все отслеживать.
Со стандарта С++`11 так же появились в STL умные указатели auto_ptr и автоматические типы auto ))) в Boost тоже есть умные указатели, да и вообще слушая росказни многих программистов о том, что С++ устарел, сложен и неудобен в отличие от C#, начинаю задумываться о знаниях этих программистов в области С++ :men: т.к. С++ уже далеко не тот который был со стандартом C++`98, а гораздо удобнее подавляющего большинства языков программирования, за счет своей гибкости. К примеру сколько ты знаешь библиотек в общем доступе и популярных для C#? Я знаю только одну - .NET FrameWork, а для С++ - STL, Boost, Qt, MFC и еще куча всего популярного )))
Касаемо остальных у тебя в коде ошибок:
- тип указателя на фундаментальный тип и фундаментальный тип, разные типы, их нельзя смешивать между собой
- не правильно типу char присваивать константное целочисленное значение, присваивай константный символьный тип
и т.д.
P.S. :
Ты не пытайся использовать для фундаментальных типов указатели, это в подавляющем большинстве ни к чему и усложняет код, я же тебе специально привел пример как можно делать, в С++ я именно так все и делаю, т.к. необходимость в указателях для фундаментальных типов я встречал крайне редко :) и в основном для массивов char, хотя проще использовать контейнеры в которых все уже сделано. Я сейчас пишу контейнеры в стиле STL для MQL5, для 4-й тоже подойдет, там и память как надо выделяется и создаются и используются они просто.

С С++ - Вопросы программирования

18 окт 2016, 12:50

Так, Костя, еще раз. Я считаю, что память выделяется уже при декларировании переменной конкретным типом. Различные типы же имеют разный объем. Ты говоришь, что память выделяется значением переменной?

Сообщение добавлено... спустя 8 минут 49 секунд:
Тип char имеет диапазон от -128 до 127 и его вполне можно использовать для чисел в этом диапазоне, а не только для символов.

С С++ - Вопросы программирования

18 окт 2016, 15:21

Малость отвлекся :bravo:
Kordan писал(а):Так, Костя, еще раз. Я считаю, что память выделяется уже при декларировании переменной конкретным типом. Различные типы же имеют разный объем. Ты говоришь, что память выделяется значением переменной?

Автоматическое распределение памяти при создании переменной - когда создается переменная по значению. Под нее выделяется память в области контролируемой программой, т.к. при запуске любой программы ей отводится ОС некоторый объем памяти.
Динамическое "распределение" памяти (распределение памяти в "куче") - только через оператор new либо посредством специальных менеджеров памяти. В этом случае отводится два участка памяти, один под указатель, который содержит адрес памяти в "куче", а другой под сам объект на который указывает указатель. Т.е. создав указатель мы еще не создали сам объект и соответственно не имеем еще адреса в динамической памяти под этот объект.
У тебя получилось следующее - ты создал указатель, но память под него не распределил, т.е. ты не сказал программе посредством оператора new, что бы она выделила какой то участок памяти и не получил соответственно сам указатель на этот участок памяти. Оператор new возвращает нам адрес на выделенный участок в динамической памяти под объект.
Далее ты, после создания указателя, пытаешься присвоить этому указателю константное значение, которое в памяти под переменные не находится, на сколько я понимаю, константа в этом случае находится где то на стеке, точно не знаю.
При этом программа думает, что указатель содержит не константу, а адрес в памяти. В общем получается не понятно что :hi_hi_hi:
Kordan писал(а):Сообщение добавлено... спустя 8 минут 49 секунд:
Тип char имеет диапазон от -128 до 127 и его вполне можно использовать для чисел в этом диапазоне, а не только для символов.

Совершенно верно, тип char языком программирования С++ воспринимается как целочисленный знаковый тип, размером 1 байт, но при этом в данном диапазоне содержится таблица символов и ты используя значения в этом диапазоне, по сути оперируешь кодами таблицы символов. Но ведь мы пишем программы не на низкоуровневом языке, а на ЯП высокого уровня и разработчики предоставили нам возможность оперировать самими символами, поэтому сам как думаешь будет удобно для восприятия, так:
Код:
const char _var = 'a';
или так:
Код:
const char _var = 97;
Думаю что второе не совсем удобно для восприятия, если ты не знаешь таблицу символов. Я это к тому, что тип char, хоть и целочисленный, но предназначен он для символов.
Информация про тип char и как его использовать
Таблица символов ASCII

С С++ - Вопросы программирования

18 окт 2016, 20:41

Ну вот например статья http://cppstudio.com/post/5828/ , про использование указателей. Там ни слова про оператор new и все вроде понятно растолковано. То, что ты пишешь тяжело осмыслить. Если ты пишешь применительно к MQL, то я пока изучаю Си и не переносил знания на MQL.

С С++ - Вопросы программирования

18 окт 2016, 20:55

Kordan писал(а):Ну вот например статья http://cppstudio.com/post/5828/ , про использование указателей. Там ни слова про оператор new и все вроде понятно растолковано. То, что ты пишешь тяжело осмыслить. Если ты пишешь применительно к MQL, то я пока изучаю Си и не переносил знания на MQL.

Ну да, я скомкано все объяснил %) не указал один нюанс про указатели на фундаментальные типы - тут ситуация алгоритмически такая же как по массивам и пользовательским типам (кроме enum и union), но с одним нюансом, т.к. фундаментальные типы по сути статические, то память под них распределяется как на статические типы, не путать с классом памяти static. Но сути не меняет.
Если касаемо твоего примера, то там бессмыслица, зачем создавать указатель, что бы затем сделать его разыменовывание и значение указателя передать другой переменной? Какой тут сакральный смысл?
Для пользовательских типов и массивов мы выделяем память, т.к. эти типы во первых большие, во вторых занимают много места в памяти и логичнее было бы их вынести в динамическую память, экономя память отведенную под работу программы с простыми типами и типами которые создаются на локальном уровне, т.е. на короткий срок.
К примеру есть массив данных либо список (буферы баров к примеру), если нам эти данные не нужны для сохранения на "бумаге", то проще их держать в динамической памяти и не тратить время на их сохранение на диске теряя время обработки программы. А новые поступающие бары просто добавлять. В процессе работы программы, контролировать размер такого массива и при его каком нить критическом превышении, сбрасывать лишнее уже в файл на диск. А выделять память под 1 байт и даже под 8 как то не кашерно, согласись :)
Еще касаемо указателей и чем они удобны. Есть функция или метод, в который нужно передать некий массив данных либо объект класса или структуры. Если передавать по ссылке, то нужно строго контролировать переданную ссылку, что бы не уничтожить сам источник данных. В то время как указатель в функции за ненадобностью можно занулить, при этом сам источник данных будет жить в памяти, пока не удалится последний указывающий на него указатель. Ну и указатель удалять объект это опять накладные расходы, менее накладно занулить указатель, чем вызвать оператор удаления.
Так же с указателями можно проводить адресную арифметику, в MQL это не доступно из-за урезанности.

С С++ - Вопросы программирования

18 окт 2016, 22:26

Да, вот сейчас уже более понятно. Я согласен, что на практике мой пример применять накладно, но он был приведен из учебника только лишь для осознания механизма работы указателей. Я хотел сказать, что в MQL его написать невозможно.

С С++ - Вопросы программирования

19 окт 2016, 05:37

Валера, вот после нескольких лет изучения программирования на C++ пришел к нескольким выводам:
1. Быстро научиться программировать можно только находясь в команде программистов уровнем выше, остальные варианты будут медленнее.
2. Перед тем как писать код, нужно научиться пользоваться инструментом - редактор на котором будешь писать код, отладчик которым будешь пользоваться.
Из редакторов нужно смотреть в сторону легких в настройке и освоении и без наворотов типа рефакторимнга, решарпинга и т.д. Конечно если навороты будут то они не лишним, но зачем редактор с наворотами для кода из нескольких строчек...
На мой взгляд самый нормальный редактор для Windows, это notepad++, в нем есть подсветка синтаксиса, возможность создания своего окружения, подключения макросов и этого достаточно. Для Linux можно использовать gedit либо vim. Все эти редакторы бесплатны официально.
Из отладчиков я бы выбрал gdb, в сети достаточно информации как им пользоваться из командной строки. Я для отладки использую всего пять команд, запомнить их не сложно. Он так же официально бесплатен.
Ну а для больших проектов можно конечно и студию использовать, даже лучше это сделать, т.к. в них отладка из-за автоматизации намного быстрее идет, плюс рефакторинг и т.д.
На сегодняшний день для Windows и Linux из бесплатных IDE вижу несколько вариантов:
- QtCreator
- VisualCode
- Eclipse CDT
- NetBeans
- CodeLite
- Code::Blocks
Сам я использую для больших проектов QtCreator, для быстрой правки каких то алгоритмов и т.д. gedit + gdb + консоль, но планирую перейти на vim, т.к. не устраивает один неприятный момент в алгоритме поиска в gedit.
Использовать VisualStudio не рационально - грузится как монстр, внутри имеет собственные реализации, которые могут стать проблемой при переносе кода в другую среду разработки. Плюс ко всему она для тонкой настройки сложна из-за большого числа наворотов. Ну и к тому эе эта IDE все же для серьезных проектов под Windows.
Почему я отказался от VisualStudio, да все просто, при поиске возникающих вопросов в сети, всегда спрашивают исходник, а у любой IDE кроме исходного файла с кодом, всегда куча дополнительных файлов тянется, в которых сохраняются настройки, скрытые от взгляда, но иногда они в себе таят самые коварные проблемы.
Касаемо MQL, то для себя однозначно уже решил - бежать подальше от этого сгустка проблем и ошибок, но тормозит пока одна не решенная проблема, которую надеюсь решу.

С С++ - Вопросы программирования

19 окт 2016, 07:35

Сейчас смотрю очень многие программисты работают на Sublime Text 3 с компилятором gcc.

С С++ - Вопросы программирования

19 окт 2016, 07:41

Kordan писал(а):Сейчас смотрю очень многие программисты работают на Subleme Text 3 с компилятором gcc.

компилятор у меня тоже gcc v4.8 но нужно будет обновиться до 5> т.к. там устранили обнаруженную уязвимость из v4.9, хотя для моих проектов это пока не критично ))) а насчет редакторов писал выше, чем проще в настройках тем лучше.
Вот так выглядит моя среда быстрой разработки (правки и тестов кода).
Gedit + gcc + gdb + плагин вставки командной строки в Gedit + плагин поддержки левого окна дерева
ide-gedit.png

Обрати внимание, запуск почти мгновенный, все под рукой, область командной строки можно скрыть и самое главное - это все установлено по умолчанию в Linux и официально бесплатно. Сейчас думаю над освоением Vim, там вроде как возможностей больше. :tipa:
У вас нет доступа для просмотра вложений в этом сообщении.

С С++ - Вопросы программирования

26 окт 2016, 13:35

Что-то сплошной геморрой с настройками различных IDE. Кое-как запустил NetBeans и то не знаю, правильно ли. Установил Qt Creator, так на него вообще не нашел поддержки, как подключить компилятор, отладчик. Visual Studio сразу заработал (на Си) после установки, но громоздкий, собака. Никак не могу определиться со средой разработки. Мне нужно HTML, PHP, CSS, C, C++.

С С++ - Вопросы программирования

26 окт 2016, 13:45

В NetBeans скриптами на bash можно любой компилятор и отладчик подключить. У меня знакомый на нем что делал. Но сам я на нем не работал, только ознакомительная установка была.
QtCreator - для Си и С++ точно подойдет, насчет всего остального не знаю, но думаю если компилятор соответствующий и отладчик подключить, то будет работать. По Си и С++ компилятору и отладчику в нем - там если ты его не пересобрал сам, то все подключено по дефолту, при условии, что ты его с фреймворком Qt ставишь. Там вариантов установки много. Я к примеру написал на bash скрипты сборки всей этой связки под разные варианты, которые мне нужны. Порядок для 4-й и 5-й версии общий следующий:
1. Стягиваешь исходники фреймворка и компилишь его с нужными ключами.
2. Ставишь QtCreator и в нем в настройках просто указываешь пути где находятся собранные фреймворки.
И это общий порядок для всех ОС. Так же для каждой поддерживаемой ОС есть собранные установщики.
У меня сейчас комп под виндой загружен, поэтому не смогу тебе показать как у меня все сделано, если нужно будет пиши, я как под Linux перегружусь, скину тебе скрины.

А вообще тебе нужно определиться прежде всего чего ты хочешь в итоге, универсальных путей тут нет, то что универсальное подходит только для общих задач. К примеру есть новый хороший IDE под твои нужды от Microsoft - VisualCode, официально бесплатна, поддерживает вроде все то чего ты написал, только в ней компилятор нужно подключать отдельно, но есть на английском у них на странице документация по этому поводу. Ide не тяжелая, но меня не устраивает т.к. под С++ для Linux есть легче и лучше.

С С++ - Вопросы программирования

26 окт 2016, 13:54

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

Сообщение добавлено... спустя 2 минуты 56 секунд:
Да, наверно универсальность не прокатит. Для вэб разработок нужно одно, для Си другое.

С С++ - Вопросы программирования

26 окт 2016, 13:59

Kordan писал(а):У меня дополнительный комп простаивает, сейчас на нем десятка, но думаю установить убунту, так многие преподаватели рекомендуют. Попробую Линукс поковырять.

Если под Linux то делай следующие связки:
1. Для проектов Си и С++ IDE которая тебя будет устраивать в плане поддержки библиотек и фреймворков которые ты планируешь использовать. Если Qt не планируешь использовать то и смысла ставить QtCreator нет.
2. Для быстрых правок кода пользуйся gedit + gcc + gdb + плагины которые я тебе выше писал
3. Для проектов на php и html найди отдельную IDE, для быстрых правок подойдет связка из п.2, там поддержка этих синтаксисов есть.

С С++ - Вопросы программирования

26 окт 2016, 14:16

Препод кодит на SublimeText3 + gcc, каждый раз сохраняя проект и компилируя через командную строку. Других посмотрел видео, тоже говорят IDE - это зло, в случае поиска ошибки, прогер, обученный на IDE, не понимая всех взаимодействий в компьютере, неспособен будет ее исправить.

С С++ - Вопросы программирования

26 окт 2016, 14:26

Kordan писал(а):Препод кодит на SublimeText3 + gcc, каждый раз сохраняя проект и компилируя через командную строку. Других посмотрел видео, тоже говорят IDE - это зло, в случае поиска ошибки, прогер, обученный на IDE, не понимая всех взаимодействий в компьютере, неспособен будет ее исправить.

Все правильно, я до недавнего времени был в таком как раз состоянии ))) как только перешел на командную строку, стал гораздо шире все понимать и теперь IDE использую только когда нужно писать что то большое и там же тогда и отлаживаю, потому как в командной строке тяжело много переменных держать на контроле. Ну и в IDE все же большой проект проще писать, там все таки рефакторинг и подстановка более серьезная. Опять же все зависит от того какие ты используешь инструменты для кода. Qt тяжело контролировать на сторонних IDE, да и собирать его тоже в родной среде проще.

С С++ - Вопросы программирования

03 ноя 2016, 00:02

Почему разработчики языка Си по стандарту используют главную функцию main типа int, имеющий диапазон 4млрд чисел и размер 4 байт, которая всего-лишь возвращает ноль? Почему не bool или char, размером в 1 байт?

С С++ - Вопросы программирования

03 ноя 2016, 09:31

Так сложилось исторически, ведь main точка входа в отработку построчно кода программы. По сути main та же самая функция как и другие, за исключением, что только с нее начинается отработка любого кода и в нее передаются необходимые параметры в качестве ее аргументов, а не с какой то другой. В динамических библиотеках есть есть так же точка входа dllmain. Вообще в Интернете информация по этому поводу есть, там же есть коды возврата этой функцией.
Комментировать