MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 437

 

構造体から文字列を削除すると、動作するようになります。

または要素ごとにコピーして、構造体の各変数
または、文字列を静的配列 uchar[16]に置き換える。

 
Taras Slobodyanik:

構造体から文字列を削除すると、動作するようになります。

要素ごとにコピーするか、構造体のすべての変数をコピーするか、どちらかです。
または、文字列を静的配列 uchar[16]に置き換える。


どの文字列を削除しますか?

実は、構造体型の変数を同じ構造体型の別の変数にコピーできることを理解するために、参考書を見てみたのですが......。また、その中で宣言された関数はどうなるのでしょう。要素ごとにコピーするのはよくない...。...非常に長いドラッグができます。

 
Aleksandr Brown:

どの文字列を削除するか?

実は、構造体型の変数が、同じ構造体型の別の変数にコピーできることを理解するために、参考書を使って例を見てみたのですが......。そして、その中で宣言された関数はどうなるのでしょう。要素ごとにコピーするのはよくない...。...非常に長く引きずることが判明した。

ArrayCopyは 試されましたか?

 
STARIJ:

ArrayCopyは試されましたか?


構造化データの 話です。配列として表現するための構造体型の変数ということですか?:-)))選択肢もない...。構造体の中には、別々に宣言するとさらに混乱するような機能があります。

 
そう、ArrayCopyは ナンセンスなことをするのです。色成分の 出力が必要な場合 - こちら
//+------------------------------------------------------------------+ 
//| Компоненты цвета                                                 | 
//+------------------------------------------------------------------+ 
#property strict
#property script_show_inputs
input     color  testColor=0x00ff00;  // задайте цвет для тестирования

//--- функция для вывода цвета в виде строки
string toString(color x)
{
 return  "("+
      (string) ( x & 0xff)           +":"+
      (string) ((x & 0xff00 ) >> 8)  +":"+
      (string) ((x & 0xff0000)>> 16) +")"   ;
}

void OnStart() 
{ 
   Alert("color ",testColor," = ",toString(testColor));  // выдает color clrLime = (0:255:0) а ведь думал это clrGreen
}

ColorToString(testColor) を使用 する方が簡単ですが

データ変換を利用する場合は、ServiceDeskをご利用ください。ご指摘のエラーは、MT5のMetaEditorでも発生しています。

 
Aleksandr Brown:

どの文字列を削除するか?

実は、構造体型の変数が、同じ構造体型の別の変数にコピーできることを理解するために、参考書を使って例を見てみたのですが......。そして、その中で宣言された関数はどうなるのでしょう。要素ごとにコピーするのはよくない...。...とても長く引きずることになります。


はい、すみません、アドバイスを読み間違えてしまいました...。

私の記憶では、現在、新しいユニオン 型が導入され、このようなことをする必要があります。

#property script_show_inputs

#define  red    colir[0]
#define  green  colir[1]
#define  blue   colir[2]

input color          testColor=clrBlue;// задайте цвет для тестирования
//--- структура для представления цвета в RGB
union RGB
  {
   color             cvet;
   uchar             colir[4];
   string            toString();    // функция для получения в виде строки
  };
//--- функция для вывода цвета в виде строки
string RGB::toString(void)
  {
   string out="("+(string)red+":"+(string)green+":"+(string)blue+")";
   return out;
  }

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- переменная для хранения в RGB
   RGB colorRGB;

   colorRGB.cvet=testColor;
   Print("color ",colorRGB.cvet," = ",colorRGB.toString());
//---
  }
 

なぜ正しい情報が表示されないのか、その理由を教えてください。


//+------------------------------------------------------------------+
//---- indicator buffers
double      AO[];                // массив для индикатора iAO
//---- handles for indicators
int         AO_handle;           // указатель на индикатор iAO
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- создание указателя на объект - индикатор iAO
   AO_handle=iAO(NULL,0);
//--- если произошла ошибка при создании объекта, то выводим сообщение
   if(AO_handle<0)
     {
      Print("Объект iAO не создан: Ошибка исполнения = ",GetLastError());
      //--- принудительное завершение программы
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ArrayFree(AO);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

//--- Достаточно ли количество баров для работы
   if(Bars(_Symbol,_Period)<10) // общее количество баров на графике меньше 10?
     {
      Alert("На графике меньше 10 баров, советник не будет работать!!");
      return;
     }

   ArraySetAsSeries(AO,true);
//--- заполнение массива AO[] текущими значениями индикатора iAO
//--- задаём порядок индексации массива как в таймсерии
//--- если произошла ошибка, то прекращаем выполнение дальнейших операций;
   if(CopyBuffer(AO_handle,0,0,100,AO)<=0)return;
   double AO_1=AO[1];
   AO_1=NormalizeDouble(AO_1,7);
   Print("AO=",AO_1);
   double AO_2=AO[2];
   AO_2=NormalizeDouble(AO_2,7);
   Print("AO2=",AO_2);
  }
//+------------------------------------------------------------------+
 
gastinets:

どうも、正しい情報が表示されないのですが、その原因を教えてください。


どこで間違った情報を見たのですか?

そして、コードを正しく挿入してください(あなたの投稿で修正しました)。

カテゴリー:赤い長方形


 

コードから取得しました、申し訳ありません-今後考慮します

負の値が正しく表示されないのは、double 型に 起因している可能性があります。

負の値を正しく表示する方法と、正の値(正しく表示される)のように正規化できるかどうかという質問を明確にさせてください。

 
gastinets:

コードから取得しました、申し訳ありません-今後考慮します

負の値が正しく表示されない。double 型の ためと思われる。

質問を明確にします - マイナス値を正しく表示させる方法と、プラス値のように正規化できるかどうか(正しく表示される)。


子供の頃、電卓をいじると、よく同じようなEが出たものです。プログラミングを始めてから電卓のことを思い出し、すべてが元通りになりました。


文字列で数値を確認したい場合は、文字列に変換してみてください。

   double AO_1=AO[1];
   AO_1=NormalizeDouble(AO_1,7);
   Print("AO=",DoubleToString(AO_1,7));
   double AO_2=AO[2];
   AO_2=NormalizeDouble(AO_2,7);
   Print("AO2=",DoubleToString(AO_2,7));
理由: