2011-03-25 4 views
2

의 나는이 방법을 가지고 있다고 가정 해 봅시다 :반환 유형을 동적으로 변경 하시겠습니까?

matrix* multiply(smatrix *sm, matrix *m){ 

그것을 내가 동적으로 반환 형식을 변경하려면 matrix *를 돌려주는 경우에도 마찬가지입니다. 반환 유형을 void *으로 설정하고 나중에 캐스팅 할 수 있습니까?

+1

제안하는 내용의 실제 코드 예제를 제공해야합니다. –

+1

예, 가능합니다. 너 시도하지 않았 니? –

+0

크기가 다른 행렬을 넣기를 원하거나 여기에 더 심각한 타이핑 문제가 있습니까? –

답변

3

당신은 무효를 선언 할 수 있습니다 * 곱하기 (smatrix * SM, 매트릭스 *의 m) 다음 나중에

1

예 void * 포인터를 반환하고 원하는 것으로 캐스팅 할 수 있습니다. 그냥 당신이 틀린 기억에 접근 할 수 있다고 예상했던 것을 돌려주고 있는지 확인하십시오.

코드를 모호하게 만들 수 있으므로 이런 식으로 디자인하는 것이 좋지 않을 수 있습니다.

0

당신은 함수에 대한 호출에서 캐스팅을 할 수 반환 형식을 캐스트.

struct wibble 
    *w; 

w = (struct wibble *)(multiply(sm, m)); 

현재로서는 매트릭스를 typedef'ing하지 않는 것이 좋습니다. 구조체이기 때문에 이미 타입이 있다고 상상해 봅니다. typedef를 사용하여 코드의 복잡성을 증가시킵니다. 그게 당신이 얻는 전부입니다.

+0

함수가'void *'를 반환하면 캐스트가 필요하지 않습니다 ... 캐스트가 잘못되었을 가능성이 높습니다 :) – pmg

0

하나의 옵션이 이미 언급되었습니다. 반환 유형 (void*). 그러나 나는과 같이, 여기 - 메이크업 반환 형식 Union 또 다른 논의되지 옵션을 언급 할 :

typedef union { 
    int scalar; 
    int* vector; 
    int** matrix; 
} custom_type; 


custom_type* myFunction() { 
// todo 
} 

Union, 그 정도 Union 회원 공유 같은 메모리를 제외하고 Struct처럼 될 수있는 모든 조합원 그래서 하나의 구성원 한 번에 설정/사용됩니다. 그러나 조심하십시오 - 당신은 명확하게 정확한 상황에서 기능으로부터 기대할 것을 알아야합니다 (그러나 나는 같은 경고가 void* 경우에 적용된다고 생각합니다).

건배!

+0

왜 노동 조합에 typedef가 있습니까? 다른 사람이 코드를 읽을 때 코드를 이해할 수 있도록 기본 유형을 확인해야합니다. typedef는 코드를 가려줍니다. –

+0

개인적으로 변수 선언을 줄이기 위해 union/struct와 함께 typedef를 사용하는 것을 선호합니다. I.E. 나는'struct MyType var;'대신에 더 짧은 선언'MyType var;'을 쓰는 것을 선호한다. 하지만 그건 내 개인 코딩 스타일 일 뿐이므로 결코 다른 사람이 그것을 사용하도록 강요하지 마십시오. –

+0

당신을 좋아합니다. 귀하의 코드를 읽는 모든 사람들을 위해. 좋은 프로그래머라는 중요한 부분은 다른 사람들이 이해할 수있는 코드를 만드는 것이라고 생각합니다. –

관련 문제