send(someId, (char*)&(newSco.data.begin()), newSco.data.size() )
У вас это почти получилось, но не совсем.
Вот почему:
begin()
дает вам итератор.Вы берете адрес этого итератора, так что вы на некотором уровне косвенности.Использование приведения в стиле C маскирует то, что в противном случае было бы ошибкой компиляции, связанной с типом.
Мы могли бы вместо этого написать (char*)&*(newSco.data.begin())
, чтобы разыменовать итератор, а затем взять адрес полученного первого элемента.
Но если контейнер был пуст, это очень сломано.Вы не можете разыменовать вещь, которая не существует.
Так что теперь мы пытаемся:
send(someId, (char*)&newSco.data[0], newSco.data.size() )
К сожалению, это также небезопасно, если контейнер пуст, поскольку .data[0]
также эффективно разыменовывает элемент, который может не существовать.Некоторые утверждают, что подразумеваемое &*
«отменяет это», но это противоречиво, и я никогда не верил этому.
Если вы когда-нибудь перейдете на C ++ 11 или более позднюю версию, вы можете использовать совершенно безопасный метод:
send(someId, (char*)newSco.data.data(), newSco.data.size() )
В противном случае используйте &newSco.data[0]
, но пропустите весь вызов send
, когда newSco.data.size()
равен нулю .Не могу этого подчеркнуть.
Приведение к char*
само по себе безопасно;вы можете свободно интерпретировать uint8_t
с как char
с таким образом;для этого есть особое правило.Я сам использовал этот паттерн несколько раз.
Но, как и выше, бросок в стиле C не идеален.Предпочитаю хороший переосмысление.Я также добавил бы const
для хорошей меры (пропустите это, если API вашего MC не разрешает это):
if (!newSco.data.empty())
{
send(
someId,
reinterpret_cast<const char*>(&newSco.data[0]),
newSco.data.size()
);
}
Там.Великолепный.10
В качестве заключительного замечания, поскольку API принимает char
для конечного параметра, я хотел бы рассмотреть возможность установки верхней границы для размера контейнера.Вы можете запустить функцию в цикле, посылая одновременно CHAR_MAX
или newSco.data.size()
байтов (в зависимости от того, что меньше).В противном случае, если вы ожидаете больше чем CHAR_MAX
элементов в контейнере, вы получите неприятное переполнение!