Проблема решена!
Исходный код был верным, Galaxy S9 необходимо было обновить до Android 9.0 Pie, чтобы работали функции setVolume()
.
Следуя совету @ Dylan, я считаю, что это просто ошибка со стороны Samsung, подкрепленная тем фактом, что обновление системы было решением.
Я, вероятно, просто пошел бы с этим:
for (int i=0; i < N; ++i)
memcpy(buffer + i * byte_sequence_length, byte_sequence, byte_sequence_length);
Это предполагает, что Вы имеете дело с двоичными данными и отслеживаете длину, не используя '\0'
завершение.
Если Вы хотите, чтобы они были струнами до, необходимо будет выделить дополнительный байт и включить '\0'
конец. Учитывая струну до и целое число, Вы хотели бы сделать это как это:
char *RepeatN(char *source, size_t n)
{
assert(n >= 0 && source != NULL);
size_t length = strlen(source) - 1;
char *buffer = new char[length*n + 1];
for (int i=0; i < n; ++i)
memcpy(buffer + i * length, source, length);
buffer[n * length] = '\0';
}
Повторение буфера при предотвращении адресной арифметики с указателями:
Можно использовать станд.:: вектор <символ> или станд.:: строка для создания вещей легче для Вас. Оба из этих контейнеров могут содержать двоичные данные также.
Это решение имеет хорошие свойства что:
.
//Note this works even for binary data.
void appendSequenceToMyBuffer(std::string &sBuffer
, const char *byte_sequence
, int byte_sequence_length
, int N)
{
for(int i = 0; i < N; ++i)
sBuffer.append(byte_sequence, byte_sequence_length);
}
//Note: buffer == sBuffer.c_str()
Альтернатива: Для двоичных данных с помощью memcpy:
buffer = new char[byte_sequence_length*N];
for (int i=0; i < N; ++i)
memcpy(buffer+i*byte_sequence_length, byte_sequence, byte_sequence_length);
//...
delete[] buffer;
Альтернатива: Поскольку пустой указатель завершил строковые данные с помощью strcpy:
buffer = new char[byte_sequence_length*N+1];
int byte_sequence_length = strlen(byte_sequence);
for (int i=0; i < N; ++i)
strcpy(buffer+i*byte_sequence_length, byte_sequence, byte_sequence_length);
//...
delete[] buffer;
Альтернатива: Если Вы заполняете буфер единственным значением:
buffer = new char[N];
memset(buffer, byte_value, N);
//...
delete[] buffer;
Если N, как известно, является питанием 2, можно скопировать с первой части буфера к последующим частям, увеличивание суммы скопировало каждый раз:
assert((N > 0) && ((N & (N-1)) == 0));
memcpy(buffer, byte_sequence, byte_sequence_length);
for (size_t i = 1; i < N; i *= 2)
memcpy(buffer + i * byte_sequence_length, buffer, i * byte_sequence_length);
Править: Это тривиально для расширения этого для работы, когда N не является питанием 2. Вот улучшенная версия, которая удаляет все ограничения на N и также заменяет нечетное для оператора с некоторое время.
if (N > 0)
memcpy(buffer, byte_sequence, byte_sequence_length);
size_t copied = 1;
while (copied < N)
{
size_t tocopy = min(copied, N - copied);
memcpy(buffer + copied * byte_sequence_length, buffer, tocopy * byte_sequence_length);
copied += tocopy;
}