La differenza tra esterno e ingresso - pagina 3

 
//+------------------------------------------------------------------+
//|                                                          inc.mqh |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"

extern int x;

int z(){
   x=122;
   return x;

Expet:

//+------------------------------------------------------------------+
//|                                                          exp.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

int x=1;

#include <inc.mqh>

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Alert(x);
   Alert(z());   
   Alert(x);   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
 
Dmitry Fedoseev:

Duck, hai una biblioteca. Naturalmente, ci saranno diverse variabili. Ciò che si intende è la connessione di mqh tramite include.

In C++, gli esterni sono appena descritti nelle librerie include, altrimenti il compilatore non vi permetterà di compilare il progetto


Dmitry Fedoseev:

esterno:

l'includer sarà inserito nel corpo del programma quando lo si compila. se si vuole descrivere l'includer lì, succederà la stessa cosa


in alternativa, si potrebbe descrivere una classe o una struttura esterna con il modificatore ;)

 
Igor Makanu:

In C++, gli esterni sono descritti nelle librerie include, altrimenti il compilatore non vi permetterà di compilare il progetto.

Il modo usuale per chiamare una libreria è usare "#include" come nome del file

 
Igor Makanu:

...

Il punto di questo è che l'includer sarà inserito nel corpo del programma durante la compilazione, se volete descrivere un'istanza lì, la stessa cosa accadrà.

Il punto è di permettere al file linkabile di essere gestito indipendentemente dall'intero progetto, di compilarlo separatamente e quindi di controllare gli errori.

 
Dmitry Fedoseev:

Il punto è essere in grado di lavorare su un file plug-in indipendentemente dall'intero progetto, per compilarlo separatamente e quindi controllare gli errori.

Penso che stiamo cercando il punto in cui semplicemente non c'è.

l'extern è stato mantenuto per compatibilità con migliaia di codice scritto in precedenza e l'aiuto è stato scritto da un tizio che ha copiato alcune informazioni dal wiki.

 
Igor Makanu:

Credo che cerchiamo un significato dove non esiste.

imho, extern è stato mantenuto per la compatibilità di migliaia di codici scritti in precedenza, e l'aiuto è stato scritto da una persona che ha copiato alcune delle informazioni da wiki

Qual è il verdetto, signori?) Se scrivo un programma .mq5 con .mqh (#include), posso tranquillamente scrivere extern e non aver paura di conseguenze inaspettate (come facevo in mql4) o usare input ?
 
Maksim Neimerik:
Qual è il verdetto dei Signori?) Se scrivo un programma .mq5 con .mqh (#include), posso tranquillamente scrivere extern e non aver paura di conseguenze inaspettate (come facevo in mql4) o usare input ?

Dipende da quali scopi. Hanno scopi diversi.

 
Maksim Neimerik:
Allora qual è il verdetto signori)? Se scrivo un programma .mq5 con .mqh (#include), posso tranquillamente scrivere extern e non aver paura di conseguenze inaspettate (come facevo in mql4) o devo ancora usare input ?

Usate i costrutti standard del codice MQL: tutti gli input all'inizio del codice, poi tutti gli include. Questo è il modo in cui gli esempi degli sviluppatori sono scritti, e il 99% del codice in codobase sono scritti in questo modo, e non avrete sorprese.

Ancora una volta su extern - possono essere cambiati durante l'esecuzione del programma, ma a mio parere è una cattiva pratica, di solito tutte le variabili esterne in OnInit () sono copiate nelle loro variabili e poi lavorare con loro (come esempio di esperti che lavorano per 4 caratteri e 5 caratteri - esempi di questo disegno nelle tonnellate di rete)


E la linea di fondo - non usate extern, se modificate il vecchio codice, sostituitelo con input e il compilatore vi aiuterà con avvertimenti se c'era un record in extern - dovete correggerlo

 

A proposito, ho scoperto che al compilatore non importa che io possa ridichiarare il contenuto dell'enum come variabile

enum mode5
{
   Manual         = 0,// Standard in Pips
   Kijun_sen      = 1 // Stoploss +/- Kijun-sen
};

//а потом где угодно можно объявить и компилятору будет пофиг

string Kijun_sen ="Да мне вообще пофиг что ты там объявил";      
 
Aleksey Semenov:

A proposito, ho scoperto che al compilatore non importa che io possa ridichiarare il contenuto dell'enum come variabile

cosa succede se dichiaro una variabile enum?

enum mode5
{
   Manual         = 0,// Standard in Pips
   Kijun_sen      = 1 // Stoploss +/- Kijun-sen
};


string Kijun_sen ="Да мне вообще пофиг что ты там объявил"; 

void OnStart()
  {
      mode5 x = Kijun_sen;
   
  }
//+------------------------------------------------------------------+

conversione enum implicita tst1.mq5 24 17


potete anche controllare EnumToString()


Penso che il tipo senza variabili dichiarate sia stato semplicemente buttato fuori dalla compilazione come non utilizzato