Re: std::string, можно ли передавать &s[0] как буфер?
От: Abyx Россия  
Дата: 21.08.14 14:52
Оценка: +2
Здравствуйте, sanx, Вы писали:

S>Например:

S>
S>    std::string result(len + 1, '\0');
S>    int retLen = ::WideCharToMultiByte(CP_UTF8, 0, str.c_str(), str.size(), &result[0], len + 1, NULL, NULL);
S>    if (!(retLen && retLen == len && SUCCEEDED(::GetLastError())))
S>        return std::string();
S>    result.resize(retLen);
S>    return result;
S>

S>Так можно? Или только вектор?

в теории — можно, начиная с С++11
на практике можно было и в С++03, но не во всех компиляторах
In Zen We Trust
std::string, можно ли передавать &s[0] как буфер?
От: sanx  
Дата: 21.08.14 14:48
Оценка:
Например:
    std::string result(len + 1, '\0');
    int retLen = ::WideCharToMultiByte(CP_UTF8, 0, str.c_str(), str.size(), &result[0], len + 1, NULL, NULL);
    if (!(retLen && retLen == len && SUCCEEDED(::GetLastError())))
        return std::string();
    result.resize(retLen);
    return result;

Так можно? Или только вектор?
string
Re: offtop
От: rus blood Россия  
Дата: 21.08.14 19:12
Оценка:
Здравствуйте, sanx, Вы писали:

S>
S>    std::string result(len + 1, '\0');
S>    int retLen = ::WideCharToMultiByte(CP_UTF8, 0, str.c_str(), str.size(), &result[0], len + 1, NULL, NULL);
S>    if (!(retLen && retLen == len && SUCCEEDED(::GetLastError())))
S>        return std::string();
S>    result.resize(retLen);
S>    return result;
S>


1. Что такое
SUCCEEDED(::GetLastError())
?

2. Почему такое требование
retLen == len
?
Для CP_UTF8 это будет верно только для английского текста.

3.
std::string result(len + 1, '\0');

Выделяет буфер и заполняет его нулями.
Зачем заполнять нулями, если затем туда пишется текст?
Имею скафандр — готов путешествовать!
Re[2]: offtop
От: flаt  
Дата: 22.08.14 06:21
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>3.
std::string result(len + 1, '\0');

RB>Выделяет буфер и заполняет его нулями.
RB>Зачем заполнять нулями, если затем туда пишется текст?

Наверное, чтобы не писать в две строки:
std::string s; s.resize(len+1);
Re[2]: offtop
От: B0FEE664  
Дата: 27.08.14 16:58
Оценка:
Здравствуйте, rus blood, Вы писали:

S>>
S>>    std::string result(len + 1, '\0');
S>>    int retLen = ::WideCharToMultiByte(CP_UTF8, 0, str.c_str(), str.size(), &result[0], len + 1, NULL, NULL);
S>>    if (!(retLen && retLen == len && SUCCEEDED(::GetLastError())))
S>>        return std::string();
S>>    result.resize(retLen);
S>>    return result;
S>>


RB>1. Что такое
SUCCEEDED(::GetLastError())
?

видимо это проверка на ERROR_NO_UNICODE_TRANSLATION

RB>2. Почему такое требование
retLen == len
?

RB>Для CP_UTF8 это будет верно только для английского текста.
не только.
И каждый день — без права на ошибку...
Re[2]: std::string, можно ли передавать &s[0] как буфер?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 27.08.14 21:27
Оценка:
Здравствуйте, Abyx, Вы писали:

A>в теории — можно, начиная с С++11

A>на практике можно было и в С++03, но не во всех компиляторах

Очень интересен список компиляторов и/или версий stl, в которых это возможно для С++03.
У меня просто куча кода для С++03, в которой я предполагал, что так делать нельзя. Но было бы интересно соптимизировать для отдельных компиляторов.
Маньяк Робокряк колесит по городу
Re[3]: offtop
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 27.08.14 21:52
Оценка:
Здравствуйте, B0FEE664, Вы писали:

RB>>1. Что такое
SUCCEEDED(::GetLastError())
?

BFE>видимо это проверка на ERROR_NO_UNICODE_TRANSLATION

Это кривизна, основанная на том, что WinAPI ошибки и ошибки COM используют 0 для обозначения результата "всё хорошо/нет ошибки". Так делать не следует.
Маньяк Робокряк колесит по городу
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.