Список форумов AmiSite.ru AmiSite.ru
Форум по Ами
 FAQ  •  Поиск  •  Пользователи  •  Группы   •  Регистрация  •  Профиль  •  Войти и проверить личные сообщения  •  Вход
 как в if-else и switch-case использовать значение из массива Следующая тема
Предыдущая тема
Начать новую тему  Ответить на тему
Автор Сообщение
il-ir



Зарегистрирован: 28.05.2013
Сообщения: 189

СообщениеДобавлено: Ср Фев 10, 2016 6:48 pm Ответить с цитатой Вернуться к началу

Есть массив условий (назовем его Conditions) и в зависимости от значения в конкретном элементе требуется выполнить разные блоки кода.

Самое простое - использовать конструкцию if-else или switch-case , но для этих конструкций требуется, что бы условие в операторе if(условие) и выражение в операторе switch(выражение) были не массивами, а простыми значениями.

То есть, если использовать такую конструкцию:
if ( Conditions ) ...
или
switch ( Conditions ) ...

то появляется сообщение: Error 6. Условия для операторов IF, WHILE, FOR могут быть числового или логического типа. Вы не можете здесь использовать массивы, пожалуйста применяйте [] (оператор индекса массива) для доступа к элементам массива.

про конструкцию IIf я помню, но тут засада в том, что требуется выполнить разные набор операторов Sad


Посему, вопрос: как можно реализовать выполнение разных блоков кода в зависимости от значения в массиве?


Заранее спасибо за ответ(ы).

P.S. Наверное, это я просто туплю откровенно Sad , и решение - элементарное.
Посмотреть профиль Отправить личное сообщение
FedorovMG



Зарегистрирован: 14.08.2014
Сообщения: 58

СообщениеДобавлено: Ср Фев 10, 2016 7:13 pm Ответить с цитатой Вернуться к началу

Можно использовать LastValue()
Посмотреть профиль Отправить личное сообщение
il-ir



Зарегистрирован: 28.05.2013
Сообщения: 189

СообщениеДобавлено: Ср Фев 10, 2016 7:49 pm Ответить с цитатой Вернуться к началу

FedorovMG писал(а):
Можно использовать LastValue()

То есть, я пишу в коде:
if ( LastValue(Conditions) ) ...
или
switch ( LastValue(Conditions) ) ...

Правильно?
Посмотреть профиль Отправить личное сообщение
yser



Зарегистрирован: 30.11.2011
Сообщения: 76

СообщениеДобавлено: Ср Фев 10, 2016 9:30 pm Ответить с цитатой Вернуться к началу

можно цикл использовать, что типа такого:

Код:
Conditions = ...;
for(i=1; i<BarCount; i++) {
  if (Conditions[i] == 1) {
     выполнить действия ...
  } else
  if (Conditions[i] == 2) {
     выполнить действия ...
  } else
  if (Conditions[i] == 3) {
     выполнить действия ...
  }
}
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Ср Фев 10, 2016 10:02 pm Ответить с цитатой Вернуться к началу

Или можно так
Результат_блока1 = ....;
Результат_блока2 = ....;
Результат = IIf(условие, Результат_блока1, Результат_блока2);

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
il-ir



Зарегистрирован: 28.05.2013
Сообщения: 189

СообщениеДобавлено: Чт Фев 11, 2016 10:32 am Ответить с цитатой Вернуться к началу

Олег, заморочка в том, что это именно блоки операторов.

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


То есть, затруднительно (или мне так кажется Smile ) в итоге выполнения фрагмента кода получить предложенную тобой конструкцию:
Результат_блока1 = ....;
Результат_блока2 = ....;

Олег, подскажи - вариант if ( LastValue(Conditions) ) ... использовать можно?

Попробую перекроить на выходных код с учетом предложенных решений, вдруг еще вопросы появятся Smile

Спасибо за подсказки.
Посмотреть профиль Отправить личное сообщение
FedorovMG



Зарегистрирован: 14.08.2014
Сообщения: 58

СообщениеДобавлено: Чт Фев 11, 2016 7:01 pm Ответить с цитатой Вернуться к началу

Да. Такой вариант будет работать.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Чт Фев 11, 2016 9:51 pm Ответить с цитатой Вернуться к началу

На тестировании работать не будет. Только в реале (сигнал, робот).

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
il-ir



Зарегистрирован: 28.05.2013
Сообщения: 189

СообщениеДобавлено: Пт Фев 12, 2016 9:55 pm Ответить с цитатой Вернуться к началу

000 писал(а):
На тестировании работать не будет. Только в реале (сигнал, робот).


Олег, а такая конструкция полноценно будет работать?
Это тестовый вариант, что бы определить - работает или нет; смысла в собственно вычислениях нет Smile
Код:
MedianPrice = (High + Low) / 2;

Num_Close = StrToNum(NumToStr(Close));
Num_Median = StrToNum(NumToStr(MedianPrice));

printf( "Начинаем условие\n\n");
if (Num_Close > Num_Median) {
  printf( "Случился IF\n\n");
  }
else {
  printf( "Случился ELSE\n\n");
  }
printf( "Close = %g\n", Close );
printf( "MedianPrice = %g\n", MedianPrice );

По крайней мере, когда на график цены сложил, то отрабатывает нормально Smile
Про полноценно работать - интересует, будет ли работать и в реале, и в тестировании, и в каких еще можно режимах?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Сб Фев 13, 2016 9:10 am Ответить с цитатой Вернуться к началу

StrToNum(NumToStr( можно заменить на LastValue(

На тесте использовать нельзя.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
il-ir



Зарегистрирован: 28.05.2013
Сообщения: 189

СообщениеДобавлено: Сб Фев 13, 2016 1:30 pm Ответить с цитатой Вернуться к началу

000 писал(а):
На тестировании работать не будет. Только в реале (сигнал, робот).

Поясни, пожалуйста, - почему на тестировании работать не будет?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вс Фев 14, 2016 11:16 am Ответить с цитатой Вернуться к началу

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

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
il-ir



Зарегистрирован: 28.05.2013
Сообщения: 189

СообщениеДобавлено: Вс Фев 14, 2016 4:04 pm Ответить с цитатой Вернуться к началу

000 писал(а):
StrToNum(NumToStr( можно заменить на LastValue(...

Олег, поясни, пожалуйста, что делает функция NumToStr.
В документации написано:
Цитата:
NumToStr( NUMBER, format = 1.3, separator=True)
NumToStr( ARRAY, format = 1.3, separator=True )


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

Цитата:
WriteVal( NUMBER, format = 1.3, separator=True)
WriteVal( ARRAY, format = 1.3, separator=True )


Используется для вывода числа NUMBER или массива ARRAY.
Примечание: функция NumToStr синоним функции WriteVal и её использование предпочтительно.

Цитата:
LastValue(ARRAY, lastmode = True )

Возвращает значение последнего элемента массива ARRAY.


По логике, если LastValue выводит только последнее значение, то NumToStr(ARRAY...) и WriteVal(ARRAY...) не должны выводить последнее значение массива, так как в чем тогда их смысл, если есть для этого специализированная функция LastValue.

Поэтому, посчитал, что NumToStr(ARRAY...) и WriteVal(ARRAY...) выводит не последнее значение массива, а значение массива в рассматриваемом баре.

Я не прав?
Поясни, пожалуйста, по поводу функций NumToStr(ARRAY...) и WriteVal(ARRAY...) - на каком баре они выводят значение, если аргументом - массив?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вс Фев 14, 2016 5:46 pm Ответить с цитатой Вернуться к началу

На самом деле не важно что делают эта пара функций вместе. Важно то,что в if() никак нельзя запихать массив. Даже не пытайся.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
il-ir



Зарегистрирован: 28.05.2013
Сообщения: 189

СообщениеДобавлено: Вс Фев 14, 2016 6:58 pm Ответить с цитатой Вернуться к началу

000 писал(а):
На самом деле не важно что делают эта пара функций вместе. Важно то,что в if() никак нельзя запихать массив. Даже не пытайся.

Ты меня прямо расстроил Sad



СПАСИБО ВСЕМ помогавшим разобраться в вопросе.
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



Следующая тема
Предыдущая тема
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы не можете скачивать файлы


Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme :: Часовой пояс: GMT + 3

File Attachment © by Meik Sievertsen