Errori, bug, domande - pagina 1167

 
Swan:
forse, ma sembra essere trasmesso correttamente. La finestra dellevariabili globali arrotonda e visualizza 17 cifre.
18...
 
TheXpert:
Casta sindacale alla riscossa. È legale in mql5 anche attraverso le strutture.
MQL4. Cosa si può fare?
 
artmedia70:
MQL4. Cosa si può immaginare?
Il nuovo MQL4 non è accostato a MQL5?
 
marketeer:
Il nuovo MQL4 non è accostato a MQL5?
Non esattamente. Anche se, a giudicare dall'Aiuto, è quasi lo stesso. Ma noi non giudicheremo. Ci interessa il risultato.
 
artmedia70:
MQL4. Cosa si può fare?

Vediamo...

Ecco uno script con il principio, dovrebbe funzionare sia per il 4 che per il 5

struct DoubleContainer
{
   double value;
};

struct LongContainer
{
   long value;
};

long ToLong(double value)
{
   DoubleContainer d; d.value = value;
   LongContainer l = (LongContainer)d;
   return l.value;
}

double ToDouble(long value)
{
   LongContainer l; l.value = value;
   DoubleContainer d = (DoubleContainer)l;
   return d.value;
}

void OnStart()
{
   long l = 130462919691841406;
   double d1 = (double)l;
   long l1 = (long)d1;
   double d2 = ToDouble(l);
   long l2 = ToLong(d2);
}
 
Vinin:
Non esattamente. Anche se, a giudicare dagli Helps, è più o meno la stessa cosa. Ma non abbiamo intenzione di giudicare. Ci interessa il risultato.
Credo che TheXpert ci abbia mostrato come ottenere il risultato. C'è già abbastanza sintassi di 5 in 4.
 
TheXpert:

Vediamo...

Ecco uno script con il principio, dovrebbe funzionare su 4 e 5

Questo è davvero strano...

#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   long l = 130462919691841406;
   //--- приведение типов
   double d1 = (double)l;
   long l1 = (long)d1;
   //--- преобразование типов
   double d2 = ToDouble(l);
   long l2 = ToLong(d2);
   //--- поглядим чё натворили
   Print("long-значение l = "+IntegerToString(l));
   Print("long l привели к типу double d1 = "+DoubleToString(d1,Digits));
   Print("double d1 привели к типу long l1 = "+IntegerToString(l1));
   Print("long l преобразовали в double d2 = "+DoubleToString(d2,Digits));
   Print("double d2 преобразовали в long l2 = "+IntegerToString(l2));
   ToDoubleString(l);
  }
//+------------------------------------------------------------------+
struct DoubleContainer
{
   double value;
};
//+------------------------------------------------------------------+
struct LongContainer
{
   long value;
};
//+------------------------------------------------------------------+
long ToLong(double value)
{
   DoubleContainer d; d.value = value;
   LongContainer l = (LongContainer)d;
   return l.value;
}
//+------------------------------------------------------------------+
double ToDouble(long value)
{
   LongContainer l; l.value = value;
   DoubleContainer d = (DoubleContainer)l;
   return d.value;
}
//+------------------------------------------------------------------+
double ToDoubleString(long long_value) {
   string long_value_str=IntegerToString(long_value);
   double double_value=StrToDouble(long_value_str);
   Print("long_value = "+IntegerToString(long_value)+", double_value = "+DoubleToString(double_value,Digits));
   return double_value;
}
//+------------------------------------------------------------------+

lungo, convertito in doppio, visualizza zero. Anche se, dopo quel doppio zero è normalmente convertito di nuovo in lungo. Non capisco...


Ma che... ????????????

 
artmedia70:
E guardare nel debugger? C'è un valore non zero molto piccolo. Funziona ancora, di cos'altro avete bisogno?
 
TheXpert:
E cercarlo nel debugger? C'è un valore non zero molto piccolo. Funziona ancora, di cos'altro hai bisogno?

Vedere. Mando l'id della finestra (è lungo) al terminale del globo (sono doppi). Ho bisogno che un insieme di indicatori installati su un diverso, qualsiasi grafico (l'Expert Advisor li imposterà) legga il valore ID del grafico dell'Expert Advisor che lo controlla e invii i suoi dati a questo stesso grafico. L'Expert Advisor elaborerà a sua volta tutti questi dati e poi lavorerà con essi. Vedo zero nel terminale globale, e non sono così sicuro che l'indicatore riceverà l'id necessario del grafico desiderato e invierà i suoi dati lì. Io vedo zero. E non coincide con l'id del grafico su cui lavora l'Expert Advisor. Ho bisogno di essere sicuro.
Se non riesco a convertire i dati correttamente, dovrò usare un file csv. Tuttavia, voglio risolvere il problema della conversione dei dati senza perdite. E qui non c'è nessuna perdita, ma piuttosto un'aggiunta di 2 al valore reale.

Ho provato a convertire in stringa - la stessa cosa - aumenta di 2 il valore inviato lungo 130462919691841406:

//+------------------------------------------------------------------+
void ToDoubleString(long long_value) {
   string long_value_str=IntegerToString(long_value);
   double double_value=StrToDouble(long_value_str);
   Print("long_value = "+long_value_str+", double_value = "+DoubleToString(double_value,Digits));
}
//+------------------------------------------------------------------+

risultato:

2014.07.07 00:45:08.513 LongToDouble EURUSD,H4: long_value = 130462919691841406, double_value = 130462919691841408.00000

Non capisco...

 

Ta maaa...

Devi mettere un doppio dal lungo prima del trasferimento. Per la variabile globale. Non c'è un valore zero, è solo un dabile casuale, può essere diciamo 1,34*e-307 può essere 4,29*e+120, perché ci sono bit di lunghezza.

Dopo la trasmissione, decomprimere da dub a long.

Questo è tutto.