C ++新手。我有这个功能' Process'需要' in_buf'通常一个16字节的数据,但我正在写这个新的lineInterleaved类,它采用了这个' interleave_buf'格式。想知道这种表示格式的方式是否是用c ++编写代码的最佳方式?
struct interleave_buf {
int32_t data_1_[8][128];
int32_t data_2_[2][128];
int16_t data_3_[128];
int16_t index;
};
class lineInterleaved : public sp_line_t {
public:
virtual int Process(const void* in_buf,
size_t* in_sample_count,
void* out_buf,
size_t* out_sample_count);
private:
struct interleave_buf buffer;
}
int lineInterleaved::Process(const void* in_buf, size_t* bytes, void* out_buf, size_t* out_sample_count) {
if (in_buf == NULL || bytes == NULL) {
return -EINVAL;
}
int8_t* out = static_cast<int8_t*>(out_buf);
const int8_t* in = static_cast<const int8_t*>(in_buf);
memcpy(buffer.data_1_, in, sizeof(buffer.data_1_));
memcpy(buffer.data_2_, in + sizeof(buffer.data_1_), sizeof(buffer.data_2_));
memcpy(buffer.data_3_, in + sizeof(buffer.data_1_) + sizeof(buffer.data_2_), sizeof(buffer.data_3_));
memcpy(out, in + sizeof(buffer.data_1_) + sizeof(buffer.data_2_), sizeof(buffer.data_3_));
*out_sample_count = sizeof(buffer.data_3_);
return 0;
}
答案 0 :(得分:0)
您不必将缓冲区复制到struct,为缓冲区指定指针是将缓冲区解析为struct的有效方法。
所以你只需将ponter分配给缓冲区,而不是所有memcpy
s,
例如:
#include <iostream>
#include <cstring>
using namespace std;
struct clsA
{
char a1[10];
char a2[10];
};
void f(const void *buf)
{
const clsA *pA = static_cast<const clsA*>(buf);
cout << pA->a1 <<endl;
cout << pA->a2 <<endl;
}
int main()
{
char buf[30];
strcpy(buf,"xx");
strcpy(&buf[10],"yy");
f(buf);
return 0;
}
除非您想要保存您不会复制的数据,否则如果您想复制结构,您可以使用常规作业:
clsA b = *pA;
另一个问题,使用out参数指针是C风格,在C ++中,常见的方法是以引用变量的形式使用这种方式。
所以你的过程方法应该是:
int lineInterleaved::Process(const void* in_buf, size_t bytes, void* out_buf, size_t& out_sample_count)