2014-01-13 4 views
1

이 기능에 문제가 있습니다. 이 함수는 StoredData 유형을 반환합니다. 함수에서 void 사용. 인식하지 못함

내 구조체입니다 :

struct StoredData 
{ 
    void* data; 
    int size; 
    int type; 
    int compareValue; 

    StoredData(): 

     size(0), 
     type(0), 
     compareValue(0){} 
}; 

그리고이 제 기능입니다 : 내가

*data = (bool)input2; 
의 경우 문 내 라인에 문제가있어 불행하게도

StoredData SDI::Array::create(int size, int type, int compareValue) 
{ 
    StoredData temp; 
    void* data; 
    int input; 
    int input2; 
    std::cout<<"What type of data would you like to insert?"<<std::endl; 
    std::cout<<"1 - Integer"<<std::endl; 
    std::cout<<"2 - Boolean"<<std::endl; 
    std::cin>>input; 
    std::cout<<"What is the value?"<<std::endl; 
    std::cin>>input2; 
    switch (input) 
    { 
    case 1: 
     size = sizeof(int); 
     type = 0; 
     data = new int; 
     *data = (int)input2; 
     break; 
    case 2: 
     size = sizeof(bool); 
     type = 1; 
     data = new bool; 
     *data = (bool)input2; 
     break; 
    } 
    temp.compareValue=input2; 
    temp.data = data; 
    temp.type = type; 
    temp.size = size; 
} 

내가 얻는 오류는 완전한 개체 형식에 대한 포인터 여야한다는 것입니다. 데이터를 인식하려면 void 변수가 필요하며 운이 없다. 누구나 해결 방법을 알고 있습니까?

각각에 대해 2 개의 오류 메시지가 표시됩니다. , 첫 번째는

illegal indirection 

이고 두 번째 사람은

error C2440: '=' : cannot convert from 'int' to 'void *' 

error C2440: '=' : cannot convert from 'bool' to 'void *' 
+0

왜 '공용체'유형 대신에 '무효'유형을 사용하고 있습니까? 튀어 나오는 또 하나의 문제는 참조 할 '데이터'에 할당 된 메모리가 없다는 것입니다. – abiessu

+0

void * 또는 union을 사용하지 마십시오. Boost :: variant를 사용하십시오. – Davidbrcz

+0

@Davidbrcz이 질문에 태그가 추가 되었습니까? –

답변

3

당신 수 없습니다 무효 포인터 역 참조. 당신은 당신이 되 참조 할 수있는 포인터 타입으로 캐스팅해야합니다 :

*(bool *) data = (bool) input2; 
+0

고마워,하지만 'temp.data = data;'줄에 다음 오류가 발생했습니다. 오류 오류 C4703 : 잠재적으로 초기화되지 않은 로컬 포인터 변수 'data'가 사용되었습니다. – WorldsWorstProgrammer

+0

입력 값이 1 또는 2가 아니기 때문에, 이 경우'data'는 절대로 초기화되지 않습니다. 'data'를 NULL로 초기화하고 적절한 오류 처리를 추가하여이 문제를 해결할 수 있습니다. –

+0

또한 매우 이상한 것은 오류이며 경고가 아니라는 것입니다. '-Werror'와 같은 스위치를 설정 했습니까? –

0

무효이 불완전한 유형의 개체를 만들 수 없습니다 불완전한 type.You입니다.

0

기본적으로 아무 것도 가리킬 수 있으므로 보통 void*을 역 참조 할 수 없습니다. 그 값을

*reinterpret_cast<bool*>(data) = static_cast<bool>(input2); 
1

당신은 무효 포인터 역 참조를 시도하고 설정 :

bool* bool_pointer = new bool; 
*bool_pointer = static_cast<bool>(input2); 
data = bool_pointer; 

또는 타입 캐스팅을 사용 : 당신은 aither (다른 포인터에 할당)는 다른 뭔가를 가리 확인해야

*data = (bool)input2; 

이것은 컴파일러에게는 의미가 없습니다. *data의 결과는 어떤 유형입니까? 당신이 그들을 만들 때 올바른 값으로 동적 변수를 초기화 할 수있다, 또는

*(bool*)data = (bool)input2; 

:

이 먼저 의미있는에 void* 캐스팅 할 필요가

data = new int(input2); 
... 
data = new bool(input2); 

을 어느 않을 것 당신이 무엇이든 주조하도록 요구하십시오.

+0

_ "메모리 위치에 할당되지 않았습니다"_ 예. 또는 더 정확하게, 메모리 위치가 _it_에 지정됩니다. –

+0

@JamesMcLaughlin :'void * data'는'void data [1]'이라고 말하는 것과 같이 사용 가능한 메모리가 있습니까? – abiessu

+0

아니요, 시도한 과제 위에 'data = new ...'라고 말하고 있습니다. –

관련 문제