2012-02-13 1 views
5

I 이런 고유치를 이용한 행렬 만들면 :memcpy가 고유 행렬 데이터를 복사하지 못하고 std :: copy가 성공하는 이유는 무엇입니까?

double * d = M.data(); 
    for(int i = 0;i<M.size();i++) 
    { 
    std::cout<<*d<<" "; 
    d++; 
    } 
    std::cout<<std::endl; 

가 생성 :

Eigen::MatrixXd M(3,3); 
    M<< 1.0, 4.0, 7.0, 2.0, 5.0, 8.0, 3.0, 6.0, 9.0 ; 
    std::cout<<M<<std::endl; 

1 4 7 
2 5 8 
3 6 9 

I는 각 요소를 인쇄 데이터를 통해 포인터 걸을 수 생산을

1 2 3 4 5 6 7 8 9 
제가

double data_copy[9]; 
    std::copy(M.data(),M.data()+M.size(),data_copy); 
    for(int i = 0;i<M.size();i++) 
    { 
    std::cout<<data_copy[i]<<" "; 
    } 
    std::cout<<std::endl; 

그러나

1 2 3 4 5 6 7 8 9 

생산 : 515,

제가 또한 스택에서 동일한 유형의 배열에 복사 표준 : 카피를 사용하여 해당 배열의 요소를 인쇄 memcpy를 사용하여 동등한 복사본을 만들 수 없습니다.

double data_memcopy[9]; 
    memcpy(data_memcopy,M.data(),M.size()); 
    for(int i = 0;i<M.size();i++) 
    { 
    std::cout<<data_memcopy[i]<<" "; 
    } 
    std::cout<<std::endl; 

1 0 0 0 0 0 0 0 0 

방어 적이기 내가 그것을해야 기대하는 일을하지 왜 어떤 좋은 이유 생산 : 이것은 단지 첫 번째 요소를 복사 관리?

답변

8

당신은 이중의 크기를 곱해야하는 (? 아니면 내가 잘못을 사용하고 있습니다) :

memcpy(data_memcopy,M.data(),M.size() * sizeof(double)); 

그렇지 않으면, 당신은 단지 복사하는 M.size() 바이트, 각 배는 이상입니다 귀하의 컴퓨터에 1 바이트.

아마도 첫 번째와 두 번째 복식에만 쓰기가 가능할 것입니다. 첫 번째와 두 번째 복식에 쓰기가 가능할 것입니다. 첫 번째 복 사본이 성공적으로 복사되었으므로 시스템에서 8 바이트이고, 두 번째 복식은 아마도 1 바이트를 복사했을 가능성이 큽니다.

관련 문제