오류, 버그, 질문 - 페이지 96

 

헷갈리네요 아시는 분 알려주세요.

구조를 만들고 데이터로 채우고 구조의 배열을 만들었습니다.

이제 어떻게 배열을 함수로 전송하지만 구조의 한 요소에 대해서만 전송합니까????????????????

 struct Str
  {
   int                a;
   int                b;
                     Str(){a= 2 ;b= 3 ;};
                    ~Str(){};
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
Str srt[ 10 ];
void OnStart ()
  {
   Print ( "sum a=" ,OnStr(srt[].a));??????????????????
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnStr( const Str &x[].y)?????????????????????
  {
   int sum= 0 ;
   for ( int i= 0 ;i< 10 ;i++)
     {
      sum+=x[i].y;
     }
   return (sum);
  }
 

개발자에게 제안 가능하면 구조에 대한 표준 작업을 수행하는 것이 좋습니다.

이건 아니야:

 struct Str
  {
   int                a;
   int                b;
                     Str(){a= 2 ;b= 3 ;};
                    ~Str(){};
  };
Str x;
Str y;
void OnStart ()
  {
   x.a+=y.a;
   x.b+=y.b;   
  }

하지만 다음과 같이:

 void OnStart ()
  {
   x+=y;     
  }
구조를 복사하는 것은 작은 문제로 남아 있습니다.
 
Urain :

헷갈리네요 아시는 분 알려주세요.

구조를 만들고 데이터로 채우고 구조의 배열을 만들었습니다.

이제 어떻게 배열을 함수로 전송하지만 구조의 한 요소에 대해서만 전송합니까????????????????


안 돼요. 예, 필요하지 않습니다.

왜냐하면 - 누가 합산 함수에서 그 요소를 정확히 방지하고 합산합니까?

다음은 "kosher"로 수정된 코드입니다.

 struct Str
  {
   int                a;
   int                b;
                     Str(){a= 2 ;b= 3 ;};
                    ~Str(){};
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
Str srt[ 10 ];
void OnStart ()
  {
   Print ( "sum a=" ,OnStr(srt));??????????????????
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnStr( const Str &x[])?????????????????????
  {
   int sum= 0 ;
   for ( int i= 0 ;i< 10 ;i++)
     {
      sum+=x[i].y;
     }
   return (sum);
  }

OnStr() 함수 내부의 for 루프에서 10이 아니라 ArraySize() 와 같은 것만 실제로 사용해야 합니다. 그리고 "sum+=x[i].y"의 y 대신 구조에 정의된 실제 데이터 필드가 합산됩니다(예: a 또는 b).

 
Urain :

구조에 대한 표준 작업을 수행하는 것이 좋은 경우 개발자에게 제안

이건 아니야:

하지만 다음과 같이:

구조를 복사하는 것은 작은 문제로 남아 있습니다.

C++에는 이것이 있습니다. "연산자 과부하"라고 합니다. 작동 방식은 해당 기능을 사용하여 프로그래머가 설정합니다.

그러나 이 기능은 'Renat'가 아니라고 말했다. 운이 없겠죠?

 
simpleton :

안 돼요. 예, 필요하지 않습니다.

왜냐하면 - 누가 합산 함수에서 그 요소를 정확히 방지하고 합산합니까?

다음은 "kosher"로 수정된 코드입니다.

OnStr() 함수 내부의 for 루프에서 10이 아니라 ArraySize()와 같은 것만 실제로 사용해야 합니다. 그리고 "sum+=x[i].y"의 y 대신 구조에 정의된 실제 데이터 필드가 합산됩니다(예: a 또는 b).

늘 그렇듯이 예를 들면 본질이 날아가 버렸지만 나는 모든 것에 놀라지 않고 아마도 내 뼈 혀를 탓할 것입니다.

그리고 핵심은 산술 평균의 함수를 작성한 다음 구조의 배열을 이 함수에 전달하여 구조의 각 구성원에 대한 산술 평균의 구조를 얻는 것입니다.

예제는 단순하지만 아마도 실패했을 것입니다. 그러나 어쨌든, 설명을 주셔서 감사합니다.

분명히 "연산자 과부하"를 허용하려면 개발자를 망치는 것이 필요합니다.

Документация по MQL5: Основы языка / Типы данных / Структуры и классы
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
  • www.mql5.com
Основы языка / Типы данных / Структуры и классы - Документация по MQL5
 

글쎄, 나는 단지 두 개의 구조를 더하고, 곱하고, 나누고,

가장 나쁜 것은 다른 구조가 이 모든 것을 새로운 방식으로 작성해야 한다는 것입니다.

PS 그래서 메소드 외에 구조 유형을 리턴 takajazha 구조로 제공하므로 중첩 호출이 전송되지 않습니다 ???

결과는 먼저 임시 구조에 저장된 다음 후속 처리로 전송되어야 합니다 ?? 이것이 왜 수행되는지는 분명하지 않습니다.

PPS 모든 매개변수가 const이지만 존재하지 않는 변수가 변경될 가능성은 없습니다.


존재하지 않는 구조를 참조할 수 있으므로 PPPS 및 쓰레기 구조는 참조로 전달됩니다.

 
int sl_pips = SymbolInfoInteger ( _Symbol , SYMBOL_TRADE_STOPS_LEVEL );
"유형 변환으로 인한 데이터 손실 가능성 "이라는 잘못된 표현이 있습니까? (빌드: 305)
Документация по MQL5: Основы языка / Типы данных / Приведение типов
Документация по MQL5: Основы языка / Типы данных / Приведение типов
  • www.mql5.com
Основы языка / Типы данных / Приведение типов - Документация по MQL5
 
Urain :

헷갈리네요 아시는 분 알려주세요.

구조를 만들고 데이터로 채우고 구조의 배열을 만들었습니다.

이제 어떻게 배열을 함수로 전송하지만 구조의 한 요소에 대해서만 전송합니까????????????????

 struct Str
  {
   int                a;
   int                b;
                     Str(){a= 2 ;b= 3 ;};
                    ~Str(){};
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
Str srt[ 10 ];
void OnStart ()
  {
   Print ( "sum a=" ,OnStr(srt[].a));??????????????????
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnStr( const Str &x[].y)?????????????????????
  {
   int sum= 0 ;
   for ( int i= 0 ;i< 10 ;i++)
     {
      sum+=x[i].y;
     }
   return (sum);
  }

심플턴 :

안 돼요. 예, 필요하지 않습니다.

왜냐하면 - 누가 합산 함수에서 그 요소를 정확히 방지하고 합산합니까?

다음은 "kosher"로 수정된 코드입니다.

OnStr() 함수 내부의 for 루프에서 10이 아니라 ArraySize()와 같은 것만 실제로 사용해야 합니다. 그리고 "sum+=x[i].y"의 y 대신 구조에 정의된 실제 데이터 필드가 합산됩니다(예: a 또는 b).

두 가지 옵션이 있습니다(내가 이해하는 한).

1. 추가 매개변수로 작업할 레코드의 인덱스를 지정하여 배열 자체를 전달합니다.

이 경우 배열 차원 의 오버플로를 제어해야 하며 함수 선언은 다음과 같이 보일 것입니다.

OnStr( const Str &x[], int Index=- 1 )

2. 하나의 레코드 차원을 가진 보조 배열을 각각 전달하고, 함수의 결과를 모니터링하고 처리하는 모든 작업은 함수 호출 시점에서 수행됩니다.

함수 선언은 다음과 같이 보일 것입니다...

OnStr( const Str &x[ 1 ])
Документация по MQL5: Операции с массивами / ArrayRange
Документация по MQL5: Операции с массивами / ArrayRange
  • www.mql5.com
Операции с массивами / ArrayRange - Документация по MQL5
 
EvgeTrofi :
"유형 변환으로 인한 데이터 손실 가능성 "이라는 잘못된 표현이 있습니까? (빌드: 305)

결과를 명시적으로 int로 캐스팅해야 합니다.

 int sl_pips = ( int ) SymbolInfoInteger ( _Symbol , SYMBOL_TRADE_STOPS_LEVEL );

추신

작동 예는 여기에서 볼 수 있습니다 - OrderSend ()

그러나 내가 이해하는 것처럼 원칙적으로이 경고에 눈을 감을 수 있습니다 ...

 

대신 괄호가 많으면 헷갈리기 시작한다!?

예를 들어 다음은 "klsfd Step 2"와 같은 문자열에서 숫자를 반환하는 함수입니다.

 int GetStep( string text){
   string Right;
   int U = StringFind (text, "Step " );
   int End, result;
   if (U>= 0 ){
      U=U+ 5 ;
      Right = StringSubstr (text, U);
      End = StringFind (Right, "." );
      result= int ( MathRound ( StringToDouble ( StringSubstr (text, U, End-U))));
       return (result);
   }
   return ( 0 );
}

이거랑 어떻게 다릅니까?

 int GetStep( string text){
   string Right;
   int U = StringFind (text, "Step " );
   int End;
   if (U>= 0 ){
      U=U+ 5 ;
      Right = StringSubstr (text, U);
      End = StringFind (Right, "." );
       return ( int ( MathRound ( StringToDouble ( StringSubstr (text, U, End-U)))));
   }
   return ( 0 );
}

두 번째 옵션은 컴파일 문제를 일으키지만 첫 번째 옵션은 그렇지 않습니다.