2014-10-12 1 views
0

Извините, если заголовок не имеет смысла, я смотрел на свой монитор в течение 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 можно вызвать, чтобы записать общее количество значений в файл.

Это имеет смысл? Любые советы о том, как реально реализовать его?

Заранее спасибо.

ответ

1

Предполагая, что второй аргумент receive_into_buffer в единицу буферного элемента, а не байт, следующий должен работать,

int16_t *buffer = calloc(total_values_to_receive, 2 * sizeof(buffer[0])); 
int16_t *temp = buffer; 

while (!done){ 
    receive_into_buffer(temp, num_values_to_receive_per_pass); 
    temp += 2 * num_values_to_receive_per_pass; 

    values_received += num_values_to_receive_per_pass; 
    if (values_received == total_values_to_receive){ 
     done = true; 
    } 
} 
fwrite(buffer, 2 * sizeof(buffer[0]), total_values_to_receive, file); 
+0

Спасибо за ваш ответ, это было очень полезно. Тем не менее, значения, которые я ожидаю найти в буфере, отсутствуют, сравнивая мою предыдущую реализацию записи с файлом после завершения каждого 'receive_into_buffer'. Что-то может произойти неправильно под капотом (так как это библиотечная функция), я сделаю еще несколько тестов для подтверждения. – user2742907

+0

@ user2742907 Добро пожаловать. Каков тип 'samples' в вызове' calloc'? – downhillFromHere

+0

Это тип, он должен быть буфером [0], таким образом, также int16_t. – user2742907

1

Стиль: равнина для() цикл будет избежать индикаторной переменной:

for (values_receive=0; values_received < total_values_to_receive; values_received += num_values_to_receive_per_pass) { 

    receive_into_buffer(buffer, num_values_to_receive_per_pass); 

    fwrite(buffer, 2 * sizeof(samples[0]), num_values_to_receive_per_pass, file); 

}