2010-12-20 2 views
0
나는 내가 어떻게 사용합니까 대신 내가 오류 사용하여 방어 적이기

사용 방법 방어 적이기() 함수

src/coder.c:909: error: invalid operands to binary * (have ‘unsigned int’ and ‘int **’)
src/coder.c:910: error: invalid operands to binary * (have ‘unsigned int’ and ‘int **’)

int **block_orig_left=NULL; 

block_orig_left=intmatrix(BSIZE_Y_LEVEL[levelv], BSIZE_X_LEVEL[levelv]); 
pred_orig_left=intmatrix(BSIZE_Y_LEVEL[levelv], BSIZE_X_LEVEL[levelv]); 

for(i1=0; i1<BSIZE_Y_LEVEL[levelv]; i1++) 
for(j1=0; j1<BSIZE_X_LEVEL[levelv]; j1++) 
{ 
    block_orig_left[i1][j1]=block_orig[i1][j1]; 
    pred_orig_left[i1][j1]=block_pred[i1][j1]; 
    Average_block_orig_left+=block_orig[i1][j1];   
} 
memcpy(block_orig_left, block_orig, sizeof(int **)*block_orig); 

memcpy(pred_orig_left, block_pred, sizeof(int **)*block_pred); 

block_orig_left[i1][j1]=block_orig[i1][j1]; 
pred_orig_left [i1][j1]=block_pred[i1][j1]; 

의, 결국 방어 적이기를 사용하려면

memcpy가 올바르게 작동합니까?

+0

memcpy의 맨 페이지를 참조하십시오. –

+0

부호없는 int로 포인터를 곱하고 있습니다. 당신은 그것을 할 수 없으며 당신은 원하지 않습니다. – Roddy

답변

1

int **의 크기에 int **를 곱하면 의미가 없습니다. 즉, 트럭의 모든 차량의 중량을 알고 싶다면 "1 대의 차량 중량"을 "트럭"으로 곱할 수 없습니다. 당신은 1 대의 차의 무게에 트럭의 차의 수를 곱해야합니다.

memcpy의 세 번째 매개 변수는 복사 할 바이트 수입니다. 당신은 정확하게 int * 의 크기를 얻었지만 그 다음 구조체에있는 int *의 수를 곱하고 싶습니다. 내가 제대로 코드를 이해하고있어 경우에 따라서, 당신은 당신이 복사 구조 때문에

sizeof(int**) * BSIZE_Y_LEVEL[levelv] * BSIZE_X_LEVEL[levelv] 

을 사용할 것이다 많은 INT 이중 포인터 것을 포함하는 것.

편집 : David Yaw의 대답을보고, 나는 그가 옳았다는 것을 깨달았다. 내부 포인터가 한번에 모두 할당되지는 않았지만 for 루프 나 다른 것으로 할당된다는 사실을 언급하지 못했기 때문에 같은 방식으로 복사해야합니다. 위의 내 방법은 올바른 양의 메모리를 복사하지만 올바른 메모리 일 필요는 없습니다.

+0

그게 올바른 방법입니다. 나는 이미 그것을 만들었고, 방금 잘못된 코드를 게시했습니다. 나는 오류를 더 이상주지 않지만 프로그램은 제대로 작동하지 않습니다. 어쨌든 고마워요 – bruno

+0

제 편집에서 언급했듯이 David Yaw의 대답을보십시오. 그는 광산보다 더 나은 대답을 가지고 있습니다. 왜냐하면 아마도 for 루프 또는 무언가에서 각각의 하위 배열을 개별적으로 할당한다는 사실을 잊었 기 때문입니다. 즉, 그들은 아마 연속적이지 않으며, 각각 memcpy 된 개별적으로 필요합니다. 그리고 sizeof (int)가 아니라 sizeof (int **)를 사용해야합니다. 왜냐하면 int를 세고 있기 때문에 int **는 그것들을 가리키고 있습니다. 대부분의 경우에도 마찬가지입니다. – Derek

0
memcpy(block_orig_left, block_orig, sizeof(int **)*block_orig); 

sizeof(int **)*block_orig은 포인터와 크기의 곱셈입니다. 나는 포인터를 곱하는 것이 컴파일러 오류에서 볼 수있는 것처럼 이해가되지 않는다는 것을 알고 있다고 생각합니다.

block_orig 또는 다른 변수 (btw는 자기 설명 변수 이름에 대해 들었습니까?) 변수는 의미하지만 memcpy은 대상, 소스 및 크기를 인수로 취합니다.

정수 - 행렬의 경우 sizeof(int) * numberOfElementsToCopy과 같은 것이 목표 메모리가 연속 (즉, 2D 배열) 인 경우 의미가 있습니다.

4

나는 block_orig, block_pred, block_orig_left 및 pred_orig_left가 모두 int**으로 선언되었다고 가정합니다. 코드 중 하나만 표시됩니다.

오류는 memcpy의 매개 변수 인 sizeof(int **)*block_orig에 있습니다. 정수 (sizeof(int**))에 int ** 유형의 변수를 곱하려고합니다. 컴파일러는 그 곱셈을 이해할 수 없습니다.

길이 매개 변수를 memcpy로 수정해야하지만 원하는대로 작동하지 않습니다.

// Still won't work. 
memcpy(block_orig_left, block_orig, sizeof(int) * BSIZE_Y_LEVEL[levelv] * BSIZE_X_LEVEL[levelv]); 

int**은 정수 배열에 대한 포인터의 배열입니다. int **를 memcpy하려고하면 외부 배열을 덮어 쓰게됩니다. 따라서 루프가 필요하고 내부 배열을 복사해야한다고 생각합니다.

이렇게하면됩니다.

for(int i = 0; i < BSIZE_Y_LEVEL[levelv]; i++) 
{ 
    memcpy(block_orig_left[i], block_orig[i], sizeof(int) * BSIZE_X_LEVEL[levelv]); 
} 
+0

int가 포인터와 같은 크기 일 필요가 없으므로 sizeof (int)로 곱하는 것이 반드시 정확하지는 않습니다. 나는 믿는다. :) 나는 그가 sizeof (정수 **)를 사용하는 것이 옳았다 고 생각합니다. – Derek

+0

그는 저장소에 대한 포인터가 아니라 데이터를 복사하려고합니다. 내 생각에 sizeof (int)는 정확하지만 int **는 하나의 memcpy가 그것을하지 않는다는 것을 의미합니다. 편집을 참조하십시오. –

+0

아, 맞아. 나는 그의 데이터 구조를 오해하고 있었다. – Derek