Erros, bugs, perguntas - página 2578

 

Experimente

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

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

Depois disto ter funcionado, voltaria a minha atenção para a wcscpy.


 
Vict:

Experimente

Depois disto ter funcionado, voltaria a minha atenção para a wcscpy.


Não, não funcionou desta forma, a corda não é passada, mas também não há problema.
Isto funciona sem o zero, mas o fim da corda está a flutuar com caracteres extra.

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);
}
 
Inicializo com um ponteiro de tamanho, e uso um ponteiro em memória, por isso 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:


Não, não funciona assim, a corda não é passada, mas também não há problema.
Mas funcionou assim, mas mais uma vez a ponta da corda está a flutuar com caracteres extra.

Leia a std::wcslen docs cuidadosamente.

Retorna o comprimento de um fio largo, ou seja, o número de caracteres de largura não nula que precede o carácter de largura nula que termina.

Se não o fizer por atacado, google help mi:

Retorna o comprimento de uma corda larga, ou seja, o número de caracteres de largura não nula que precede o carácter de largura nula que termina. Se não acreditarmos de todo, passamos um cheque:

#include <iostream>
#include <cwchar>

int main()
{
        const wchar_t* text = L"12345";
        std::cout << std::wcslen(text);
        return 0;
}
Lançamento e ver:

Reescrever:

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

Conclusão: Primeiro lemos as docas, não compreendemos, vamos ao fórum, lemos o fórum, lembremo-nos que alguém que escreve no fórum, provavelmente o mesmo guru que você, respectivamente, depois do fórum voltar a abrir as docas, escreva um teste, ohrenzied pelo conhecimento de um guru no fórum, considerem-se inteligentes como um pato, escrevam código, ohrenzied por insectos, novamente um ciclo docas-fórum, aprendam sobre o ub, descubram onde o erro, ohrenzied pela sua estupidez.

É mais ou menos assim que funciona.

PS. Isto é C, isto é hardcore, aqui não deve fumar fóruns, apenas publicações e documentos sérios, apenas o seu próprio cérebro.

 
Roman:


Não, não funcionou, o fio não é passado, mas também não há problema.
Mas funcionou desta forma sem zero, mas flutua a ponta da corda com caracteres extra.

Se não funcionou, então um fio vazio foi alimentado com a entrada. A minha opção está correcta e a sua não está a funcionar.

#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

Escreve-se sem rodeios o tampão com uma grande margem, naturalmente a linha desejada também é capturada.

 
Vladimir Simakov:

PS. Isto é C, isto é hardcore, não há aqui fóruns para fumar, apenas publicações e documentos sérios, apenas o seu próprio cérebro.

Este hardcore(wcslen(data)+1) já tentei, e agora que experimentei a vossa versão, a corda não é copiada de todo.

 
Roman:

Este hardcore(wcslen(data)+1) já tentei, e agora tentei a sua opção, a corda não copia de todo.

E o que significa o segundo parâmetro em memspy_s?

 
Vladimir Simakov:

O que significa o segundo parâmetro na função memspy_s?

Deixe-me tentar adivinhar

- comprimento da corda fora, apenas +1 caracter, que /000 esqueceu.

 
Vict:

Se não funcionou, então um fio vazio foi alimentado com a entrada. A minha opção está correcta e a sua não está a funcionar.

Está estupidamente a sobrepor o tampão com uma grande margem, é claro, que a corda certa também é capturada.

Como é que um fio vazio? Quando o fio vem de uma tomada, em outras variantes embora esteja torto, mas não está vazio.
Não estou a dizer que a sua variante está errada, mas na sua variante utiliza um conjunto de cordel.
No meu caso, é um ponteiro.

const wchar_t* data = getData();

A função socket retorna um ponteiro para const wchar_t*.
Porque eu culpo o bug em mql, porque tentei tantas funções C diferentes, hardcore +1 ou +2.
Simplesmente não vai funcionar.

 
Vladimir Simakov:
Deixe-me tentar adivinhar

- comprimento da corda fora, apenas +1 caracter, que /000 esqueceu.

Se se refere a isto

StringInit(out, 201, 32);

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

Depois a corda é copiada muito raramente, e com grandes desfasamentos.
Esta variante já foi experimentada logo no início, recuar um par de páginas, afixei aí screenshots.

Aqui está o mesmo comportamento que na segunda captura de ecrã, os modders porque é que os nomes dos ficheiros no krakozrabry substituíram.

Vê, mesmo esta funçãowcscpy(out, dados); que conta automaticamente o comprimento da corda, causa o mesmo comportamento, o tempo a saltar a corda inteira.