Errori, bug, domande - pagina 713

 
speedy:

Il pulsante Compile è perso per sempre (bisogna ricaricare l'editor per riaverlo)

Beh, non esattamente... :) sono riuscito a recuperarlo :)

Dovete commentare il pezzo ricorsivo e premere il pulsante debug compile per farlo.

 
speedy:

1. non è sicuro "esporre" all'esterno elementi interni non di classe base (e in questo esempio, non l'attributo stesso, ma solo un elemento dell'array!) Inoltre, non è possibile cambiare il suo valore.

Inoltre, contraddice lo "spirito" della programmazione orientata agli oggetti: tutto il lavoro con i dati dell'oggetto dovrebbe essere eseguito all'interno dell'oggetto, dai suoi propri metodi...

3. Che ne dite di usare solo Setter per l'attributo dei dati?

4. Il codice avrebbe bisogno di leggibilità.

5. alla fine questa "semplicità" con l-value indexer farà sì che nessuno, compreso te, capisca come funziona questo codice...

6. passerete più tempo a cercare gli errori che a scrivere Setter.

Cos'è, umorismo nero?

1. Mi dispiace, - sciocchezze. Capisco che la paranoia sia in voga qui, ed è un argomento di scarto per "perché non dovresti farlo". Non ci vedo alcun pericolo. Qualsiasi nome, dopo tutto, è un riferimento. L'indicizzazione è solo un'estensione del concetto di nome. Niente di più. Vietiamo del tutto i nomi, per sicurezza. I link sono estremamente pericolosi, vero?

2. Quella logica contraddice violentemente lo spirito della programmazione orientata agli oggetti con C++, C#, Delphi e un paio di dozzine di linguaggi meno popolari dove gli indicizzatori funzionano abbastanza bene sia a destra che a sinistra. Inoltre, il buon senso e il mio spirito non lo contraddicono per qualche motivo.

Gli indicizzatori sono fatti per comunicare con l'ambiente esterno. La loro funzione è esattamente quella di un'interfaccia. Posso incapsulare e nascondere qualsiasi cosa, ma ho bisogno di indici per operare con oggetti come array. In effetti, tutti gli array sono disposti in qualche modo. Per esempio, gli array mql dinamici regolari. Possiamo proibire di metterli a sinistra dell'operatore di assegnazione? Sostituiamoli con una funzione come SetArrayValue(array, i, j, value); questo migliorerà contemporaneamente la leggibilità. E anche il debug diventerà molto più facile. Ugh...

3. Che ne dite di fare un indicizzatore normale? La cameriera è bella, certo, ma la regina è ancora meglio.

4. Qui è dove comincio davvero a perdere la testa: è illeggibile?

  t[i]=i*i;

Questo è più leggibile, vero?

  t.setDataElement(i, i*i);

Bene, penso che andrò a farmi curare.

5. Fico.

6. Ho pianto.


 

L'indicatore ha smesso di compilare sulla build 630:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
 //код
 for(int i=limit; i<rates_total && !IsStopped(); i++)
  {
   if()
    {
     //~400 стр. кода
     // i используется много раз
     // тут же определяется RT=true или false
    }
   if(RT)
    {
     double p=close[i];  // 'i' - undeclared identifier
    }
  }
 return(rates_total);  // 'rates_total' - undeclared identifier
}

c i errore può essere eliminato mettendo un annuncio davanti a for

int i;
for(i=limit; i<rates_total && !IsStopped(); i++)
{

}

E cosa fare con'rates_total' - identificatore non dichiarato?

Lo stesso su Win7 x64 e XP x32.

 

Puoi dirmelo per favore. MathMin() e MathMax() sono implementate come funzioni (conparametri passati attraverso lo stack) o come sostituzione di macro(inline)? Secondo il libro di riferimento sono funzioni.

Документация по MQL5: Основы языка / Функции / Передача параметров
Документация по MQL5: Основы языка / Функции / Передача параметров
  • www.mql5.com
Основы языка / Функции / Передача параметров - Документация по MQL5
 
kPVT:

L'indicatore ha smesso di compilare sulla build 630:

c i errore può essere eliminato mettendo un annuncio davanti a for

E cosa fare con'rates_total' - identificatore non dichiarato?

Lo stesso su Win7 x64 e XP x32.

Ci deve essere un errore nel tuo codice da qualche parte. Il blocco che avete presentato si compila senza errori se dichiarate le variabili limit, RT e la condizione if()
 
Rosh:
Hai chiaramente un errore da qualche parte nel tuo codice. Il blocco presentato si compila senza errori se si dichiarano le variabili limit, RT e si imposta la condizione if()

Naturalmente non ho dato il codice, ma una struttura approssimativa.

Sulla build 619 l'indicatore è stato compilato e ha funzionato bene.

Su 630 genera gli errori di cui sopra.

Il codice è invariato al 100%. Il modo in cui il compilatore lavora è ovviamente cambiato.

 
Scrivete al Service Desk e allegate il codice sorgente. Questo aiuterà gli sviluppatori a trovare la causa e a risolverla.
 
speedy:

Bug?

Il codice che segue genera una sorta di ciclo perpetuo nel compilatore. Facendo clic su Annulla

non funziona immediatamente, ma quando lo fa, riprende il controllo dell'editor.

Il pulsante Annulla stesso non scompare, ma non è nemmeno accessibile.

Il pulsante Compile è perso per sempre (bisogna ricaricare l'editor per riaverlo)

Grazie per il post, l'errore del compilatore è stato risolto.
 
victorg:

Si prega di avvisare. MathMin() e MathMax() sono realizzate come funzioni (conparametri passati attraverso lo stack) o come macrosostituzioni(inline)? Secondo il libro di riferimento, sono funzioni.

Naturalmente le funzioni, perché al momento della compilazione i valori degli argomenti sono sconosciuti. IMHO inline e macro sono diversi.

P.S: in linea o non in linea non posso dirlo.

 
220Volt:

Naturalmente le funzioni, perché al momento della compilazione i valori degli argomenti sono sconosciuti. IMHO inline e macro sono diversi.

P.S: se sono in linea o meno non posso dirlo.

Una macro e una funzione in linea sono effettivamente cose diverse. Ma non è questo che intendo. Ecco un esempio quando al momento della compilazione i valori degli argomenti sono sconosciuti

#define  min(a,b) (((a)<(b))?(a):(b))
double func(a,b)
  {
  c=min(a,b);   // 1-й вариант
  c=fmin(a,b);  // 2-й вариант
  return(c);
  }

Nel primo caso, il codice deve essere incollato nella funzione corrente (credo) e nel secondo caso, la funzione viene chiamata con parametri passati attraverso lo stack (credo). Ma ai fini dell'ottimizzazione, il compilatore può effettivamente implementare anche la seconda variante attraverso la sostituzione. È così? Non lo so. Ecco perché ho chiesto.

Документация по MQL5: Основы языка / Функции / Передача параметров
Документация по MQL5: Основы языка / Функции / Передача параметров
  • www.mql5.com
Основы языка / Функции / Передача параметров - Документация по MQL5
Motivazione: