2014-03-02 2 views
0

스레드 생성을 처리하는 함수에 토큰 배열을 전달해야합니다. 이를 위해 함수가 여분의 void *aux 인수를 취할 수 있다는 사실을 사용하고 있습니다.char 포인터의 배열을 void 포인터로 변환 한 다음 다시 변환합니다.

기능 (마지막 인수는 내 질문에 관련) : 나는 통과하고있어 어떻게

char *argv[]; 

이것은 : 내가 문자열 토큰에 대한 포인터를 저장이 배열을 사용

tid_t 
thread_create (const char *name, int priority, 
       thread_func *function, void *aux); 

논증 (마지막 것은 관련이있다) :

thread_create (file_name, PRI_DEFAULT, start_process, argv); 

그러나, 내가 다시하려고하면

char *argv[] = aux; 

나는 다음과 같은 메시지가 받고 있어요 : 무효의 매개 변수를 통해 문자열 포인터의 배열을 전달하는 어떤 방법

error: invalid initialiser 

거기를? 당신은 가변 길이 배열에 할당하려는

답변

2

: 대신

char *argv[] = aux; /* wont compile! */ 

로 변수를 선언 char** :

char **argv = aux; 
+0

내 downvote를 취소 할 수 있도록 내 답변을 터치하고 싶을 수도 있습니다. – alk

+1

그러나 'char **'로의 캐스트는 필요하지 않습니다. – alk

+0

완료. 나는 당신이 옳은 대답을 지적한 이후에 누가 대표를해야하는지 당신에게 느낍니다. 모두를 위해 고맙습니다 :) – MBlanc

1
로 전달 될 때 배열이 포인터로 붕괴

함수를 사용하면됩니다.

char ** argv = aux; 

배열 참조 사본을 보유하려면 aux에 의해 d는 다음을 수행 :이 솔루션은 위의 플 로브 디프, 볼 형태의 C99이 필요

char ** ppc = aux; 
while (*ppc) 
{ 
    ++ppc; 
} 

char * argv[ppc - ((char **) aux) + 1] = {NULL}; 
while (ppc > ((char **) aux) 
{ 
    argv[ppc - ((char **) aux) - 1] = *ppc; 
    --ppc; 
} 

.

+0

나는이 코드를 따르기가 너무 어렵다. 왜'memcpy'를 사용하지 않습니까? – MBlanc

+0

예, 두 번째 루프는 간단한'memcpy()'로 대체 될 수 있습니다. @MBlanc 그러나 첫 번째는 엘멘의 수를 결정하는 데 필요합니다. – alk

관련 문제