2012-06-05 2 views
1

NSString을 C 함수에 전달하려고합니다. 매개 변수를 받아들이지 않거나 무시하는 것 같습니다. 어떤 도움을 주시면 감사하겠습니다 - 고마워요.Objective-C, C 함수에 파일 이름을 전달하는 방법은 무엇입니까?

int copyfiles(int argc, const char **argv) 
{ 
    if(argc < 2 || argc > 3) 
    { 
     puts("usage: copy file [outfile]"); 
     return 1; 
    } 

    const char *infile = argv[1]; 
    char *outfile; 
    if(argc > 2) 
    { 
     outfile = strdup(argv[2]); 
     expect(outfile, "allocate"); 
    } 
... 
} 

@implementation MyApplication 

@synthesize window; 

    - (void)copy:(NSString *)pathToFile 
    { 
    NSString *pathToFile = @"/path/to/file"; 
    copyfiles((int)(const char *)[pathToFile UTF8String],(const char **)[pathToFile UTF8String]); 
    } 

내가 오류를 얻을하지 않습니다하지만 출력이 나에게 준다 "사용 : 파일 복사 [OUTFILE]를"내가 분명히 제대로 매개 변수를 캐스팅하고 있지 않다.

+1

char *을 int로 변환하지 마십시오. – QED

+1

모든 캐스팅이 잘못되어 이것이 오류를주지 않는 이유입니다. 캐스팅은 컴파일러에 있습니다. – Chuck

+0

@Chuck - 고마워. 분명히 objective-c 내에서 c 코드를 디버그하는 것은 쉽지 않습니다. 나는 중단 점을 설정하려고 시도했으나 어느 쪽도 깨지지 않을 것이다. –

답변

4

copyfiles으로 전화를 걸었습니다. 특히 이유는 첫 번째 인수에 정수가 필요한 함수에 문자열을 전달하는 이유입니다.

이 함수에 인수 을 넣고 다음에 인수 목록에 대한 포인터로 포인터를 전달해야합니다.

예를 들어, (검증되지 않은하지만 당신은 일반적인 생각을해야합니다) 다음과 같은 C 코드로 부를 것이다 :

const char *args[] = {"copy", "fromfile", "tofile", NULL}; 
copyfiles (sizeof(args)/sizeof(*args) - 1, args); 

첫 번째 줄은 문자 포인터의 배열을 생성한다 (더 정확하게, C 문자열) ISO C 표준에서 위임 된 끝에는 NULL을 포함합니다.

두 번째 줄은 두 개의 인수를 전달합니다. 첫 번째 줄은 배열의 크기 - 1 (목록의 "실제"인수)이고 두 번째 줄은 배열 자체입니다. 당신의 C 함수가 main -like 동작을 기대하기 때문에

char *args[3]; 
args[0] = "copy"; 
args[1] = [pathToFile UTF8String]; // watch out for auto-release here? 
args[2] = NULL; 
copyfiles (2, args); 

첫 번째 인수는 다음과 같습니다

당신은 하나의 파일 이름을 사용하여 다양한 것 같다 특정 경우에,

, 당신은 같은 시작해야 "프로그램"이름.

+0

NSString을 (정상적으로) 무엇인가에 일반적으로 사용되는 명령 줄 함수에 적용하려고합니다 :'copyfile files1 file2' –

+0

@Joe, 이해합니다. 아마 2 스트링 버전을 가지고 카운트에 대해 걱정하지 않고, 내가하는 것처럼 아마 그렇지 않을 것입니다. 그러나, 당신이하고있는 일은 가능하지만,'main'과 같은 규칙을 따라야합니다 : 첫 번째 인수는 인수 배열의 항목 수이고 두 번째 인수는 실제 배열 자체입니다. 당신이 부르는 방식이 잘못되었습니다. 나는 명확히하기 위해 갱신 할 것이다. – paxdiablo

+0

예를 들어 주셔서 감사합니다. 나는 당신의 코드 ("")를 "}"로 변경하고 char 앞에 const를 추가 한 몇 가지 사항을 수정했다. 그리고 문자열을 따라 가도록 (듯이) 보인다. 고맙습니다! –

2

내가 당신에 대해 잘 모르지만, 나는 "copyfiles는"하지만 2 또는 3 어디 샘플 코드를 찾을 않은 것이 될 것입니다 귀하의 함수 호출에 "(int)(const char *)[pathToFile UTF8String]"의 결과를 생각하면 이 구현을 기반으로하고 있습니까?

어쨌든 미친 캐스트를 2의 상수로 변경하십시오 (통과하는 모든 경로가 단일 경로이기 때문에). 더 나은 결과가 있는지 확인하십시오.

+0

일반적으로 NSString을 전달하려고하는 C 함수가 명령 행에서 사용됩니다. 그래서 보통 다음과 같이 사용되기를 원할 것입니다 :'copyfile files1 file2' –

+0

"int copyfiles (int argc, const char ** argv)'"함수 선언을보십시오. 그것은''int'' 다음에''char **' "가옵니다. char *의 배열이 뒤에 오는 정수. –

+0

그래서'copyfiles (1, [pathToFile UTF8String]) '와 같아야합니까? –

관련 문제