2013-02-27 3 views
1

나는 C 언어에서 부호없는 정수 배열에 대한 포인터를 취합니다. 입력은 일종의 필터링을 수행하고 결과를 동일한 포인터 배열로 반환합니다. 나는 이것을했다 :uint 배열에 대한 포인터

static void Filtering(Inst_t *psStruct, uint8 *arraypointer) 
{ 
    uint8 *arrayFilter; 
    uint32 i, n = 0, uCount; 
    uCount = psStruct->uCount; 

    for (i = 0; i < uCount; i++) 
    {   
     arraypointer[i] = (arraypointer[i] + arraypointer[i - 1] + arraypointer[i + 1])/3;  
    } 
} 

이렇게하면 데이터를 덮어 씁니다. 그러나 나는 그런 일이 일어나기를 원하지 않는다. 따라서 포인터가 가리키는 배열 데이터의 로컬 복사본을 만들고이를 사용하여 평균을 계산하고 계산 된 값을 다시 전달하십시오.

* arraypointer 크기의 배열을 할당하고 포인터 배열 값을 사용하여 initiliazing하는 대신이 로컬 복사본을 사용하려고합니다. 이론적으로 이것은 나에게 의미가 있지만 이것이 최선의 방법인지 확실하지 않습니다.

이 문제를 해결할 수있는 모든 포인터/코드는 높이 평가됩니다. 도와주세요.

미리 감사드립니다.

+0

이 어서, 당신의 접근 방식은 확인 들린다. – alk

+0

"uint 배열에 대한 포인터"가 없습니다. 당신은 방금 "포인터에 대한 포인터"를 가지고 있습니다. – newacct

답변

1

데이터를 수정하지 않으려면 왜 기능을 수행해야합니까? 자신의 프로그램 디자인을 피하는 방법을 고안하는 대신 함수의 정의를 변경하고 다르게 구현하십시오. 다음 호출자의

static void Filtering (Inst_t *psStruct, 
         const uint8_t* source, 
         uint8_t* result) 

:

uint8_t* filtered_buf = malloc (sizeof(buf)); 

Filtering(some_struct, buf, filtered_buf); 

free(filtered_buf); 
+0

또한, 호출자는'malloc'을 사용할 필요가 없으며 단지'uint8_t buf [N], filtered_buf [N];'을 사용할 수 있습니다. 이는 할당이 다른 수준에서 할당 해제가 필요하지 않으므로 훨씬 더 우수한 인터페이스입니다. –

+0

@CharlesBailey 정확합니다. 이 방법을 사용하면 버퍼 할당과 필터링 알고리즘 간의 긴밀한 결합이 제거됩니다. – Lundin

1

확실히. 이것은 새로운 배열을 반환하는 함수를 구현하는 완전히 합법적 인 방법입니다.

빠르게 요소를 복사하려면이 작업을 수행 할 수 있습니다

uint8 *newarray = malloc(uCount * sizeof(uint8)); 
memcpy(newarray, arraypointer, uCount * sizeof(uint8)); 

/* do work on newarray */ 
return newarray; 

는 함수가 동적으로 할당 된 배열을 반환하도록 문서화하고, 작업이 완료되는 때를 해제해야해야합니다.

+1

저는 이것이 좋은 충고라고 생각하지 않습니다. 더 좋은 방법은 호출자에게 읽기 전용 액세스 권한이있는 버퍼와 결과가 포함 된 버퍼를 두 번 지나게하는 것입니다. 그런 다음 호출자가 메모리 할당과 memcpy에 대해 걱정하게하십시오.이 알고리즘은 그 자체에 대해 관심을 가져서는 안됩니다. – Lundin

+0

@ Lundin : 당신이 그 기능으로 무엇을하고 싶은지에 전적으로 의존합니다. 새로운 배열을 생성해야하는 상황에서 독점적으로 사용된다면, 함수 내에서 'malloc'을 피할 이유가 없습니다 (예를 들어, 의도를 명확히하기 위해'NewArrayByFiltering '라고 이름 붙이기). – nneonneo

0

uCount 필드에서 사용할 수있는 요소 수가 많으므로 확실히 로컬 복사본을 만들 수 있습니다.

평균 (읽기 전용 연산)을 수행하려는 경우 로컬 사본이 필요한 이유가 표시되지 않습니다. 당신이 원하지 않는다면 (함수에서 반환하기 전에 당신은 물론 local는 사용하기 전에 NULL 않은 것을 확인해야합니다

const size_t num_bytes = psStruct->uCount * sizeof *local; 
uint8 *local = malloc(num_bytes); 
memcpy(local, arraypointer, num_bytes); 

free()을 :

복사본을 만들려면 뭔가를 할 것 return 결과로 새로운 배열, free() 완료되면 호출자의 책임이됩니다).