Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz, hiçbir yerde - 6. - sayfa 156

 

1) neden int err=0 bildirilirken hemen başlatılmıyor ?

2) kontrol etmedi, ancak belgelerin dediği gibi, hata GetLastError () işlevi kullanılırken otomatik olarak sıfırlanan bazı değişkenlerde saklanıyor,

ve ayrıca bazı işlevleri kullanırken her zaman değişir (çoğunlukla terminal olanlar)

3) bu nedenle GetLastError (), OrderSelect'te var olmayan bir bilet numarasına eriştikten sonra 0 değerini verdi:

" Kalan işlevler hiçbir koşulda last_error değişkeninin değerini değiştirmez. ................., OrderSelect , ............. .... ... "

 
hoz :

Genellikle bunun gibi işlevlerin içinde bir tür değişkeni bildirdim:

Daha içeride, bir koşul altında, bir hata olup olmadığını görmek için onu zaten aradım. Valla bu sadece bende değil bir çok yerde karşılaştığım kodlarda var. Yani tipik bir durum. Bugün, hataları kontrol etmek istediğiniz her fonksiyonda her seferinde aynı değişkeni bildirmenin mantıklı olmadığını düşündüm. Bir kez global olarak ilan etmenin ve init'te başlatmanın daha kolay olacağı sonucuna vardım. Bunun gibi bir şey:

Daha sonra, zaten bir değeri olduğunu bilerek, kullanıcı tanımlı işlevlerde err değişkenini çağırmanız gerektiğinde. Aslında GetLastError () son hatanın kodunu verir, yani her fonksiyonda hata kodunun görüntülenmesinden ve GetLastError ()'un çağrılmasından sorumlu olan bu err değişkeni tüm hesaplamaların sonunda çağrılırsa, o zaman her şey doğru olacak, değil mi?

Ancak diğer yandan, bir işlevin sonunda (uzman kod yürütme zinciri boyunca) çağırmazsanız, değişken sıfıra sıfırlanmaz ve bu, eğer bir hata varsa, yanlış yürütme ile tehdit eder. önceki kod yürütme zinciri, ancak şu anki kodda değil, ANCAK son hata kodu döndürülür... ve onu sıfırlamak için bu GetLastError () işlevini çağırmanız gerekir. Onlar. her şey çağrılmış olup olmamasına bağlı. Her yerde böyle olacağına dair bir kesinlik yoksa, güvenli oynamak ve her seferinde sıfırlamak daha kolay, değil mi?

Global düzeyde err bildirebilir, ardından GetLastError() öğesini çağırmadan önce start() içinde sıfıra ayarlayabilirsiniz, örneğin:

 int err;
//------------------
int init() 
{
  // ...
  return ( 0 );
}
//------------------
int start() 
{ 
  // ...
  RefreshRates();
  OrderClose(...);
  err= 0 ;     // обнуление
  err= GetLastError ();
  SomeErrFunction(err);
  // ...
return ( 0 );
}
 
ALXIMIKS :

1) neden int err=0 bildirilirken hemen başlatılmıyor ?


Deneyin! :) Benim için işe yaramadı. Anladığım kadarıyla, özelin başlatılması. global değişkenlerdeki fonksiyonlara izin verilmez . Her ne kadar belgeler bundan bahsetmiyor gibi görünse de.
ALXIMIKS :

2) kontrol etmedi, ancak belgelerin dediği gibi, hata GetLastError () işlevi kullanılırken otomatik olarak sıfırlanan bazı değişkenlerde saklanıyor,

ve ayrıca bazı işlevleri kullanırken her zaman değişir (çoğunlukla terminal olanlar)

Sıfırlama ve yukarıda yazılanlar hakkında, oradaki akım, değer LastError () değişkenine girdikten sonra, sıfırlamak için GetLastError () işlevini çağırmanız gerekir, böylece son hata kodunu döndürür ve LastError değişkenini sıfırlar aksi takdirde, son hatanın kodu GetLastError () çağrılıncaya kadar kalıcı olarak saklanır ve buna göre, artık mevcut olmadığı yerde son hatanın kodunu döndürebilir. (yani, günlüğü okumayı veya yazdırmayı zorlaştıran başka bir işlevde).
ALXIMIKS :

3) bu nedenle GetLastError (), OrderSelect'te var olmayan bir bilet numarasına eriştikten sonra 0 değerini verdi:

" Kalan işlevler hiçbir koşulda last_error değişkeninin değerini değiştirmez. ................., OrderSelect , ............. .... ... "

Büyük olasılıkla OrderSelect() nedeniyle değil , başka bir şey değil (yakınlarda aynı işlevde). Ayrıca, genellikle daha birçok şeyden etkilenir.
 
paladin80 :

Global düzeyde err bildirebilir, ardından GetLastError()'u çağırmadan önce start()'ta sıfıra ayarlayabilirsiniz, örneğin:

Başlangıçta ve ardından kodda 1'den fazla hata bildirirseniz, zaten mantığa göre söve çıkacaktır. Değilse, GetLastError() sürekli olarak çağrılır (teoride her kullanıcı tanımlı işlevin sonunda) .
 
hoz :
o zaman söve zaten mantığa göre çıkacaktır. Değilse , GetLastError() sürekli olarak çağrılır (teorik olarak her kullanıcı tanımlı işlevin sonunda).

Bazen daha sık araman gerekir
 

Victor (hoz), son hatayla derdini anlamıyorum.

Hataları işlemek için bir işlev bildirin ve gerektiğinde onu çağırın. Her şey yerel olacak ve her yerde kullanılabilecek.

 // Объявление:
void CommentError( int nLastCodeError, string sComment)
 {
   if (nLastCodeError != 0 ) Print (sComment, "  " , ErrorDescription(nLastCodeError));
 }

// Вызов:
void start()
 {
  CommentError( GetLastError (), "Ошибка в функции start()!" );
 }
 
Zhunko :

Victor (hoz), son hatayla ilgili sıkıntılarını anlamıyorum.

Hataları işlemek için bir işlev bildirin ve gerektiğinde onu çağırın. Her şey yerel olacak ve her yerde kullanılabilecek.


Anlaşılabilir. Ancak bu işlev benim durumumda gerekli olduğunda çağrılacak, yani. bir hata olup olmadığını kontrol etmek istediğimde. Ancak daha önce bir yerde bir hata varsa ve o anda orada değilse, önceki hata döndürülür, bu daha öncedir.Sonuçta, Vadim işlevinizde LastError değişkeni GetLastError() çağrılarak sıfırlanmaz . mesele bu..
 
hoz :

Anlaşılabilir. Ancak bu işlev benim durumumda gerekli olduğunda çağrılacak, yani. bir hata olup olmadığını kontrol etmek istediğimde. Ama daha önce bir yerde bir hata varsa ve o anda orada değilse, o zaman önceki hata döndürülür, bu daha önceydi.Sonuçta, Vadim işlevinizde, GetLastError() çağrılarak LastError değişkeni sıfırlanmaz . mesele bu..

Sıfırlanması gerekmez. Fonksiyonlardan sonra her yerde hataları kontrol etmek bir alışkanlık olmalıdır. Yine de bir aramanın bağlantısının kesilmesi gerekiyor. Savaş modunda yavaşlamamak için. Onlar. böyle bir hata ayıklayıcı.

Bir istisna, elbette, karar vermek için analiz edilmesi gereken hatalar içindir.

 
hoz :

Anlaşılabilir. Ancak bu işlev benim durumumda gerekli olduğunda çağrılacak, yani. bir hata olup olmadığını kontrol etmek istediğimde. Ancak daha önce bir yerde bir hata varsa ve o anda orada değilse, o zaman önceki hata döndürülür, bu daha önce olmuştur.Sonuçta, Vadim işlevinizde, GetLastError() çağrılarak LastError değişkeni sıfırlanmaz . mesele bu..
Önce sıfırlamamızı (err=0;), sonra eylemi çağırmamızı, ardından err=GetLastError() hata değerini atamamızı, işlememizi ve tekrar err=0 yapmamızı engelleyen nedir?
 
Farklı t/p ve s/l'de kar faktörü nasıl hesaplanır. Açıktır ki, al ve dur, örneğin her biri 20 puan ise, karlı ve kârsız işlemlerin sayısını sayarız ve bunları böleriz. Ve örneğin, alma 40 puan ve durma 30 puan ise nasıl sayılır? Teşekkür ederim!