Можно ли в коде изменить математический знак (только знак) по выбранному условию? - страница 2

 
Alexander Sevastyanov #:

Вопрос не мне, но отвечу.
Вообще без проблем: присвоить каждой операции целочисленное значение, например:

  • 0 - сложение
  • 1 - вычитание
  • 2 - умножение
  • 3 - деление
  • и т.д. 

В функции через switch или if распознать тип операции.
По сути OP_BUY, OP_SELL и  другие закодированы таким же образом через именованные константы.

П.С. Как вариант можно передать и как string ("add", "subtruct", "multiply" ...) для большей ясности.

Вот именно, вопрос не вам. Ну да ладно…

strung почти совсем не вариант, switch не принимает строковые выражения.

Хотя, для конкретного примера решение с передачей "строкового" выражения есть. Ну, это так… Для повыёживаться…

/********************Script program start function*******************/
void OnStart()
 {
  double r = f(2.0, 3.7, "+");
  DebugBreak();
 }/******************************************************************/

/********************************************************************/
double f(double a, double b, string c)
 {
  double n = 0;
  ushort k = StringGetCharacter(c, 0);
  switch(k)
   {
    case '-':
      n = a-b; break;
    case '+':
      n = a+b; break;
    case '*':
      n = a*b; break;
    case '/':
      n = a/b; break;
   }
  return n;
 }/******************************************************************/
 
leon_17 #:

Хорошо, допустим 0 это + И что мне это даёт?
Какая разница как я обустрою условие смены знака?

Вопрос в том, как сделать так, чтобы не переписывать по сто раз один и тот же код в котором меняется лишь операционный знак. Ну блин, как еще объяснить. Чтобы можно было сделать как то так:

Там где большой код вместо одной строки, можно вычислить по отдельности две части в переменные и дальше останется только та строка…

 
leon_17 #:

...

Вопрос в том, как сделать так...

Никак 

 
leon_17:

можно такие случаи как-то унифицировать?

  • Макросы.
  • Шаблоны.
  • Указатели на функции.

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

 
Alexey Viktorov #:

Как вы предлагаете передачу типа операции?

Как вариант:

enum OPERATIONS {ADDITION, SUBTRACTION, MULTIPLICATION, DIVISION};

double calculate(double firstNumber,double secondNumber, OPERATIONS operation = ADDITION) {
   switch (operation) {
   case ADDITION:
      return firstNumber + secondNumber;
   case SUBTRACTION:
      return firstNumber - secondNumber;
   case MULTIPLICATION:
      return firstNumber * secondNumber;
   case DIVISION:
      if(secondNumber != 0) return firstNumber / secondNumber;
   default:
      return 0;
   }
}
 
Вся проблема в том, что написанный код программы это не исполняемый текст. Компилятор должен получить точные инструкции в момент компиляции и он понятия не представляет, что будет во время исполнения. Поэтому все танцы с бубном в вариативности выполнения кода лежат на ваших плечах, и они должны однозначно интерпретироваться компилятором, перегрузка функции или процедуры по значению не работает, потому как на этапе компиляции для компилятора нет никакой разницы, что будет подставлено вместо переменной во время выполнения... Да и смысла в перегрузке нет - функцию придется описать полностью.
 
Yevhenii Levchenko #:

Как вариант:

Ну да, через enum хороший вариант. Я про него что-то и не подумал.

 

Представьте процессор будущего... и соответственно его ассемблер. 

Указывается не команда mov, add, pop... а указывается имя специального регистра, в котором хранится команда.

Но есть ли в этом смыл? Какую пользу можно их этого извлечь? 

 
Yevhenii Levchenko #:

Как вариант:

Я писал про большой код, а не переменные с примера. Представьте, что вместо firstNumber и secondNumber целые куски кода по 50 строк хотя бы... в которых также несколько раз применяется все тот же операционный знак. А это все то же самое только вид сбоку.

В общем... походу нельзя никак сделать кроме копипаста в таких случаях (

 
leon_17 #:

Я писал про большой код, а не переменные с примера. Представьте, что вместо firstNumber и secondNumber целые куски кода по 50 строк хотя бы... в которых также несколько раз применяется все тот же операционный знак. А это все то же самое только вид сбоку.

В общем... походу нельзя никак сделать кроме копипаста в таких случаях (

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Можно ли в коде изменить математический знак (только знак) по выбранному условию?

Alexey Viktorov, 2023.09.09 10:28

Там где большой код вместо одной строки, можно вычислить по отдельности две части в переменные и дальше останется только та строка…


Причина обращения: