찻주전자의 질문 - 페이지 126

 
Renat :

그리고 언제부터 모든 배열이 정적이고 모든 인덱스와 크기가 되었습니까?

배열은 거의 항상 동적이기 때문에 인덱스는 변수이므로 호출 시 심각한 정적 검사를 수행할 수 없습니다 . 메타 정보/rtti를 기반으로 한 검사 만 수행해야 하므로 전체 개체/설명에 액세스하는 것이 중요하고 메모리 조각으로 무작위로 작동하지 않는 것이 중요합니다.

텍사스 순서대로 가자. 정적 배열 의 경우 컴파일하는 동안 모든 것이 쉽게 확인됩니다.

동적 개체(숨겨진 개체입니다!)의 경우 런타임에 메타 정보가 있습니다. 맞나요? 있다! 확실히 있습니다.

컴파일된 함수의 실행 코드에서 검사의 런타임을 등록하는 것만 남아 있습니다. 그리고 그게 다야!

그리고 나는 그것이 부끄러운 일이라고 말하는 것이 아닙니다. 글쎄, Slava (Stringo)도 놈이 아닙니다. 그리고 일반적으로 누가 쉬운가요? .. :)

// 결국: 4에서 모든 것이 완료되었습니다.

// 이미 동적 배열을 만들었다면 배열이 어디에나 가지고 있는 메타 정보를 사용하십시오!

// 그것을 가지고 있으면 일반적으로 멋진 일을 할 수 있습니다(예: 사용자가 알 수 없는 차원의 배열을 전송할 수 있도록 허용).

// mql5(!)에서는 크기를 알 수 없는 2차원 배열을 함수에 전달할 수도 없습니다.

// 골동품 두꺼비에서도 할 수 있습니다.. :))

 
Renat :

걱정하지 마십시오. 모든 것이 오랫동안 생각되었습니다.

우리는 보호 원칙 위반의 결과를 잘 알고 있습니다. 이것이 "4월에 12개의 더 심각한 오류 가 수정되어 가상 머신에서 벗어나 시스템을 제어할 수 있게 되었습니다."

난 걱정하지 않습니다. 이 특정 결정의 결과는 "시스템 제어"와 같은 냄새가 나지 않습니다. 나는 당신에게 그런 함수 포인터를 묻지 않았습니다. 해를 끼칠 수 있는 최대값은 어레이의 범위를 벗어나 잘못 제어되는 경우 "외부" 메모리를 파괴하는 것입니다.
 
MetaDriver :

1. 그래서 네이밍을 도입하고 하드 타이핑을 제안했습니다. 더욱이 명목형이 적용되지 않는 유일한 곳이기 때문에 언어 개체의 보편화 이데올로기에 잘 맞습니다.

2. 나도 똑같이 한다. 그것은 모두 동일합니다. 첫째, 비뚤어지고 둘째, 결코 보편적이지 않습니다. 다음은 불필요한 재작성 및 구조 래핑 없이 2차원 mql 배열을 OpenCL 버퍼에 복사하는 방법( 1 )입니다. 또는 ( 2 ) (속도를 위해) 1차원이 아닌 배열에 대해 고유한 ArrayCopy(..) 함수를 사용합니다.

// 이전 게시물의 거친 부분에 대해 죄송합니다. 정말 중복입니다. "복잡하지 말자"고 흥분했다. 어려움을 낳기 때문입니다.

2a. 나는 많은 경우에 ArrayCopy()와 같은 함수에 대한 "1차원 제약"이 주석에서 하나의 기본 면책 조항으로 고통 없이 완화될 수 있다고 생각합니다. "이 함수는 다차원 배열 에서도 작동 합니다.

많은 문제가 사라질 것입니다. // 물론 전부는 아닙니다.

두 가지 방법이 있습니다. 하나는 1차원 배열을 별도로 복사하는 것이지만 이것은 OCL 인터페이스가 배열로 가득 차 있기 때문에 좋지 않습니다.

1차원 배열을 2차원 배열로 표현하는 두 번째 방법은 여전히 테이프를 통해 OCL로 전송되기 때문입니다. 그런 다음 이와 같은 것입니다. 그건 그렇고, 차원을 변경할 때 데이터 이동 자체는 배열의 일부를 복사하여 OCL에서 수행할 수 있습니다. 모두 크기, 비용 효율성에 따라 다릅니다.

 class CArrayTwo_merniy
  {
   float              a[];
   int                size_i;
   int                size_j;
public :
                     CArrayTwo_merniy( void ){size_i= 0 ;size_j= 0 ;};
                    ~CArrayTwo_merniy( void ){};
   void               Resize( int i, int j)
     {
       int size;
       if (j<size_j)// если уменьшаем j размер массива
        {
         for ( int l= 1 ;l<i;l++)
             for ( int k= 0 ;k<j;k++)
               a[l*i+k]=a[l*size_i+k];
         size= ArrayResize (a,i*j);
         if (size==i*j)
           {size_i=i; size_j=j;}
         return ;
        }
       else // иначе, если увеличиваем j размер массива
        {
         size= ArrayResize (a,i*j);
         if (size==i*j)
           {
             for ( int l=i- 1 ;l>= 0 ;l--)
               for ( int k=j- 1 ;k>= 0 ;k--)
                  a[l*i+k]=a[l*size_i+k];
            size_i=i; size_j=j;
           }
        }
     };
   void set( int i, int j, float v)
     {
       if (i*size_i+j>= 0 && i*size_i+j<size_i*size_j)a[i*size_i+j]=v;
       else Print ( "Ошибка set [" +i+ ":" +j+ "]" );
     };
   float get( int i, int j)
     {
       if (i*size_i+j>= 0 && i*size_i+j<size_i*size_j) return (a[i*size_i+j]);
       else { Print ( "Ошибка get [" +i+ ":" +j+ "]" ); return ( EMPTY_VALUE );}
     };
  };
//+------------------------------------------------------------------+
void OnStart ()
  {
   CArrayTwo_merniy ar; string t;
   ar.Resize( 3 , 3 ); int cnt= 0 ;
   for ( int i= 0 ;i< 3 ;i++) for ( int j= 0 ;j< 3 ;j++){ar.set(i,j,( float )cnt); cnt++;}
   t= "исх " ; for ( int i= 0 ;i< 3 ;i++){ for ( int j= 0 ;j< 3 ;j++)t+= "[" +ar.get(i,j)+ "]" ;t+= "." ;} Print (t);
   ar.Resize( 5 , 5 );
   t= "5х5 " ; for ( int i= 0 ;i< 5 ;i++){ for ( int j= 0 ;j< 5 ;j++)t+= "[" +ar.get(i,j)+ "]" ;t+= "." ;} Print (t);
   ar.Resize( 3 , 3 );
   t= "3х3 " ; for ( int i= 0 ;i< 3 ;i++){ for ( int j= 0 ;j< 3 ;j++)t+= "[" +ar.get(i,j)+ "]" ;t+= "." ;} Print (t);
  }
 
Urain :

두 가지 방법이 있습니다. 하나는 1차원 배열을 별도로 복사하는 것이지만 이것은 OCL 인터페이스가 배열로 가득 차 있기 때문에 좋지 않습니다.

1차원 배열을 2차원 배열로 표현하는 두 번째 방법은 여전히 테이프를 통해 OCL로 전송되기 때문입니다. 그런 다음 이와 같은 것입니다. 그건 그렇고, 차원을 변경할 때 데이터 이동 자체는 배열의 일부를 복사하여 OCL에서 수행할 수 있습니다. 모두 크기, 비용 효율성에 따라 다릅니다.

многа многа букаф

배부르게 먹었던 것이 전부입니다. :) 오컴은 히스테리..

;)

여기에 2차원 배열이 있습니다. sizeof(My2DArray)가 있습니다. 글쎄, 당신은 버퍼에 복사해야 다른 무엇입니까??? 어쨌든, 변수가 수행할 수 있도록 내 배열에 오프셋을 제공한 사람조차 없었습니다. 그래서 안돼. 먼저 다시 작성하거나(브레이크가 발생함) 고유한 2차원 배열을 작성해야 합니다. (!!) 글쎄, 자십. 그리고 이것은 왜? 그리고 나를 위해 안전합니다. (!) 모두, 웃고 있습니다. :)))

 
MetaDriver :

배부르게 먹었던 것이 전부입니다. :) 오컴은 히스테리..

;)

:))

예, 솔직히 말하면 크기 조정의 오버헤드가 엄청나지만 이러한 경우에 OCL을 사용하면 줄일 수 있습니다.

그러나 2차원 배열을 OCL 버퍼에 직접 복사합니다.

그리고 재채기를 할 때마다 어레이를 다시 분할하는 것은 권장하지 않습니다.

그리고 그것은 꽤 적용 가능합니다.

 
MetaDriver :

배부르게 먹었던 것이 전부입니다. :) 오컴은 히스테리..

;)

자, 당신은 많은 bukaf를 가지고 있습니다. 세 가지 기능은 get과 Resize를 설정합니다.

당신이 여기 hilosohstvuval에 있는 동안 무릎에 뿌린 당신을 위해 특별히 위협합니다.

 
Urain :
자, 당신은 많은 bukaf를 가지고 있습니다. 세 가지 기능은 get과 Resize를 설정합니다.
누가 주장하는 것이 좋습니다. 다음은 연산자로 오버로드되는 또 다른 시간입니다(그리고 그들은 "[ ]" 및 "=" 연산자를 오버로드 가능하게 만드는 것을 잊지 않을 것입니다. 그러면 마침내 lafa 입니다. 우리는 시장에서 동적 배열을 거래할 것입니다. 그리고 그들은 그것을 받아들일 것입니다. ! 함수의 배열 입니다. :)
 
MetaDriver :
잘 쿨, 누가 주장. 그 때 우리는 연산자로 과부하가 걸릴 것입니다 (그리고 그들은 "[ ]" 연산자를 추정 가능하게 만드는 것을 잊지 않을 것입니다. 그런 다음 당신의 lafa . 우리는 시장에서 우리의 동적 배열 을 거래할 것입니다. 그리고 그들은 그것을 받아들일 것입니다! :)
잊지 말자 ;)
 
mql5 :
잊지 말자 ;)
:))
 
MetaDriver :

여기에 2차원 배열이 있습니다. sizeof(My2DArray)가 있습니다. 글쎄, 당신은 버퍼에 복사해야 다른 무엇입니까??? 어쨌든, 변수가 수행할 수 있도록 내 배열에 오프셋을 제공한 사람조차 없었습니다. 그래서 안돼. 먼저 다시 작성하거나(브레이크가 발생함) 고유한 2차원 배열을 작성해야 합니다. (!!) 글쎄, 자십. 그리고 이것은 왜? 그리고 나를 위해 안전합니다. (!) 모두, 웃고 있습니다. :)))

친애하는, 컨텍스트를 따르십시오.

1) 통제되고 안전한 하나의 환경에서 완전히 통제되지 않은 원시 버퍼로 이동할 때 해당 바이너리 환경과의 호환성에 대한 책임은 사용자에게 있습니다.

2) 코드를 작성할 때 이 코드의 아키텍처에 대한 책임은 귀하에게 있습니다. 그리고 다른 구조를 사용할 때 "말과 떨리는 암사슴을 한 수레에 묶는 것이 어렵다"고 외치지 마십시오.

3) CLBufferRead 및 CLBufferWrite 에 대한 설명을 읽는 것이 좋습니다. 범용 void* 참조로 인해 모든 유형의 참조를 OpenCL로 전송할 수 있습니다. 그리고 변위와 크기가 있습니다.

 uint   CLBufferRead(
   int           buffer,                     // хендл на буфер OpenCL
   const void &  data[],                      // массив значений
   uint          buffer_offset= 0 ,           // смещение в OpenCL буфере в байтах, по умолчанию 0
   uint          data_offset= 0 ,             // смещение в массиве в элементах, по умолчанию 0
   uint          data_count= WHOLE_ARRAY       // количество значений из буфера для чтения, по умолчанию весь буфер
   );
uint   CLBufferWrite(
   int           buffer,                     // хендл на буфер OpenCL
   const void &  data[],                     // массив значений
   uint          buffer_offset= 0 ,           // смещение в OpenCL буфере в байтах, по умолчанию 0
   uint          data_offset= 0 ,             // смещение в массиве в элементах, по умолчанию 0
   uint          data_count= WHOLE_ARRAY       // количество значений из массива для записи, по умолчанию весь массив
   );

나는 주제가 단순히 손가락에서 빨려 들어가는 것을 봅니다.