일반 클래스 라이브러리 - 버그, 설명, 질문, 사용 기능 및 제안 사항 - 페이지 24

 
fxsaber :

키로 값을 얻는 것에 대한 질문입니다. 라이브러리 코드에서 이 메서드는 다음과 같습니다.

 //+------------------------------------------------------------------+
//| Find index of entry with specified key.                          |
//+------------------------------------------------------------------+
template < typename TKey, typename TValue>
int CHashMap::FindEntry(TKey key)
  {
   if (m_capacity!= NULL )
     {
       //--- get hash code from key
       int hash_code=m_comparer.HashCode(key)& 0x7FFFFFFF ;
       //--- search pair with specified key
       for ( int i=m_buckets[hash_code%m_capacity] ; i>= 0 ; i=m_entries[i].next )
         if (m_entries[i].hash_code==hash_code && m_comparer.Equals(m_entries[i].key,key))
             return (i);
     }
   return (- 1 );
  }

예, 이 코드는 i in for의 비표준 재할당으로 인해 오해의 소지가 있을 수 있습니다.

먼저 인덱스로 하위 배열에 액세스합니다. 여기에는 다음 값이 포함될 수 있습니다. i=m_buckets[hash_code%m_capacity]; (즉, i는 하위 배열 또는 값 바구니의 인덱스입니다).

그런 다음 동일한 for에서 바구니의 인덱스가 바구니의 요소 인덱스로 바뀝니다. i=m_entries[i].next

실제로 코드는 올바르게 작성되었습니다. 일반적인 경우 각 하위 배열은 평균 하나의 요소를 가지며 루프는 다시 평균적으로 한 번만 실행됩니다.

 
Vasiliy Sokolov :

예, 이 코드는 i in for의 비표준 재할당으로 인해 오해의 소지가 있을 수 있습니다.

먼저 인덱스로 하위 배열에 액세스합니다. 여기에는 다음 값이 포함될 수 있습니다. i=m_buckets[hash_code%m_capacity]; (즉, i는 하위 배열 또는 값 바구니의 인덱스입니다).

그런 다음 동일한 for에서 바구니의 인덱스가 바구니의 요소 인덱스로 바뀝니다. i=m_entries[i].next

실제로 코드는 올바르게 작성되었습니다. 일반적인 경우 각 하위 배열은 평균 하나의 요소를 가지며 루프는 다시 평균적으로 한 번만 실행됩니다.

충돌의 경우 주기가 만들어지는 것으로 이해했습니다. 미니 목록을 살펴보세요.

 
fxsaber :

충돌의 경우 주기가 만들어지는 것으로 이해했습니다. 미니 목록을 살펴보세요.

예, 절대적으로 맞습니다.

 

템플릿 라이브러리( CArrayList )를 사용하여 사용자 지정 유형을 저장합니다. 인상 - 행복하지 않습니다. 최소한의 편의를 위해 매크로를 작성했습니다.

 #define CLEANUP   do {                                      \
   for ( int i_cln = 0 ;  i_cln < segs.Count();  ++ i_cln) {   \
      Wave_end *cln_el;                                     \
       if (  segs.TryGetValue(i_cln, cln_el) )                \
         delete cln_el;                                     \
   }} while ( false )
#define SSEG(IND)   do {                \
if ( ! segs.TryGetValue(IND, we) ) {    \
   CLEANUP;                            \
   continue ;                           \
}} while ( false )

TryGetValue의 추가 완전성 + 값으로 클래스를 전달할 수 없기 때문에 사용하기가 어렵습니다.

 
이 주제와 관련이 없는 댓글은 " MQL5 MT5 MetaTrader 5 초보자의 질문 "으로 이동되었습니다.
 

말해봐, 내가 이해하지 못하는 부분이 있을지도 모르지만, 이 유형의 구성을 사용하려고 하면:

 #include <Generic\\ArrayList.mqh>

struct Option {
   string name;
   color   clr;
};

...

CArrayList<Option> _options;

그런 다음 오류가 발생합니다.

'옵션' - 개체는 참조로만 전달됩니다. ICollection.mqh 십사 십팔

글쎄, 오류의 전체 스택이 더 있습니다 ...
 
Andrey Pogoreltsev :

말해봐, 내가 이해하지 못하는 부분이 있을지도 모르지만, 이 유형의 구성을 사용하려고 하면:

그런 다음 오류가 발생합니다.

'옵션' - 개체는 참조로만 전달됩니다. ICollection.mqh 십사 십팔

글쎄, 오류의 전체 스택이 더 있습니다 ...

다음과 같이 시도하십시오.

 #include <Generic\\ArrayList.mqh>

class Option {
   string name;
   color   clr;
};

...

CArrayList<Option * > _options;
 
Sergey Eremin :

다음과 같이 시도하십시오.

컬렉션에 대한 포인터 전달/저장은 개념적으로 잘못되었습니다.

 
Andrey Pogoreltsev :

컬렉션에 대한 포인터 전달/저장은 개념적으로 잘못되었습니다.

MQL에서는 약간이라도 사용할 수 있는 단일 제네릭이 없습니다. 모두 심각한 잼이 있습니다. 내장 배열을 사용하면 머리가 덜 아프게 됩니다.

 
TheXpert :

MQL에서는 약간이라도 사용할 수 있는 단일 제네릭이 없습니다. 모두 심각한 잼이 있습니다. 내장 배열을 사용하면 머리가 덜 아프게 됩니다.

네, 배열 zayuzat. 내장 유형에만 적합한 컬렉션을 만들고 코드베이스에 넣는 이유는 무엇입니까?)