Erreurs, bugs, questions - page 2578

 
Vict:

Essayez

Après que cela ait fonctionné, je porterais mon attention sur wcscpy.


Non, ça n'a pas fonctionné comme ça, la chaîne n'est pas passée, mais il n'y a pas de problème non plus.
Cela fonctionne sans le zéro, mais la fin de la chaîne flotte avec des caractères supplémentaires.

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);
}
 
J'initialise avec une taille de pointeur, et utilise le pointeur dans memcpy, donc c'est OK :))
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:


Non, ça ne fonctionne pas comme ça, la chaîne de caractères n'est pas transmise, mais il n'y a pas de problème non plus.
Mais ça a fonctionné comme ça, mais encore une fois la fin de la chaîne flotte avec des caractères supplémentaires.

Lisez attentivement la documentation de std::wcslen.

Renvoie la longueur d'une chaîne large, c'est-à-dire le nombre de caractères larges non nuls qui précèdent le caractère large nul de fin.

Si vous ne comprenez pas, google help mi :

Renvoie la longueur d'une chaîne large, c'est-à-dire le nombre de caractères larges non nuls qui précèdent le caractère large nul de fin. Si nous n'y croyons pas du tout, nous faisons un chèque :

#include <iostream>
#include <cwchar>

int main()
{
        const wchar_t* text = L"12345";
        std::cout << std::wcslen(text);
        return 0;
}
Lancer et voir :

Réécriture :

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

Conclusion : Tout d'abord, nous lisons les docks, ne comprennent pas, aller au forum, lire le forum, se rappeler que quelqu'un qui écrit sur le forum, probablement le même gourou que vous êtes, respectivement, après le forum de nouveau ouvert docks, écrire un test, ohrenzied par la connaissance d'un gourou sur le forum, se considèrent comme intelligent comme un canard, écrire du code, ohrenzied par les bugs, encore un cycle docks-forum, apprendre sur ub, trouver où l'erreur, ohrenzied à sa stupidité.

Voici en gros comment cela fonctionne.

PS. C'est du C, c'est du hardcore, ici vous ne devez pas fumer les forums, seulement les publications et docs sérieux, seulement vos propres cerveaux.

 
Roman:


Non, cela n'a pas fonctionné, la chaîne n'est pas passée, mais il n'y a pas de problème non plus.
Mais cela a fonctionné de cette façon sans zéro, mais cela fait flotter la fin de la chaîne avec des caractères supplémentaires.

Si cela ne fonctionnait pas, une chaîne vide était introduite dans l'entrée. Mon option est correcte et fonctionne, la vôtre ne l'est pas.

#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

Vous écrasez carrément le tampon avec une grande marge, naturellement la ligne souhaitée est également capturée.

 
Vladimir Simakov:

PS. C'est du C, c'est du hardcore, pas de forums à fumer ici, seulement des publications et des docs sérieux, seulement vos propres cerveaux.

J'ai déjà essayé ce noyau dur(wcslen(data)+1), et maintenant j'ai essayé votre version, la chaîne n'est pas du tout copiée.

 
Roman:

J'ai déjà essayé ce noyau dur(wcslen(data)+1), et maintenant j'ai essayé votre option, la chaîne ne se copie pas du tout.

Et que signifie le second paramètre de la fonction memspy_s ?

 
Vladimir Simakov:

Que signifie le deuxième paramètre de la fonction memspy_s ?

Laissez-moi essayer de deviner

- La longueur de la chaîne est dépassée, seulement +1 caractère, que /000 a oublié.

 
Vict:

Si cela ne fonctionnait pas, une chaîne vide était introduite dans l'entrée. Mon option est correcte et fonctionne, la vôtre ne l'est pas.

Vous écrasez stupidement le tampon avec une grande marge, bien sûr, que la bonne chaîne est capturée aussi.

Comment est une chaîne vide ? Lorsque la chaîne provient d'une prise, dans d'autres variantes, bien qu'elle soit tordue, elle n'est pas vide.
Je ne dis pas que votre variante est fausse, mais dans votre variante, vous utilisez un tableau de chaînes.
Dans mon cas, c'est un pointeur.

const wchar_t* data = getData();

La fonction socket renvoie un pointeur sur const wchar_t*.
Parce que je pense que c'est un bug dans mql, parce que j'ai essayé tellement de fonctions C différentes, hardcore +1 ou +2.
Ça ne marchera pas.

 
Vladimir Simakov:
Laissez-moi essayer de deviner

- La longueur de la chaîne est dépassée, seulement +1 caractère, que /000 a oublié.

Si vous voulez dire à ce sujet

StringInit(out, 201, 32);

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

Ensuite, la chaîne est copiée très rarement, et avec de grands décalages dans le temps.
Cette variante a déjà été essayée au tout début, revenez quelques pages en arrière, j'y ai posté des captures d'écran.

Voici le même comportement que dans la deuxième capture d'écran, les modders pourquoi les noms des fichiers sur le krakozrabryy remplacé.

Vous voyez, même cette fonctionwcscpy(out, data); qui compte automatiquement la longueur de la chaîne, provoque le même comportement, le temps de sauter la chaîne entière.

 
Roman:

En quoi est-ce une chaîne vide ? Lorsque la chaîne provient d'une prise, dans d'autres variantes, bien qu'elle soit tordue, elle n'est pas vide.
Je ne dis pas que votre variante est fausse, mais dans votre variante, vous utilisez un tableau de chaînes.
Dans mon cas, c'est un pointeur.

La fonction socket renvoie un pointeur sur const wchar_t *
C'est pour cela que j'impute le bug à mql, car j'ai essayé tellement de fonctions C et de hardcore +1 ou +2.
Ça ne marchera pas.

Ecrire les lignes après memcpy() en parallèle au fichier, si mql est coupable (il y a un wrapper au-dessus des appels avec copie des arguments), alors le fichier ne sera pas vide, probablement.

HH : bien, juste au cas où - dans µl la fonction de bibliothèque est déclarée avec un lien, n'est-ce pas ? void fn(string & s) ?