Kütüphaneler: DLL olmadan Dosya Eşleme - sayfa 3

 
Urain:
Sanırım bir çeşit garantili test yapmamız gerekiyor. Ama henüz nasıl yapacağımı bilmiyorum.

Mantıksal olarak konuşursak, bir tutamacı kapatmak bellek alanının serbest bırakılmasına neden olur.

Ancak bu, tutamacın kapatılmasının bu alanı sıfırlaması gerektiği anlamına gelmez. Tutamaç kapatılır, yazılan veri başka bir yazılım tarafından üzerine yazılana kadar kalır. bu böyledir.

 
sergeev:
Ara verileri depolamak için dosyalar kullanırsanız, elbette yapabilirsiniz. Önemli olan, verileri bazı referans noktalarında diske sıfırlamaktır, çünkü bir şey olursa, bilgi geri alınamaz şekilde kaybolacaktır.
Eğer "bir şey olursa", gerçek bilgi her durumda kaybolacaktır. Ve ara sonuçlar, evet, demiryolundaki bir dosyaya periyodik olarak dökebilirsiniz.
 
sergeev:

Mantıksal olarak, tutamacı kapatmak bu bellek alanını serbest bırakacaktır.

Ancak bu, tutamacın kapatılmasının bu alanı sıfıra indirmesi gerektiği anlamına gelmez. Tutamaç kapatıldığında, yazılan veriler başka bir yazılım tarafından üzerine yazılana kadar kalır.

Dosya kapatılır, tutamaç yok edilir, aynı isimde bir dosya açarız ve gerekli bilgileri okuruz, ancak fikir olarak dağıtılmış alan kaybolmalı ve yok edilmiş bir dosyayı oluşturmadan açmak bir hataya neden olmalıdır. Bunun bir hata mı yoksa bir özellik mi olduğunu bilmiyorum.

#include <MemMapLib.mqh>
//+------------------------------------------------------------------+
//| Komut dosyası programı başlatma işlevi|
//+------------------------------------------------------------------+
void OnStart()
  {
   CMemMapFile *hmem=new CMemMapFile();
   int err=hmem.Open("Local\\test",111,modeCreate);// bir dosya oluşturun

   uchar data[];
   int sizedata=StringToCharArray("Hello from MQL5!",data);
   err=hmem.Write(data,sizedata);  // yaz
   ArrayInitialize(data,0);

   CMemMapFile hm;
   err=hm.Open("Local\\test",111); // dosyayı oluşturmadan aç
   uchar nextdata[];
   hm.Seek(0,SEEK_SET);
   err=hm.Read(nextdata,sizedata); // oku
   Print(CharArrayToString(nextdata));

   ArrayInitialize(data,0);
   err=hmem.Open("Local\\test",111); // dosyayı oluşturmadan aç
   hmem.Seek(0,SEEK_SET);
   err=hmem.Read(data,sizedata);     // oku
   Print("için",CharArrayToString(data));

   hmem.Close(); delete hmem; // dosyayı kapat
   hm.Close();                // dosyayı kapat

   ArrayInitialize(data,0);
   err=hm.Open("Local\\test",111);Print("err=",err);
   hm.Seek(0,SEEK_SET);
   err=hm.Read(data,sizedata);
   Print("sonra",CharArrayToString(data));
  }
//+------------------------------------------------------------------+
 
Urain:

dağıtılan alanın kaybolması ve yok edilen bir dosyayı oluşturmadan açmanın bir hataya neden olması gerekir.

Sanırım bu bir hata.

İşin püf noktası, bellekte bir dosya adı olması. Ve sistem bunu algılar.

 

Arkadaşlar, bir isteğim var.

Windows dışı olanlar da dahil olmak üzere herhangi bir API'den memcpy/strcpy kullanımına izin vermeyecek böyle bir API işlevi bulmam gerekiyor.

Yani, herhangi bir nedenden dolayı dönen işaretçinin boyutunun bilinmeyeceği veya dönen dizenin NULL sonlu olmayacağı ve boyutunun bilinmeyeceği bir durum bulun.


Lütfen bu yöntemin uygulama sınırlarını bulmama yardım edin...

 

MT5 642 Win7 64, anladığım kadarıyla çalışmıyor, sonra

hmem=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,size+HEAD_MEM,path); // bellek nesnesi oluştur

1400 hatası alıyorum,

ama Vista 32 çalışıyor.

 

Kontrol ettim, aynı hatayı aldım. Ama =6.

 
sergeev:

Kontrol ettim, aynı hatayı aldım. Ama =6.



Bir çeşit hile olmalı. Doğrudan başlatmada err=6 veriyor, ancak hata ayıklama modunda err=1400.

 
İnt veya double diziler nasıl aktarılır? Ben yapamıyorum :(
 
baramantan:
İnt veya double diziler nasıl aktarılır? Ben yapamıyorum :(
bunları sizeof(<Type>)*<Number_Elements> uzun değişkenleri olarak ele alın ve her şey çalışacaktır :)