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

 
Сергей Таболин :

그리고 배열의 크기 문제가 해결되면 결국 pr_open과 pr_close가 처음 접근했을 때 어떤 값을 가지고 있는지 살펴보는 것이 가치가 있다고 생각합니다.


P./S.: 여기서는 초기화되지 않습니다.

...
int             buf_lup[], buf_ldn[];
...
void OnTick ()
{
   int       lup, ldn, sup, sdn;
   int       sum_up, sum_dn;
   double    pr_open, pr_close;

.........

      ldn = 0 ;
      sup = 0 ;
      sdn = 0 ;
      sum_up = 0 ;
      sum_dn = 0 ;

.........

               buf_ldn[ldn] = ( int )((pr_open - pr_close) / Point ()); // ОШИБКА тут
               sum_dn += buf_ldn[ldn++];

........
}

그리고 그들에게 무언가가 할당되었다는 것은 코드에서 볼 수 없습니다.

초기화는 다음 위치에 있을 수 있습니다.

.........

코드 줄은 숨겨져 있습니다.

 
Сергей Таболин :

정확히))) 문제가 없습니다.

일반적으로 동적 배열 의 차원을 지속적으로 모니터링하는 것은 어떻게 든 불편합니다 ... 무게가 얼마인지 알아야합니다. 그럼 무슨 소용이 있겠습니까? ....

그 의미는 배치될 요소의 수를 미리 알 수 없는 경우 보장된 더 큰 크기의 정적 배열을 선언할 필요가 없다는 것입니다. ) 및 메모리 낭비. 어레이에 추가해야 하는 새 데이터가 나타나면 어레이의 크기를 동적으로 늘리면 됩니다.
 
Сергей Таболин :

원칙적으로 이것은 이해할 수 있습니다. 이 배열이 자동으로 증가할 수 없는 이유가 명확하지 않습니까?

그렇다면 왜 이루어지지 못했을까요? 나는 이것을 생각해 내지 않았다))) 이것이 내가 동적 배열 을 사용하려고 시도한 방법입니다 ...

또한 색인을 추가로 저장해야합니다 ... 분수가 아닙니다 ...

누가 동적으로 증가하는 것이 불가능하다고 말했는가???

여기 당신을 돕기 위해

 ArrayResize

Устанавливает новый размер в первом измерении массива



int    ArrayResize ( 
   void &  array[],               // массив, переданный по ссылке 
   int     new_size,             // новый размер массива 
   int     reserve_size= 0          // резервное значение размера (избыточное) 
   );
 

Параметры

array[]

[out]  Массив для изменения размеров.

new_size

[in]  Новый размер для первого измерения.

reserve_size= 0

[in]  Необязательный параметр. Размер для дополнительного резерва.

Возвращаемое значение

При успешном выполнении функция возвращает количество всех элементов, содержащихся в массиве после изменения размера; в противном случае возвращает - 1 и массив не меняет размеры.

Примечание

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

Общее число элементов в массиве не может превышать 2147483647 .

При частом распределении памяти рекомендуется использовать третий параметр, задающий резерв для уменьшения количества физического распределения памяти. Все последующие вызовы функции ArrayResize не приводят к физическому перераспределению памяти, а только меняется размер первого измерения массива в пределах зарезервированной памяти. Следует помнить, что третий параметр будет использоваться только тогда, когда будет происходить физическое распределение памяти, например:



ArrayResize (arr, 1000 , 1000 ); 
for ( int i= 1 ;i< 3000 ;i++) 
   ArrayResize (arr,i, 1000 );
 

В данном случае произойдёт 2 перераспределения памяти, один раз до входа в цикл на 2000 элементов, при этом размерность массива будет установлена в 1000 и второй при i равной 2000 . Если третий параметр опустить, то произойдёт 2000 физических перераспределения памяти и это замедлит выполнение программы.

인증서 사용 방법에 대한 인증서를 작성해야 합니다)))))))))))))))))))))))))

 
Сергей Таболин :

원칙적으로 이것은 이해할 수 있습니다. 이 배열이 자동으로 증가할 수 없는 이유가 명확하지 않습니까?

 int arr[];

arr[] = 1 ;
arr[] = 9 ;
arr[] = 3 ;
....

그렇다면 왜 이루어지지 못했을까요? 나는 이것을 생각해 내지 않았다))) 이것이 내가 동적 배열 을 사용하려고 시도한 방법입니다 ...

또한 색인을 추가로 저장해야합니다 ... 분수가 아닙니다 ...

나는 당신이 이 코드에서 무엇을 하려고 하는지 이해하지 못했습니다.

여기에서 동적 배열의 용도와 사용 방법을 보여주는 작은 예를 스케치했습니다.

   // динамический массив строк, в который поместим считанные из файла "FileName.txt" строки,
   // количество строк в файле нам неизвестно
   string Strings[];
   ArrayResize (Strings, 0 , 20 );   // сейчас это массив нулевой длины
   
   // открываем текстовый файл для чтения
   int hFile = FileOpen ( "FileName.txt" , FILE_READ | FILE_TXT );
   
   if (hFile != INVALID_HANDLE )
   {
       // каретку в начало файла
       FileSeek (hFile, 0 , SEEK_SET );
      
       // вспомагательные переменные
       string sString;
       int nTotalStrings = 0 ;
      
       // читаем файл построчно
       while (! FileIsEnding (hFile) && ! IsStopped ())
      {
         // считываем очередную строку
         sString = FileReadString (hFile);
         
         // добавляем считанную строку в массив, предварительно увеличив его размер на 1
         if (sString != "" )
         {
            nTotalStrings++;
             ArrayResize (Strings, nTotalStrings, 20 );
            Strings[nTotalStrings- 1 ] = sString;
         }
      }
      
       // уходя, гасите свет
       FileClose (hFile);
   }
   
   // выведем считанные строки в журнал для проверки
   for ( int i = 0 ; i < ArraySize (Strings); i++)
       Print (Strings[i]);
 
Сергей Таболин :

이 배열이 자동으로 증가할 수 없는 이유가 명확하지 않습니까?

언어 개발자인 Patamushta는 Syakh에서 자랐고, 이는 MQL이 하드코어 C 이미지에서 PHP/JS와 유사한 팝으로 전환되는 속도를 크게 늦춥니다. plebeian PHP에서는 새 값을 할당하는 것으로 충분하며 배열은 자체적으로 크기를 조정하며 MQL을 사용하면 코더의 중요성을 느낄 수 있습니다. 따라서 삽을 들고 선별된 전문가의 일원이 되는 것을 즐기십시오.
 
Сергей Таболин :

이것은 원칙적으로 동적 배열 이 일반적으로 어떻게 채워져야 하는지에 대한 간단한 예입니다. 아주 오랫동안 C로 글을 쓰지 않아서 기억이 안 나지만 php에서는 배열이 그대로 채워져 있습니다! 모든 것이 논리적이고 이해할 수 있습니다. 배열에 요소를 추가하면(arr[] = x) 배열이 자동으로 증가하고 요소가 배열 끝에 추가됩니다. 그리고 직접 늘릴 필요도 없고 요소의 인덱스를 직접 지정할 필요도 없습니다. 여기서 우리는 완전히 불필요한 움직임을 수행해야 합니다.

차이가 분명하다...

제 생각에는 이것은 적어도 이상합니다)))

글쎄, 그런 다음 삽을 들고 정확히 그렇게 작동하는 동적 배열의 구현을 직접 작성하십시오. 무엇이 당신을 멈추게 합니까? )) 사실, MCL 할당을 위해 [] 오버로딩을 허용하지 않습니다. 하드코어로는 충분하지 않습니다. ))
 
Сергей Таболин :

이것은 원칙적으로 동적 배열 이 일반적으로 어떻게 채워져야 하는지에 대한 간단한 예입니다. 아주 오랫동안 C로 글을 쓰지 않아서 기억이 안 나지만 php에서는 배열이 그대로 채워져 있습니다! 모든 것이 논리적이고 이해할 수 있습니다. 배열에 요소를 추가하면(arr[] = x) 배열이 자동으로 증가하고 요소가 배열 끝에 추가됩니다. 그리고 직접 늘릴 필요도 없고 요소의 인덱스를 직접 지정할 필요도 없습니다. 여기서 우리는 완전히 불필요한 움직임을 수행해야 합니다.

차이가 분명하다...

제 생각에는 이것은 적어도 이상합니다)))

누가 OOP 사용을 막고 유사한 구문을 구현합니까?

 #property strict

/*
enum TestEnum
{
  zero,
  one,
  two,
  three,
  four,
  five,
  six,
  seven,
  eight,
  nine,
  ten,
  eleven,
  twelve,
  thirteen,
  fourteen,
  fitteen
};
*/

template < typename T>
class RubbArray
{
   private :
    T data[];
    
   protected :
     void add(T d)
    {
       int n = ArraySize (data);
       ArrayResize (data, n + 1 );
      data[n] = d;
    }
    
   public :
    
    T operator []( int i) const
    {
       return data[i];
    }
    
    RubbArray * operator <<(T d)
    {
      add(d);
       return GetPointer ( this );
    }

    T operator =(T d)
    {
      add(d);
       return d;
    }

     void operator =( const RubbArray &d)
    {
       int i, n = d.size();
       ArrayResize (data, n);
       for (i = 0 ; i < n; i++)
      {
        data[i] = d[i];
      }
    }

    T operator >>( int i)
    {
      T d = this [i];
       ArrayCopy (data, data, i, i + 1 );
       ArrayResize (data, ArraySize (data) - 1 );
       return d;
    }
    
     int size() const
    {
       return ArraySize (data);
    }
    
     void print() const
    {
       int i, n = ArraySize (data);
       string s;
       for (i = 0 ; i < n; i++)
      {
        s += ( string )data[i] + "," ;
      }
       Print (s);
    }
};

void OnStart ()
{
   //RubbArray<TestEnum> d;
  RubbArray< double > d, d2;
  d << 5 << 7 ;
  d = 10 ;
  d << 15 ;
  d.print();
   Print (d[ 1 ]);
   double x = d >> 1 ;
  d2 = d;
  d2.print();
}
 
Alexander Puzanov :
언어 개발자인 Patamushta는 Syakh에서 자랐고, 이는 MQL이 하드코어 C 이미지에서 PHP/JS와 유사한 팝으로 전환되는 속도를 크게 늦춥니다. plebeian PHP에서는 새 값을 할당하는 것으로 충분하며 배열은 자체적으로 크기를 조정하며 MQL을 사용하면 코더의 중요성을 느낄 수 있습니다. 따라서 삽을 들고 선별된 전문가의 일원이 되는 것을 즐기십시오.
내 생각에 단순한 배열은 프로그래머의 지식 없이 "크기를 조정"해서는 안 됩니다. 이러한 동작이 필요한 경우 적절한 클래스를 작성해야 합니다. 그런 다음 문제없이 "스마트"배열을 사용합니다. 그리고 배열이 처음에 속하는 단순 구조 에는 "독립적인 결정 권한"이 없어야 합니다.
 
네 사람이 이미 당신에게 말했습니다 - 삽을 들고 당신이 너무 많이 필요하기 때문에 자신의 수업을 작성하십시오. ))
 
Сергей Таболин :

"프로그래머에 대한 지식 없이"는 작동하지 않습니다. "배열의 끝에 요소를 추가"(arr[] = x)하라는 명령을 내리는 것은 프로그래머입니다. 그리고 어레이에는 "독립적인 결정권"이 없습니다. 프로그래머의 명령을 실행해야만 크기가 증가하므로 프로그래머가 동일한 크기를 추적하지 않아도 됩니다. )))

내 경험에서 알 수 있듯이 프로그래머가 인덱스 20의 항목을 10개 요소가 포함된 배열에 쓰는 경우 이는 실수를 했을 가능성이 높으며 프로그램은 오류를 제공해야 하며 배열의 크기를 늘리면 안 됩니다. 의심스러운 행동.

이러한 모든 "크기 조정 배열"은 편의성보다 잠재적인 버그를 숨기는 데 더 많은 문제가 있습니다. 게다가 배열의 크기를 추적하지 않아도 되는 것 또한 잠재적으로 위험한 관행이며 수정하기 어려운 버그로 이어집니다.