Извините, если заголовок не имеет смысла, я смотрел на свой монитор в течение 15 минут, пытаясь придумать его.Переместите местоположение указателя вокруг, чтобы написать рекурсивно выделенный буфер
Я использую библиотечную функцию из API C (в 64-разрядной версии Xubuntu 14.04), чтобы переместить заданное число значений int16_t в буфер и повторить заданное количество раз, описанное здесь (вроде) псевдо-код:
int16_t *buffer = calloc(total_values_to_receive, 2 * sizeof(samples[0]));
while (!done){
receive_into_buffer(buffer, num_values_to_receive_per_pass);
fwrite(buffer, 2 * sizeof(samples[0]), num_values_to_receive_per_pass, file);
values_received += num_values_to_receive_per_pass;
if (values_received == total_values_to_receive){
done = true;
}
}
в основном то, что она делает это получить определенное количество значений на каждый проход и записывает эти значения в файл, а также отметить, что тот же файл добавляется каждый раз. Например. если total_values_to_receive = 100
и num_values_to_receive_per_pass = 10
, всего будет 10 проходов.
Что я хотел бы сделать, главным образом для увеличения скорости, состоит в том, чтобы иметь место для записи после завершения всех проходов. Прототип функции библиотеки содержит void* samples, size_t num_samples
, который, как вы догадались, относится к буферу, в котором необходимо хранить образцы, и количеству образцов для хранения.
Я не совсем уверен в указателях, но есть способ записать в буфер за один проход, а затем переместить указатель на num_values_to_receive_per_pass
, так что при следующем вызове функции библиотеки он просто добавит этот буфер (так сказать). Затем указатель можно перенести в начало буфера, а fwrite
можно вызвать, чтобы записать общее количество значений в файл.
Это имеет смысл? Любые советы о том, как реально реализовать его?
Заранее спасибо.
Спасибо за ваш ответ, это было очень полезно. Тем не менее, значения, которые я ожидаю найти в буфере, отсутствуют, сравнивая мою предыдущую реализацию записи с файлом после завершения каждого 'receive_into_buffer'. Что-то может произойти неправильно под капотом (так как это библиотечная функция), я сделаю еще несколько тестов для подтверждения. – user2742907
@ user2742907 Добро пожаловать. Каков тип 'samples' в вызове' calloc'? – downhillFromHere
Это тип, он должен быть буфером [0], таким образом, также int16_t. – user2742907