2010-06-22 6 views
1

이 날 미치게된다배열을 매개 변수로 전달하는 방법은 무엇입니까?

나는 gstreamer를 API의 기능

void gst_init(int *argc, char **argv[]); 

이와 내가 같이 정의 일부 매개 변수와 함께 호출 할 :이 코드는 아무튼

int argc = 2; 
char* argv[2] = {"myvalue1", "myvalue2"}; 
gst_init(&argc, &argv); 

(오류 C2664가 발생합니다)

error C2664: 'gst_init' : cannot convert parameter 2 from 'char *(*)[2]' to 'char **[]' 

질문 : : argv 값을 매개 변수로 전달하려면 어떻게 정의해야합니까? 저는 C++을 5 년 이상 사용해 왔지만, 고등학교 때부터 원시 배열을 사용하지 않았습니다 (5 년 전 이상).

편집 : 저는 VS2010 Express를 사용하고 있습니다.

답변

2

int argc = 2; 
char* arg1[1] = {"myvalue1"}; 
char* arg2[1] = {"myvalue2"}; 
char** argv[2] = { arg1, arg2 }; 
gst_init(&argc, argv); 

char **argv[]char* 배열의 배열과 유사하다 char**의 배열 인 시도.

OTOH 매개 변수로 전달하려고 시도한 내용은 char *(*)[2] : 배열에 대한 포인터 char*으로 표시됩니다.

+0

'오류 C2440 :'초기화 중 ':'const char [9] '에서'char ** '로 변환 할 수 없습니다. – utnapistim

+0

@utnapistim, 내 업데이트를 참조하십시오. –

+0

업데이트 된 코드가 확인을 컴파일합니다. 나는 그것을 넘어갈 것이다. 감사. – utnapistim

4

일반적으로 manual의 지침을 따르고 main이 제공하는 인수에 대한 포인터를 전달하므로 gstreamer가 처리하는 인수를 제거 할 수 있습니다.

#include <stdio.h> 
#include <gst/gst.h> 

int main (int argc, char *argv[]) 
{ 
    gst_init (&argc, &argv); 
    // handle the remaining argc values of argv 

자신의 주장을 만들려면, 다음 main는 것이다 배열의 같은 종류의 생성 :

void gst_init(int *argc, char **argv[]) 
{ 
    // strip one argument 
    --*argc; 
    ++*argv; 
} 

void foo() 
{ 
    int argc = 2; 

    char* args[] = {"myvalue1", "myvalue2"}; 
    char** argv = args; 

    for(int i= 0; i < argc; ++i) 
     printf("%s\n", argv[i]); 

    gst_init(&argc, &argv); 

    for(int i= 0; i < argc; ++i) 
     printf("%s\n", argv[i]); 
} 

당신이 C99을 사용하지 않는 경우를 별도의 포인터를 가지고 쉽게 문자열 리터럴의 로컬 배열에 저장합니다. C99을 사용하면 char** argv = (char*[]){"myvalue1", "myvalue2"};을 작성하여 익명 배열의 첫 번째 요소에 대한 포인터로 시작할 수 있습니다.

배열의 첫 번째 요소에 대한 포인터가 아닌 배열을 가리키는 변수에 대한 포인터를 전달해야합니다. 첫 번째 경우 포인터에 대한 배열 매개 변수의 저하는 포인터 지역 변수를 선언하는 두 번째 경우와 동일한 효과를 얻습니다. 그런 다음이 변수의 주소를 전달할 수 있고 함수는이를 수정할 수 있습니다. 컴파일러가 배열의 요소 수를 추론하므로 sizeof (args)는 32 비트 시스템에서 8입니다. sizeof (argv)는 4이므로, ++ args는 ++ argv가하는 것처럼 다음 요소보다는 포인터를 배열의 끝으로 이동시킵니다. 컴파일러는 그러한 조작으로부터 사용자를 보호합니다.

그러나 일반적으로 설명서에 나와있는대로 사용하십시오.

+0

args와 argv를 전달해야한다는 것을 알고 있습니다. 매개 변수를 수동으로 정의하는 방법이 궁금 해서요 ("gstreamer"라는 질문에 태그를 지정하지 않은 이유입니다. 구문에 관심이있었습니다). 답변을 주셔서 감사합니다. (다른 것을 얻었습니다). 되세요. +1 :) – utnapistim

관련 문제