Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将较小的数据块合并到一大块内存中_C++_Pointers_Copymemory - Fatal编程技术网

C++ 将较小的数据块合并到一大块内存中

C++ 将较小的数据块合并到一大块内存中,c++,pointers,copymemory,C++,Pointers,Copymemory,我有这样的代码: ByteArray ret; ret.resize( MAX( body_left, tmp_read.size() ) ); while ( body_left > 0 ) { ByteArray::Write r = tmp_read.write(); int rec = 0; err = connection->get_partial_data( r.ptr(), MIN( body_left, tmp_read.size() ), r

我有这样的代码:

ByteArray ret;
ret.resize( MAX( body_left, tmp_read.size() ) );
while ( body_left > 0 ) {
    ByteArray::Write r = tmp_read.write();
    int rec = 0;
    err = connection->get_partial_data( r.ptr(), MIN( body_left, tmp_read.size() ), rec );
    if ( rec > 0 ) {
        ByteArray::Write w = ret.write();
        copymem( w.ptr(), r.ptr(), rec );
        body_left -= rec;
    }
}
我发现理解这段代码很有挑战性。有几个问题:

ret.resize(最大值(body_left,tmp_read.size())
通过数组
分配最左边的
正文
tmp\u read.size()

ByteArray::Write r=tmp_read.Write()中
是否
r
成为指向空间中用于写入数据的位置的指针

ByteArray::Write w=ret.Write()中
w
是否像上一个问题中的
r
那样变成指针

此外,在这方面:

copymem(w.ptr(),r.ptr(),rec);
copymem(w.ptr(),r.ptr(),rec);
据我所知,在指针
r
下收集的所有数据都被复制到指针
w
下的位置。问题是它们的大小不同,如何移动指针
w.ptr()
,以保持数据完整且顺序正确?或者是
w.ptr()
是指向函数的指针,这应该不是问题


额外上下文:

方法
get_partial_data
返回数据块,比如每个数据块有20、20和10个字节。 变量
ret
的长度应为50字节,并将这些块合并为一个
ByteArray

不幸的是,我在这个项目中找不到
ByteArray
的定义,所以我猜它是另一个库的一部分(可能是libGL?)

我知道这个问题不是很精确,我的信心正在飞跃,但如果有人能帮助我,我将不胜感激

原始类和项目此代码取自:

第503-516行

它的形状不同,因为我已经应用了DirtyHack(这不太好用)

是ret.resize(最大值(body_left,tmp_read.size());分配 左边最高主体的字节数组或tmp_read.size()

MAX
最有可能是返回两个参数中较大值的宏。行
ret.resize(MAX(body_left,tmp_read.size())
确保
ret
对于可能发生的任何写入操作都足够大

在ByteArray::Write r=tmp_read.Write()中;r是否成为指向的指针 将用于写入数据的空间中的位置

在ByteArray::Write w=ret.Write();,w是否像r一样成为指针 在上一个问题中

是第187行定义的类。是在第209行定义的函数,它返回一个
Write
对象,而不是指针。因此,
r
w
从来都不是指针

class Write {
  // ...
};

Write write() {
  Write w;
  // ...
  return w; 
}
此外,在这方面:

copymem(w.ptr(),r.ptr(),rec);
copymem(w.ptr(),r.ptr(),rec);
据我所知,这一行中收集的所有数据 指针r被复制到指针w下的位置。问题是 它们的大小不同,如何移动指针w.ptr()来保存数据 完好无损,顺序正确吗?或者w.ptr()是指向函数的指针 这应该不是问题

是第36行定义的宏

#define copymem(m_to,m_from,m_count) \
do { \
  unsigned char * _from=(unsigned char*)m_from; \
  unsigned char * _to=(unsigned char*)m_to; \
  int _count=m_count; \
  for (int _i=0;_i<_count;_i++) \
    _to[_i]=_from[_i]; \
} while (0);
#定义copymem(m_-to,m_-from,m_-count)\
做{\
无符号字符*_from=(无符号字符*)m_from\
无符号字符*_to=(无符号字符*)m_to\
int _count=m_count\
对于(int _i=0;_i来说,总结我(我们)到目前为止所学的一切:

原代码如下:

    ByteArray::Write r = tmp_read.write();
    int rec=0;
    err = connection->get_partial_data(r.ptr(),MIN(body_left,tmp_read.size()),rec);
    if (rec>0) {
        ByteArray ret;
        ret.resize(rec);
        ByteArray::Write w = ret.write();
        copymem(w.ptr(),r.ptr(),rec);
        body_left-=rec;
        if (body_left==0) {
            status=STATUS_CONNECTED;
        }
        return ret;
    }
    #define copymem(m_to,m_from,m_count) \
    do { \
      unsigned char * _from=(unsigned char*)m_from; \
      unsigned char * _to=(unsigned char*)m_to; \
      int _count=m_count; \
      for (int _i=0;_i<_count;_i++) \
        _to[_i]=_from[_i]; \
    } while (0);
    ByteArray ret;
    ret.resize(MAX(body_left,tmp_read.size()));
    ByteArray::Write w = ret.write();
    unsigned char * _to = (unsigned char*) w.ptr();
    int _offset = 0;
    while (body_left > 0) {
        ByteArray::Write r = tmp_read.write();
        int rec=0;
        err = connection->get_partial_data(r.ptr(),MIN(body_left,tmp_read.size()),rec);
        if (rec>0) {
            unsigned char * _from=(unsigned char*)r.ptr();
            for (int _i=0;_i<rec;_i++)
                _to[_offset+_i]=_from[_i];
            _offset += rec;
            body_left-=rec;
        }
    }
    if (body_left==0) {
        status=STATUS_CONNECTED;
    }
    return ret;
其中copymem是一个宏,如下所示:

    ByteArray::Write r = tmp_read.write();
    int rec=0;
    err = connection->get_partial_data(r.ptr(),MIN(body_left,tmp_read.size()),rec);
    if (rec>0) {
        ByteArray ret;
        ret.resize(rec);
        ByteArray::Write w = ret.write();
        copymem(w.ptr(),r.ptr(),rec);
        body_left-=rec;
        if (body_left==0) {
            status=STATUS_CONNECTED;
        }
        return ret;
    }
    #define copymem(m_to,m_from,m_count) \
    do { \
      unsigned char * _from=(unsigned char*)m_from; \
      unsigned char * _to=(unsigned char*)m_to; \
      int _count=m_count; \
      for (int _i=0;_i<_count;_i++) \
        _to[_i]=_from[_i]; \
    } while (0);
    ByteArray ret;
    ret.resize(MAX(body_left,tmp_read.size()));
    ByteArray::Write w = ret.write();
    unsigned char * _to = (unsigned char*) w.ptr();
    int _offset = 0;
    while (body_left > 0) {
        ByteArray::Write r = tmp_read.write();
        int rec=0;
        err = connection->get_partial_data(r.ptr(),MIN(body_left,tmp_read.size()),rec);
        if (rec>0) {
            unsigned char * _from=(unsigned char*)r.ptr();
            for (int _i=0;_i<rec;_i++)
                _to[_offset+_i]=_from[_i];
            _offset += rec;
            body_left-=rec;
        }
    }
    if (body_left==0) {
        status=STATUS_CONNECTED;
    }
    return ret;

注释/意见?

如果它让你感觉更好,我是一个相当熟练的C++开发者(即使我自己这么说),但是这个代码对我来说也没什么意义。它使用了我以前从未见过的类库。你在哪里找到代码?哈哈!谢谢大家,我更新问题与链接项目和一些额外的数据。不返回指针,所以他们不是指针我认为。至于CopyMeM,它是一个。我不是精通精通C++,所以别人可以回答你的问题。还有一件事我不清楚,线:CopyMeM(W pTr-(),R pTr-(),ReC),假设W pTr-()是一个指向内存中包含数据的位置的指针。这是否足以执行一组这样的操作:copymem(w.ptr(),r.ptr(),rec),copymem(w.ptr()+20,r.ptr(),rec),copymem(w.ptr()+40,r.ptr(),rec)(假设我们收到了20,20和10个字节,就像我问的原始问题一样)好吧,也许我会添加一个助手问题。行如下:unsigned char*\u from=(unsigned char*)m\u from,是否创建了一个新变量,它将作为指向unsigned char和指针值(location)的指针计算为从m_可以是的任何东西中转换为指针无符号字符?你是我的生命救星。感谢你的解释,我解决了所有问题。也许我的解决方案不是最好的,但很有效。我现在只关心内存泄漏。不确定如何检测这些。如果有人可以查看并确认,我将发布我的代码在我的代码中,你已经看到了更糟糕的情况,它在不违反C++世界中所有可能的良好实践规则的情况下完成了任务。