Hatalar, hatalar, sorular - sayfa 1438

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

Ve dizinin boyutuyla ilgili sorun çözüldüğünde, sonuçta, ilk erişildiğinde pr_open ve pr_close değerlerinin ne olduğuna bakmaya değer olduğunu düşünüyorum.


P./S.: Burada başlatılmazlar:

...
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++];

........
}

ve onlara bir şeyin atandığı kodda görünmez.

Başlatılmaları şunlarda bir yerde olsa da:

.........

kod satırları sizden gizlenir.

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

Aynen))) Onlarda sorun yok.

Genel olarak, dinamik bir dizinin boyutunu sürekli olarak izlemek bir şekilde elverişsizdir ... Ne kadar ağır olduğunu bilmeniz gerekir. O zaman bunun ne anlamı var? ....

Bunun anlamı, içine yerleştirilecek öğelerin sayısı önceden bilinmiyorsa, garantili daha büyük boyutta statik bir dizi bildirmek gerekli değildir (tüm durumlar için yeterli olacak şekilde büyük bir marjla) ) ve bellek israfı. Diziye eklenmesi gereken yeni veriler göründüğünde dizinin boyutunu dinamik olarak artırmanız yeterlidir.
 
Сергей Таболин :

Prensip olarak, bu anlaşılabilir. Bu dizinin neden otomatik olarak artırılamadığı açık değil mi?

Peki neden yapılamamıştı? Bunu ben bulamadım))) Dinamik bir diziyi böyle kullanmaya çalıştım ...

Artı, ayrıca dizini kaydetmeniz gerekiyor ... Çeşme değil ...

Dinamik olarak arttırmanın imkansız olduğunu kim söyledi???

sana yardım etmek için burada

 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 физических перераспределения памяти и это замедлит выполнение программы.

Sertifikanın nasıl kullanılacağına dair sertifika yapılması gereklidir))))))))))))))))))))))

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

Prensip olarak, bu anlaşılabilir. Bu dizinin neden otomatik olarak artırılamadığı açık değil mi?

 int arr[];

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

Peki neden yapılamamıştı? Bunu ben bulamadım))) Dinamik bir diziyi bu şekilde kullanmaya çalıştım ...

Artı, ayrıca dizini kaydetmeniz gerekiyor ... Çeşme değil ...

Bu kodda ne yapmaya çalıştığınızı anlamadım.

Burada sizin için dinamik dizilerin ne işe yaradığını ve nasıl kullanılacağını gösteren küçük bir örnek çizdim.

   // динамический массив строк, в который поместим считанные из файла "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]);
 
Сергей Таболин :

Bu dizinin neden otomatik olarak artırılamadığı açık değil mi?

Dil geliştiricileri Patamushta, Syakh üzerine yetiştirildi ve bu, MQL'nin sert C-görüntülerinden pop PHP/JS benzerine geçişini büyük ölçüde yavaşlatıyor. Plebeian PHP'de yeni bir değer atamak yeterlidir ve dizi kendi boyutunu kendisi ayarlayacaktır ve MQL kodlayıcının ne kadar önemli olduğunu hissettirmeyi mümkün kılmaktadır. O halde bir kürek kapın ve seçkin profesyonellerden oluşan bir kadronun parçası olmanın keyfini çıkarın.
 
Сергей Таболин :

Bu, prensipte, dinamik bir dizinin normalde nasıl doldurulması gerektiğine dair basit bir örnektir. Çok uzun zamandır C yazmadım, hatırlamıyorum ama php'de diziler aynen böyle dolduruluyor! Her şey mantıklı ve anlaşılır. Diziye bir eleman eklersem (dizi[] = x), dizi otomatik olarak artırılır ve eleman dizinin sonuna eklenir. Ve kendiniz uzatmanız gerekmez ve öğenin dizinini kendiniz belirtmeniz gerekmez. Burada tamamen gereksiz hareketler yapmamız gerekiyor:

fark açık...

Bence bu en azından garip)))

Peki, o zaman bir kürek alın ve tam olarak böyle çalışacak kendi dinamik dizi uygulamanızı yazın, sizi durduran ne? )) Doğru, MCL'yi atamak için [] aşırı yüklemeye izin vermeyecek, hardcore yeterli değil. ))
 
Сергей Таболин :

Bu, prensipte, dinamik bir dizinin normalde nasıl doldurulması gerektiğine dair basit bir örnektir. Çok uzun zamandır C yazmadım, hatırlamıyorum ama php'de diziler aynen böyle dolduruluyor! Her şey mantıklı ve anlaşılır. Diziye bir eleman eklersem (dizi[] = x), dizi otomatik olarak artırılır ve eleman dizinin sonuna eklenir. Ve kendiniz uzatmanız gerekmez ve öğenin dizinini kendiniz belirtmeniz gerekmez. Burada tamamen gereksiz hareketler yapmamız gerekiyor:

fark açık...

Bence bu en azından garip)))

OOP kullanmayı ve benzer bir sözdizimi uygulamasını kim engelliyor?

 #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 :
Dil geliştiricileri Patamushta, Syakh üzerine yetiştirildi ve bu, MQL'nin sert C-görüntülerinden pop PHP/JS benzerine geçişini büyük ölçüde yavaşlatıyor. Plebeian PHP'de yeni bir değer atamak yeterlidir ve dizi kendi boyutunu kendisi ayarlayacaktır ve MQL kodlayıcının ne kadar önemli olduğunu hissettirmeyi mümkün kılmaktadır. O halde bir kürek kapın ve seçkin profesyonellerden oluşan bir kadronun parçası olmanın keyfini çıkarın.
Bence basit bir dizi, programcının bilgisi olmadan "boyutunu ayarlamamalı". Böyle bir davranış gerekliyse, uygun bir sınıf yazılmalıdır. Ve sonra - "akıllı" diziyi sorunsuz kullanmak için. Ve dizinin başlangıçta ait olduğu basit yapılar "bağımsız karar haklarına" sahip olmamalıdır.
 
Dört kişi sana zaten söyledi - bir kürek al ve çok ihtiyacın olduğu için kendi sınıfını yaz. ))
 
Сергей Таболин :

"programcının bilgisi olmadan" çalışmaz. "Dizin sonuna bir eleman ekle" komutunu veren programcıdır (dizi[] = x). Ve dizinin "bağımsız karar hakları" yoktur. Yalnızca programcının komutunu yürüterek boyutunu artırır, böylece programcıyı bu boyutu izlemekten kurtarır. )))

Deneyimlerimin gösterdiği gibi, bir programcı 10 öğe içeren bir diziye 20 dizininde bir şey yazarsa, bu büyük olasılıkla bir hata yaptığı anlamına gelir ve programın bir hata vermesi ve dizinin boyutunu artırmaması, böylece dizinin boyutunu gizlememesi gerekir. şüpheli eylem.

Tüm bu "boyut ayarlı diziler", kolaylıktan ziyade potansiyel hataları gizleme konusunda daha fazla sorun yaşıyor. Ayrıca, bir dizinin boyutunu takip etmek zorunda olmamak da potansiyel olarak tehlikeli bir uygulamadır ve düzeltilmesi zor hatalara yol açar.