記事"MQL5でのZIPアーカイブの扱い"についてのディスカッション - ページ 2

 
Vasiliy Sokolov:

悪名高い構造のキャスティングは悪態をつくことである。修正版を添付ファイルに入れておいてください。


プロンプトありがとうございました!

 
Vasiliy Sokolov:

構造体キャスティングと同じ状況ですが、CDictionaryという別のコンテナです。IncludeDictionary.mqhを以下に添付のバリアントで置き換えてください。

そして、はい、すべてがMT4で問題なく動作 し、私はCZipがMT4上の私のプロジェクトにおける主力であると言うでしょう。


あとはこれだけだ:

'm_array' - structures containing objects are not allowed Dictionary.mqh 306 25

 
Stanislav Korotky:

残るはこれだ:

'm_array' - structures containing objects are not allowed Dictionary.mqh 306 25


306行目はこの断片に置き換えてください:

#ifdef __MQL4__
int t_size = ArrayResize(temp_array, ArraySize(m_array));
for(int i = 0; i < t_size; i++)
   temp_array[i] = m_array[i];
#else
ArrayCopy(temp_array, m_array);
#endif

MT4用アタッシュ辞書

ファイル:
Dictionary.mqh  39 kb
 
Vasiliy Sokolov:

306行目はこの断片に置き換えてください:

MT4 用のアタッシュ辞書では。

これで理解できました。ありがとう。

PS.アーカイブ内の長さがゼロのファイルについては、(ZipTask1の例では)正しくないヘッダが作成され、そのために復元できないのは事実ですが、これは解決できます。

 
Stanislav Korotky:

理にかなっている。ありがとう。

PS.ZipTask1の例では)アーカイブ内の長さゼロのファイルに対して無効なヘッダが作成され、検索不能になるのは事実だが、これは解決できる。

長さゼロで何ができるか見てみます。

 

何が問題なのでしょうか?zip.zipファイル(例からダウンロード)を解凍できません。




ログ

18:25:47.809 スクリプト zip_arc101 GBPUSD,H1: 正常にロードされました。

0 18:25:47.830 zip_arc101 GBPUSD,H1: 初期化されました。

0 18:25:47.830 zip_arc101 GBPUSD,H1: Handle= 1 GetLastError= 0

0 18:25:47.830 zip_arc101 GBPUSD,H1:FileReadArray= 11004

0 18:25:47.830 zip_arc101 GBPUSD,H1: Zip.CreateFromCharArray= true

0 18:25:47.830 zip_arc101 GBPUSD,H1: アーカイブの読み込みに成功しました。合計ファイル数: 7

0 18:25:47.836 zip_arc101 GBPUSD,H1: Zip.UnpackZipArchive= false

0 18:25:47.837 zip_arc101 GBPUSD,H1: Zip.UnpackZipArchive= false

0 18:25:47.837 zip_arc101 GBPUSD,H1: Zip.UnpackZipArchive= false

0 18:25:47.837 zip_arc101 GBPUSD,H1: uninit reason 0

0 18:25:47.839 スクリプト zip_arc101 GBPUSD,H1: 削除されました。

 
void OnStart()
  {
//---
   uchar zip_array[];
   
   ResetLastError();
   
   int Handle = FileOpen("zip.zip", FILE_READ|FILE_BIN|FILE_COMMON );
   
   
   Print("Handle= ", Handle, "   GetLastError= ", GetLastError() );
   
   
   Print("FileReadArray= ", FileReadArray(Handle, zip_array) );
   
   
   Print("Zip.CreateFromCharArray= ", Zip.CreateFromCharArray(zip_array) );
   
   
   printf("Archive successfully loaded. Total files: "+(string)Zip.TotalElements());
   
   
   Print("Zip.UnpackZipArchive= ", Zip.UnpackZipArchive("NNN",FILE_COMMON) );
   
   Print("Zip.UnpackZipArchive= ", Zip.UnpackZipArchive("",FILE_COMMON) );
   
   Print("Zip.UnpackZipArchive= ", Zip.UnpackZipArchive("", 0) );
   
  }
//+------------------------------------------------------------------+
 

CZip::UnpackZipArchiveメソッドは、仕事はするのですが、なぜかいつもfalseを返します。これはバグです。現場観察によって実際の解凍をチェックしてください。

 
Vasiliy Sokolov:

CZip::UnpackZipArchiveメソッドは、仕事はするのですが、なぜかいつもfalseを返します。これはバグです。実際の解凍を観察してみてください。


はい!

 

ここでもう一つ問題がある。複数のアーカイブをループで解凍する必要がある場合、名前の年だけを変更する必要がある。

d2014.zipだけが解凍される。



0 01:57:36.772 スクリプト zip_arc104 GBPUSD,H1: 読み込み成功

0 01:57:36.807 zip_arc104 GBPUSD,H1: 初期化されました。

0 01:57:36.807 zip_arc104 GBPUSD,H1: -------------- DDDd2014.zip

0 01:57:36.815 zip_arc104 GBPUSD,H1: DD╱d2014.zip Zip.LoadZipFromFile= true

0 01:57:36.815 zip_arc104 GBPUSD,H1: アーカイブの読み込みに成功しました。合計ファイル数: 1

0 01:57:36.906 zip_arc104 GBPUSD,H1: Zip.UnpackZipArchive= false

0 01:57:36.906 zip_arc104 GBPUSD,H1: -------------- DDd2015.zip

0 01:57:36.912 zip_arc104 GBPUSD,H1: DDPUSD2015.zip Zip.LoadZipFromFile= true

0 01:57:36.912 zip_arc104 GBPUSD,H1: アーカイブの読み込みに成功しました。合計ファイル数: 1

1 01:57:36.912 zip_arc104 GBPUSD,H1: 'Zip.mqh' (407,28) で無効なポインタ アクセスが発生しました。

0 01:57:36.913 zip_arc104 GBPUSD,H1: uninit reason 0

0 01:57:36.915 スクリプト zip_arc104 GBPUSD,H1: 削除されました。