CGraphic'i test etme - sorular ve öneriler - sayfa 10

 

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5

Aleksey Vyazmikin , 2019.02.17 06:56

Bir kez daha deneyi tekrarlamaya karar verdim, işte kod

       //--- отключим показ ценового графика
       ChartSetInteger ( 0 , CHART_SHOW , false );
       long chart= ChartID ();

      CGraphic graphic;
         Print ( "0 Тут ошибка " , GetLastError (), " " ,cLng::CodeDescription( GetLastError ()));
         ResetLastError ();
       if ( ObjectFind (chart,name)< 0 )
        {
         Print ( "1 Тут ошибка " , GetLastError (), " " ,cLng::CodeDescription( GetLastError ()));
         ResetLastError ();
         graphic.Create(chart,name, 0 , 0 , 0 ,pix_X,pix_Y); //Создает графический ресурс, привязанный к объекту чарта 
         Print ( "2 Тут ошибка " , GetLastError (), " " ,cLng::CodeDescription( GetLastError ()));
         ResetLastError ();
        }

İşte sonuç

 2019.02 . 17 08 : 55 : 19.845 Test_4G_CB (Si Splice,H1)       0 Тут ошибка 0 Операция выполнена успешно
2019.02 . 17 08 : 55 : 19.860 Test_4G_CB (Si Splice,H1)       1 Тут ошибка 4202 Графический объект не найден
2019.02 . 17 08 : 55 : 19.860 Test_4G_CB (Si Splice,H1)       2 Тут ошибка 4202 Графический объект не найден
Hatanın nedeni hakkında bir fikriniz var mı?
Kütüphanede bir hata olduğu söylendi - düzeltilecek mi?
 
Aleksey Vyazmikin :
Kütüphanede bir hata olduğu söylendi - düzeltilecek mi?

Telepatlar tatilde. Ve sıradan insanlar için ihtiyacınız olan:

  1. sorunu yeniden üreten minimum kod (tüm gereksiz çöplerin atıldığı).
  2. net bir açıklama - tam olarak neyin yanlış olduğu (neyi elde etmek istedikleri, sonunda neyi elde ettikleri ve bunun neden bir hata olduğunu düşündükleri)
  3. işletim sistemi özellikleri, terminal yapısı, ticari sunucu adı

 
Aleksey Vyazmikin :
Kütüphanede bir hata olduğu söylendi - düzeltilecek mi?

Bir hata olduğu size nereden bildirildi? Size söyledim - bir an için kütüphaneye bakın, _LastError değişkenine yazılabilir. Bu durumda, kodun bir hata ile çalışması gerekli değildir. Sonuçta, bir nesne aranabilir (ve orada değilse, değişkene bir hata kodu girilecektir) ve yaratılması olabilir. Şimdi, eğer nesne yaratılmamışsa, o zaman evet - bir hata, ama yaratıldı ve her şey yolunda gidiyor. Ancak kontrol ettikten sonra, hata kodu (nesne oluşturulmadan önce eksikti) bir değişkene yazılacak ve daha sonra kodunuzda okuyacaksınız.

 
Vladimir Karputov :

Telepatlar tatilde. Ve sıradan insanlar için ihtiyacınız olan:

  1. sorunu yeniden üreten minimum kod (tüm gereksiz çöplerin atıldığı).
  2. net bir açıklama - tam olarak neyin yanlış olduğu (neyi elde etmek istedikleri, sonunda neyi elde ettikleri ve bunun neden bir hata olduğunu düşündükleri)
  3. işletim sistemi özellikleri, terminal yapısı, ticari sunucu adı

1. Kod

 //+------------------------------------------------------------------+
//|                                              CB_Model_Analiz.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#include <Graphics\Graphic.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
   string name= "Name" ;
   long chart= ChartID ();

   CGraphic graphic;
   Print ( "0 Тут ошибка " , GetLastError ());
   ResetLastError ();
   if ( ObjectFind (chart,name)< 0 )
     {
       Print ( "1 Тут ошибка " , GetLastError ());
       ResetLastError ();
      graphic.Create(chart,name, 0 , 0 , 0 , 100 , 100 ); //Создает графический ресурс, привязанный к объекту чарта 
       Print ( "2 Тут ошибка " , GetLastError ());
       ResetLastError ();
     }
   graphic.Destroy();
  }
//+------------------------------------------------------------------+

2. Günlükte hata mesajları alması beklenmiyor

 2019.02 . 17 10 : 37 : 46.326 CB_Model_Analiz (Si Splice,H1)   1 Тут ошибка 4202
2019.02 . 17 10 : 37 : 46.326 CB_Model_Analiz (Si Splice,H1)   2 Тут ошибка 4202

3. Windows 7 Home 32 bit, 1940 oluşturma, test sırasında sunucuya bağlı değil - aracı Açılış.

 
Artyom Trishkin :

Bir hata olduğu size nereden bildirildi? Size söyledim - bir an için kütüphaneye bakın, _LastError değişkenine yazılabilir. Bu durumda, kodun bir hata ile çalışması gerekli değildir. Sonuçta, bir nesne aranabilir (ve orada değilse, değişkene bir hata kodu girilecektir) ve yaratılması olabilir. Şimdi, eğer nesne yaratılmamışsa, o zaman evet - bir hata, ama yaratıldı ve her şey yolunda gidiyor. Ancak kontrol ettikten sonra, hata kodu (nesne oluşturulmadan önce eksikti) bir değişkene yazılacak ve daha sonra kodunuzda okuyacaksınız.

Kitaplık ya gerçek bir hata oluştuğunda bir hata atmalı ya da durumu doğru bir şekilde ele almalı ve olmadığı yerde bir hata atmamalıdır. Eğer hata kontrolü yapılırken kütüphane kullanımım sınıfta açıklanmıyorsa, o zaman onu kaydettirmek gerekir. Her durumda, kullanıcının ürün üreticisinin kitaplıklarını düzenlemesi mantıksızdır.

 
Aleksey Vyazmikin :

Kitaplık ya gerçek bir hata oluştuğunda bir hata atmalı ya da durumu doğru bir şekilde ele almalı ve olmadığı yerde bir hata atmamalıdır. Eğer hata kontrolü yapılırken kütüphane kullanımım sınıfta açıklanmıyorsa, o zaman onu kaydettirmek gerekir. Her durumda, kullanıcının ürün üreticisinin kitaplıklarını düzenlemesi mantıksızdır.

Hata yok, tekrar okuyun:

Bir hata olduğu size nereden bildirildi? Size söyledim - bir an için kütüphaneye bakın, _LastError değişkenine yazılabilir. Bu durumda, kodun bir hata ile çalışması gerekli değildir. Sonuçta , bir nesne aranabilir (ve orada değilse, değişkene bir hata kodu girilecektir ) ve yaratılması olabilir . Şimdi, eğer nesne yaratılmamışsa, o zaman evet - bir hata, ama yaratıldı ve her şey yolunda gidiyor. Ancak kontrol ettikten sonra, hata kodu (nesne oluşturulmadan önce eksikti) bir değişkene yazılacak ve daha sonra kodunuzda okuyacaksınız.

Bu nedenle, kodun düzenli olarak yürütülmesinden sonra hatayı neden okuduğunuzu öğrenmek yalnızca sizin ilgi alanınızdır. Büyük olasılıkla, _LastError değişkenindeki sıfır olmayan bir kodun içeriğinin, yalnızca CGGraphic kodunda değil, içinde bir hata olması gerektiği anlamına gelmediğini anlamıyorsunuz. Bu durumda, belki de bu, SB'de CGraphic içinde gerçekleştirilen bir nesnenin varlığının aranmasının basit bir sonucudur. Adına göre bir nesne için bir istek vardı, döndürülen sonuç -1 oldu ve 4202 kodu _LastError'a sığdı.Ardından nesne yaratıldı, her şey yoluna girdi ve çağıran programa geri döndü. Ve içinde hemen hata kodunu okur ve alırsınız. Ancak hata yok - SB içindeki sorguların sonucunu görüyorsunuz.

Ben sadece rapor ettiğiniz şey için olası bir sebep öneriyorum.

Bu nedenle, gerçekten gerçek bir hata bulmak ve bunu raporlamak istiyorsanız, hata ayıklayıcıdaki tüm CGraphic kodunu tamamen gözden geçirmeniz ve mantık ve işlemde hatalara yol açacak gerçek hatayı yakalamanız gerekir ve sadece bunu iddia etmekle kalmazsınız. hata kodunu okuyun, bu kesinlikle var olduğu anlamına gelir.

 
Artyom Trishkin :

Hata yok, tekrar okuyun:

Bu nedenle, kodun düzenli olarak yürütülmesinden sonra hatayı neden okuduğunuzu öğrenmek yalnızca sizin ilgi alanınızdır. Büyük olasılıkla, _LastError değişkenindeki sıfır olmayan bir kodun içeriğinin, yalnızca CGGraphic kodunda değil, içinde bir hata olması gerektiği anlamına gelmediğini anlamıyorsunuz. Bu durumda, belki de bu, SB'de CGraphic içinde gerçekleştirilen bir nesnenin varlığının aranmasının basit bir sonucudur. Adına göre bir nesne için bir istek vardı, döndürülen sonuç -1 oldu ve 4202 kodu _LastError'a sığdı.Ardından nesne yaratıldı, her şey yoluna girdi ve çağıran programa geri döndü. Ve içinde hemen hata kodunu okur ve alırsınız. Ancak hata yok - SB içindeki sorguların sonucunu görüyorsunuz.

Ben sadece rapor ettiğiniz şey için olası bir sebep öneriyorum.

Bu nedenle, gerçekten gerçek bir hata bulmak ve bunu raporlamak istiyorsanız, hata ayıklayıcıdaki tüm CGraphic kodunu tamamen gözden geçirmeniz ve mantık ve işlemde hatalara yol açacak gerçek hatayı yakalamanız gerekir ve sadece bunu iddia etmekle kalmazsınız. hata kodunu okuyun, bu kesinlikle var olduğu anlamına gelir.

Siz kendiniz mantıksal akıl yürütmede kodda bir hata olabileceğini belirttiniz ve bu, hatayı sıfırlamamakla ifade edildi. yaratılmadan önce nesnenin yokluğu nedeniyle elde edilmiştir.

Hayır, karmaşık kodda bir hata aramaya ve ardından olması gereken bir yanıt almaya kalifiye değilim.

Bu mesajın kullanıcı hatası olup olmadığını söyleyebilir misiniz?

2019.02.17 11:08:42.901 Test_4G_CB (Si Splice,H1)       invalid pointer access in 'Test_4G_CB.mq5' (909,7)

Bu kodu işaret eder - D.PointsFill( false );

      CCurve *D=graphicT.CurveAdd(X_04,Y_04, ColorToARGB (DarkOrange, 256 ),CURVE_POINTS,Interval_04); //Создает и добавляет кривую на график
      D.PointsFill( false ); //Устанавливает флаг, указывающий, нужно ли выполнять заливку для точек, определяющих кривую при отрисовке точками. 
      D.PointsType(POINT_VERTICAL_DASH); //Устанавливает флаг, указывающий на тип точек, использующихся при отрисовке кривой точками.
 
Aleksey Vyazmikin :

Siz kendiniz mantıksal akıl yürütmede kodda bir hata olabileceğini belirttiniz ve bu, hatayı sıfırlamamakla ifade edildi. yaratılmadan önce nesnenin yokluğu nedeniyle elde edilmiştir.

Hayır, karmaşık kodda bir hata aramaya ve ardından olması gereken bir yanıt almaya kalifiye değilim.

Lütfen bu mesajın bir kullanıcı hatası olup olmadığını söyleyin.

Bu kodu işaret eder - D.PointsFill( false );

Cümlenin anlamını hiç anlamadım.

Bana öyle geliyor ki, size her şeyi ayrıntılı olarak anlattım.

bilmiyorum. Yeterli bilgi yok.

 
Artyom Trishkin :

Cümlenin anlamını hiç anlamadım.

Bana öyle geliyor ki, size her şeyi ayrıntılı olarak anlattım.

bilmiyorum. Yeterli bilgi yok.

Kodun bir hataya tepki üzerine kurulu olduğunu anlamıyorsunuz (bir hata durumunda bir nesne oluşturuyoruz), o zaman hatayı düzelttikten sonra ( bir nesne oluşturuyoruz ), bu hatayı sıfırlamak mantıklıdır, ki buna göre, mantıksal akıl yürütmenize göre, kütüphanede yapılmaz.

Bu yüzden bu hataya nasıl tepki vereceğime dair hiçbir bilgim yok ...

 
Aleksey Vyazmikin :

Kodun bir hataya tepki üzerine kurulu olduğunu anlamıyorsunuz (bir hata durumunda bir nesne oluşturuyoruz), o zaman hatayı düzelttikten sonra ( bir nesne oluşturuyoruz ), bu hatayı sıfırlamak mantıklıdır, ki buna göre, mantıksal akıl yürütmenize göre, kütüphanede yapılmaz.

Bu yüzden bu hataya nasıl tepki vereceğime dair hiçbir bilgim yok ...

Bir hatanın, _LastError'da sıfır olmayan bir kodun varlığı değil, bu işlevin hatalı bir şekilde yürütüldüğünü gösteren bir işlev tarafından sonucun döndürülmesi olduğu açıkça anlaşılmalıdır. Ve _LastError, işlevin hatalı yürütülmesine neden olan hatayı size doğru bir şekilde gösterecek kodu içerir. Bu nedenle, doğrudan işlevin dönüş kodunu kullanmak yerine, hizmet değişkeninde depolanan hata kodunun açıklamasına mantığınıza güvenmek çok şüphelidir. İşlev -1 veya yanlış veya 0 döndürdüyse (her işlev için hata kodu yardımda açıklanmıştır) ve bu nedenle - _LastError içindeki kod değil, yalnızca işlev tarafından döndürülen sonucun analizi sizin tarafınızdan işlenmelidir. , bir hatayı belirtmez, ancak bir işlevin neden sonuç döndürdüğünü belirtmek için kullanılır.

Belirtilen ada sahip hiçbir nesne yoksa, nesne arama işlevi sıfırdan küçük bir değer döndürür. Bu bir hata mı? Numara. Bu, belirli bir ada sahip bir nesne oluşturmaya karar verdiğiniz temel olarak normal bir işlev yanıtıdır. Bu durumda, _LastError'da bulunan kod doğrudan "İstenen ada sahip nesne mevcut değil" der - onu oluşturabilirsiniz.

Genel olarak, size açıklama yapmaktan bıktım. Kim ister - anlayacaktır.