2012-07-03 2 views
-1

BDD 조작을 위해 CUDD 패키지를 사용하고 있습니다. DdManager라는 큰 데이터 구조의 복사본을 만들고 싶습니다. 문제는 :이 데이터 구조 안에 포인터가 너무 많아서 직접 복사를하면 "얕은"복사본 (일부는 용어를 사용함)이됩니다. 즉, 새로운 복사 점의 포인터가 같은 위치로 향하게됩니다 ~에 대한 원본 복사본에 의해, 그래서 내가 그들 중 누구에게나 변경되면 나는 또한 다른 바람직하지 않은 변화 ... 데이터 구조가 정말 크고 매우 상세한 때문에 수동으로 복사 기능을 만들려고 노력하지 않습니다 다른 복잡한 구조에 많은 포인터도 !!! 벡터 솔루션을 시도한 here을 설명했지만 많은 중첩 구조와 포인터가 있기 때문에 예상 된 결과를 얻지 못했으며 완전히 새로운 복사본이 필요합니다. 데이터 구조가 다른 많은 포인터 정말 크고 매우 상세한 때문에포인터가있는 구조체를 내부에 복사하는 방법은 무엇입니까?

#include <iostream> 
#include <cstdlib> 
#include <string.h> 
#include <vector> 
using namespace std; 
struct n1 
{ 
    int a; 
    char *b; 
}; 
struct n2 
{ 
    int **c; 
    struct n1 *xyz; 
}; 
typedef struct 
{ 
    vector<struct n2> x; 
}X; 
int main() 
{ 
    struct n2 s1; 
    s1.xyz = (struct n1*)malloc(sizeof(struct n1)); 
    s1.xyz->a = 3; 
    s1.xyz->b = (char*)malloc(5); 
    s1.xyz->b[0] = '\0'; 
    strcat(s1.xyz->b,"Mina"); 
    s1.c = (int**)malloc(5 * sizeof(int*)); 
    for(int i = 0; i < 5; i++) 
     s1.c[i] = (int*)malloc(5 * sizeof(int)); 
    for(int i = 0; i < 5; i++) 
     for(int j = 0 ; j < 5 ; j++) 
      s1.c[i][j] = i + j; 
    X struct1,struct2; 
    vector<struct n2>::iterator it; 
    it = struct1.x.begin(); 
    it = struct1.x.insert(it,s1); 
    it = struct2.x.begin(); 
    it = struct2.x.insert(it,struct1.x[0]); 
    cout<<"struct2.x[0].c[1][2] = "<<struct2.x[0].c[1][2] <<" !"<<endl; // This is equal to 3 
    (struct2.x[0].c[1][2])++; //Now it becomes 4 
    cout<<"struct2.x[0].c[1][2] = "<<struct2.x[0].c[2][2] <<" !"<<endl; //This will print 4 
    cout<<"s1.c[1][2] "<< s1.c[1][2]<<" !"<<endl; // This will also print 4 ... that's the wrong thing 
    return 0; 
} 
+1

'vector'를 사용하는 것 같지만 그렇지 않으면 C 스타일의 코드입니까? – unkulunkulu

+1

나에게 C++과 비슷한 것처럼 보입니다. C에서는 문자열 상수로 이동할 수 없습니다. – wildplasser

+11

"데이터 구조가 실제로 크기가 크고 매우 상세하기 때문에 수동으로 복사 기능을 시도하는 것은 불가능합니다."- 죄송합니다.하지만 그게 인생입니다. 그게 바로 당신이해야 할 일입니다. – cdarke

답변

1

"손으로 복사 기능을 만들려고 노력하는 것은 가능하지 않다 : 여기

내가 뭘 원하는지의 코드 샘플입니다 복잡한 구조도 !!! "

이것은 정확히 당신이해야 할 일입니다. 객관적인 접근 방식은 하나의 커다란 do-it-all 복사 방법을 쓰지 않는다는 것을 의미합니다. 대신 모든 객체 (구조체)는 그 자체 만 복사 한 다음 더 이상 복사 할 필요가 없을 때까지 하위 객체 복사 메서드 등을 호출합니다.

"벡터 솔루션"과 같은 것은 없지만 벡터는 가장 작은 복사 방법을 사용하는 가장 작은 개체입니다.

구조체와 클래스간에 차이가 없으므로 복사 방법을 작성하십시오.

데이터 구조 만 알면 사람을 구할 수있는 유일한 사람 (또는이 데이터 복사)이됩니다. 다른에도 불구하고

3

는이 문제를 해결하기 위해 ... 당신이 손

하여 복사 기능을

에 있다고 말하고, 나는 당신에 대한 잘못된 접근 생각합니다. 여기 왜, 그리고 여기에 제안이 있습니다.

복잡한 CUDD 라이브러리의 필수 부분 인 CUDD ddManager 객체의 복사본을 만들려고합니다. CUDD는 내부적으로 일부 개체 (여기서 도움이 될 수있는 참조 카운트)를 사용하지만 ddManager 개체는 라이브러리의 전체 인스턴스를 효율적으로 나타냅니다. 참조 카운트가 인스턴스간에 어떻게 작동하는지 아이디어가 없습니다.

CUDD 라이브러리 및 그것의 associated C++ wrapper은 ddManager의 별도 복사본을 생성하는 데 필요한 복사 생성자를 제공하지 못하는 것 같습니다. 그리고 이들을 추가하는 것은 심각한 노력과 여러분이 시도하고있는 라이브러리의 상세한 내부 지식을 필요로합니다 클라이언트로 사용할 수 있습니다. 이 작업을 수행 할 수는 있지만 복잡한 작업이 필요합니다.

대신 현재 BDD를 파일/stream/whatever에 쓰고 ddManager의 새 인스턴스로 다시 읽으려고합니다. 이걸 도와 줄 dddmp 라이브러리가 있습니다.

또한 C++ 래퍼가 ddManager 클래스 non-copyable을 만들도록 수정하는 것이 좋습니다.

+1

는 지금 또 다른 하나 관리자에서 BDD를 전송하는 기능을 사용하려합니다 ..이 기능은 다음과 같습니다 DdNode *이 Cudd_bddTransfer은 ( DdManager * ddSource, DdManager * ddDestination, DdNode의 * f를) 는 이미 만들었습니다 새 관리자 및 Cudd_Init() ... 초기화 ... BDD 루트 노드 (DdNode *)는 관리자 구조 내에 저장됩니다. 즉,이 함수에 보낼 세 번째 매개 변수는 무엇입니까 ?? 미리 감사드립니다. – user1489488

+0

잘 모르겠다. 뿌리와 같은 것이 있습니까? 어쩌면 당신은 어떤 노드를 건네 주면, 그것은 연결된 모든 것을 전송할 것입니까? – Roddy

관련 문제