Hatalar, hatalar, sorular - sayfa 2577
Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
bu seçeneği biliyorum
Sonra sıfıra bölün .
Sonra sıfıra bölün .
mon...umut vardı, ama her zaman olduğu gibi sadece hardcore)))
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.
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,
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!
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.
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.
sıfır mevcut
Israr ediyorsan, yolun ol.
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.
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.
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.