Hatalar, hatalar, sorular - sayfa 2577

 
Igor Makanu :

bu seçeneği biliyorum

Sonra sıfıra bölün .

 
fxsaber :

Sonra sıfıra bölün .

mon...umut vardı, ama her zaman olduğu gibi sadece hardcore)))

 
Vict :

ZY: Genel olarak hatlarla iletişim kuramıyor musunuz? dizileri wchar_t içine kaydedin ve onları sürün ve gerekirse µl içinde dizeye dönüştürün https://www.mql5.com/en/docs/convert/shortarraytostring

Kabul ediyorum

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

WinAPI -> MQL5 x64

A100 , 2018.05.29 14:11

Tüm kurallar söylendi. Her zaman çalışmasını istiyorsanız, ushort kullanmanız gerekir ve neden aniden string ile çalışmayı bıraktığını (dün ne işe yaradığını) bulmak istiyorsanız - o zaman string kullanabilirsiniz.

 
Vict :

burada sınırların dışındasın


StringInit(out, 165, 32); içindeki başlatılmış dizenin uzunluğunu kontrol etmeyi düşündürdünüz.

Help StringInit, ikinci parametrenin dizenin uzunluğu olduğunu, dizenin uzunluğunun anladığım kadarıyla dizedeki karakter sayısı olduğunu söylüyor.
Benim durumumda, giriş dizesi 164 karakterden oluşuyor, bu yüzden ikinci parametrede 165'i belirledim, *2, 330'dan fazlasını denedim.

Bir işaretçi ile memcpy_s kullanarak,

memcpy_s( out , wcslen(data) * sizeof (wchar_t*), data, wcslen(data) * sizeof (wchar_t*));

sonuç aynıydı, dizenin sonu her zaman karakter sayısına göre yüzer ve ayrıştırma sırasında sızıntılar olur.
İşaretçi olmadan, dize de yüzer.

Ama burada bana bir fikir verdiniz ve StringInit(out, 1400, 32) içinde stringin uzunluğunu değil, pointer'ın byte cinsinden boyutunu belirledim.
Ve bakın, satır ekstra çıktı karakterleri olmadan, sorunsuz bir şekilde çözümlendi ve tek bir sızıntı olmadı.
Dizenin bir işaretçi olmadan yüzdüğü boyutunda bir işaretçi olduğunu belirtmek isterim.

Bu, geliştiricilere soruyu soruyor, StringInit yardımı doğru mu ???
Dizenin uzunluğu, yardımda mı yoksa StringInit işlevinin kendisinde mi dizenin boyutuyla karıştırılıyor?
Genel olarak, şimdi memcpy kullanıyorsanız, işaretçinin boyutunu geçerseniz düzgün çalışır ve StringInit uzunlukla değil bu boyutla başlatılır!

 
A100 :

Kabul ediyorum

Evet, ben de katılıyorum. Ancak bir diziyi dizi olarak kullanmak her zaman uygun değildir, özellikle bu dizinin birkaç işlevden geçirilmesi gerektiğinde.
Bu durumda, işaretçiler daha uygundur, bu diziyi yeniden doldurmak için her geçiş işlevinde gerekli değildir ve ayrıca dizi için bir parametre daha, boyutu girmek.

 
A100 :

Böylece, açıkça aşırı boyutta bir arabellek tahsis ettiniz (sınır taşındı) ve hata görünmüyor - çünkü tam olarak sınırda meydana geldi

Ben de öyle düşündüm, dizenin uzunluğu 164, onu 165'e ayarla, 330'a ayarla.
Dizeler karakter olarak sayılıyorsa, 330 açıkça dize uzunluğu sınırı değildir.
Bunun uzunlukla ilgili değil, bayt boyutuyla ilgili olduğu ortaya çıktı.
Ancak yardım tam tersini söylüyor, StringInit tam olarak uzunluğa sahip olmalı.

Genel olarak, anladığım kadarıyla, mql string tipi bir işaretçidir ve bu tip ile bir işaretçi gibi çalışmanız gerekir.

 
Ayrıca, dll'deki sonuçtaki dizgiyi bir terminal sıfırının varlığı için kontrol etmeye karar verdim.
sıfır mevcut
 for ( int index = 0 ; index <= wcslen(data); ++index)
   wcout << static_cast< int >(data[index]) << " " ;
 123 34 101 34 58 34 97 103 103 84 114 97 100 101 34 44 34 69 34 58 49 53 54 57 54 50 52 50 50 57 50 51 54 44 34 115 34 58 34 66 84 
67 85 83 68 84 34 44 34 97 34 58 49 54 54 50 49 57 49 55 53 44 34 112 34 58 34 56 50 48 50 46 49 48 48 48 48 48 48 48 34 44 34 113 
34 58 34 48 46 48 51 51 50 51 48 48 48 34 44 34 102 34 58 49 56 51 57 54 49 54 55 50 44 34 108 34 58 49 56 51 57 54 49 54 55 50 44 
34 84 34 58 49 53 54 57 54 50 52 50 50 57 50 51 49 44 34 109 34 58 116 114 117 101 44 34 77 34 58 116 114 117 101 125 0
 
Roman :

Israr ediyorsan, yolun ol.

 
Roman :

Ben de öyle düşündüm, dizenin uzunluğu 164, onu 165'e ayarla, 330'a ayarla.
Dizeler karakter olarak sayılıyorsa, 330 açıkça dize uzunluğu sınırı değildir.
Bunun uzunlukla ilgili değil, bayt boyutuyla ilgili olduğu ortaya çıktı.
Ancak yardım tam tersini söylüyor, StringInit tam olarak uzunluğa sahip olmalı.

Genel olarak, anladığım kadarıyla, mql string tipi bir işaretçidir ve bu tip ile bir işaretçi gibi çalışmanız gerekir.

mql dize türü, bir işaretçi, dize uzunluğu ve muhtemelen başka bir şey içeren bir yapıdır.

DLL'ye bir dize ilettiğinizde, yalnızca bir işaretçi iletilir. Dizenin uzunluğu manuel olarak iletilmelidir.

Ve her zaman çizginin ötesine geçmemeye dikkat edin.

Tüm satır boyutu değişiklikleri yalnızca MQL tarafındadır.

DLL tarafında, kullandığınız fonksiyonlar için yardımı dikkatlice okumanız gerekir. Bütün problemlerin bundan ibaret.

sizeof( wchar_t* ) bir işaretçinin boyutunu döndürür. İhtiyacınız olan şey bu değil.

 
Koldun Zloy :

mql dize türü, bir işaretçi, dize uzunluğu ve muhtemelen başka bir şey içeren bir yapıdır.

DLL'ye bir dize ilettiğinizde, yalnızca bir işaretçi iletilir. Dize uzunluğu manuel olarak iletilmelidir.

Ve her zaman çizginin ötesine geçmemeye dikkat edin.

Tüm satır boyutu değişiklikleri yalnızca MQL tarafındadır.

DLL tarafında, kullandığınız fonksiyonlar için yardımı dikkatlice okumanız gerekir. Bütün problemlerin bundan ibaret.

sizeof( wchar_t* ) bir işaretçinin boyutunu döndürür. İhtiyacınız olan şey bu değil.

Bu doğru, çıkış dizesi için bir arabellek ayırıyorum ve onu boşluklarla başlatıyorum.
Ayrıca bu satırı (işaretçi) dll'ye aktarıyorum.

 string out ;
StringInit ( out , 1400 , 32 );

Func( out );

Dll'de wchar_t * verileri dışarı, yani ayrıca bir işaretçiye kopyalanır. Mantıken, bir sorun olmamalı.
Anladığım kadarıyla, yardıma göre, StringInit işlevi, dizenin uzunluğunu ayarlamalıdır.
Ancak StringInit işlevinin kendisiyle ilgili hala bazı yanlış anlamalar var, dizenin uzunluğunu, çöplerin tırmandığını, işaretçinin boyutunu belirtti, her şey çalıştı.
Dize uzunluğunun ne tür bir manuel iletimini kastettiğini anlamadım.

Sizeof(wchar_t) işaretçi olmadan kullanırsanız, dize fazladan karakterlerle yüzmeye başlar, bu da ayrıştırma ve sızıntı ile ilgili bir soruna neden olur.
Dizeleri dll'ye aktarmak için Renat'ın dll'nin nasıl yazılacağı konusundaki makalesinden örnek kullanıldı.
Ama herhangi bir nedenle, sizeof(wchar_t) işaretçisi olmadan iletirsem, dize yüzer, ancak sizeof(wchar_t*) işaretçisiyle ilgili herhangi bir sorun yoktur.
Onlara mantıklı geliyor, ancak dizeyi işaretçi olarak kopyalıyorum, o zaman boyut bir tür olarak değil işaretçi olarak iletilmelidir.