1

パラメータを受け入れない (または無視する) ように見えますが、NSString を 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]);
    }

エラーは発生しませんが、出力に「usage: copy file [outfile]」と表示されるため、明らかにパラメーターが正しくキャストされていません。

4

2 に答える 2

4

への呼び出しcopyfiles、具体的には、最初の引数に整数が必要な関数に文字列を渡す理由を見てください。

その関数に引数カウントを渡し、その後に引数リストのポインターツーポインターを渡す必要があります。

たとえば、次の C コードで呼び出します (テストされていませんが、一般的なアイデアは理解できるはずです)。

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

最初の行は、ISO C 標準で義務付けられている末尾の NULL を含む文字ポインター (より正確には C 文字列) の配列を作成します。

2 行目は 2 つの引数を渡します。最初の引数は配列のサイズから 1 を引いたもの (リスト内の「実際の」引数の数) で、2 番目の引数は配列自体です。

1 つのファイル名の種類を使用しているように見える特定のケースでは、次のようなものから始める必要があります。

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

C関数はmain、最初の引数が「プログラム」名であるような動作を期待しているためです。

于 2012-06-05T04:59:12.773 に答える
2

あなたのことはわかりませんが(int)(const char *)[pathToFile UTF8String]copyfiles

いずれにせよ、そのクレイジーなキャストを定数 2 に変更して (パスが 1 つしか渡されないため)、より良い結果が得られるかどうかを確認してください。

于 2012-06-05T04:58:51.967 に答える