Hatalar, hatalar, sorular - sayfa 2579

 
Roman :

Boş bir dizeye ne dersiniz? Soketten gelen dizi geldiğinde, diğer durumlarda, bir eğri olmasına rağmen, boş değildir.
Sürümünüzün doğru olmadığını söylemiyorum, ancak sürümünüzde bir dizi dizi kullanıyorsunuz.
Benim durumumda bu bir işaretçi

soket işlevi, işaretçiyi const wchar_t'ye döndürür*
Bu yüzden mql bug'ında günah işliyorum, çünkü herhangi bir C-S fonksiyonunu denemedim, +1 veya +2 ile hardcore olanları kullandım.
Hiç gitmiyor.

Memcpy () den sonraki satırları dosyaya paralel olarak yazın, eğer μl suçlanacaksa (çağrıların üzerinde kopyalama argümanları olan bir çeşit sarmalayıcı var), o zaman dosya muhtemelen boş olmayacaktır.

Not: peki, her ihtimale karşı - µl'de kitaplık işlevi bir bağlantı ile bildirilir mi? void fn(string & s)?
 
Vict :

Memcpy () den sonraki satırları dosyaya paralel olarak yazın, eğer μl suçlanacaksa (çağrıların üzerinde kopyalama argümanları olan bir çeşit sarmalayıcı var), o zaman dosya muhtemelen boş olmayacaktır.

Not: peki, her ihtimale karşı - µl'de kitaplık işlevi bir bağlantı ile bildirilir mi? void fn(string & s)?

Tüm satırları ya yorumlarda grafikte ya da terminalin baskısında gösteriyorum, satır geldiğinde yorumda bir eğri olup olmadığı hemen anlaşılıyor.
Büyük zaman boşlukları olduğunda, çizgi nadiren grafikte görünür ve baskıda delikler vardır.
Hiç şüphe yok ki, soketten bir string gelmiyor, kene verisi milisaniye frekansında alınıyor.
getData() soketinden, bir değişkene bir işaretçi aldık, işaretçi değişkeninden onu hemen mql'ye kopyaladım, herhangi bir sarmalayıcıya değil.
Evet, Feng Shui'ye göre beyan edilmiştir))

 #import "ExampleDll.dll"
   void Func( string task, string & out);
#import
Genel olarak, mql dizesiyle ilgili herhangi bir sorun için. Zaten birçok seçenek denendi ve test edildi.
Soketten gelen dizi, bir sıfır terminali ve en güvenilir test işlevi ile birlikte gelir.
wcscpy(out, data);
или
wcsncpy(out, data, wcslen(data));  //wcslen(data)+1
sorunu tam olarak mql'de gösterir

Genel olarak, şimdilik sizeof (wichar_t *) ile davranışa bakacağım.
Ama muhtemelen kendimi MQ'dan gelen değişikliklerden korumak için, muhtemelen gerçekten diziler üzerine dizeler yazacağım.
 
Ama muhtemelen kendimi MQ'dan gelen değişikliklerden korumak için, muhtemelen gerçekten diziler üzerine dizeler yazacağım.

Altın sözler. Tabii ki, string kullanmak istiyorum, ancak dll'ye aktarıldığında uygulanmasını ve/veya davranışını açıklayan bir standardın olmaması nedeniyle, bu saf ub. Ve böylece, kısaca string[] ve diziyi sakince geçersiniz, tek şey diziyi oluşturma ve kopyalamanın ek yüküdür.

not. Yine de bana öyle geliyor ki sorun mql'de değil, lib'inizde. Tüm testlerim normal bir şekilde geçti ve orada mantıksal olarak hatalı bir şey yok, string wchar_t * üzerinde oldukça önemsiz bir sarmalayıcıdır, ancak büyük olasılıkla wstring üzerinde, onu mahvetmek için.

 
Vladimir Simakov :

Altın sözler. Tabii ki, string kullanmak istiyorum, ancak dll'ye aktarıldığında uygulanmasını ve/veya davranışını açıklayan bir standardın olmaması nedeniyle, bu saf ub. Ve böylece, kısaca string[] ve diziyi sakince aktarırsınız, tek şey diziyi oluşturmak ve kopyalamak için ek yük olmasıdır.

not. Yine de bana öyle geliyor ki sorun mql'de değil, lib'inizde. Tüm testlerim normal bir şekilde geçti ve orada mantıksal olarak hatalı bir şey yok, string wchar_t * üzerinde oldukça önemsiz bir sarmalayıcıdır, ancak büyük olasılıkla wstring üzerinde, onu mahvetmek için.

Libu hakkında da şüphelerim vardı, olası sebeplerden hiçbir şeyi dışlamıyorum.
Ama soketten aldığım stringi ASCII kodlarına çevirdim, stringin doğru olduğu görülüyor.
Sırada basit bir kopya geliyor,
mql, bir dizgeye işaretçiyi doğru şekilde kabul etmiyor.

Dosyalar:
1.PNG  32 kb
 
Roman :

Tüm satırları ya yorumlarda grafikte ya da terminalin baskısında gösteriyorum, satır geldiğinde yorumda bir eğri olup olmadığı hemen anlaşılıyor.
Büyük zaman boşlukları olduğunda, çizgi nadiren grafikte görünür ve baskıda delikler vardır.
Hiç şüphe yok ki, soketten bir string gelmiyor, kene verisi milisaniye frekansında alınıyor.
getData() soketinden, bir değişkene bir işaretçi aldık, işaretçi değişkeninden onu hemen mql'ye kopyaladım, herhangi bir sarmalayıcıya değil.
Evet, Feng Shui'ye göre beyan edilmiştir))

Genel olarak, mql dizesiyle ilgili herhangi bir sorun için. Zaten birçok seçenek denendi ve test edildi.
Soketten gelen dizi, bir sıfır terminali ve en güvenilir test işlevi ile birlikte gelir.
sorunu tam olarak mql'de gösterir

Genel olarak, şimdilik sizeof (wichar_t *) ile davranışa bakacağım.
Ama muhtemelen kendimi MQ'dan gelen değişikliklerden korumak için, muhtemelen gerçekten diziler üzerine dizeler yazacağım.

Bir dosyaya yazmak - dll tarafında demek istedim, eğer dosyaya yazılmışsa, ancak µl'ye girmiyorsa, bunlar zaten bir hata hakkında bir ifade içeren ağır argümanlardır, düzeltebilirler.

Ve isteğiniz dışında bir sarıcı var, MQ kodu/adresleri dış dünyadan saklıyor, her şey dolaylı olarak gidiyor.

 
Vict :

Bir dosyaya yazmak - dll tarafında demek istedim, eğer dosyaya yazılmışsa, ancak µl'ye girmiyorsa, bunlar zaten bir hata hakkında bir açıklama içeren ağır argümanlardır, düzeltebilirler.

Ve isteğiniz dışında bir sarıcı var, MQ kodu/adresleri dış dünyadan saklıyor, her şey dolaylı olarak gidiyor.

Alınan satırları bir dosyaya yazın.
Soket işlevi bir dizgeye bir işaretçi döndürdüğünden, dosyaya dizeye bir işaretçi yazılır ve ardından bu işaretçi mql'ye kopyalanır.
işlevi kullanma

wcscpy(out,  data);

Ortaya çıkan dizenin uzunluğu 164, 200 mql olarak tahsis edilmiştir

 StringInit (out, 200 , 32 );

mql'de alınan kopyalanan dizenin uzunluğu eşittir, ancak kopyalamada ciddi boşluklar vardır.
Mql betiğinde while döngüsü Sleep(1) ile dönüyor

Dosyalar:
458.PNG  71 kb
 
Ve eğer işlevi kullanırsanız
wcsncpy(out, data, wcslen(data));
O zaman boşluk yok, ancak kopyalanan satırlar eşit değil, satırın sonunda fazladan karakterler görünüyor.
wcslen(data)+1 eklemek yardımcı olmuyor .

Sonuç, buraya yazdığım tüm sayfalardan.
mql-ovsky dizesi, kopyalanan işaretçiyi dll'den const wchar_t* dizesine doğru şekilde kabul etmiyor
Dosyalar:
w6b.PNG  74 kb
qjv2.PNG  73 kb
09i3.PNG  6 kb
 
Roman :

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.

Bazen doğru olanı yaparsın ve işe yaramaz.

Yanlış yapıyorsun - işe yarıyor gibi görünüyor.

Bu gibi durumlarda doğru olanı yapmanız ve hatayı başka yerde aramanız gerekir.

 
Roman :

Alınan satırları bir dosyaya yazın.
Soket işlevi bir dizgeye bir işaretçi döndürdüğünden, dosyaya dizeye bir işaretçi yazılır ve ardından bu işaretçi mql'ye kopyalanır.
işlevi kullanma

Ortaya çıkan dizenin uzunluğu 164, 200 mql olarak tahsis edilmiştir

mql'de alınan kopyalanan dizenin uzunluğu eşittir, ancak kopyalamada ciddi boşluklar vardır.
Mql betiğinde while döngüsü Sleep(1) ile dönüyor

1. MQL'de bir işaretçi değil, bir dize kopyalanır.

2. MQL'de 200 karakterlik bir dizi seçtiniz. Sonra içine 164 karakter kopyaladık. Bundan sonra, MQL'deki dizenin boyutuna bakın. 200'de kaldı.

 
Koldun Zloy :

Bazen doğru olanı yaparsın ve işe yaramaz.

Yanlış yapıyorsun - işe yarıyor gibi görünüyor.

Bu gibi durumlarda doğru olanı yapmanız ve hatayı başka yerde aramanız gerekir.

Bunun doğru olması için memcpy'yi terk ettim ve wcscpy veya wcsncpy kullandım.
Sonuç, yukarıya yaz.