Errori, bug, domande - pagina 2116

 

Gliargomenti della funzione non sono calcolati da destra a sinistra

int i = 0;
int _etLastError() { return i; }
int _tringGetCharacter( string, int ) { i = 5041; return 0; }
void OnStart()
{
    string abc = "ABC";
    ResetLastError();
    Print( ::StringGetCharacter( abc, 1024 ), ":", GetLastError()); //(*)слева направо
    Print(   _tringGetCharacter( abc, 1024 ), ":", _etLastError()); //   справа налево
}

Risultato della stringa (*) : 0:5041

Previsto in entrambi i casi: 0:0

 
A100:

Gliargomenti della funzione non sono calcolati da destra a sinistra

Risultato della stringa (*) : 0:5041

Era previsto in entrambi i casi: 0:0

Questo non è un errore. Il compilatore decide da solo in quale ordine calcolare gli argomenti.

Bisogna solo tenerne conto.

 
Koldun Zloy:

Questo non è un errore. Il compilatore decide da solo in quale ordine calcolare gli argomenti.

L'errore è il seguente: fino a poco tempo fa, l'ordine era strettamente definito da https://www.mql5.com/ru/forum/1111/page2040#comment_5858419(notare la data e l'estratto della documentazione: garantito). Poi l'ordine è stato tranquillamente cambiato (anche nella documentazione), e potrebbe essere cambiato in modo civile - via inline https://www.mql5.com/ru/forum/1111/page2042#comment_5860752. Ma come dovrebbe saperlo l'utente? L'utente deve indovinare? O prima di usare qualsiasi strumento, guardare la documentazione?

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2017.10.04
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 

Errori di compilazione e altro

#define MACRO( X )      #X
void OnStart()
{
        Print( MACRO( AC/DC    )); //нормально
        Print( MACRO( AC\\DC   )); //error: '\' - illegal escape sequence
        Print( MACRO( ABC\nDEF )); //error: '\' - illegal escape sequence
        Print( MACRO( 'ABC'    )); //error: '' - single quote needed
        Print( MACRO( "ABC     )); //error: '' - double quotes are needed
        Print( MACRO( "ABC"    )); //Результат: ABC вместо "ABC"
        Print( MACRO( '"'ABC   )); //нормально
}
 
A100:

L'errore è questo: fino a poco tempo fa, l'ordine era strettamente definito da https://www.mql5.com/ru/forum/1111/page2040#comment_5858419(notare la data e l'estratto della documentazione: garantito). Poi l'ordine è stato tranquillamente cambiato (anche nella documentazione), ed è stato possibile cambiarlo in modo civile - via inline https://www.mql5.com/ru/forum/1111/page2042#comment_5860752. Ma come dovrebbe saperlo l'utente? L'utente deve indovinare? O guardare la documentazione prima di usare qualsiasi strumento?

Semplicemente non dovete scrivere codice che dipende dall'ordine di calcolo degli argomenti.

In C++ il compilatore ha il diritto di inlineare una funzione anche se non ha la parola chiave inline.

In MQL non c'è una parola chiave inline, il compilatore integra le funzioni solo a sua discrezione.

L'ordine dei calcoli da destra a sinistra era apparentemente dovuto al fatto che gli argomenti in questo ordine sono messi in pila,

ma possono essere passati anche attraverso i registri.

E per le funzioni incorporate, non c'è nessun passaggio di argomenti in quanto tali.

 
Koldun Zloy:

1. Non c'è bisogno di scrivere codice che dipenda dall'ordine in cui gli argomenti sono calcolati.

2. In C++, il compilatore ha il diritto di inlineare una funzione anche se non ha la parola chiave inline.

3. In MQL non c'è una parola chiave inline, il compilatore incorpora solo funzioni a sua discrezione.

4. L'ordine dei calcoli da destra a sinistra sembra essere collegato al fatto che gli argomenti sono messi in pila in questo ordine,

ma possono anche essere passati attraverso i registri.

5. E non c'è nessun passaggio di argomenti per le funzioni integrate.

1. Perché non dovrebbe essere così se l'ordine inverso era garantito nella documentazione e il codice era più semplice e chiaro in questo caso? Potremmo anche negare l'uso delle priorità dell'operazione 5 + (2*3) ed esigere che le parentesi (5 + (2*3)) siano messe ovunque - nel caso in cui sia improvvisamente cambiato

2. Il compilatore C++ impone certi requisiti alle funzioni incorporate, il che esclude una tale situazione https://www.mql5.com/ru/forum/1111/page2136#comment_6454818.

3. questo è il modo in cui è stato proposto di essere introdotto

4. Nei registri (a differenza dello stack), gli argomenti possono essere messi in qualsiasi ordine, incluso l'ordine inverso

5. Non è l'ordine di passaggio che conta - è l'ordine di calcolo degli argomenti, e questo è il caso di qualsiasi funzione con più di un argomento. E C++ ne tiene conto prima di rendere (o non rendere) una funzione in linea (vedi punto 2)

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2018.01.31
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 
A100:

1. Perché no, se l'ordine inverso è garantito nella documentazione e il codice è più semplice e chiaro. Potremmo anche negare di usare 5 + (2*3 ) e chiedere di mettere le parentesi (5 + (2*3)) ovunque - nel caso in cui sia improvvisamente cambiato

2. Il compilatore C++ impone certi requisiti alle funzioni incorporate, il che esclude una tale situazione https://www.mql5.com/ru/forum/1111/page2136#comment_6454818.

3. questo è il modo in cui è stato proposto di essere introdotto

4. Nei registri (a differenza dello stack), gli argomenti possono essere messi in qualsiasi ordine, incluso l'ordine inverso

5. Non è l'ordine di passaggio che conta - è l'ordine di calcolo degli argomenti, e questo è il caso di qualsiasi funzione con più di un argomento. E C++ ne tiene conto prima di rendere (o non rendere) una funzione in linea (vedi punto 2)

3. Non so cosa ci guadagni. Volete proibire al compilatore di incorporare funzioni senza specificare esplicitamente inline?

2. Non so cosa intendi.

4. Stavo solo suggerendo a cosa era legato quell'ordine e la sua cancellazione. Non credo che sia stato fatto per caso e sarà sempre così d'ora in poi. Non c'è niente di terribile.

5. Vi sbagliate. In C++, l'ordine di calcolo degli argomenti non è definito.

1. Ho scritto in C++ per molti anni e non ho mai trovato questo problema.


 
Koldun Zloy:

3. Non so cosa questo possa fare per voi. Volete impedire al compilatore di incorporare funzioni senza specificare esplicitamente inline?

4. Ho solo suggerito il motivo di questo ordine e del suo annullamento. Non credo che sia stato fatto per caso e sarà sempre così ora. Non c'è niente di terribile.

5. Vi sbagliate. In C++, l'ordine di calcolo degli argomenti è indefinito.

3. Stavo suggerendo che il compilatore non dovrebbe essere autorizzato a cambiare l'ordine di calcolo degli argomenti per le funzioni senza inline.

5. L'ordine di calcolo è definito dall'implementazione (il compilatore) ed è abbastanza concreto (da destra a sinistra o da sinistra a destra), e qui, per esempio:

void OnStart()
{
    ResetLastError();
    Print( GetLastError(), ":", StringGetCharacter( "abc", 1024 ), ":", GetLastError());
}

non è chiaro quale sia l'ordine 2-1-3 o 2-3-1 o altro.

Risultato: 5041:0:5041.

Atteso: 0:0:5041 da sinistra a destra o

5041:0:0 da destra a sinistra

 
A100:

non è chiaro quale sia l'ordine 2-1-3 o 2-3-1 o altro

Non capisco perché scrivere codice che è palesemente ambiguo?

 
fxsaber:

Non capisco perché scrivere codice che è palesemente ambiguo?

Una domanda simile per te https://www.mql5.com/ru/forum/1111/page2037#comment_5842347

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2017.10.02
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
Motivazione: