Hatalar, hatalar, sorular - sayfa 2578

 

Denemek

StringInit( out , 200 , 32 );
...

if ( memcpy_s( out , 200 * sizeof (wchar_t), data, wcslen(data)* sizeof (wchar_t)+ sizeof (L '\0' )) ) {
   // что-то пошло не так
}

Bu çalışmalardan sonra wcscpy'ye bakardım.


 
Vict :

Denemek

Bu çalışmalardan sonra wcscpy'ye bakardım.


Hayır, o şekilde çalışmadı, string iletilmiyor ama herhangi bir problem de yok.
Sıfır olmadan bu şekilde çalıştı, ancak satırın sonu fazladan karakterlerle bu şekilde yüzüyor.

 StringInit (out, 200 , 32 );
 if (memcpy_s(out, 200 * sizeof (wchar_t), data, wcslen(data) * sizeof (wchar_t)))     // + sizeof(L'\0'))) 
{
   MessageBoxW( NULL , L "Problem" , L "Problem" , MB_OK );
}
 
İşaretçinin boyutuyla başlatıyorum ve memcpy'de işaretçiyi kullanıyorum, bu yüzden her şey yolunda :))
 StringInit (out, 1400 , 32 );

if (memcpy_s(out, 200 * sizeof (wchar_t*), data, wcslen(data) * sizeof (wchar_t*)))  
{
   MessageBoxW( NULL , L "Problem" , L "Problem" , MB_OK );
}
 
Roman :


Hayır, o şekilde çalışmadı, string iletilmiyor ama herhangi bir problem de yok.
Ve bu şekilde çalıştı, ama yine satırın sonu fazladan karakterlerle yüzüyor.

std::wcslen'deki dock'ları dikkatlice okuyoruz

Geniş bir dizenin uzunluğunu, yani sonlandırıcı boş geniş karakterden önce gelen boş olmayan geniş karakterlerin sayısını döndürür.

Anlamadıysan google yardım et:

Geniş bir dizenin uzunluğunu, yani sonlandırıcı bir boş geniş karakterden önce gelen boş olmayan geniş karakterlerin sayısını döndürür. Hiç inanmıyorsak, bir çek yazarız:

 #include <iostream>
#include <cwchar>

int main()
{
         const wchar_t* text = L "12345" ;
        std::cout << std::wcslen(text);
         return 0 ;
}
Koşuyoruz ve görüyoruz:

yeniden yazma:

 if (memcpy_s( out , 200 * sizeof (wchar_t), data, (wcslen(data)+ 1 ) * sizeof (wchar_t))) 

Sonuç: Önce rıhtımları okuduk, anlamadık, foruma gittik, forumu okuduk, forumda yazan kişinin muhtemelen sizinle aynı guru olduğunu hatırlıyoruz, forumdan sonra sırasıyla biz dock'u tekrar aç, bir test yaz, forumdaki gurunun bilgisi ile sikişiyoruz, kendimizi ördek gibi akıllı görüyoruz, kod yazıyoruz, böceklerden sikiliyoruz, yine doki-forum döngüsü, öğreniyoruz ub hakkında, nerede hata yaptığımızı buluruz, aptallığımızdan sikiriz.

Hemen hemen böyle oluyor.

not. Burası C, bu hardcore, burada forumlar içmemelisin, sadece ciddi yayınlar ve rıhtımlar, sadece beynin.

 
Roman :


Hayır, o şekilde çalışmadı, string iletilmiyor ama herhangi bir problem de yok.
Sıfır olmadan bu şekilde çalıştı, ancak satırın sonu fazladan karakterlerle bu şekilde yüzüyor.

İşe yaramadıysa, girdi boş bir dizeydi. Sürümüm doğru ve çalışıyor, sizinki değil.

#include <cstring>
#include <iostream>
using namespace std;

int main() {
        wchar_t out [ 200 ];
        wchar_t data[] = L "Hello world" ;
        memcpy( out , data, wcslen(data)* sizeof (wchar_t)+ sizeof (L '\0' ));
        wcout << "string = " << out << endl;
}
// string = Hello world

Aptalca büyük bir kenar boşluğu ile arabelleğin üzerine yazarsınız, doğal olarak istenen satır da yakalanır.

 
Vladimir Simakov :

not. Burası C, bu hardcore, burada forumlar içmemelisin, sadece ciddi yayınlar ve rıhtımlar, sadece beynin.

Bu hardcore (wcslen(data)+ 1 ) zaten denedim ve şimdi sürümünüzü denedim, dize hiç kopyalanmıyor.

 
Roman :

Bu hardcore (wcslen(data)+ 1 ) zaten denedim ve şimdi sürümünüzü denedim, dize hiç kopyalanmıyor.

Ve memspy_s işlevindeki ikinci parametre ne anlama geliyor?

 
Vladimir Simakov :

Ve memspy_s işlevindeki ikinci parametre ne anlama geliyor?

tahmin etmeye çalışacağım

- dizi çıkışının uzunluğu ., /000'in unuttuğu yalnızca +1 karakter.

 
Vict :

İşe yaramadıysa, girdi boş bir dizeydi. Sürümüm doğru ve çalışıyor, sizinki değil.

Aptalca büyük bir kenar boşluğu ile arabelleğin üzerine yazarsınız, doğal olarak istenen satır da yakalanır.

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 dize dizisi kullanıyorsunuz.
Benim durumumda bu bir işaretçi

 const wchar_t* data = getData();

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.

 
Vladimir Simakov :
tahmin etmeye çalışacağım

- dizi çıkışının uzunluğu ., /000'in unuttuğu yalnızca +1 karakter.

eğer demek istiyorsan

StringInit( out , 201 , 32 );

if (memcpy_s( out , 201 * sizeof (wchar_t), data, (wcslen(data) + 1 ) * sizeof (wchar_t)))

Bu satır çok nadiren ve büyük zaman boşluklarıyla kopyalanır.
Bu seçenek zaten en başta denendi, birkaç sayfa geriye bakın, orada ekran görüntüleri yayınladım.

Burada ikinci ekrandaki davranışın aynısı , modcular nedense dosya adlarını krakozyabry ile değiştirmişler.

Görüyorsunuz, bu fonksiyon bile wcscpy( out , data); dizenin uzunluğunu otomatik olarak sayan, aynı davranışa neden olur ve tüm dizeyi geçici olarak atlar.

Neden: