Любые вопросы от ПРОФИ к СУПЕРПРОФИ - 1. - страница 3

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
VonDo Mix
1523
VonDo Mix  
Святая простота (с) Ян Гус
Владимир Тезис
4266
Владимир Тезис  
Sorento:
Святая простота (с) Ян Гус

Что Вы имеете ввиду?
VonDo Mix
1523
VonDo Mix  
drknn:

Что Вы имеете ввиду?

Не всё так просто.

теперь внутри функции - поработайте с переданной переменной.

Как учит нас матмех - если предавали псевдопеременную по адресу - все чудеса в ней накрылись.

Но если адрессный пул по константам выстроился - всё иначе будет.

0 станет 1 и наоборот.

;)

Владимир Тезис
4266
Владимир Тезис  
Зачем Вам в советнике/индикаторе/скрипте такие сложности, как передача переменной по адресу? Что Вы имеете ввиду под терминами: псевдопеременная, адресный пул и выстраивание по константам?
VonDo Mix
1523
VonDo Mix  
drknn:
Зачем Вам в советнике/индикаторе/скрипте такие сложности, как передача переменной по адресу? Что Вы имеете ввиду под терминами: псевдопеременная, адресный пул и выстраивание по константам?

компиляторы и интерпретаторы схожы.

Потому задумайтесь.

как передаются параметры(переменные)?, а если в функциию передается выражение..

;)

Vladyslav Goshkov
2218
Vladyslav Goshkov  
Sorento:

поделюсь сомнениями и я.

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

Но чем больше пишу кода (пока мало) - возникает вопрос:

как передаются параметры в функциях?

(по имени или по значению?)

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

;)


Хоть профи или супер профи себя и не считаю, но попытаюсь ответить :).

МТ реализован на С\С++ и разработчики рекомендовали в случае неясностей обращаться к стандартам этого языка.

По страндарту С\С++ все параметры, кроме массивов, передаются по значению - в том числе и выражения. То есть, передаются копии параметров: изменение параметра, переданного по значению, внутри вызываемой функции, не приводит к изменению параметра во внешней - вызывающей. Если нужно, чтоб изменение было, то передавать нужно по ссылке (по адресу) - то есть передается адрес, по которому расположена переменная, передаваемая в качестве параметра. Тогда можно поменять значение, расположенное по этому адресу, а сам адрес нет. Все массивы передаются по ссылке - то есть передаются сразу адреса: иначе через стек приходилось бы копировать огромное количество данных.

Для того, чтобы запретить изменение параметра, передаваемого по ссылке, внутри вызываемой функции, в С\С++ используется модификатор const.

В С\С++ строки являются символьными массивами, с одной разницей - такой массив должен заканчиваться символом окончания строки '\0'.

В МКЛ строка - это структура, содержащая размер и указатель на строку (то есть сам строковый массив ), если верить примерам.

Пример для С\С++ :

//----
struct MqlStr
  {
   int               len;
   char             *string;
  };

Здесь char * является указателем на переменную символьного типа (тип char). Сам тип указателя (char*, int*, double*.......) всегда целочисленный - это адрес ячейки. Это обозначает, что в переменной хранится не строка, а адрес ячейки. Само значение символа можно получить вот таким обращением : *string или таким string[0]. Для работы всегда нужно выделять память под массив, если он не размещен статически - то есть при описании не указан его размер, например так:

char string[1025] ;

это массив символов, из 1025 элементов.... если последний символ (string[1024]='\0'), то такой массив может трактоваться как строка размерностью 1024 символа.

Тогда элементы строки можно получить как элементы обычного массива string[i]; При динамическом размещении под строку выделяют + 1 элемент и последним добавляют символ конца строки.....

Соответственно строка передается всегда по ссылке. Запрещена ли их модификация это зависит от реализации МКЛ и это можно проверить примером: передаем в функцию строку, там меняем значение и считываем его (это значение) после окончания работы вызываемой функции.

Удачи.

Vadim Zhunko
5136
Vadim Zhunko  
VladislavVG:

Соответственно строка передается всегда по ссылке. Запрещена ли их модификация это зависит от реализации МКЛ и это можно проверить примером: передаем в функцию строку, там меняем значение и считываем его (это значение) после окончания работы вызываемой функции.

Модификация не запрещена. Проверял.
Vadim Zhunko
5136
Vadim Zhunko  
drknn:

Пипец. Видать вопрос к разработчикам, либо в ДЛЛ-ке не всё ладно. Я на С++ не программлю - пытался как-то сделать пару-тройку прог, столкнулся с тем, что пока у тя установлена оболочка С++, у тя всё работает. Но стОит только перенести экзешник на другой комп, как сразу обнаруживается недостача какой-то dll-ки. Да и работа со строками не понравилась. Бросил я этот язык и так и остался на Delphi. Может Вам попробовать сделать свою ДЛЛ-ку на нём - с терминалом у меня такие длл-ки дружат вполне нормально...

P.S.

Так я и не понял, чего все так хвалят С++, если уже на уровне выбора оболочки для программирования с этим языком возникают проблемы...

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

Проблема возникает, когда их загружаешь из удалённого процесса.

=====================================

По поводу переноса кода на другой комп. Скорее всего Вы переносили дебагерный вариант. Он тянет за собой библиотеки для отладки из Студии. Надо было скомпилировать релиз. Тогда всё работало бы везде.

TheXpert
17879
TheXpert  
Зря назвал по аналогии.
Владимир Тезис
4266
Владимир Тезис  
TheXpert:
Зря назвал по аналогии.

Точно. Я даже сперва проморгал толком термины названия этой ветки - не заметил, что названия отличаются - внимание уже настроено на определённый шаблон.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий