L'editor genera i seguenti avvertimenti su questo costrutto standard, legale e popolare secondo gli standard del linguaggio C: "declaration of 'a' hides global declaration at line 4" e "declaration of 'b' hides global declaration at line 4" che è anche scorretto e analfabeta dal nucleo perché non c'è né dichiarazione di una nuova variabile all'interno di una funzione né alcun accenno a una possibile sovrapposizione di variabili.
Di conseguenza, anche in un codice di programma non molto grande abbiamo centinaia di avvisi irrilevanti.
I messaggi sono assolutamente corretti al 100%.
Avete bisogno di 5-10 anni di programmazione attiva con piena responsabilità per il vostro codice a qualcuno per apprezzare l'utilità del controllo profondo dei compilatori. I linguaggi C/C++ hanno in gran parte guadagnato la fama di essere uno strumento di autocombustione a causa di compilatori deboli che non volevano e non potevano analizzare profondamente la qualità e proteggere gli autori.
Anche ora, nel 2014, i compilatori C/C++ (quelli rimasti su Windows dopo che sono stati completamente distrutti da Microsoft) non si occupano di proteggere i programmatori da se stessi. Sì, c'è un debole (praticamente inutile), per un po' di soldi ed eseguire separatamente Code Analysis in Visial Studio, ma dobbiamo ancora usare separatamente PVS Studio (lode a Dio per quei ragazzi), CPP Check e Lint per la ricerca profonda degli errori.
Testare questo esempio:
MQL4/MQL5 - dà avvisi su potenziali errori
declaration of 'a' hides global declaration at line 6 Test.mq4 1314
declaration of 'b' hides global declaration at line 6 Test.mq4 1322
Visual Studio 2012, compresa l'analisi del codice - niente. La qualità dell'analisi per i potenziali errori è zero. Non si preoccupano perché non c'è un concorrente da molto tempo.
PVS Studio - riporta correttamente.
V669 The 'a', 'b' arguments are non-constant references. The analyzer is unable to determine the position at which this argument is being modified.
It is possible that the function contains an error. test.cpp 17
Lint - riporta la stessa cosa, ma la 'x' si nasconde.
Il nostro compito è quello di fare un compilatore di qualità che sia bravo nel controllo della qualità e che non permetta le tecniche suicide/insane dei linguaggi C/C++.
Penso anche che i messaggi siano completamente inutili. Non sono un programmatore professionista, ma questo tipo di assurdità in µl mi stressa. Mi chiedo se i riferimenti ad a e b sono costanti, PVS Studio genererà un avviso (non c'è modo di controllarlo da solo)?
int a=1,b=2;
//--------------------------------------------------------------------void start(){
int k=sum(a,b);
Alert(k);
}
//--------------------------------------------------------------------int sum(constint& a, constint& b){
return(a+b);
}
1. Potresti fare un esempio di quale potrebbe essere esattamente l'errore potenziale in questo semplice codice, di cui il compilatore avverte?
Occuparsi dei programmatori è certamente una buona cosa, purché abbia una spiegazione logica ragionevole e non diventi troppo invadente.
2. Penso che la qualità del codice scritto non sia legata alla qualità del compilatore e alla sua capacità di analizzare la sintassi, ma si verifica solo quando l'ambiente di test è scritto abbastanza bene da permettere di eseguire una profonda analisi funzionale del codice scritto. Ma credere in una salvifica analisi sintattica del codice senza una shell di test è un'utopia e uno spreco di sforzi.
Ecco perché i programmatori professionisti non guardano quasi mai gli avvertimenti perché i compilatori, per definizione, non possono fornire un'analisi funzionale del codice, mentre anche un programmatore principiante conosce comunque la sintassi del linguaggio.
Sono corretti, ma non sono pratici. È anche molto importante che questo comportamento del compilatore non possa essere controllato.
Renat:
Avete bisogno di 5-10 anni di programmazione attiva con piena responsabilità per il vostro codice a qualcuno per apprezzare l'utilità del controllo profondo per i compilatori. I linguaggi C/C++ si sono guadagnati non poco la fama di essere uno strumento autocelebrativo a causa di compilatori deboli che non volevano e non erano in grado di analizzare profondamente la qualità e proteggere gli autori.
Mi chiedo perché esattamente questi linguaggi sono stati presi come base per MQL4/MQL4++/MQL5?
Dopo tutto, non si tratta di compilatori in primo luogo, ma del design di questi linguaggi.
Renat:
Anche ora, nel 2014, i compilatori C/C++ (quelli rimasti su Windows dopo che sono stati completamente distrutti da Microsoft) non si occupano di proteggere i programmatori da se stessi. Sì, c'è un debole (praticamente inutile), per un po' di soldi e separatamente eseguire l'analisi del codice in Visial Studio, ma dobbiamo ancora usare separatamente PVS Studio (lode a Dio per quei ragazzi), CPP Check e Lint per la rilevazione profonda degli errori.
Test di questo esempio:
MQL4/MQL5 - dà avvisi su potenziali errori
Visual Studio 2012, compresa l'analisi del codice - niente, la qualità dell'analisi per i potenziali errori è zero. Non si preoccupano perché non ci sono concorrenti per molto tempo.
PVS Studio - riporta correttamente
Lint - genera la stessa cosa, quindi la 'x' si nasconde...
In primo luogo, Microsoft non è onnipotente e onnipresente. E secondo, ci sono altri compilatori rimasti su Windows. Vi darò un esempio, anche se lo compilo da sotto Linux, ma le versioni Windows e Linux di questo compilatore non differiscono nella parte di "ricerca profonda degli errori". Il codice sorgente è leggermente modificato:
int a=1,b=2;
//--------------------------------------------------------------------int sum(int& a, int& b){
return(a+b);
}
//--------------------------------------------------------------------int main(){
return sum(a,b);
}
Compilazione e messaggi del compilatore:
$ icpc -c -Wremarks 1.cpp
1.cpp(3): remark #1418: external function definition with no prior declarationint sum(int& a, int& b){
^
1.cpp(3): remark #3280: declaration hides variable "a" (declared at line 1)int sum(int& a, int& b){
^
1.cpp(3): remark #3280: declaration hides variable "b" (declared at line 1)int sum(int& a, int& b){
^
Vedete, nel 2014, ci sono compilatori di Windows che hanno il servizio di "ricerca profonda".
Si noti che il diritto di decidere se usare o meno il "deep lookup" è dato al programmatore: lo stesso codice in compilazione più pratica senza l'opzione "-Wremarks" ma con tutti gli avvertimenti abilitati con l'opzione "-Wall" si compila senza alcun commento:
$ icpc -c -Wall 1.cpp
$
Inoltre, questo compilatore permette di controllare la "ricerca profonda" a livello di singole osservazioni, disabilitando quelle che il programmatore considera inutili.
Viene utilizzata la seguente versione del compilatore:
$ icpc --version
icpc (ICC) 15.0.020140723
Copyright (C) 1985-2014 Intel Corporation. All rights reserved.
A proposito, questo compilatore si integra con Visual Studio, almeno le versioni precedenti si integravano con le versioni precedenti di Visual Studio.
Renat:
Il nostro compito è quello di fare un compilatore di qualità che sia bravo nel controllo della qualità e che non permetta le tecniche suicide/insane dei linguaggi C/C++.
Un compilatore di qualità, prima di tutto, deve "funzionare", cioè deve corrispondere alla definizione del linguaggio, altrimenti tutte le sue altre caratteristiche perderebbero di significato:
#property strict/******************************************************************************/class A {
private:
/******************************************************************************/
A() { }
/******************************************************************************/void f() { }
public:
/******************************************************************************/staticvoid sf1(A &a) {
a.f(); // Нет ошибки
}
/******************************************************************************/staticvoid sf2() {
A a; // Место "ошибки"
a.f(); // Нет ошибки
}
};
/******************************************************************************/voidOnStart() {
}
Perché il metodo f() dichiarato nella sezione privata è chiamato perfettamente da un metodo statico come dovrebbe essere, ma il costruttore della classe, anch'esso dichiarato nella sezione privata, non è "chiamato" dallo stesso metodo statico quando si definisce una variabile?
Messaggi di errore:
'A::A' - cannot call private member function
Questo bug del compilatore non permette, per esempio, di implementare il singleton di Myers in modo umano (questo esempio NON è un'implementazione di detto singleton). E questo non è l'ultimo bug in termini di accesso alle entità dichiarate nella sezione privata.
Questo è esattamente un bug, e non una qualche caratteristica diretta, per esempio, contro le tecniche suicide/irragionevoli, perché una volta che si sostituisce la definizione automatica delle variabili con la creazione dinamica degli oggetti, il costruttore viene improvvisamente chiamato nel modo più meraviglioso:
/******************************************************************************/staticvoid sf2() {
A *a = new A;
a.f();
delete a;
}
Questo codice si compila già senza errori. Inoltre, potete assicurarvi che il costruttore sia già stato chiamato in questo caso inserendo una stampa di qualche messaggio dal codice del costruttore.
Finché rimangono tali bug, è strano parlare di un compilatore di qualità. Quando si tratta di errori nell'implementazione del linguaggio stesso, i compilatori C/C++, sia commerciali che non, sono di gran lunga superiori ai compilatori MQL4++ perché non ci sono queste sciocchezze. Così tanto meglio, che direi che rispetto a loro il compilatore MQL4++ 'non funziona' affatto.
L'unica caratteristica veramente forte del compilatore MQL4++ che fornisce un controllo veramente serio della qualità del codice in questa fase sono gli avvertimenti nel caso in cui il programmatore non controlli i valori di ritorno delle funzioni che possono fallire, per esempio le funzioni di trading. Ma anche una caratteristica così forte del compilatore ha un valore molto limitato quando la qualità della sua implementazione è così scarsa.
Penso anche che i messaggi siano completamente inutili. Non sono un programmatore professionista, ma questo tipo di assurdità in µl mi stressa. Mi chiedo se i riferimenti ad a e b sono costanti, PVS Studio genererà un avviso (non c'è modo di controllarlo da solo)?
int a=1,b=2;
//--------------------------------------------------------------------void start(){
int k=sum(a,b);
Alert(k);
}
//--------------------------------------------------------------------int sum(constint& a, constint& b){
return(a+b);
}
Il compilatore Intel C++ 15.0.0 produce gli stessi commenti per entrambi i casi quando compila con l'opzione -Wremarks.
Renat: Beh, se le indicazioni di potenziali errori sono corrette, allora questi errori devono essere corretti.
Un errore potenziale è proprio questo, un errore potenziale non è necessariamente un errore. Pertanto, l'affermazione che "significa che dobbiamo correggere questi errori" non è corretta, perché potrebbero NON essere affatto errori.
Ci sono casi in cui un errore è quasi certamente presente, per esempio, quando non viene controllato il risultato di una chiamata di funzione, che può fallire. Un avvertimento su un caso del genere è appropriato e abbastanza utile. Gli avvertimenti sui casi in cui non si può dire con certezza se c'è un errore o no sono di solito sia irrilevanti che non utili. Quando i nomi sono nascosti, non si può dire che c'è quasi certamente un errore.
Sì, è possibile per un programmatore ottenere ogni sorta di diagnostica basata sulla "ricerca profonda" per determinare se ci sono errori potenziali, cioè - errori fatti inavvertitamente. Ma questa non dovrebbe essere la modalità principale del compilatore e dovrebbe essere possibile disabilitarla. Per proteggere i novizi da potenziali errori di questo tipo, la diagnostica può essere abilitata di default, cioè dopo l'installazione. Tuttavia, si dovrebbe essere ancora in grado di spegnerlo.
È ovvio che i fatti di nascondere un nome in uno scope chiuso che è stato precedentemente dichiarato nello scope esterno sono rilevati dal compilatore Intel solo come marcature e non come avvertimenti per lo stesso motivo: potrebbero non essere affatto errori. E in altri compilatori, compresi quelli non commerciali, tali fatti nascosti NON corrispondono ad alcun avvertimento. Perché tutta l'esperienza collettiva degli utenti del compilatore, cioè dei programmatori, ci dice che questo NON dovrebbe essere un avvertimento. E, naturalmente, l'utente dovrebbe essere in grado di configurare quali avvertimenti/osservazioni saranno emessi e quali no.
A proposito, dato che MQL è un linguaggio separato che non deve seguire gli standard di C/C++, non sarebbe più facile disabilitare l'occultamento dei nomi negli ambiti chiusi in esso?
1.cpp(3): remark #3280: declaration hides variable "a" (declared at line 1)int sum(int& a, int& b){
Questa osservazione non ha senso e non dà alcuna informazione utile al programmatore in linea di principio, perché non c'è alcun occultamento della variabile "a" inizialmente, come detto.
L'occultamento avviene solo quando viene creata una copia locale della variabile, che è anche un'azione legittima. Anche se un errore si verifica improvvisamente nel codice a causa di questo nascondersi, può essere facilmente trovato proprio perché la ricerca trova immediatamente lo stesso nome. Se cominciamo a cambiare e alterare i nomi in un modello di funzione, che è una "soluzione" a questa regola da parte della logica del compilatore, la situazione di ricerca degli errori diventerà molto più complicata e la confusione abbonderà nella comprensione del codice. Sembra ovvio.
Consenti l'uso dei cookie per accedere al sito MQL5.com.
Abilita le impostazioni necessarie nel browser, altrimenti non sarà possibile accedere.
Hai effettuato l'accesso. L'autenticazione a due fattori è stata disattivata. Configurala di nuovo e scansiona un nuovo codice QR, oppure continua con l'autenticazione a due fattori disattivata.
Ciao Vinin!
Hai controllato l'indicatore: AltrTrend_Signal_v2_2.mq4
e ha trovato un errore logico
in formula : SSP=MathCeil (Kperiod/iADX(NULL,0,PerADX,PRICE_CLOSE,MODE_MAIN,1))
hai sottolineato 1 alla fine
cosa pensi che dovrebbe essere?
pansa
Probabilmente 0! Provate! E se in un ciclo, provate e i o quello che conta!
Ciao Vinin!
Hai controllato l'indicatore: AltrTrend_Signal_v2_2.mq4
e ha trovato un errore logico
in formula : SSP=MathCeil (Kperiod/iADX(NULL,0,PerADX,PRICE_CLOSE,MODE_MAIN,1))
hai sottolineato 1 alla fine
cosa pensi che dovrebbe essere?
pansa
Devespostarsi
L'editor genera i seguenti avvertimenti su questo costrutto standard, legale e popolare secondo gli standard del linguaggio C: "declaration of 'a' hides global declaration at line 4" e "declaration of 'b' hides global declaration at line 4" che è anche scorretto e analfabeta dal nucleo perché non c'è né dichiarazione di una nuova variabile all'interno di una funzione né alcun accenno a una possibile sovrapposizione di variabili.
Di conseguenza, anche in un codice di programma non molto grande abbiamo centinaia di avvisi irrilevanti.
I messaggi sono assolutamente corretti al 100%.
Avete bisogno di 5-10 anni di programmazione attiva con piena responsabilità per il vostro codice a qualcuno per apprezzare l'utilità del controllo profondo dei compilatori. I linguaggi C/C++ hanno in gran parte guadagnato la fama di essere uno strumento di autocombustione a causa di compilatori deboli che non volevano e non potevano analizzare profondamente la qualità e proteggere gli autori.
Anche ora, nel 2014, i compilatori C/C++ (quelli rimasti su Windows dopo che sono stati completamente distrutti da Microsoft) non si occupano di proteggere i programmatori da se stessi. Sì, c'è un debole (praticamente inutile), per un po' di soldi ed eseguire separatamente Code Analysis in Visial Studio, ma dobbiamo ancora usare separatamente PVS Studio (lode a Dio per quei ragazzi), CPP Check e Lint per la ricerca profonda degli errori.
Testare questo esempio:
Il nostro compito è quello di fare un compilatore di qualità che sia bravo nel controllo della qualità e che non permetta le tecniche suicide/insane dei linguaggi C/C++.
Penso anche che i messaggi siano completamente inutili. Non sono un programmatore professionista, ma questo tipo di assurdità in µl mi stressa. Mi chiedo se i riferimenti ad a e b sono costanti, PVS Studio genererà un avviso (non c'è modo di controllarlo da solo)?
Test di questo esempio:
1. Potresti fare un esempio di quale potrebbe essere esattamente l'errore potenziale in questo semplice codice, di cui il compilatore avverte?
Occuparsi dei programmatori è certamente una buona cosa, purché abbia una spiegazione logica ragionevole e non diventi troppo invadente.
2. Penso che la qualità del codice scritto non sia legata alla qualità del compilatore e alla sua capacità di analizzare la sintassi, ma si verifica solo quando l'ambiente di test è scritto abbastanza bene da permettere di eseguire una profonda analisi funzionale del codice scritto. Ma credere in una salvifica analisi sintattica del codice senza una shell di test è un'utopia e uno spreco di sforzi.
Ecco perché i programmatori professionisti non guardano quasi mai gli avvertimenti perché i compilatori, per definizione, non possono fornire un'analisi funzionale del codice, mentre anche un programmatore principiante conosce comunque la sintassi del linguaggio.
I messaggi sono assolutamente corretti al 100%.
Sono corretti, ma non sono pratici. È anche molto importante che questo comportamento del compilatore non possa essere controllato.
Avete bisogno di 5-10 anni di programmazione attiva con piena responsabilità per il vostro codice a qualcuno per apprezzare l'utilità del controllo profondo per i compilatori. I linguaggi C/C++ si sono guadagnati non poco la fama di essere uno strumento autocelebrativo a causa di compilatori deboli che non volevano e non erano in grado di analizzare profondamente la qualità e proteggere gli autori.
Mi chiedo perché esattamente questi linguaggi sono stati presi come base per MQL4/MQL4++/MQL5?
Dopo tutto, non si tratta di compilatori in primo luogo, ma del design di questi linguaggi.
Anche ora, nel 2014, i compilatori C/C++ (quelli rimasti su Windows dopo che sono stati completamente distrutti da Microsoft) non si occupano di proteggere i programmatori da se stessi. Sì, c'è un debole (praticamente inutile), per un po' di soldi e separatamente eseguire l'analisi del codice in Visial Studio, ma dobbiamo ancora usare separatamente PVS Studio (lode a Dio per quei ragazzi), CPP Check e Lint per la rilevazione profonda degli errori.
Test di questo esempio:
In primo luogo, Microsoft non è onnipotente e onnipresente. E secondo, ci sono altri compilatori rimasti su Windows. Vi darò un esempio, anche se lo compilo da sotto Linux, ma le versioni Windows e Linux di questo compilatore non differiscono nella parte di "ricerca profonda degli errori". Il codice sorgente è leggermente modificato:
Compilazione e messaggi del compilatore:
Vedete, nel 2014, ci sono compilatori di Windows che hanno il servizio di "ricerca profonda".
Si noti che il diritto di decidere se usare o meno il "deep lookup" è dato al programmatore: lo stesso codice in compilazione più pratica senza l'opzione "-Wremarks" ma con tutti gli avvertimenti abilitati con l'opzione "-Wall" si compila senza alcun commento:
$ icpc -c -Wall 1.cpp $Inoltre, questo compilatore permette di controllare la "ricerca profonda" a livello di singole osservazioni, disabilitando quelle che il programmatore considera inutili.
Viene utilizzata la seguente versione del compilatore:
A proposito, questo compilatore si integra con Visual Studio, almeno le versioni precedenti si integravano con le versioni precedenti di Visual Studio.
Il nostro compito è quello di fare un compilatore di qualità che sia bravo nel controllo della qualità e che non permetta le tecniche suicide/insane dei linguaggi C/C++.
Un compilatore di qualità, prima di tutto, deve "funzionare", cioè deve corrispondere alla definizione del linguaggio, altrimenti tutte le sue altre caratteristiche perderebbero di significato:
Perché il metodo f() dichiarato nella sezione privata è chiamato perfettamente da un metodo statico come dovrebbe essere, ma il costruttore della classe, anch'esso dichiarato nella sezione privata, non è "chiamato" dallo stesso metodo statico quando si definisce una variabile?
Messaggi di errore:
Questo bug del compilatore non permette, per esempio, di implementare il singleton di Myers in modo umano (questo esempio NON è un'implementazione di detto singleton). E questo non è l'ultimo bug in termini di accesso alle entità dichiarate nella sezione privata.
Questo è esattamente un bug, e non una qualche caratteristica diretta, per esempio, contro le tecniche suicide/irragionevoli, perché una volta che si sostituisce la definizione automatica delle variabili con la creazione dinamica degli oggetti, il costruttore viene improvvisamente chiamato nel modo più meraviglioso:
Questo codice si compila già senza errori. Inoltre, potete assicurarvi che il costruttore sia già stato chiamato in questo caso inserendo una stampa di qualche messaggio dal codice del costruttore.
Finché rimangono tali bug, è strano parlare di un compilatore di qualità. Quando si tratta di errori nell'implementazione del linguaggio stesso, i compilatori C/C++, sia commerciali che non, sono di gran lunga superiori ai compilatori MQL4++ perché non ci sono queste sciocchezze. Così tanto meglio, che direi che rispetto a loro il compilatore MQL4++ 'non funziona' affatto.
L'unica caratteristica veramente forte del compilatore MQL4++ che fornisce un controllo veramente serio della qualità del codice in questa fase sono gli avvertimenti nel caso in cui il programmatore non controlli i valori di ritorno delle funzioni che possono fallire, per esempio le funzioni di trading. Ma anche una caratteristica così forte del compilatore ha un valore molto limitato quando la qualità della sua implementazione è così scarsa.
Penso anche che i messaggi siano completamente inutili. Non sono un programmatore professionista, ma questo tipo di assurdità in µl mi stressa. Mi chiedo se i riferimenti ad a e b sono costanti, PVS Studio genererà un avviso (non c'è modo di controllarlo da solo)?
Fedeli, ma non pratici.
Beh, se le indicazioni di potenziali errori sono corrette, allora questi errori devono essere corretti.
Un errore potenziale è proprio questo, un errore potenziale non è necessariamente un errore. Pertanto, l'affermazione che "significa che dobbiamo correggere questi errori" non è corretta, perché potrebbero NON essere affatto errori.
Ci sono casi in cui un errore è quasi certamente presente, per esempio, quando non viene controllato il risultato di una chiamata di funzione, che può fallire. Un avvertimento su un caso del genere è appropriato e abbastanza utile. Gli avvertimenti sui casi in cui non si può dire con certezza se c'è un errore o no sono di solito sia irrilevanti che non utili. Quando i nomi sono nascosti, non si può dire che c'è quasi certamente un errore.
Sì, è possibile per un programmatore ottenere ogni sorta di diagnostica basata sulla "ricerca profonda" per determinare se ci sono errori potenziali, cioè - errori fatti inavvertitamente. Ma questa non dovrebbe essere la modalità principale del compilatore e dovrebbe essere possibile disabilitarla. Per proteggere i novizi da potenziali errori di questo tipo, la diagnostica può essere abilitata di default, cioè dopo l'installazione. Tuttavia, si dovrebbe essere ancora in grado di spegnerlo.
È ovvio che i fatti di nascondere un nome in uno scope chiuso che è stato precedentemente dichiarato nello scope esterno sono rilevati dal compilatore Intel solo come marcature e non come avvertimenti per lo stesso motivo: potrebbero non essere affatto errori. E in altri compilatori, compresi quelli non commerciali, tali fatti nascosti NON corrispondono ad alcun avvertimento. Perché tutta l'esperienza collettiva degli utenti del compilatore, cioè dei programmatori, ci dice che questo NON dovrebbe essere un avvertimento. E, naturalmente, l'utente dovrebbe essere in grado di configurare quali avvertimenti/osservazioni saranno emessi e quali no.
A proposito, dato che MQL è un linguaggio separato che non deve seguire gli standard di C/C++, non sarebbe più facile disabilitare l'occultamento dei nomi negli ambiti chiusi in esso?
Questa osservazione non ha senso e non dà alcuna informazione utile al programmatore in linea di principio, perché non c'è alcun occultamento della variabile "a" inizialmente, come detto.
L'occultamento avviene solo quando viene creata una copia locale della variabile, che è anche un'azione legittima. Anche se un errore si verifica improvvisamente nel codice a causa di questo nascondersi, può essere facilmente trovato proprio perché la ricerca trova immediatamente lo stesso nome. Se cominciamo a cambiare e alterare i nomi in un modello di funzione, che è una "soluzione" a questa regola da parte della logica del compilatore, la situazione di ricerca degli errori diventerà molto più complicata e la confusione abbonderà nella comprensione del codice. Sembra ovvio.